Hier eine CRC-16 Prüfung aus einem 32 Bit Datenwort 0x3d23f034
im Old School Assembler
Gegencheck mit CRC-Calculator von
https://www.ghsi.de/component/option,com_wrapper/Itemid,151/
war erfolgreich ;)
1 | GPOLYNOM = w6
|
2 | CRC = w3
|
3 | DATA = w4
|
4 | COUNT = w5
|
5 | RESULT = w0
|
6 |
|
7 | _test_crc:
|
8 | MOV #0x8005,GPOLYNOM
|
9 | MOV #0x3d23,CRC ;Testdaten 3d23f034
|
10 | MOV #0xf034,DATA
|
11 | MOV #0x10,COUNT ;Anzahl Bit-Shifts (DATA.Length)
|
12 | CALL _calculate_crc ;Berechne CRC..
|
13 | MOV #0x0000,DATA ;GPOLYNOM.Length - 1 an Testdaten als 0 anhängen
|
14 | MOV #0x0f,COUNT ;GPOLYNOM.Length - 1
|
15 | CALL _calculate_crc ;Berechne CRC..
|
16 | XOR CRC,GPOLYNOM,CRC ;Restwert / GPOLYNOM => CRC
|
17 | MOV #0x1,RESULT ;Rückgabewert der Prüfung auf true setzen
|
18 | MOV #0x6eef,w6 ;Zu erwartende CRC-Summe aus den Testdaten
|
19 | CPSEQ w6,CRC ;CRC korrekt?
|
20 | MOV #0x0,RESULT ;NEIN ! Rückgabewert auf false setzen
|
21 | RETURN
|
22 |
|
23 | _calculate_crc:
|
24 | BTSC CRC,#0xf ;High-Bit von CRC gesetzt?
|
25 | XOR CRC,GPOLYNOM,CRC ;Ja! CRC / GPOLYNOM = CRC
|
26 | RLC DATA,DATA ;DATA << 1
|
27 | RLC CRC,CRC ;CRC << 1 (DATA Bit)
|
28 | DEC COUNT,COUNT ;
|
29 | CP0 COUNT ;
|
30 | BRA NZ,_calculate_crc ;Datenpaket durch?
|
31 | RETURN
|
32 |
|
33 | .end
|