home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 13
/
AACD13.ISO
/
AACD
/
Games
/
WHDLoad
/
Extra
/
Patcher1.05dev.lha
/
Patcher1.05
/
PARAMQTX
/
nitro.imager.asm
< prev
next >
Wrap
Assembly Source File
|
1998-01-17
|
20KB
|
1,013 lines
;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