home *** CD-ROM | disk | FTP | other *** search
- ;--------------------------------------------------------------------------
- ; CRC_16.S
- ; Assemblerroutinen (68000er) zur CRC-Berechnung;
- ;
- ; (c) 1994 by Jan Kriesten, D-35043 Marburg, FidoNet: 2:244/4344
- ;
- ; Die CRC-Tabelle fr CRC-16 ist hier enthalten;
- ;
-
- *** CRC-16
- .GLOBL Crc16Str, Crc16Blk, Crc16Upd, Crc16BlkUpd
- .GLOBL Crc16Short
- .GLOBL Crc16Tab
-
- .TEXT
-
- ;--------------------------------------------------------------------------
- ; Routinen zur CRC-16 Berechnung (CRC-16)
- ; Polynom: x^16+x^15+x^2+1
- ; Die Berechnung wird mit Hilfe einer Tabelle durchgefhrt, so da
- ; 8 BIT gleichzeitig herangezogen werden knnen.
-
- .MODULE Crc16Str
-
- ; -> a0: - Adresse eines nullterminierten Strings;
- ; <- d0: - CRC-16 ( 2 Byte unsigned );
-
- moveq #-1, d0 ; d0 vorbesetzen
- lea.l Crc16Tab(pc), a1 ; Adresse der CRC-Tabelle nach a1
-
- bra.b .LoopStart
-
- .Loop:
- eor.b d0, d1 ; x = crc XOR (*msg)
- add.w d1, d1 ; mal 2, da auf long adressiert wird
- move.w (a1, d1.w), d1 ; entsprechender Tabelleneintrag nach d1
-
- lsr.w #8, d0 ; d0 wird um 8 BIT rechts geschoben
- eor.w d1, d0 ; y = (crc >> 8) XOR x
-
- .LoopStart:
- moveq #0, d1 ; d1 lschen
- move.b (a0)+, d1 ; erstes Byte des Strings nach d1 ...
- bne.b .Loop ; wenn d2 != 0, dann geht's weiter
-
- rts ; ... endlich schluss und zurck!
-
- .ENDMOD
-
- .MODULE Crc16Blk
-
- ; -> a0: - Adresse eines Datenblockes;
- ; d0: - Lnge des Datenblockes ( 4 Bytes unsigned )
- ; <- d0: - CRC-16 ( 2 Byte unsigned );
-
- move.l d0, d1 ; counter in d1 initialisieren
- moveq #-1, d0 ; d0 vorbesetzen
-
- cmp.l #$ffff.w, d1 ; wenn die Lnge WORD ist
- blo.w Crc16Short ; dann dbra benutzen
-
- bra.w Crc16BlkUpd
-
- .ENDMOD
-
- .MODULE Crc16BlkUpd
-
- ; -> a0: - Adresse eines Datenblockes;
- ; d0: - bisherige CRC-16
- ; d1: - Lnge des Datenblockes ( 4 Bytes unsigned )
- ; <- d0: - CRC-16 ( 2 Byte unsigned );
-
- cmp.l #$ffff.w, d1 ; wenn die Lnge WORD ist
- blo.w Crc16Short ; dann dbra benutzen
-
- move.l d1, d2 ; counter in d2 initialisieren
-
- lea.l Crc16Tab(pc), a1 ; Adresse der CRC-Tabelle nach a1.
-
- bra.b .LoopStart
-
- .Loop:
- moveq #0, d1 ; d1 lschen
- move.b (a0)+, d1 ; Zeichen holen
-
- eor.b d0, d1 ; x = crc XOR (*msg)
- add.w d1, d1 ; mal 2, da auf word adressiert wird
- move.w (a1,d1.w), d1 ; entsprechender Tabelleneintrag nach d1
-
- lsr.w #8, d0 ; d0 wird um 8 BIT rechts geschoben
- eor.w d1, d0 ; y = (crc >> 8) XOR x
-
- .LoopStart:
- subq.l #1, d2 ; counter um 1 erniedrigen
- bpl.b .Loop ; wenn d3 >= 0, dann geht's weiter
-
- rts ; ... endlich schluss und zurck!
-
- .ENDMOD
-
- .MODULE Crc16Short
-
- ; -> a0: - Adresse eines Datenblockes;
- ; d0: - bisherige CRC-16
- ; d1: - Lnge des Datenblockes ( 2 Bytes signed )
- ; <- d0: - CRC-16 ( 2 Byte unsigned );
-
- move.l d1, d2 ; counter in d2 initialisieren
-
- lea.l Crc16Tab(pc), a1 ; Adresse der CRC-Tabelle nach a1.
-
- bra.b .LoopStart
-
- .Loop:
- moveq #0, d1 ; d1 lschen
- move.b (a0)+, d1 ; Zeichen holen
-
- eor.b d0, d1 ; x = crc XOR (*msg)
- add.w d1, d1 ; mal 2, da auf word adressiert wird
- move.w (a1,d1.w), d1 ; entsprechender Tabelleneintrag nach d1
-
- lsr.w #8, d0 ; d0 wird um 8 BIT rechts geschoben
- eor.w d1, d0 ; y = (crc >> 8) XOR x
-
- .LoopStart:
- dbra d2, .Loop ; counter um 1 erniedrigen und
- ; und bis -1.
-
- rts ; ... endlich schluss und zurck!
-
- .ENDMOD
-
- .MODULE Crc16Upd
-
- ; -> d0: - bisheriger CRC-16 (2 Byte unsigned;
- ; d1: - hinzuzufgendes Byte;
- ; <- d0: - CRC-16 ( 2 Byte unsigned );
-
- lea.l Crc16Tab(pc), a0 ; Adresse der CRC-Tabelle nach a1.
-
- andi.w #$00ff, d1 ; ober Byte ausmaskieren
- eor.b d0, d1 ; x = crc XOR (*msg)
- add.w d1, d1 ; mal 2, da auf word adressiert wird
- move.w (a0,d1.w), d1 ; entsprechender Tabelleneintrag nach d1
-
- lsr.w #8, d0 ; d0 wird um 8 BIT rechts geschoben
- eor.w d1, d0 ; y = (crc >> 8) XOR x
-
- rts ; ... endlich schluss und zurck!
-
- .ENDMOD
-
- ;--------------------------------------------------------------------------
-
- .MODULE Crc16Tab:
-
- dc.w $0000, $1189, $2312, $329b, $4624, $57ad, $6536, $74bf
- dc.w $8c48, $9dc1, $af5a, $bed3, $ca6c, $dbe5, $e97e, $f8f7
- dc.w $1081, $0108, $3393, $221a, $56a5, $472c, $75b7, $643e
- dc.w $9cc9, $8d40, $bfdb, $ae52, $daed, $cb64, $f9ff, $e876
- dc.w $2102, $308b, $0210, $1399, $6726, $76af, $4434, $55bd
- dc.w $ad4a, $bcc3, $8e58, $9fd1, $eb6e, $fae7, $c87c, $d9f5
- dc.w $3183, $200a, $1291, $0318, $77a7, $662e, $54b5, $453c
- dc.w $bdcb, $ac42, $9ed9, $8f50, $fbef, $ea66, $d8fd, $c974
- dc.w $4204, $538d, $6116, $709f, $0420, $15a9, $2732, $36bb
- dc.w $ce4c, $dfc5, $ed5e, $fcd7, $8868, $99e1, $ab7a, $baf3
- dc.w $5285, $430c, $7197, $601e, $14a1, $0528, $37b3, $263a
- dc.w $decd, $cf44, $fddf, $ec56, $98e9, $8960, $bbfb, $aa72
- dc.w $6306, $728f, $4014, $519d, $2522, $34ab, $0630, $17b9
- dc.w $ef4e, $fec7, $cc5c, $ddd5, $a96a, $b8e3, $8a78, $9bf1
- dc.w $7387, $620e, $5095, $411c, $35a3, $242a, $16b1, $0738
- dc.w $ffcf, $ee46, $dcdd, $cd54, $b9eb, $a862, $9af9, $8b70
- dc.w $8408, $9581, $a71a, $b693, $c22c, $d3a5, $e13e, $f0b7
- dc.w $0840, $19c9, $2b52, $3adb, $4e64, $5fed, $6d76, $7cff
- dc.w $9489, $8500, $b79b, $a612, $d2ad, $c324, $f1bf, $e036
- dc.w $18c1, $0948, $3bd3, $2a5a, $5ee5, $4f6c, $7df7, $6c7e
- dc.w $a50a, $b483, $8618, $9791, $e32e, $f2a7, $c03c, $d1b5
- dc.w $2942, $38cb, $0a50, $1bd9, $6f66, $7eef, $4c74, $5dfd
- dc.w $b58b, $a402, $9699, $8710, $f3af, $e226, $d0bd, $c134
- dc.w $39c3, $284a, $1ad1, $0b58, $7fe7, $6e6e, $5cf5, $4d7c
- dc.w $c60c, $d785, $e51e, $f497, $8028, $91a1, $a33a, $b2b3
- dc.w $4a44, $5bcd, $6956, $78df, $0c60, $1de9, $2f72, $3efb
- dc.w $d68d, $c704, $f59f, $e416, $90a9, $8120, $b3bb, $a232
- dc.w $5ac5, $4b4c, $79d7, $685e, $1ce1, $0d68, $3ff3, $2e7a
- dc.w $e70e, $f687, $c41c, $d595, $a12a, $b0a3, $8238, $93b1
- dc.w $6b46, $7acf, $4854, $59dd, $2d62, $3ceb, $0e70, $1ff9
- dc.w $f78f, $e606, $d49d, $c514, $b1ab, $a022, $92b9, $8330
- dc.w $7bc7, $6a4e, $58d5, $495c, $3de3, $2c6a, $1ef1, $0f78
-
- .ENDMOD
-
- .END
-