Цитата(forever failure @ May 28 2009, 14:36)

Уважаемые участники, а приведите плз., кто владеет этим языком, так, хотя бы ради интереса, код вычисления контрольной суммы CRC16 на форте ?
Просто интересно сравнить с привычными решениями на Ц.
Есть CRC8, делал для 1-wire, по документу AVR318 ATMEL Application Note.Rev.2579A-AVR-09/04 ( page_17).
0x18 VALUE POLYNOM
0x80 CONSTANT MSB#
0x01 CONSTANT LSB#
: LSB LSB# AND ;
: CRC8 8 0 DO
2DUP LSB SWAP LSB XOR
IF SWAP POLYNOM XOR
1 RSHIFT MSB# OR
ELSE SWAP 1 RSHIFT
THEN SWAP 1 RSHIFT
LOOP DROP ;
Если данные находятся в стеке:
\ ( ... d[n] d[n-1] ... d[1] 's n --- crc )
: CRC 0 ?DO SWAP CRC8 LOOP ;
где: d[] - байты данных; 's - ноль; n - количество данных в стеке
Если данные находятся в памяти:
: CRC ( 's addr n -- crc ) \ 's - seed=0 ; addr - адрес начала блока данных; n - количество байтов
OVER + SWAP ( 's addr2 addr1 )
DO I C@ CRC8 LOOP
;
А следующий фрагмент я использовал для построения таблицы ( табличный метод получения CRC8 )
\
\ построение таблицы crc8
\
: crc8tab ( -- )
CR ." crc8tab:" CR
0 0x100 0 DO DUP I CRC8 I 0x8 /MOD DROP 0=
IF CR 0x09 EMIT ." DB" 0x09 EMIT
THEN ." 0x" .XB ." , "
LOOP DROP ;
при котором входной байт используется как индекс в таблице значений контрольной суммы.
Вот, как-то так.
Да, забыл:
: .XB BASE @ >R HEX
0 <# # # #>
TYPE SPACE R> BASE ! ;
это печать байта в шестнадцатиричном виде.
Таблица напечаталась вот такая:
crc8tab:
DB 0x00 , 0x5E , 0xBC , 0xE2 , 0x61 , 0x3F , 0xDD , 0x83
DB 0xC2 , 0x9C , 0x7E , 0x20 , 0xA3 , 0xFD , 0x1F , 0x41
DB 0x9D , 0xC3 , 0x21 , 0x7F , 0xFC , 0xA2 , 0x40 , 0x1E
DB 0x5F , 0x01 , 0xE3 , 0xBD , 0x3E , 0x60 , 0x82 , 0xDC
DB 0x23 , 0x7D , 0x9F , 0xC1 , 0x42 , 0x1C , 0xFE , 0xA0
DB 0xE1 , 0xBF , 0x5D , 0x03 , 0x80 , 0xDE , 0x3C , 0x62
DB 0xBE , 0xE0 , 0x02 , 0x5C , 0xDF , 0x81 , 0x63 , 0x3D
DB 0x7C , 0x22 , 0xC0 , 0x9E , 0x1D , 0x43 , 0xA1 , 0xFF
DB 0x46 , 0x18 , 0xFA , 0xA4 , 0x27 , 0x79 , 0x9B , 0xC5
DB 0x84 , 0xDA , 0x38 , 0x66 , 0xE5 , 0xBB , 0x59 , 0x07
DB 0xDB , 0x85 , 0x67 , 0x39 , 0xBA , 0xE4 , 0x06 , 0x58
DB 0x19 , 0x47 , 0xA5 , 0xFB , 0x78 , 0x26 , 0xC4 , 0x9A
DB 0x65 , 0x3B , 0xD9 , 0x87 , 0x04 , 0x5A , 0xB8 , 0xE6
DB 0xA7 , 0xF9 , 0x1B , 0x45 , 0xC6 , 0x98 , 0x7A , 0x24
DB 0xF8 , 0xA6 , 0x44 , 0x1A , 0x99 , 0xC7 , 0x25 , 0x7B
DB 0x3A , 0x64 , 0x86 , 0xD8 , 0x5B , 0x05 , 0xE7 , 0xB9
DB 0x8C , 0xD2 , 0x30 , 0x6E , 0xED , 0xB3 , 0x51 , 0x0F
DB 0x4E , 0x10 , 0xF2 , 0xAC , 0x2F , 0x71 , 0x93 , 0xCD
DB 0x11 , 0x4F , 0xAD , 0xF3 , 0x70 , 0x2E , 0xCC , 0x92
DB 0xD3 , 0x8D , 0x6F , 0x31 , 0xB2 , 0xEC , 0x0E , 0x50
DB 0xAF , 0xF1 , 0x13 , 0x4D , 0xCE , 0x90 , 0x72 , 0x2C
DB 0x6D , 0x33 , 0xD1 , 0x8F , 0x0C , 0x52 , 0xB0 , 0xEE
DB 0x32 , 0x6C , 0x8E , 0xD0 , 0x53 , 0x0D , 0xEF , 0xB1
DB 0xF0 , 0xAE , 0x4C , 0x12 , 0x91 , 0xCF , 0x2D , 0x73
DB 0xCA , 0x94 , 0x76 , 0x28 , 0xAB , 0xF5 , 0x17 , 0x49
DB 0x08 , 0x56 , 0xB4 , 0xEA , 0x69 , 0x37 , 0xD5 , 0x8B
DB 0x57 , 0x09 , 0xEB , 0xB5 , 0x36 , 0x68 , 0x8A , 0xD4
DB 0x95 , 0xCB , 0x29 , 0x77 , 0xF4 , 0xAA , 0x48 , 0x16
DB 0xE9 , 0xB7 , 0x55 , 0x0B , 0x88 , 0xD6 , 0x34 , 0x6A
DB 0x2B , 0x75 , 0x97 , 0xC9 , 0x4A , 0x14 , 0xF6 , 0xA8
DB 0x74 , 0x2A , 0xC8 , 0x96 , 0x15 , 0x4B , 0xA9 , 0xF7
DB 0xB6 , 0xE8 , 0x0A , 0x54 , 0xD7 , 0x89 , 0x6B , 0x35
я ее тупо воткнул в исходник на асме.
\ Табличный метод CRC8:
: CRC ( c -- crc ) 0xFF AND crc8tab + C@ ;
Вот, собственно и все.
А CRC16 - аналогичным образом, только полином другой и сдвигов побольше...
PS. Примеры реальные, использовал российский SP-Forth4