
;************************************************************************
; Moscow State Technical University n.a. N.E. Bauman
;   Calculate CRC16 using crc16_8005_table 
;   Polinom: x^16+x^15+x^2+1
;   Initialization value=0xffff
;   Finalization   value=0x0000
;   Test          string=123456789
;   CRC            value=0xAEE7
;************************************************************************
.include "m64def.inc"
.def t0 =r16
.def t1 =r17
.def CRC_regh =r18 ; 
.def CRC_regl =r19 ; 
 
;***********************************************************************
.MACRO CRC
eor 	CRC_regh, @0
andi    CRC_regh,0xff  
mov  	ZL, CRC_regh
lpm  	t1,Z         
eor 	CRC_regl,t1
mov 	CRC_regh,CRC_regl 
dec 	ZH
lpm  	t1,Z
mov 	CRC_regl,t1
inc 	ZH
.ENDMACRO
.MACRO CRCINIT
ser 	CRC_regl
ser 	CRC_regh
ldi 	ZH, High(CRC_Table*2+0x100)
.ENDMACRO
;************************************************************************
.org 0
  rjmp Reset
Reset:
ldi 	t0, low(RAMEND)
out		SPl, t0
ldi 	t0, High(RAMEND)
out 	SPH, t0
;************************************************************************
CRCINIT 

ldi 	t0, 0x31
CRC t0
ldi 	t0, 0x32
CRC t0
ldi 	t0, 0x33
CRC t0
ldi 	t0, 0x34
CRC t0
ldi 	t0, 0x35
CRC t0
ldi 	t0, 0x36
CRC t0
ldi 	t0, 0x37
CRC t0
ldi 	t0, 0x38
CRC t0
ldi 	t0, 0x39
CRC t0

LOOP: 
                              
rjmp LOOP


;-------------------------------------------------------------------------------------------------
.org 0x100
CRC_Table:
.db 0x00,0x05,0x0f,0x0a,0x1b,0x1e,0x14,0x11
.db 0x33,0x36,0x3c,0x39,0x28,0x2d,0x27,0x22
.db 0x63,0x66,0x6c,0x69,0x78,0x7d,0x77,0x72
.db 0x50,0x55,0x5f,0x5a,0x4b,0x4e,0x44,0x41
.db 0xc3,0xc6,0xcc,0xc9,0xd8,0xdd,0xd7,0xd2
.db 0xf0,0xf5,0xff,0xfa,0xeb,0xee,0xe4,0xe1
.db 0xa0,0xa5,0xaf,0xaa,0xbb,0xbe,0xb4,0xb1
.db 0x93,0x96,0x9c,0x99,0x88,0x8d,0x87,0x82
.db 0x83,0x86,0x8c,0x89,0x98,0x9d,0x97,0x92
.db 0xb0,0xb5,0xbf,0xba,0xab,0xae,0xa4,0xa1
.db 0xe0,0xe5,0xef,0xea,0xfb,0xfe,0xf4,0xf1
.db 0xd3,0xd6,0xdc,0xd9,0xc8,0xcd,0xc7,0xc2
.db 0x40,0x45,0x4f,0x4a,0x5b,0x5e,0x54,0x51
.db 0x73,0x76,0x7c,0x79,0x68,0x6d,0x67,0x62
.db 0x23,0x26,0x2c,0x29,0x38,0x3d,0x37,0x32
.db 0x10,0x15,0x1f,0x1a,0x0b,0x0e,0x04,0x01
.db 0x03,0x06,0x0c,0x09,0x18,0x1d,0x17,0x12
.db 0x30,0x35,0x3f,0x3a,0x2b,0x2e,0x24,0x21
.db 0x60,0x65,0x6f,0x6a,0x7b,0x7e,0x74,0x71
.db 0x53,0x56,0x5c,0x59,0x48,0x4d,0x47,0x42
.db 0xc0,0xc5,0xcf,0xca,0xdb,0xde,0xd4,0xd1
.db 0xf3,0xf6,0xfc,0xf9,0xe8,0xed,0xe7,0xe2
.db 0xa3,0xa6,0xac,0xa9,0xb8,0xbd,0xb7,0xb2
.db 0x90,0x95,0x9f,0x9a,0x8b,0x8e,0x84,0x81
.db 0x80,0x85,0x8f,0x8a,0x9b,0x9e,0x94,0x91
.db 0xb3,0xb6,0xbc,0xb9,0xa8,0xad,0xa7,0xa2
.db 0xe3,0xe6,0xec,0xe9,0xf8,0xfd,0xf7,0xf2
.db 0xd0,0xd5,0xdf,0xda,0xcb,0xce,0xc4,0xc1
.db 0x43,0x46,0x4c,0x49,0x58,0x5d,0x57,0x52
.db 0x70,0x75,0x7f,0x7a,0x6b,0x6e,0x64,0x61
.db 0x20,0x25,0x2f,0x2a,0x3b,0x3e,0x34,0x31
.db 0x13,0x16,0x1c,0x19,0x08,0x0d,0x07,0x02


