;another example of a formatconversion, this time for a hd-install
;the gemx-disk has some gaps, and due highscorefile there will be
;5 parts created

	INCDIR	ASM-ONE:INCLUDE2.0/

	INCLUDE	OWN/Patcher.I
	INCLUDE	DEVICES/TRACKDISK.I
	INCLUDE	EXEC/EXEC_LIB.I
	INCLUDE	EXEC/IO.I
	INCLUDE	LIBRARIES/DOS_LIB.I


HP	MOVEQ.L	#20,D0
	RTS
	DC.L	TAB
	DC.B	'PTCH'
	DC.B	'$VER:Gemx_Diskimager_V1.01',0
	EVEN

TAB	DC.L	PCH_INIT,INITROUT
	DC.L	PCH_FILECOUNT,5
	DC.L	PCH_ADAPTOR,ADNAME
	DC.L	PCH_DISKNAME,DISKNAMEARRAY
	DC.L	PCH_FILENAME,FILENAMEARRAY
	DC.L	PCH_CHANGES,CHANGESARRAY	
	DC.L	PCH_NAME,PARAMNAME
	DC.L	PCH_DATALENGTH,LENGTHTABLE
	DC.L	PCH_SPECIAL,SPECIALARRAY
	DC.L	PCH_STATE,STATEARRAY
	DC.L	PCH_STATE2,STATEARRAY2
	DC.L	PCH_MINVERSION,VERSNAME		;minimum version of THE PATCHER
	DC.L	0

;minimum version of the patcher required, its a commandline-parameter
VERSNAME	DC.B	'V1.01'		;MAY NOT CONTAIN HEADING ZEROES
	EVEN				;MUST CONTAIN 2 NUMBERS AFTER POINT


ADNAME	DC.B	'Done by Harry.',0
	EVEN


PARAMNAME	DC.B	'Gemx, Diskimager for HD-install',0
	EVEN


DISKNAMEARRAY	DC.L	DISK1NAME
	DC.L	DISK1NAME
	DC.L	DISK1NAME
	DC.L	DISK1NAME
	DC.L	DISK1NAME

DISK1NAME	DC.B	'Gemx',0
	EVEN


FILENAMEARRAY	DC.L	FILE1NAME
	DC.L	FILE2NAME
	DC.L	FILE3NAME
	DC.L	FILE4NAME
	DC.L	FILE5NAME

FILE1NAME	DC.B	'disk.1',0
	EVEN
FILE2NAME	DC.B	'disk.2',0
	EVEN
FILE3NAME	DC.B	'disk.3',0
	EVEN
FILE4NAME	DC.B	'disk.4',0
	EVEN
FILE5NAME	DC.B	'disk.5',0
	EVEN
;FILE1NAME	DC.B	'Gemx002',0
;	EVEN
;FILE2NAME	DC.B	'Gemx074',0
;	EVEN
;FILE3NAME	DC.B	'Gemx083',0
;	EVEN
;FILE4NAME	DC.B	'Gemx084',0
;	EVEN
;FILE5NAME	DC.B	'Gemx130',0
;	EVEN

LENGTHTABLE	DC.L	$3b*$1800
	DC.L	(83-74)*$1800
	DC.L	$1800			;HIGHSCORE!
	DC.L	43*$1800
	DC.L	$1E*$1800
	
CHANGESARRAY	DC.L	0		;no changes to made in cycle 1
	DC.L	0
	DC.L	0			;no changes to made in cycle 3
	DC.L	0
	DC.L	0

;the parameter-initializing opens sourcedevice 
INITROUT	MOVEQ.L	#0,D0
	MOVE.L	PTB_OPENDEVICE(A5),A0
	JSR	(A0)
	TST.L	D0
	RTS

;loading-statetexts for the cycles
STATEARRAY	DC.L	LOADSTATE2
	DC.L	LOADSTATE2
	DC.L	LOADSTATE2
	DC.L	LOADSTATE2
	DC.L	LOADSTATE2


LOADSTATE2
	DC.B	'Please insert your original writepro-',$A
	DC.B	'tected disk in the source drive.',0
	EVEN

STATEARRAY2	DC.L	SAVESTATE		;no text in cycle 1
	DC.L	SAVESTATE
	DC.L	SAVESTATE
	DC.L	SAVESTATE
	DC.L	SAVESTATE


