;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

	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.1',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.01'		;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
.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

	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	.ERR

					;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.W	.ERR
	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
	DBF	D5,.55
	BRA.W	.NOTORG

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

	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.S	.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)

	MOVE.L	D4,D0
	RTS

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

.NOTORG	TST.L	D7
	BNE.S	.ERR
	ST	D7
	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


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
.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.W	.ERR
	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
	DBF	D5,.55
	BRA.W	.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)

	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


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.W	.1
.5	MOVEQ.L	#$4,D6				;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.W	.ERR
	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
	DBF	D6,.55
	BRA.W	.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.W	.3
	CMP.L	#$3,D2				;UNTIL TRACK $3 IS REACHED
	BNE.W	.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)

	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	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	(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
	BSR.W	GETSYNC2
	TST.L	D0
	BNE.W	.ERR

	SUBQ.L	#2,A0		;DUE MY LONGWORD-READER

	MOVE.W	#$A6,D7		;decodes $A7 WORDS
.1
;	MOVE.L	(A0)+,D2	;ORIGINAL CODE
				;my code to get a longword
	MOVE.L	(A0)+,D2	;get higher part
	MOVE.L	(A0),D6		;get lower part
	LSR.L	D5,D6		;shift lower part with count
	MOVEQ.L	#$20,D1		;higher part has to be shifted to fill
				;the rest-place, a longword has 20 bits
	SUB.L	D5,D1
	LSL.L	D1,D2
	OR.L	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.W	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.W	.ERR

	SUBQ.L	#2,A0		;DUE MY LONGWORD-READER

	MOVE.W	#$0626,D7	;decodes $627*4=$189c bytes
.1
;	MOVE.L	(A0)+,D0
				;my code to get a longword
				;that it works, a2 has to point 2 bytes
				;before the real location! (see
				;subq #2,a0 before)
	MOVE.L	(A0)+,D0	;get higher part
	MOVE.L	(A0),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

;	MOVE.L	(A0)+,D1
				;my code to get a longword
	MOVE.L	(A0)+,D1	;get higher part
	MOVE.L	(A0),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,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.W	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
;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.W	.ERR

	SUBQ.L	#2,A0		;DUE MY LONGWORD-READER
	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.W	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				;my code to get a longword
	
	MOVEM.L	D5/D6/D2,-(A7)
	MOVE.L	A4,D5
	MOVE.L	(A0)+,D0	;get higher part
	MOVE.L	(A0),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
	MOVEM.L	(A7)+,D5/D6/D2
	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


