[SDASZ80] табличный CRC16 для ВГ93

Программирование, алгоритмы

Postby dr_max » Sun, 15.04.2018 10:52:37

Табличный CRC16, для расчета CRC данных ВГ93

Code: Select all
;==============================================================
;     CRC-16-CCITT table
;      Polynome: 0x1021
;   x^16 + x^12 + x^5 + 1
;==============================================================
crc16_table:
    .dw     0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7
    .dw     0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF
    .dw     0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6
    .dw     0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE
    .dw     0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485
    .dw     0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D
    .dw     0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4
    .dw     0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC
    .dw     0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823
    .dw     0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B
    .dw     0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12
    .dw     0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A
    .dw     0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41
    .dw     0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49
    .dw     0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70
    .dw     0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78
    .dw     0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F
    .dw     0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067
    .dw     0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E
    .dw     0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256
    .dw     0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D
    .dw     0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405
    .dw     0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C
    .dw     0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634
    .dw     0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB
    .dw     0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3
    .dw     0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A
    .dw     0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92
    .dw     0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9
    .dw     0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1
    .dw     0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8
    .dw     0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0

;==============================================================
;u16 wd_crc(u8 *addr, u16 size, u16 initial);
;       #0xE295  ; initial CRC for FB DAM (0xA1 0xA1 0xA1 0xFB)
;       #0xD2F6  ; initial CRC for F8 DAM (0xA1 0xA1 0xA1 0xF8)
;       #0xB230  ; initial CRC for SAM (0xA1 0xA1 0xA1 0xFE)
;==============================================================
_wd_crc:
    push    ix
    pop     af
    pop     af
    pop     ix          ; IX - address
    pop     bc          ; BC - size
    pop     de          ; DE - initial CRC
    push    de
    push    bc
    push    ix
    push    af

wdcrc_lp$:
    ld      a,d
    xor     a, 0 (ix)   ; tmp = (crc>>8)^buff[]
    ld      l,a
    ld      h,#0
    add     hl,hl
    ld      a,l
    add     a,#<crc16_table
    ld      l,a
    ld      a,#>crc16_table
    adc     a,h
    ld      h,a         ; HL = crc16_table + tmp*2

    inc     hl
    ld      a,e
    xor     (hl)
    dec     hl
    ld      d,a
    xor     a
    xor     (hl)
    ld      e,a         ; DE - new CRC

    inc     ix
    dec     bc
    ld      a,b
    or      c
    jp      nz,wdcrc_lp$

    pop     ix
; return big-endian crc
    ld      h,e
    ld      l,d
    ret

dr_max
 
Posts: 36
Joined: Thu, 26.01.2017 12:03:36

Postby dr_max » Sun, 15.04.2018 14:09:49

Дико извиняюсь, передачу параметров писал не приходя в сознание)
можно вернуть, как было:
Code: Select all
    push    ix
    ld      hl,#4
    add     hl,sp

    ld      a,(hl)
    inc     hl
    .db     #0xDD
    ld      l,a

    ld      a,(hl)
    inc     hl
    .db     #0xDD
    ld      h,a         ; IX - address
    ld      c,(hl)
    inc     hl
    ld      b,(hl)      ; BC - size
    inc     hl
    ld      e,(hl)
    inc     hl
    ld      d,(hl)      ; DE - initial CRC


Или же так:
Code: Select all
    push ix
    pop hl
    pop af
    pop ix      ; IX - address
    pop bc      ; BC - size
    pop de      ; DE - initial CRC
    push de
    push de
    push de
    push hl
    push af
dr_max
 
Posts: 36
Joined: Thu, 26.01.2017 12:03:36

Postby dr_max » Thu, 03.05.2018 10:09:01

Немого (скорей даже много) оптимизаций:

Code: Select all
u16 wd_crc(u8 *addr, u16 size, u16 initial) __naked
{
    addr;
    size;
    initial;

    __asm
    pop     af      ; ret
    pop     hl      ; addr
    pop     bc      ; size
    exx
    pop     de      ; initial crc
    push    de
    ld      bc,#crc16_table
    exx
    push    bc
    push    hl
    push    af

wdcrc_lp$:
    ld      a,(hl)
    exx
    xor     d
    ld      l,a
    ld      h,#0
    add     hl,hl
    add     hl,bc
    ld      a,e
    ld      e,(hl)
    inc     hl
    xor     (hl)
    ld      d,a     ; DE - new CRC
    exx
    inc     hl
    dec     bc
    ld      a,b
    or      c
    jp      nz,wdcrc_lp$

    exx

; //return big-endian crc
    ld      l,d
    ld      h,e
    ret

crc16_table:
    .dw     0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7
    .dw     0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF
    .dw     0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6
    .dw     0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE
    .dw     0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485
    .dw     0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D
    .dw     0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4
    .dw     0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC
    .dw     0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823
    .dw     0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B
    .dw     0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12
    .dw     0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A
    .dw     0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41
    .dw     0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49
    .dw     0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70
    .dw     0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78
    .dw     0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F
    .dw     0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067
    .dw     0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E
    .dw     0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256
    .dw     0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D
    .dw     0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405
    .dw     0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C
    .dw     0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634
    .dw     0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB
    .dw     0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3
    .dw     0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A
    .dw     0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92
    .dw     0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9
    .dw     0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1
    .dw     0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8
    .dw     0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
    __endasm;
}


dr_max
 
Posts: 36
Joined: Thu, 26.01.2017 12:03:36


Return to Coding

Who is online

Users browsing this forum: No registered users and 2 guests

cron

x