home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / PNL Libraries / Assembly / CalcCRC.a next >
Encoding:
Text File  |  1994-08-27  |  4.7 KB  |  247 lines  |  [TEXT/MPS ]

  1.     macro
  2.     PUSH
  3.     move.l    &SYSLIST[1],-(sp)
  4.     endm
  5.         
  6.     macro
  7.     POP
  8.     move.l    (sp)+,&SYSLIST[1]
  9.     endm
  10.  
  11. magic    proc    export
  12.     dc.w    $0000,$1021,$2042,$3063,$4084,$50a5,$60c6,$70e7
  13.     dc.w    $8108,$9129,$a14a,$b16b,$c18c,$d1ad,$e1ce,$f1ef
  14.     dc.w    $1231,$0210,$3273,$2252,$52b5,$4294,$72f7,$62d6
  15.     dc.w    $9339,$8318,$b37b,$a35a,$d3bd,$c39c,$f3ff,$e3de
  16.     dc.w    $2462,$3443,$0420,$1401,$64e6,$74c7,$44a4,$5485
  17.     dc.w    $a56a,$b54b,$8528,$9509,$e5ee,$f5cf,$c5ac,$d58d
  18.     dc.w    $3653,$2672,$1611,$0630,$76d7,$66f6,$5695,$46b4
  19.     dc.w    $b75b,$a77a,$9719,$8738,$f7df,$e7fe,$d79d,$c7bc
  20.     dc.w    $48c4,$58e5,$6886,$78a7,$0840,$1861,$2802,$3823
  21.     dc.w    $c9cc,$d9ed,$e98e,$f9af,$8948,$9969,$a90a,$b92b
  22.     dc.w    $5af5,$4ad4,$7ab7,$6a96,$1a71,$0a50,$3a33,$2a12
  23.     dc.w    $dbfd,$cbdc,$fbbf,$eb9e,$9b79,$8b58,$bb3b,$ab1a
  24.     dc.w    $6ca6,$7c87,$4ce4,$5cc5,$2c22,$3c03,$0c60,$1c41
  25.     dc.w    $edae,$fd8f,$cdec,$ddcd,$ad2a,$bd0b,$8d68,$9d49
  26.     dc.w    $7e97,$6eb6,$5ed5,$4ef4,$3e13,$2e32,$1e51,$0e70
  27.     dc.w    $ff9f,$efbe,$dfdd,$cffc,$bf1b,$af3a,$9f59,$8f78
  28.     dc.w    $9188,$81a9,$b1ca,$a1eb,$d10c,$c12d,$f14e,$e16f
  29.     dc.w    $1080,$00a1,$30c2,$20e3,$5004,$4025,$7046,$6067
  30.     dc.w    $83b9,$9398,$a3fb,$b3da,$c33d,$d31c,$e37f,$f35e
  31.     dc.w    $02b1,$1290,$22f3,$32d2,$4235,$5214,$6277,$7256
  32.     dc.w    $b5ea,$a5cb,$95a8,$8589,$f56e,$e54f,$d52c,$c50d
  33.     dc.w    $34e2,$24c3,$14a0,$0481,$7466,$6447,$5424,$4405
  34.     dc.w    $a7db,$b7fa,$8799,$97b8,$e75f,$f77e,$c71d,$d73c
  35.     dc.w    $26d3,$36f2,$0691,$16b0,$6657,$7676,$4615,$5634
  36.     dc.w    $d94c,$c96d,$f90e,$e92f,$99c8,$89e9,$b98a,$a9ab
  37.     dc.w    $5844,$4865,$7806,$6827,$18c0,$08e1,$3882,$28a3
  38.     dc.w    $cb7d,$db5c,$eb3f,$fb1e,$8bf9,$9bd8,$abbb,$bb9a
  39.     dc.w    $4a75,$5a54,$6a37,$7a16,$0af1,$1ad0,$2ab3,$3a92
  40.     dc.w    $fd2e,$ed0f,$dd6c,$cd4d,$bdaa,$ad8b,$9de8,$8dc9
  41.     dc.w    $7c26,$6c07,$5c64,$4c45,$3ca2,$2c83,$1ce0,$0cc1
  42.     dc.w    $ef1f,$ff3e,$cf5d,$df7c,$af9b,$bfba,$8fd9,$9ff8
  43.     dc.w    $6e17,$7e36,$4e55,$5e74,$2e93,$3eb2,$0ed1,$1ef0
  44.     endp
  45.  
  46. CalcCRCStack    record    0
  47. Return    ds.l    1
  48. dummy    ds.b    1
  49. v    ds.b    1
  50. crcp    ds.l    1
  51.     endr
  52.  
  53. ; procedure CalcCRC(var crc:integer; v:integer);
  54. CalcCRC    proc    export
  55.     with    CalcCRCStack
  56.     
  57.     move.l    crcp(sp),a0
  58.     move.w    #0,d0
  59.     move.b    (a0),d0                ; crc high byte
  60.     add.w    d0,d0
  61.     lea    magic,a1
  62.     move.w    (a1,d0.w),d0
  63.     move.b    v(sp),d1
  64.     eor.b    d1,d0
  65.     move.b    1(a0),d1            ; crc low byte
  66.     lsl.w    #8,d1
  67.     eor.w    d1,d0
  68.     move.w    d0,(a0)    
  69.  
  70.     move.l    (sp),6(sp)
  71.     add.l    #6,sp
  72.     rts
  73.  
  74.     endp
  75.  
  76. CalcCRCBlockStack    record    0
  77. a2    ds.l    1
  78. Return    ds.l    1
  79. crcp    ds.l    1
  80. len    ds.l    1
  81. p    ds.l    1
  82.     endr
  83.  
  84. ; procedure CalcCRCBlock(p:ptr; len:longInt; var crc:integer);
  85. CalcCRCBlock    proc    export
  86.     with    CalcCRCBlockStack
  87.  
  88.     move.l    a2,-(sp)
  89.     move.l    len(sp),d2
  90.     move.l    crcp(sp),a0
  91.     lea    magic,a1
  92.     move.l    p(sp),a2
  93.  
  94. lop
  95.     subq.l    #1,d2
  96.     bmi.s    fin
  97.  
  98.     clr.w    d0
  99.     move.b    (a0),d0                ; crc high byte
  100.     add.w    d0,d0
  101.     move.w    (a1,d0.w),d0
  102.     move.b    (a2)+,d1
  103.     eor.b    d1,d0
  104.     move.b    1(a0),d1            ; crc low byte
  105.     lsl.w    #8,d1
  106.     eor.w    d1,d0
  107.     move.w    d0,(a0)    
  108.     bra    lop
  109.  
  110. fin
  111.     move.l    (sp)+,a2
  112.     move.l    (sp),12(sp)
  113.     add.l    #12,sp
  114.     rts
  115.  
  116.     endp
  117.  
  118. ; procedure CalcMBCRC(var crc:integer; v:integer);
  119. CalcMBCRC    proc    export
  120.     with    CalcCRCStack
  121.     
  122.     move.l    crcp(sp),a0
  123.     move.w    #0,d0
  124.     move.b    (a0),d0                ; crc high byte
  125.     move.b    v(sp),d1
  126.     eor.b    d1,d0
  127.     add.w    d0,d0
  128.     lea    magic,a1
  129.     move.w    (a1,d0.w),d0
  130.     move.b    1(a0),d1            ; crc low byte
  131.     lsl.w    #8,d1
  132.     eor.w    d1,d0
  133.     move.w    d0,(a0)    
  134.  
  135.     move.l    (sp),6(sp)
  136.     add.l    #6,sp
  137.     rts
  138.  
  139.     endp
  140.  
  141. CalcMBCRCBlockStack    record    0
  142. a2    ds.l    1
  143. Return    ds.l    1
  144. crcp    ds.l    1
  145. len    ds.l    1
  146. p    ds.l    1
  147.     endr
  148.  
  149. ; procedure CalcMBCRCBlock(p:ptr; len:longInt; var crc:integer);
  150. CalcMBCRCBlock    proc    export
  151.     with    CalcMBCRCBlockStack
  152.     
  153.     move.l    a2,-(sp)
  154.     move.l    len(sp),d2
  155.     move.l    crcp(sp),a0
  156.     lea    magic,a1
  157.     move.l    p(sp),a2
  158. lop
  159.     subq.l    #1,d2
  160.     bmi.s    fin
  161.  
  162.     clr.w    d0
  163.     move.b    (a0),d0                ; crc high byte
  164.     move.b    (a2)+,d1
  165.     eor.b    d1,d0
  166.     add.w    d0,d0
  167.     move.w    (a1,d0.w),d0
  168.     move.b    1(a0),d1            ; crc low byte
  169.     lsl.w    #8,d1
  170.     eor.w    d1,d0
  171.     move.w    d0,(a0)    
  172.     bra    lop
  173.  
  174. fin
  175.     move.l    (sp)+,a2
  176.     move.l    (sp),12(sp)
  177.     add.l    #12,sp
  178.     rts
  179.  
  180.     endp
  181.  
  182. ; function GetMagic:magicPtr;
  183. GetMagic    proc    export
  184.     lea    magic,a0
  185.     move.l    a0,4(sp)
  186.     rts
  187.  
  188.     endp
  189.     
  190.     END
  191.     
  192. regspc    equ        16
  193. rtsoff    equ        regspc+0
  194. voff    equ        regspc+4
  195. crcoff    equ        regspc+6
  196.  
  197. ; procedure CalcCRC(var crc:integer; v:integer);
  198. ; @crc        @a0 = d0
  199. ; v            d1
  200. ; @rts
  201. OldCRC    proc    export
  202.     MOVEM.L    A0/D0-D2,-(SP)    ;Save all regs. except D0
  203.  
  204.     move.l    crcoff(sp),a0
  205.     move.w    (a0),d0
  206.     move.w    voff(sp),d1
  207.     
  208.     move.w    #7,d2
  209. loop
  210.     lsl.b    #1,d1
  211.     roxl.w    #1,d0
  212.     bcc        noxor
  213.     eor.w    #$1021,d0
  214. noxor
  215.     dbf        d2,loop
  216.     
  217.     move.w    d0,(a0)
  218.     
  219.     MOVEM.L    (SP)+,A0/D0-D2
  220.     move.l    (sp),6(sp)
  221.     add.l    #6,sp
  222.     RTS
  223.     endp
  224.     
  225.  
  226. procedure CalcCRC (v: integer);
  227.     var
  228.         temp: boolean;
  229.         i: integer;
  230. begin
  231.     for i := 1 to 8 do begin
  232.         temp := BAND(crc, $8000) <> 0;
  233.         crc := BOR(BSL(crc, 1), BSR(v, 7));
  234.         if temp then
  235.             crc := BXOR(crc, $1021);
  236.         v := BAND(BSL(v, 1), $FF);
  237.     end;
  238. end;
  239.  
  240. asm -wb "{active}"
  241.  
  242.  
  243. (evaluate "{active}" =~ /(?*):(?*)®1.a/ )> dev:null
  244. (evaluate "{active}" =~ "/(?*)®2.a/" )> dev:null
  245. link -sn CalcCRC="{®1}" "{active}.o" -o "{®2}"
  246. dumpcode "{®2}"
  247.