SAVESTATE	
	DC.B	'Please insert your destination disk.',0
	EVEN

;routines to 'load' something
SPECIALARRAY	DC.L	LOADROUT
	DC.L	LOADROUT		;load stuff from original
	DC.L	LOADROUT
	DC.L	LOADROUT
	DC.L	LOADROUT

STARTTRACK
	DC.B	2,$25*2,83,84,$41*2
	EVEN

LOADROUT
;.xxx	bra.s	.xxx
	MOVEQ.L	#0,D7				;one diskchange allowed
.NEU
.4	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1	;disk in sourcedrive?
	MOVE.W	#TD_CHANGESTATE,IO_COMMAND(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	TST.L	IO_ACTUAL(A1)
	BNE.W	.NOTORG

	MOVE.L	PTB_ADDRESSOFFILE(A5),A4	;load first part of disk
	LEA.L	(A4),A2			;offset to load in the dataspace
	MOVEQ.L	#0,D2
	MOVE.B	STARTTRACK(PC,D6.W),D2		;starttrack on the disk
	LEA.L	LENGTHTABLE(PC),A3
	MOVE.L	D6,D3
	LSL.L	#2,D3
	MOVE.L	(A3,D3.L),D3			;bytes to read
	MOVEQ.L	#0,D4				;data from the start of the track
;	bra.s	.5				;because reading starts with
						;trackstart, this is obsolete

.3	TST.L	D4
	BNE.S	.1
.5	MOVEQ.L	#$4,D5				;4 tries, then error
.55	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1
	MOVE.L	PTB_SPACE(A5),IO_DATA(A1)	;track is to load in PTB_SPACE
	MOVE.L	#$7C00,IO_LENGTH(A1)		;double length of track
						;to decode the index-sync-read data
	MOVE.L	D2,D0				;my own trackcounter
	EOR.B	#1,D0				;disksides are reverse
	MOVE.L	D0,IO_OFFSET(A1)
	MOVE.W	#TD_RAWREAD,IO_COMMAND(A1)
	MOVE.B	#IOTDB_INDEXSYNC,IO_FLAGS(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	TST.L	D0
	BNE.W	.ERR
	MOVE.L	PTB_SPACE(A5),A0
	LEA.L	$7C00(A0),A1			;end of buffer
	LEA.L	$7C00(A0),A3
	BSR.W	TRACKDECODE
	TST.L	D0
	BEQ.S	.R1OK
	DBF	D5,.55
	BRA.W	.NOTORG

.R1OK

	ADDQ.L	#1,D2
	ST	D7				;correct disk - nothing anymore
						;to change
.1	MOVE.B	(A3)+,(A2)+
	ADDQ.L	#1,D4
	CMP.L	#$1800,D4			;tracklength
	BNE.S	.2
	MOVEQ.L	#0,D4				;new track
.2	SUBQ.L	#1,D3
	BNE.W	.3

	MOVEQ.L	#0,D4
.END	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1	;switch motor off
	MOVE.L	#0,IO_LENGTH(A1)
	MOVE.W	#TD_MOTOR,IO_COMMAND(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)

	MOVE.L	D4,D0
	RTS

.ERR	MOVEQ.L	#-1,D4
	BRA.S	.END

.NOTORG	TST.L	D7			;if the first time the original
	BNE.S	.ERR			;was not in the source drive,
	ST	D7			;youll be asked to put it there
	LEA.L	LINE1(PC),A0
	LEA.L	LINE2(PC),A1
	MOVE.L	PTB_REQUEST(A5),A6
	JSR	(A6)
	TST.L	D0
	BNE.S	.ERR
	BRA.W	.NEU

LINE1	DC.B	'Please insert your original',0
	EVEN
LINE2	DC.B	'in the source drive.',0
	EVEN

;< A0 RAWTRACK
;< A1 TRACKBUFFER
;> D0 ERROR


GETSYNC
;SYNCANFANG SUCHEN
.SHF2	MOVEQ.L	#$10-1,D5
.SHF1	MOVE.L	(A2),D0
	LSR.L	D5,D0
	CMP.W	#$4489,D0
	BEQ.S	.SY
	DBF	D5,.SHF1
	ADDQ.L	#2,A2
	CMP.L	A2,A4
	BHI.S	.SHF2
	BRA.S	.ERR
