Files
2020-05-16 20:18:45 +02:00

58 lines
1.1 KiB
NASM

/*
org $2000
mwa #$ffff crc16.crc
lda #'B'
jsr crc16.updCRC
lda #'N'
jsr crc16.updCRC
lda #'E'
jsr crc16.updCRC
jmp *
*/
.proc crc16
crc equ $80
tmpx equ $82
tmpy equ $83
updCRC
stx tmpx
sty tmpy
EOR CRC+1 ; A contained the data
STA CRC+1 ; XOR it into high byte
LSR @ ; right shift A 4 bits
LSR @ ; to make top of x^12 term
LSR @ ; ($1...)
LSR @
TAX ; save it
ASL @ ; then make top of x^5 term
EOR CRC ; and XOR that with low byte
STA CRC ; and save
TXA ; restore partial term
EOR CRC+1 ; and update high byte
STA CRC+1 ; and save
ASL @ ; left shift three
ASL @ ; the rest of the terms
ASL @ ; have feedback from x^12
TAX ; save bottom of x^12
ASL @ ; left shift two more
ASL @ ; watch the carry flag
EOR CRC+1 ; bottom of x^5 ($..2.)
TAY ; save high byte
TXA ; fetch temp value
ROL @ ; bottom of x^12, middle of x^5!
EOR CRC ; finally update low byte
STA CRC+1 ; then swap high and low bytes
STY CRC
ldx tmpx
ldy tmpy
RTS
.endp