Advertisement
Guest User

CRC-16/CCITT-FALSE and CRC-16/AUG-CCITT

a guest
Jun 15th, 2020
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; CRC-16/CCITT-FALSE calculation
  2. ;   Initial value = 0xFFFF
  3. ;
  4. ; CRC-16/AUG-CCITT calculation
  5. ;   Initial value = 0x1D0F
  6. ;
  7. ; 16-bit CRC-CCITT specification, which is:
  8. ; Width = 16 bits
  9. ; Truncated polynomial = 0x1021
  10. ; Input data is NOT reflected
  11. ; Output CRC is NOT reflected
  12. ; No XOR is performed on the output CRC
  13. ;
  14. ; unsigned short crc16(const unsigned char* data_p, unsigned char length){
  15. ;     unsigned char x;
  16. ;     unsigned short crc = 0xFFFF;
  17. ;
  18. ;     while (length--){
  19. ;         x = crc >> 8 ^ *data_p++;
  20. ;         x ^= x>>4;
  21. ;         crc = (crc << 8) ^ ((unsigned short)(x << 12)) ^ ((unsigned short)(x <<5)) ^ ((unsigned short)x);
  22. ;     }
  23. ;     return crc;
  24. ; }
  25.  
  26.     ORG 0x8000
  27.    
  28.     ld   HL, null
  29.     ld   BC, size_null
  30.     call crc
  31.    
  32.     ld   HL, char_A
  33.     ld   BC, size_A
  34.     call crc
  35.    
  36.     ld   HL, num
  37.     ld   BC, size_num
  38.     call crc
  39.  
  40.     ld   HL, A256
  41.     ld   BC, size_A256
  42.     call crc
  43.    
  44.     ret
  45.  
  46.    
  47. ; In: BC sum bytes
  48. ; Out: DE crc16
  49. crc:
  50.     push HL
  51.     push BC
  52.     ld   DE, 0xFFFF ; 3:10 CRC-16/CCITT-FALSE    
  53.     call crc_loopB
  54.     call PRINT_DE    
  55.     pop  BC
  56.     pop HL
  57.    
  58.     ld    A, ' '
  59.     rst 10H
  60.    
  61.     ld   DE, 0x1D0F ; 3:10 CRC-16/AUG-CCITT
  62.     call crc_loopB
  63.     call PRINT_DE    
  64.    
  65.     ld    A, 0x0D
  66.     rst 10H
  67.  
  68.     ret
  69.  
  70.  
  71.    
  72. ; In: BC sum bytes, DC start crc, HL data addr
  73. ; Out: DE crc16
  74. crc_loopB:
  75.     ld    A, B
  76.     or    C
  77.     ret   z
  78.    
  79.     dec   BC
  80.     inc   C
  81.     push BC    
  82.     ld    B, C
  83. crc_loopC:
  84.  
  85. ; In:  HL = Data addr, DE old crc
  86. ; Out: DE new crc
  87. ; Pollutes: AF, DE, HL, C
  88. crc16_byte:
  89.     ld    A, (HL)   ; 1:7
  90.     xor   D         ; 1:4
  91.     ld    C, A      ; 1:4   x = ((old_crc>>8) ^ data) & 0xff;
  92.     rrca            ; 1:4
  93.     rrca            ; 1:4
  94.     rrca            ; 1:4
  95.     rrca            ; 1:4
  96.     and  0x0F       ; 2:7
  97.     xor   C         ; 1:4
  98.     ld    C, A      ; 1:4   x ^= x>>4
  99.                     ;11:46
  100.    
  101.     add   A, A      ; 1:4
  102.     add   A, A      ; 1:4
  103.     add   A, A      ; 1:4
  104.     add   A, A      ; 1:4   1111 0000
  105.     xor   E         ; 1:4
  106.     ld    D, A      ; 1:4   crc_hi = (old_crc << 8) ^ (x << 12)
  107.  
  108.     xor   E         ; 1:4
  109.     add   A, A      ; 1:4   1110 0000
  110.     xor   C         ; 1:4
  111.     ld    E, A      ; 1:4   crc_lo = (x << 5) ^ x
  112.  
  113.     ld    A, C      ; 1:4
  114.     rrca            ; 1:4
  115.     rrca            ; 1:4
  116.     rrca            ; 1:4
  117.     and  0x1F       ; 2:7   0001 1111
  118.     xor   D         ; 1:4
  119.     ld    D, A      ; 1:4   crc_hi = (old_crc << 8) ^ (x << 12) ^ (x << 5)
  120.                     ;18:71
  121.    
  122.     inc  HL         ; 1:6    
  123.     djnz crc_loopC  ; 2:8/13
  124.     pop  BC
  125.     ld    C, 0x00
  126.     jr   crc_loopB
  127.    
  128.                                        
  129. ;===============================
  130. ;TISK OBSAHU <DE> V HEXA KODU
  131. PRINT_DE:
  132.     ld    A, D
  133.     call  PRINT_A
  134.     ld    A,E
  135.  
  136. ;-------------------------------
  137. PRINT_A:
  138.     push AF
  139.     call AHI2HEX    ;VYPISE HORNI NIBBLE REG A
  140.     rst  0x10       ; vypis znaku z registru A
  141.     pop  AF
  142.     call ALO2HEX    ;VYPISE DOLNI NIBBLE REG A
  143.     rst  0x10       ; vypis znaku z registru A
  144.     ret
  145.  
  146. ;-------------------------------
  147. AHI2HEX:
  148.     rrca
  149.     rrca
  150.     rrca
  151.     rrca
  152. ALO2HEX:
  153.     and  0x0F
  154.     add   A,0x90    ; hex-->ascii
  155.     daa
  156.     adc   A,'@'
  157.     daa
  158.     ret
  159.                    
  160.  
  161. null:
  162. size_null   EQU $-null
  163. db 0x00
  164.  
  165. char_A:
  166. db 'A'
  167. size_A   EQU $-char_A
  168. db 0x00
  169.  
  170. num:                    
  171. db "123456789"
  172. size_num   EQU $-num
  173. db 0x00
  174.  
  175. A256:
  176. db "AAAAAAAAAAAAAAAA"
  177. db "AAAAAAAAAAAAAAAA"
  178. db "AAAAAAAAAAAAAAAA"
  179. db "AAAAAAAAAAAAAAAA"
  180. db "AAAAAAAAAAAAAAAA"
  181. db "AAAAAAAAAAAAAAAA"
  182. db "AAAAAAAAAAAAAAAA"
  183. db "AAAAAAAAAAAAAAAA"
  184. db "AAAAAAAAAAAAAAAA"
  185. db "AAAAAAAAAAAAAAAA"
  186. db "AAAAAAAAAAAAAAAA"
  187. db "AAAAAAAAAAAAAAAA"
  188. db "AAAAAAAAAAAAAAAA"
  189. db "AAAAAAAAAAAAAAAA"
  190. db "AAAAAAAAAAAAAAAA"
  191. db "AAAAAAAAAAAAAAAA"
  192. size_A256   EQU $-A256
  193. db 0x00
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement