;another example of a formatconversion, this time for a hd-install
;the nitro-disk has a really strange decoding-routine
;have a look on that table-changes while execution (PCH_DATALENGTH 
;  and PCH_CHANGES)
;new longwordreader on the bitstream, lesser registers used, no
;  special adjust to An needed anymore like the earlier one


	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

MYNITRO=0


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

TAB	DC.L	PCH_INIT,INITROUT
	DC.L	PCH_FILECOUNT,3
	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.05'		;MAY NOT CONTAIN HEADING ZEROES
	EVEN				;MUST CONTAIN 2 NUMBERS AFTER POINT


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


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


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

DISK1NAME	DC.B	'Nitro',0
	EVEN


FILENAMEARRAY	DC.L	FILE1NAME
	DC.L	FILE2NAME
	DC.L	FILE3NAME

FILE2NAME	DC.B	'disk.1',0
	EVEN
FILE1NAME	DC.B	'init',0
	EVEN
FILE3NAME	DC.B	'high',0
	EVEN

LENGTHTABLE	DC.L	$1200
	DC.L	$0			;WILL BE EVALUATED IN CYCLE1
	DC.L	$140			;HIGHSCORE!

CHANGESARRAY	DC.L	0		;no changes to make in cycle 1
	DC.L	0			;no changes to make in cycle 2
	DC.L	0			;if no highscores were on disk,
					;they will be generated

;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


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


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

;routines to 'load' something
SPECIALARRAY	DC.L	LOADROUT2	;load dual-formatted track 0
	DC.L	LOADROUT		;load stuff from original
	DC.L	LOADROUT3		;load highscore

LOADROUT2
	MOVEQ.L	#0,D7
	MOVEQ.L	#0,D0			;inhibit drive (only on first cycle)
	MOVE.L	PTB_INHIBITDRIVE(A5),A0
	JSR	(A0)

