home *** CD-ROM | disk | FTP | other *** search
- XDEF _DecodeTrack
- XDEF DecodeTrack
-
- SYNC_WORD = $5542
- RESYNC_BUFLEN = $1800
-
- start:
- move.l #dectrack,A0
- move.l #rawtrack,D0
- bsr DecodeTrack
- rts
-
- ResyncTrack:
- move.l RawBuffer(pc),A0
- move.l Shift(pc),D0
- move.l #RESYNC_BUFLEN-1,D1
- subq.l #6,A0
- lea synctrack,A1
- st_loop:
- move.l (A0),D2
- lsr.l D0,D2
- addq.l #2,A0
- move.w D2,(A1)+
- dbf D1,st_loop
- rts
-
- ; ** C entrypoint
-
- _DecodeTrack:
- move.l 4(A7),D0 ; raw buffer
- move.l 8(A7),A0 ; destination (decoded)
-
- ; ** assembly entrypoint
-
- DecodeTrack:
- movem.l D1-A6,-(sp)
-
- move.l A0,A1 ; dec
- move.l D0,A0 ; raw
-
- bsr GetSync
- tst.l D0
- bne syncerr
-
- move.l A1,DecodedBuffer
- move.l A0,RawBuffer
- move.l D1,Shift
-
- bsr ResyncTrack
-
- move.l DecodedBuffer,A0 ; destination
- lea synctrack+2,A1 ; source
-
- bsr Decode
- exit:
-
- movem.l (sp)+,D1-A6
- rts
-
-
- syncerr
- moveq #2,D0
- bra exit
-
-
- Decode:
- MOVEM.L D1-D2/D6-D7/A1,-(A7) ;0848: 48E76340
-
- ; D7 = track number used to checksum the track, ignored
- ANDI.L #$000000FF,D7 ;084E: 0287000000FF
-
- ADDQ.L #4,A1 ;085A: 5489
- MOVE.L (A1)+,D0 ;085C: 2019
- MOVE.L (A1)+,D1 ;085E: 2219
- ANDI.L #$55555555,D0 ;0860: 028055555555
- ANDI.L #$55555555,D1 ;0866: 028155555555
- LSL.L #1,D0 ;086C: E388
- OR.L D1,D0 ;086E: 8081
- ROL.L #8,D0 ;0870: E198
- ; CMP.B D7,D0 ;0872: B007
- ; BNE.S LAB_0038 ;0874: 6636
- ROL.L #8,D0 ;0876: E198
- CMP.B #1,D0
- BNE.S .LAB_0039 ;087C: 663A
- MOVE.L #$000005E3,D7 ;0884: 2E3C000005E3
- .LAB_0037:
- MOVE.L (A1)+,D0 ;088A: 2019
- MOVE.L (A1)+,D1 ;088C: 2219
- ANDI.L #$55555555,D0 ;088E: 028055555555
- ANDI.L #$55555555,D1 ;0894: 028155555555
- LSL.L #1,D0 ;089A: E388
- OR.L D1,D0 ;089C: 8081
- MOVE.L D0,(A0)+ ;089E: 20C0
- DBF D7,.LAB_0037 ;08A0: 51CFFFE8
- MOVEQ #0,D0 ;08A4: 7001
- bra .exit
- .LAB_0039:
- MOVE.L #$00000001,D0 ;08B8: 203C000000FC ; wrong checksum
- .exit
- MOVEM.L (A7)+,D1-D2/D6-D7/A1 ;08BE: 4CDF02C6
- RTS ;08C2: 4E75
-
-
- GetSync:
- movem.l D2-D6/A1-A6,-(sp)
-
- MOVE.L A0,A2
- lea $7C00(A2),A4 ;end of rawtrack
-
- .SHF2 MOVEQ.L #$10-1,D5
-
- ; *** try to find the sync shift (0 to 15)
-
- .SHF1 MOVE.L (A2),D0 ; a longword of data
- LSR.L D5,D0 ; shift it by D5
- CMP.W #SYNC_WORD,D0 ; sync?
- BEQ.S .SY ; yes: found sync AND shift
- DBF D5,.SHF1
- ADDQ.L #2,A2
- cmp.l A2,A4
- beq ErrorSyn
- BRA.S .SHF2
-
- ; ** shift has been found, sync too.
-
- .SY MOVE.L (A2),D0
- ADDQ.L #2,A2
- LSR.L D5,D0 ;d5 is the shifting-number when sync was found
- CMP.W #SYNC_WORD,D0
- BNE.S .SY
-
- .1 MOVE.L (A2),D0
- ADDQ.L #2,A2
- LSR.L D5,D0
- CMP.W #SYNC_WORD,D0
- BEQ.S .1
-
- moveq #0,D0
- move.l A2,A0 ; buffer synced
- move.l D5,D1 ; shift
- bra ExitSyn
-
- ErrorSyn:
- moveq #-1,D0
- ExitSyn
- movem.l (sp)+,D2-D6/A1-A6
- rts
- RawBuffer:
- dc.l 0
- DecodedBuffer:
- dc.l 0
- Shift:
- dc.l 0
- dectrack:
- ; blk.b $1B00,0
- rawtrack:
- ; incbin "ram:gc.raw"
-
- SECTION "DATA",BSS
- synctrack:
- blk.w RESYNC_BUFLEN,0
-