home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / Games / JST / sources / src / loaders / GreatCourts / decode.asm next >
Encoding:
Assembly Source File  |  2001-03-19  |  2.7 KB  |  162 lines

  1.     XDEF    _DecodeTrack
  2.     XDEF    DecodeTrack
  3.  
  4. SYNC_WORD = $5542
  5. RESYNC_BUFLEN = $1800
  6.  
  7. start:
  8.     move.l    #dectrack,A0
  9.     move.l    #rawtrack,D0
  10.     bsr    DecodeTrack
  11.     rts
  12.  
  13. ResyncTrack:
  14.     move.l    RawBuffer(pc),A0
  15.     move.l    Shift(pc),D0
  16.     move.l    #RESYNC_BUFLEN-1,D1
  17.     subq.l    #6,A0
  18.     lea    synctrack,A1
  19. st_loop:
  20.     move.l    (A0),D2
  21.     lsr.l    D0,D2
  22.     addq.l    #2,A0
  23.     move.w    D2,(A1)+
  24.     dbf    D1,st_loop
  25.     rts
  26.  
  27. ; ** C entrypoint
  28.  
  29. _DecodeTrack:
  30.     move.l    4(A7),D0    ; raw buffer
  31.     move.l    8(A7),A0    ; destination (decoded)
  32.  
  33. ; ** assembly entrypoint
  34.  
  35. DecodeTrack:
  36.     movem.l    D1-A6,-(sp)
  37.  
  38.     move.l    A0,A1    ; dec
  39.     move.l    D0,A0    ; raw
  40.  
  41.     bsr    GetSync
  42.     tst.l    D0
  43.     bne    syncerr
  44.  
  45.     move.l    A1,DecodedBuffer
  46.     move.l    A0,RawBuffer
  47.     move.l    D1,Shift
  48.  
  49.     bsr    ResyncTrack
  50.  
  51.     move.l    DecodedBuffer,A0    ; destination
  52.     lea    synctrack+2,A1        ; source
  53.     
  54.     bsr    Decode
  55. exit:
  56.  
  57.     movem.l    (sp)+,D1-A6
  58.     rts
  59.  
  60.  
  61. syncerr
  62.     moveq    #2,D0
  63.     bra    exit
  64.  
  65.  
  66. Decode:
  67.     MOVEM.L    D1-D2/D6-D7/A1,-(A7)    ;0848: 48E76340
  68.  
  69.     ; D7 = track number used to checksum the track, ignored
  70.     ANDI.L    #$000000FF,D7        ;084E: 0287000000FF
  71.  
  72.     ADDQ.L    #4,A1            ;085A: 5489
  73.     MOVE.L    (A1)+,D0        ;085C: 2019
  74.     MOVE.L    (A1)+,D1        ;085E: 2219
  75.     ANDI.L    #$55555555,D0        ;0860: 028055555555
  76.     ANDI.L    #$55555555,D1        ;0866: 028155555555
  77.     LSL.L    #1,D0            ;086C: E388
  78.     OR.L    D1,D0            ;086E: 8081
  79.     ROL.L    #8,D0            ;0870: E198
  80. ;    CMP.B    D7,D0            ;0872: B007
  81. ;    BNE.S    LAB_0038        ;0874: 6636
  82.     ROL.L    #8,D0            ;0876: E198
  83.     CMP.B    #1,D0            
  84.     BNE.S    .LAB_0039        ;087C: 663A
  85.     MOVE.L    #$000005E3,D7        ;0884: 2E3C000005E3
  86. .LAB_0037:
  87.     MOVE.L    (A1)+,D0        ;088A: 2019
  88.     MOVE.L    (A1)+,D1        ;088C: 2219
  89.     ANDI.L    #$55555555,D0        ;088E: 028055555555
  90.     ANDI.L    #$55555555,D1        ;0894: 028155555555
  91.     LSL.L    #1,D0            ;089A: E388
  92.     OR.L    D1,D0            ;089C: 8081
  93.     MOVE.L    D0,(A0)+        ;089E: 20C0
  94.     DBF    D7,.LAB_0037        ;08A0: 51CFFFE8
  95.     MOVEQ    #0,D0            ;08A4: 7001
  96.     bra    .exit
  97. .LAB_0039:
  98.     MOVE.L    #$00000001,D0        ;08B8: 203C000000FC    ; wrong checksum
  99. .exit
  100.     MOVEM.L    (A7)+,D1-D2/D6-D7/A1    ;08BE: 4CDF02C6
  101.     RTS                ;08C2: 4E75
  102.  
  103.  
  104. GetSync:
  105.     movem.l    D2-D6/A1-A6,-(sp)
  106.  
  107.     MOVE.L    A0,A2
  108.     lea    $7C00(A2),A4        ;end of rawtrack
  109.  
  110. .SHF2    MOVEQ.L    #$10-1,D5
  111.  
  112.     ; *** try to find the sync shift (0 to 15)
  113.  
  114. .SHF1    MOVE.L    (A2),D0        ; a longword of data
  115.     LSR.L    D5,D0        ; shift it by D5
  116.     CMP.W    #SYNC_WORD,D0    ; sync?
  117.     BEQ.S    .SY        ; yes: found sync AND shift
  118.     DBF    D5,.SHF1
  119.     ADDQ.L    #2,A2
  120.     cmp.l    A2,A4
  121.     beq    ErrorSyn
  122.     BRA.S    .SHF2
  123.  
  124.     ; ** shift has been found, sync too.
  125.  
  126. .SY    MOVE.L    (A2),D0
  127.     ADDQ.L    #2,A2
  128.     LSR.L    D5,D0            ;d5 is the shifting-number when sync was found
  129.     CMP.W    #SYNC_WORD,D0
  130.     BNE.S    .SY
  131.  
  132. .1    MOVE.L    (A2),D0
  133.     ADDQ.L    #2,A2
  134.     LSR.L    D5,D0
  135.     CMP.W    #SYNC_WORD,D0
  136.     BEQ.S    .1
  137.  
  138.     moveq    #0,D0
  139.     move.l    A2,A0    ; buffer synced
  140.     move.l    D5,D1    ; shift
  141.     bra    ExitSyn
  142.  
  143. ErrorSyn:
  144.     moveq    #-1,D0
  145. ExitSyn
  146.     movem.l    (sp)+,D2-D6/A1-A6
  147.     rts
  148. RawBuffer:
  149.     dc.l    0
  150. DecodedBuffer:
  151.     dc.l    0
  152. Shift:
  153.     dc.l    0
  154. dectrack:
  155. ;    blk.b    $1B00,0
  156. rawtrack:
  157. ;    incbin    "ram:gc.raw"
  158.  
  159.     SECTION    "DATA",BSS
  160. synctrack:
  161.     blk.w    RESYNC_BUFLEN,0
  162.