.NEU
.4	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1
	MOVE.W	#TD_CHANGESTATE,IO_COMMAND(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	TST.L	IO_ACTUAL(A1)
	BNE.W	.NOTORG

	MOVEQ.L	#0,D0				;display track to read from
	BSR.W	TRACKREADING

	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1
	MOVE.L	PTB_ADDRESSOFFILE(A5),IO_DATA(A1)
	MOVE.L	#$1200,IO_LENGTH(A1)
	MOVE.L	#$400,IO_OFFSET(A1)
	MOVE.W	#CMD_READ,IO_COMMAND(A1)
	CLR.L	IOTD_SECLABEL(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	TST.L	D0
	BNE.W	.NOTORG

					;LOAD CHECKDISKTRACK
	MOVEQ.L	#0,D2
	LEA.L	TRACKDATALENGTH(PC),A2
	MOVEQ.L	#0,D4

.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
	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.B	.NXCYCLE
	MOVE.L	PTB_SPACE(A5),A0
	LEA.L	$7C00(A0),A1			;end of buffer
	LEA.L	$7C02(A0),A3
	BSR.W	TRACKDECODE3
	TST.L	D0
	BEQ.S	.OK
.NXCYCLE
	DBF	D5,.55
	TST.L	D7
	BNE.W	.DISPERR
	BRA.B	.NOTORG

.OK
	CMP.L	#'tb_1',(A3)			;nitro-diskname
	BNE.S	.NOTORG

	ST	D7
	LEA.L	$8(A3),A3
	MOVE.L	#$A0,D3

.1	MOVE.L	D4,D0
	LSL.L	#1,D0
	MOVE.W	(A3,D0.W),D0
	AND.W	#$FFF,D0
	MOVE.W	D0,(A2)+
	ADDQ.L	#1,D4
	CMP.W	D3,D4				;tracklength
	BNE.S	.2
	MOVEQ.L	#0,D4				;new track
.2
	TST.L	D4
	BNE.W	.3

	LEA.L	TRACKDATALENGTH,A0		;evaluate disksize needed in
	MOVEQ.L	#0,D0				;next cycle (cycle 2)
.T1	MOVEQ.L	#0,D1
	MOVE.W	(A0)+,D1
	ADD.L	D1,D0
	CMP.L	#TRACKDATALENGTHEND,A0
	BNE.S	.T1
	LSL.L	#2,D0
	MOVE.L	D0,LENGTHTABLE+4		;store length in right table
;		    ^-^-^-^-^-^

	MOVEQ.L	#0,D4
.END	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1
	MOVE.L	#0,IO_LENGTH(A1)
	MOVE.W	#TD_MOTOR,IO_COMMAND(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	TST.L	D4
	BEQ.S	.SK

	MOVEQ.L	#0,D0				;enable drive if error
	MOVE.L	PTB_ENABLEDRIVE(A5),A0
	JSR	(A0)

.SK
	MOVE.L	D4,D0
	RTS

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

.NOTORG	TST.L	D7
	BNE.S	.ERR
	ST	D7

	LEA.L	LOADSTATE2(PC),A0	;display 'please insert...'
	MOVE.L	PTB_DISPLAY(A5),A6
	JSR	(A6)

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

	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

.DISPERR
	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1	;motor off
	MOVE.L	#0,IO_LENGTH(A1)
	MOVE.W	#TD_MOTOR,IO_COMMAND(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	BSR.S	TRACKERROR		;requester 'error on track 000'
	BRA.S	.ERR

TRACKERROR				;requester 'error on track 000'
	MOVE.B	D2,D0
	AND.L	#$FF,D0
	DIVU.W	#$A,D0
	SWAP	D0
	ADD.B	#$30,D0
	MOVE.B	D0,ETRACK+2
	CLR.W	D0
	SWAP	D0
	DIVU.W	#$A,D0
	SWAP	D0
	ADD.B	#$30,D0
	MOVE.B	D0,ETRACK+1
	CLR.W	D0
	SWAP	D0
	DIVU.W	#$A,D0
	SWAP	D0
	ADD.B	#$30,D0
	MOVE.B	D0,ETRACK

	LEA.L	LINEE1(PC),A0
	LEA.L	LINEE2(PC),A1
	MOVE.L	PTB_REQUEST(A5),A6
	JSR	(A6)
	RTS


TRACKREADING				;message 'reading track 000'
	AND.L	#$FF,D0
	DIVU.W	#$A,D0
	SWAP	D0
	ADD.B	#$30,D0
	MOVE.B	D0,RTRACK+2
	CLR.W	D0
	SWAP	D0
	DIVU.W	#$A,D0
	SWAP	D0
	ADD.B	#$30,D0
	MOVE.B	D0,RTRACK+1
	CLR.W	D0
	SWAP	D0
	DIVU.W	#$A,D0
	SWAP	D0
	ADD.B	#$30,D0
	MOVE.B	D0,RTRACK

	LEA.L	READINGNR(PC),A0
	MOVE.L	PTB_DISPLAY(A5),A6
	JSR	(A6)
	RTS




LINEE1	DC.B	'Read Error',0
	EVEN
LINEE2	dc.b	'on Track '
ETRACK	DC.B	'000',0
	EVEN

READINGNR
	DC.B	'Reading track '
RTRACK	DC.B	'000.',0
	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				;starttrack on the disk
	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.W	.1
	MOVE.L	D2,D0
	LSL.L	#1,D0
	LEA.L	TRACKDATALENGTH(PC),A0
	TST.W	(A0,D0.W)
	BEQ.W	.SKIPEMPTY

.5	MOVEQ.L	#$4,D5				;4 tries, then error

	MOVE.L	D2,D0				;display track to read from
	BSR.W	TRACKREADING

.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
	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.B	.NXCYCLE
	MOVE.L	#$AAAAAAAA,ANDVALUE
	MOVE.L	PTB_SPACE(A5),A0
	LEA.L	$7C00(A0),A1			;end of buffer
	LEA.L	$7C00(A0),A3
	BSR.W	TRACKDECODE2
	TST.L	D0
	BEQ.S	.R1OK
	MOVE.L	#$55555555,ANDVALUE
	MOVE.L	PTB_SPACE(A5),A0
	LEA.L	$7C00(A0),A1			;end of buffer
	LEA.L	$7C00(A0),A3
	BSR.W	TRACKDECODE2
	TST.L	D0
	BEQ.S	.R1OK
.NXCYCLE
	DBF	D5,.55
	TST.L	D7
	BNE.W	.DISPERR
	BRA.B	.NOTORG

.R1OK	MOVE.W	D1,D3
	LSL.W	#2,D3
	ST	D7				;correct disk - nothing anymore
						;to change
.1	MOVE.B	(A3,D4.W),(A2)+
	ADDQ.L	#1,D4
	CMP.W	D3,D4				;tracklength
	BNE.S	.2
.SKIPEMPTY
	MOVEQ.L	#0,D4				;new track
	ADDQ.L	#1,D2
.2
	TST.L	D4
	BNE.W	.3
	CMP.L	#$A0,D2				;UNTIL END OF DISK IS REACHED
	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)
	TST.L	D4
	BEQ.S	.SK

	MOVEQ.L	#0,D0				;enable drive if error
	MOVE.L	PTB_ENABLEDRIVE(A5),A0
	JSR	(A0)