.SY	
	MOVE.L	(A2),D0
	ADDQ.L	#2,A2
	LSR.L	D5,D0
	CMP.W	#$4489,D0
	BNE.S	.SY

.1	MOVE.L	(A2),D0
	ADDQ.L	#2,A2
	LSR.L	D5,D0
	CMP.W	#$4489,D0
	BEQ.S	.1
	SUBQ.L	#2,A2
	CMP.L	A2,A4
	BLS.S	.ERR
	MOVEQ.L	#0,D0
	RTS

.ERR	MOVEQ.L	#-1,D0
	RTS

;< A0 RAWTRACK
;< A1 TRACKBUFFER
;> D0 ERROR
;INTERN
;  D5 SHIFT-COUNT
;  D4 #$55555555

TRACKDECODE	MOVEM.L	A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
	MOVE.L	A0,A2
	LEA.L	($7C00-2*$1808)(A0),A4	;LAST CHANCE FOR CORRECT SYNC

	MOVE.L	#$55555555,D4
.TRY	BSR.W	GETSYNC
	TST.L	D0
	BNE.W	.ERR

	MOVE.L	(A2),D0
;	ADDQ.L	#2,A2
	LSR.L	D5,D0
	CMPI.W	#$2AAA,D0
	BNE.W	.TRY

	MOVE.W	#$05FF,D7
	MOVEQ	#$00,D3
.1
;	MOVE.L	(A2)+,D0	;original code
				;my code to get a longword
				;that it works, a2 has to point 2 bytes
				;before the real location! (see commented
				;addq #2,a2 before)
	MOVE.L	(A2)+,D0	;get higher part
	MOVE.L	(A2),D6		;get lower part
	LSR.L	D5,D6		;shift lower part with count
	MOVEQ.L	#$20,D2		;higher part has to be shifted to fill
				;the rest-place, a longword has 20 bits
	SUB.L	D5,D2
	LSL.L	D2,D0
	OR.L	D6,D0		;my code ends


	AND.L	D4,D0
	ASL.L	#1,D0

;	MOVE.L	(A2)+,D1
				;my code to get a longword
	MOVE.L	(A2)+,D1	;get higher part
	MOVE.L	(A2),D6		;get lower part
	LSR.L	D5,D6		;shift lower part with count
	MOVEQ.L	#$20,D2		;higher part has to be shifted to fill
				;the rest-place, a longword has 20 bits
	SUB.L	D5,D2
	LSL.L	D2,D1
	OR.L	D6,D1		;my code ends

	AND.L	D4,D1
	OR.L	D1,D0
	ADD.L	D0,D3
	MOVE.L	D0,(A1)+
	DBF	D7,.1


;	MOVE.L	(A2)+,D0
				;my code to get a longword
	MOVE.L	(A2)+,D0	;get higher part
	MOVE.L	(A2),D6		;get lower part
	LSR.L	D5,D6		;shift lower part with count
	MOVEQ.L	#$20,D2		;higher part has to be shifted to fill
				;the rest-place, a longword has 20 bits
	SUB.L	D5,D2
	LSL.L	D2,D0
	OR.L	D6,D0		;my code ends

	AND.L	D4,D0
	ASL.L	#1,D0
;	MOVE.L	(A2)+,D1
				;my code to get a longword
	MOVE.L	(A2)+,D1	;get higher part
	MOVE.L	(A2),D6		;get lower part
	LSR.L	D5,D6		;shift lower part with count
	MOVEQ.L	#$20,D2		;higher part has to be shifted to fill
				;the rest-place, a longword has 20 bits
	SUB.L	D5,D2
	LSL.L	D2,D1
	OR.L	D6,D1		;my code ends

	ANDI.L	D4,D1
	OR.L	D1,D0
	CMP.L	D0,D3
	BNE.W	.ERR

	MOVEQ.L	#0,D0
.END
	MOVEM.L	(A7)+,A2/A3/A4/A5/D2/D3/D4/D5/D6/D7
	RTS
.ERR
	MOVEQ.L	#-1,D0
	BRA.S	.END