.db 0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x80
.db 0x80,0x00,0x00,0x80,0x00,0x80,0x80,0x00
.db 0x80,0x00,0x00,0x80,0x00,0x80,0x80,0x00
.db 0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x80
.db 0x80,0x00,0x00,0x80,0x00,0x80,0x80,0x00
.db 0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x80
.db 0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x80
.db 0x80,0x00,0x00,0x80,0x00,0x80,0x80,0x00
.db 0x81,0x01,0x01,0x81,0x01,0x81,0x81,0x01
.db 0x01,0x81,0x81,0x01,0x81,0x01,0x01,0x81
.db 0x01,0x81,0x81,0x01,0x81,0x01,0x01,0x81
.db 0x81,0x01,0x01,0x81,0x01,0x81,0x81,0x01
.db 0x01,0x81,0x81,0x01,0x81,0x01,0x01,0x81
.db 0x81,0x01,0x01,0x81,0x01,0x81,0x81,0x01
.db 0x81,0x01,0x01,0x81,0x01,0x81,0x81,0x01
.db 0x01,0x81,0x81,0x01,0x81,0x01,0x01,0x81
.db 0x83,0x03,0x03,0x83,0x03,0x83,0x83,0x03
.db 0x03,0x83,0x83,0x03,0x83,0x03,0x03,0x83
.db 0x03,0x83,0x83,0x03,0x83,0x03,0x03,0x83
.db 0x83,0x03,0x03,0x83,0x03,0x83,0x83,0x03
.db 0x03,0x83,0x83,0x03,0x83,0x03,0x03,0x83
.db 0x83,0x03,0x03,0x83,0x03,0x83,0x83,0x03
.db 0x83,0x03,0x03,0x83,0x03,0x83,0x83,0x03
.db 0x03,0x83,0x83,0x03,0x83,0x03,0x03,0x83
.db 0x02,0x82,0x82,0x02,0x82,0x02,0x02,0x82
.db 0x82,0x02,0x02,0x82,0x02,0x82,0x82,0x02
.db 0x82,0x02,0x02,0x82,0x02,0x82,0x82,0x02
.db 0x02,0x82,0x82,0x02,0x82,0x02,0x02,0x82
.db 0x82,0x02,0x02,0x82,0x02,0x82,0x82,0x02
.db 0x02,0x82,0x82,0x02,0x82,0x02,0x02,0x82
.db 0x02,0x82,0x82,0x02,0x82,0x02,0x02,0x82
.db 0x82,0x02,0x02,0x82,0x02,0x82,0x82,0x02
; 000h 00 01 02 03 04 05 06 07
/*.db 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80 ; 0000h..0007h
.db 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00 ; 0008h..000Fh
.db 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00 ; 0010h..0017h
.db 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80 ; 0018h..001Fh
.db 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00 ; 0020h..0027h
.db 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80 ; 0028h..002Fh
.db 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80 ; 0030h..0037h
.db 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00 ; 0038h..003Fh
.db 0x81, 0x01, 0x01, 0x81, 0x01, 0x81, 0x81, 0x01 ; 0040h..0047h
.db 0x01, 0x81, 0x81, 0x01, 0x81, 0x01, 0x01, 0x81 ; 0048h..004Fh
.db 0x01, 0x81, 0x81, 0x01, 0x81, 0x01, 0x01, 0x81 ; 0050h..0057h
.db 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38 ; 0058h..005Fh
.db 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA ; 0060h..0067h
.db 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C ; 0068h..006Fh
.db 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26 ; 0070h..0077h
.db 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0 ; 0078h..007Fh
.db 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62 ; 0080h..0087h
.db 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4 ; 0088h..008Fh
.db 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE ; 0090h..0097h
.db 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68 ; 0098h..009Fh
.db 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA ; 00A0h..00A7h
.db 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C ; 00A8h..00AFh
.db 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76 ; 00B0h..00B7h
.db 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0 ; 00B8h..00BFh
.db 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92 ; 00C0h..00C7h
.db 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54 ; 00C8h..00CFh
.db 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E ; 00D0h..00D7h
.db 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98 ; 00D8h..00DFh
.db 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A ; 00E0h..00E7h
.db 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C ; 00E8h..00EFh
.db 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86 ; 00F0h..00F7h
.db 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 ; 00F8h..00FFh
; 001h 00 01 02 03 04 05 06 07
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0100h..0107h
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0108h..010Fh
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0110h..0117h
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0118h..011Fh
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0120h..0127h
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0128h..012Fh
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0130h..0137h
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0138h..013Fh
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0140h..0147h
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0148h..014Fh
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0150h..0157h
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0158h..015Fh
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0160h..0167h
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0168h..016Fh
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0170h..0177h
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0178h..017Fh
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0180h..0187h
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0188h..018Fh
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 0190h..0197h
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 0198h..019Fh
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 01A0h..01A7h
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 01A8h..01AFh
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 01B0h..01B7h
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 01B8h..01BFh
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 01C0h..01C7h
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 01C8h..01CFh
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 01D0h..01D7h
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 01D8h..01DFh
.db 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; 01E0h..01E7h
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 01E8h..01EFh
.db 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 ; 01F0h..01F7h
.db 0x01, 0xC0, 0x80, 0x41, 0x41, 0xC1, 0x81, 0x40*/ ; 01F8h..01FFh  */