.SK

	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	LOADSTATE2(PC),A0	;display 'please insert...'
	MOVE.L	PTB_DISPLAY(A5),A6
	JSR	(A6)

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

	LEA.L	LINE1(PC),A0		;requester 'please insert...'
	LEA.L	LINE2(PC),A1
	MOVE.L	PTB_REQUEST(A5),A6
	JSR	(A6)
	TST.L	D0
	BNE.S	.ERR
	BRA.W	.NEU

.DISPERR
	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1	;motor off
	MOVE.L	#0,IO_LENGTH(A1)
	MOVE.W	#TD_MOTOR,IO_COMMAND(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	BSR.W	TRACKERROR		;requester 'error on track 000'
	BRA.S	.ERR

LOADROUT3
	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	#2,D2				;starttrack on the disk
	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.B	.1
.5	MOVEQ.L	#$4,D6				;4 tries, then error
	MOVEQ.L	#2,D0				;display track to read from
	BSR.W	TRACKREADING

.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
	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.B	.NXCYCLE
	MOVE.L	PTB_SPACE(A5),A0
	LEA.L	$7C00(A0),A1			;end of buffer
	LEA.L	$7C02(A0),A3			;due checksum
	BSR.W	TRACKDECODE
	TST.L	D0
	BEQ.S	.R1OK
.NXCYCLE
	DBF	D6,.55
	TST.L	D7
	BNE.W	.DISPERR
	BRA.B	.NOTORG

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

	MOVE.L	PTB_ADDRESSOFFILE(A5),A4	;check if highscores were saved
	MOVE.W	#$140-1,d0
.H2	TST.B	(A4)+
	BNE.S	.H
	DBF	D0,.H2
	MOVE.L	#HITAB,CHANGESARRAY+2*4		;if not, generate them
.H
	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)

	MOVEQ.L	#0,D0				;enable drive unconditionally
	MOVE.L	PTB_ENABLEDRIVE(A5),A0
	JSR	(A0)

	MOVE.L	D4,D0
	RTS

.ERR	MOVEQ.L	#0,D4				;ignore error
	MOVE.L	#HITAB,CHANGESARRAY+2*4		;generate highscores
;			^-^-^-^-^-^-^-^
	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	LOADSTATE2(PC),A0	;display 'please insert...'
	MOVE.L	PTB_DISPLAY(A5),A6
	JSR	(A6)

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

	LEA.L	LINE1(PC),A0		;requester 'please insert...'
	LEA.L	LINE2(PC),A1
	MOVE.L	PTB_REQUEST(A5),A6
	JSR	(A6)
	TST.L	D0
	BNE.S	.ERR
	BRA.W	.NEU

.DISPERR
	MOVE.L	PTB_DEVICESOURCEPTR(A5),A1	;motor off
	MOVE.L	#0,IO_LENGTH(A1)
	MOVE.W	#TD_MOTOR,IO_COMMAND(A1)
	MOVE.L	(_SYSBASE).W,A6
	JSR	_LVODOIO(A6)
	BSR.W	TRACKERROR		;requester 'error on track 000'
	BRA.S	.ERR


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	(A0),D0
	LSR.L	D5,D0
	CMP.W	#$4429,D0	;NITRO HAS $4429 AS SYNC
	BEQ.S	.SY
	DBF	D5,.SHF1
	ADDQ.L	#2,A0
	CMP.L	A0,A4
	BHI.S	.SHF2
	BRA.S	.ERR
.SY	
	MOVE.L	(A0),D0
	ADDQ.L	#2,A0
	LSR.L	D5,D0
	CMP.W	#$4429,D0
	BNE.S	.SY

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

.ERR	MOVEQ.L	#-1,D0
	RTS

GETSYNC2
;SYNCANFANG SUCHEN
.SHF2	MOVEQ.L	#$10-1,D5
.SHF1	MOVE.L	(A0),D0
	LSR.L	D5,D0
	CMP.W	#$428A,D0	;NITRO-DISKCHECKTRACK HAS $428A AS SYNC
	BEQ.S	.SY
	DBF	D5,.SHF1
	ADDQ.L	#2,A0
	CMP.L	A0,A4
	BHI.S	.SHF2
	BRA.S	.ERR
.SY	
	MOVE.L	(A0),D0
	ADDQ.L	#2,A0
	LSR.L	D5,D0
	CMP.W	#$428A,D0
	BNE.S	.SY

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

.ERR	MOVEQ.L	#-1,D0
	RTS

;	IFEQ	1

;< A0 RAWTRACK
;< A1 TRACKBUFFER
;> D0 ERROR
;INTERN
;  D5 SHIFT-COUNT
;  D4 #$55555555
;track contains 1 WORD CHECKSUM, THEN $A6 WORDS

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

	MOVE.L	#$55555555,D4		;get syncposition (word+bitshift)
	BSR.B	GETSYNC2
	TST.L	D0
	BNE.B	.ERR

	MOVE.W	#$A6,D7		;decodes $A7 WORDS
.1
;	MOVE.L	(A0)+,D2	;ORIGINAL CODE

				;my *NEW* code to get a longword
				;DOESNT REQUIRE THAT SUBQ #2,An ANYMORE
	MOVE.L	(A0)+,D2	;get higher word
	LSR.L	D5,D2
	SWAP	D2
	MOVE.L	-2(A0),D6	;get lower word
	LSR.L	D5,D6
	MOVE.W	D6,D2		;my code ends

	ANDI.L	D4,D2
	MOVE.L	D2,D3
	SWAP	D3
	ADD.W	D3,D3
	OR.W	D3,D2
	MOVE.W	D2,(A2)+
	DBF	D7,.1

	MOVE.L	A1,A2
	MOVE.W	(A2)+,D3
	MOVE.W	#$14C,D6
	BSR.B	CHECKSUM
	CMP.W	D2,D3
	BNE.S	.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

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

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

	MOVE.W	#$0626,D7	;decodes $627*4=$189c bytes
.1
;	MOVE.L	(A0)+,D0	;original line

				;my *NEW* code to get a longword
	MOVE.L	(A0)+,D0	;get higher word
	LSR.L	D5,D0
	SWAP	D0
	MOVE.L	-2(A0),D6	;get lower word
	LSR.L	D5,D6
	MOVE.W	D6,D0		;my code ends


;	MOVE.L	(A0)+,D1	;original line

				;my *NEW* code to get a longword
	MOVE.L	(A0)+,D1	;get higher word
	LSR.L	D5,D1
	SWAP	D1
	MOVE.L	-2(A0),D6	;get lower word
	LSR.L	D5,D6
	MOVE.W	D6,D1		;my code ends

	AND.L	D4,D0
	AND.L	D4,D1
	ADD.L	D0,D0
	OR.L	D1,D0
	MOVE.L	D0,(A2)+
	DBF	D7,.1
	MOVEQ	#$01,D3

	MOVE.L	A1,A2
	MOVE.W	(A2)+,D3
	MOVE.W	#$189A,D6
	BSR.B	CHECKSUM
	CMP.W	D2,D3
	BNE.S	.ERR
;	LSR.W	#1,D6
;	SUBQ.W	#1,D6
;.2	MOVE.W	(A1)+,(Ax)+
;	SUBQ.L	#1,D0
;	DBLE	D6,.2
;	CMP.W	D0,D0

	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


CHECKSUM
	MOVEM.L	D1/D6/A1,-(A7)
	LSR.W	#1,D6
	MOVEQ	#-$01,D2
	ADD.W	D2,D2
	BRA.B	.1

.2	MOVE.W	(A2)+,D1
	ADDX.W	D1,D2
.1	DBF	D6,.2
	MOVEM.L	(A7)+,D1/D6/A1
	RTS	

;	ENDC


;LB_FFF4	DC.L	$AAAAAAAA
;	DC.L	$55555555
;	DC.W	$4429

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

ANDVALUE	DC.L	$AAAAAAAA

TRACKDECODE2	MOVEM.L	A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
	LEA.L	($7C00-2*$1A00)(A0),A4	;LAST CHANCE FOR CORRECT SYNC
	MOVE.L	D2,D7		;SAVE ACTUAL TRACK-#

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

	MOVE.L	D5,A4


;	MOVE.L	(A0)+,D5	;CHECKSUM2
	BSR.W	MYLONGWORD
	MOVE.L	D0,D5
	ANDI.L	#$55555555,D5
	MOVE.W	D5,D1
	SWAP	D5
	ADD.W	D5,D5
	OR.W	D1,D5
;	MOVE.B	$B(A3),D0	;??? 0
;	ANDI.W	#$0001,D0
;	ADD.W	D0,D0
;	ADD.W	D0,D0
;	LEA	LB_FFF4(PC),A2
;	MOVE.L	(A2,D0.W),D1	;DATA-AND
	MOVE.L	ANDVALUE(PC),D1	;REPLACEMENT FOR 6 LINES BEFORE

;	MOVEQ	#$00,D0
;	MOVE.B	$0009(A3),D0	;TRACK-#
	MOVE.L	D7,D0
	ADD.W	D0,D0
;	LEA	$001E(A3),A2
	LEA.L	TRACKDATALENGTH(PC),A2
	MOVE.W	(A2,D0.W),D7
;	MOVE.L	A1,A2
	MOVEM.L	D5/D7,-(A7)
	BSR.B	LB_0062
	MOVEM.L	(A7)+,D5/D7
	MOVE.W	D6,D2
	SWAP	D6
	EOR.W	D6,D2
	ANDI.W	#$FFF0,D2
	MOVE.W	D7,D1
	CMP.W	D2,D5
	BNE.S	.ERR
;	MOVEM.L	(A7)+,D1-A6
	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
	RTS	

LB_0062	MOVEQ	#$1F,D2
	MOVEQ	#$1F,D4
	MOVEQ	#$00,D3
	MOVEQ	#$00,D6
	SUBQ.W	#1,D7
	MOVEQ	#$1F,D5
LB_006E	TST.W	$0002(A0)
	BEQ.B	LB_006E
;	MOVE.L	(A0)+,D0
	BSR.S	MYLONGWORD
	BTST	D4,D0
	BEQ.B	LB_00A2

LB_007A	ADD.L	D3,D3
	ADDQ.W	#1,D3
	DBF	D5,LB_0090
	EOR.L	D1,D3
	ADD.L	D3,D6
	MOVE.L	D3,(A1)+
	DBF	D7,LB_008E

	BRA.B	LB_00F0

LB_008E	MOVEQ	#$1F,D5
LB_0090	SUBQ.W	#2,D4
	BPL.B	LB_009E

	AND.W	D2,D4
LB_0096	TST.W	$0002(A0)
	BEQ.B	LB_0096
;	MOVE.L	(A0)+,D0
	BSR.S	MYLONGWORD
LB_009E	BTST	D4,D0
	BNE.B	LB_007A
LB_00A2	ADD.L	D3,D3
	DBF	D5,LB_00B6

	EOR.L	D1,D3
	ADD.L	D3,D6
	MOVE.L	D3,(A1)+
	DBF	D7,LB_00B4
	BRA.B	LB_00F0
LB_00B4	MOVEQ	#$1F,D5
LB_00B6	DBF	D4,LB_00C4
	MOVEQ	#$1F,D4
LB_00BC	TST.W	$0002(A0)
	BEQ.B	LB_00BC
;	MOVE.L	(A0)+,D0
	BSR.S	MYLONGWORD
LB_00C4	BTST	D4,D0
	BNE.B	LB_007A
	ADD.L	D3,D3
	DBF	D5,LB_00DC
	EOR.L	D1,D3
	ADD.L	D3,D6
	MOVE.L	D3,(A1)+
	DBF	D7,LB_00DA
	BRA.B	LB_00F0

LB_00DA	MOVEQ	#$1F,D5
LB_00DC	SUBQ.W	#3,D4
	BPL.B	LB_00EA
	AND.W	D2,D4
LB_00E2	TST.W	$0002(A0)
	BEQ.B	LB_00E2
;	MOVE.L	(A0)+,D0
	BSR.S	MYLONGWORD
LB_00EA	BTST	D4,D0
	BNE.B	LB_007A
	BEQ.B	LB_00A2

LB_00F0	RTS	

;	ORI.B	#$90,D0
;	ADDA.L	#$00000008,A0
;	DBF	D7,LB_00F4
;	RTS	


MYLONGWORD
	MOVEM.L	D5/D6,-(A7)
	MOVE.L	A4,D5		;due lack of data registers shift stored in A4
				;my *NEW* code to get a longword
	MOVE.L	(A0)+,D0	;get higher word
	LSR.L	D5,D0
	SWAP	D0
	MOVE.L	-2(A0),D6	;get lower word
	LSR.L	D5,D6
	MOVE.W	D6,D0		;my code ends

	MOVEM.L	(A7)+,D5/D6
	RTS

TRACKDATALENGTH
	DS.W	$A0
TRACKDATALENGTHEND
	DC.W	0

HITAB
	DC.B	$00,$80,$00,$02,$05,$1F,$40,$4D
	DC.B	$41,$4A,$00,$80,$00,$0A,$05,$1B
	DC.B	$58,$52,$41,$59,$00,$80,$00,$12
	DC.B	$05,$17,$70,$53,$41,$52,$00,$80
	DC.B	$00,$1A,$05,$13,$88,$4A,$46,$57
	DC.B	$00,$80,$00,$22,$05,$0F,$A0,$43
	DC.B	$53,$57,$00,$80,$00,$2A,$05,$0B
	DC.B	$B8,$4E,$45,$54,$00,$80,$00,$32
	DC.B	$05,$07,$D0,$49,$41,$4E,$00,$80
	DC.B	$00,$3A,$05,$03,$E8,$53,$56,$52
	DC.B	$00,$80,$00,$42,$05,$17,$70,$20
	DC.B	$20,$20,$00,$80,$00,$4A,$05,$17
	DC.B	$70,$20,$20,$20,$00,$80,$00,$52
	DC.B	$05,$17,$70,$20,$20,$20,$00,$80
	DC.B	$00,$5A,$05,$17,$70,$20,$20,$20
	DC.B	$00,$80,$00,$62,$05,$17,$70,$20
	DC.B	$20,$20,$00,$80,$00,$6A,$05,$17
	DC.B	$70,$20,$20,$20,$00,$80,$00,$72
	DC.B	$05,$17,$70,$20,$20,$20,$00,$80
	DC.B	$00,$7A,$05,$17,$70,$20,$20,$20
	DC.B	$00,$80,$00,$82,$05,$17,$70,$20
	DC.B	$20,$20,$00,$80,$00,$8A,$05,$17
	DC.B	$70,$20,$20,$20,$00,$80,$00,$92
	DC.B	$05,$17,$70,$20,$20,$20,$00,$80
	DC.B	$00,$9A,$05,$17,$70,$20,$20,$20
	DC.B	$00,$80,$00,$A2,$05,$17,$70,$20
	DC.B	$20,$20,$00,$80,$00,$AA,$05,$17
	DC.B	$70,$20,$20,$20,$00,$80,$00,$B2
	DC.B	$05,$17,$70,$20,$20,$20,$00,$80
	DC.B	$00,$BA,$05,$17,$70,$20,$20,$20
	DC.B	$00,$80,$00,$C2,$05,$17,$70,$20
	DC.B	$20,$20,$00,$80,$00,$CA,$05,$17
	DC.B	$70,$20,$20,$20,$00,$80,$00,$D2
	DC.B	$05,$17,$70,$20,$20,$20,$00,$80
	DC.B	$00,$DA,$05,$17,$70,$20,$20,$20
	DC.B	$00,$80,$00,$E2,$05,$17,$70,$20
	DC.B	$20,$20,$00,$80,$00,$EA,$05,$17
	DC.B	$70,$20,$20,$20,$00,$80,$00,$F2
	DC.B	$05,$17,$70,$20,$20,$20,$00,$80
	DC.B	$00,$FA,$05,$17,$70,$20,$20,$20
	DC.B	$00,$80,$01,$02,$05,$17,$70,$20
	DC.B	$20,$20,$00,$80,$01,$0A,$05,$17
	DC.B	$70,$20,$20,$20,$00,$80,$01,$12
	DC.B	$05,$17,$70,$20,$20,$20,$00,$80
	DC.B	$01,$1A,$05,$17,$70,$20,$20,$20
	DC.B	$00,$80,$01,$22,$05,$17,$70,$20
	DC.B	$20,$20,$00,$80,$01,$2A,$05,$17
	DC.B	$70,$20,$20,$20,$00,$80,$01,$32
	DC.B	$05,$17,$70,$20,$20,$20,$00,$80
	DC.B	$01,$3A,$05,$17,$70,$20,$20,$20
	DC.B	$00,$40,$00,$00


