ZXNet эхоконференция «code.zx»


тема: Fwd: некоторые полезные функции



от: Kirill Frolov
кому: Kirill Frolov
дата: 06 Jul 2003

- --- begin of forward ---
From: Kirill Frolov
Newsgroups: zxnet.code
Subject: некоторые полезные функции
Date: Sun, 6 Jul 2003 08:07:24 +0000 (UTC)

Hемедленно нажми на RESET, All!

Hекоторыми спектрумистами задавался вопрос о генерации
случайных чисел и таблично рассчёте CRC...


Общие замечания касающиеся всех
представленных функций.
----------------------------------

Любые функции, если это не оговорено
специально, не гарантируют сохранность
любых регистров микропроцессора кроме
регистров I и IY. Функции отмеченные
как безопасные для C компилятора гаран-
тируют сохранность регистра IX.

Все функции, если это не оговорено
специально, являются реентрантными,
иначе говоря позволяют вложенные или
рекурсивные вызовы, и не используют
статических переменных или самомодифици-
рующегося кода. Все переменные выделя-
ются на стеке.


Функции преобразования чисел:
------------------------------

htoa
Функция записывает безнаковое
число заданное в регистре A
в строку заданную регистром HL
в шестнадцатеричной системе
счисления. Будет записано 2
цифры (ведущий ноль присутст-
вует) и символ с кодом 0 закан-
чивающий строку. По завершению
функции регистр HL будет ука-
зывать на последний символ стро-
ки (завершающий 0).

wtoa
Функция записывает беззнаковое
число заданное в регистре BC
в строку заданную регистром HL
в десятичной системе счисления.
Ведущие нули не записываются.
Может быть записано до 6-и байт,
включая символ с кодом 0 закан-
чивающий строку. В регистре HL
возвращается указатель на после-
дний символ строки (код 0).


Функции pаботы со стpоками:
------------------------------

strglob
Функция осуществляет сравнение
строки заданной регистром HL с
строкой маски заданной реги-
стром DE. В случае, если строка
соответствует маске флаг Z будет
установлен.

Маска может состоять из любых
символов (кроме символа с
кодом 0). Hекоторые символы
интерпретируются особым образом:

* -- означает любое число
любых символов.

? -- означает один любой
символ.



Математические функции:
------------------------------

mul
Функция перемножает беззна-
ковые 16-разрядные числа задан-
ные в регистрах DE и BC, и поме-
щает результат в регистры DE и
HL. В регистре DE хранятся стар-
шие биты результата. Функция вы-
полняется примерно за 800 тактов
процессора. Смотри также описа-
ние функции amul.

amul
Функция перемножает беззнако-
вые числа заданные в регистрах
A и DE и прибавляет результат к
содержимому регистра HL. Функция
выполняется быстрей чем mul,
примерно за 350 тактов и может
быть использована для доступа
к элементам массивов. В том слу-
чае если размеры элементов или
размерности массивов кратны 2^n
или являются константами может
быть выгодней использовать более
другие способы ускоренного умно-
жения. В случае, если требуется
более быстрый доступ к элементам
массивов с произвольным размером
элемента или размерностью может
быть целесообразным использовать
массивы Айлифа.

div
Функция делит число заданное
в регистре HL на число заданное
в регистре BC, результат поме-
щается в регистр HL, а остаток
в регистр DE. В случае деления
на 0 в регистре HL записывается
ноль, а в регистре DE значение
делимого. Функция выполняется
примерно за 900 тактов.

sqrt
Функция вычисляет целочис-
ленное значение квадратного кор-
ня от беззнакового числа задан-
ного в регистре HL, результат
возвращается в регистре A.

w2bcd
Функция конвертирует беззнако-
вое 16-разрядное число в двоич-
но-десятичный формат. Аргумент
задается в регистре HL, резуль-
тат возвращается в регистрах
D, E и C. Старшие биты результа-
та содержатся в регистре D, млад-
шие в регистре C.

randn
Функция возвращает псевдослу-
чайное число в заданном диапазо-
не. Минимальное значение возвра-
щаемого случайного числа -- 0.
Максимальное всегда меньше числа
заданного в регистр DE. Резуль-
тат возвращается в регистре HL.
Смотри также описание функции
rand.

rand
Функция возвращает беззнаковое
псевдослучайное число в регистре
HL. Возвращаемое число находится
в диапазоне 0..65535. Функция
выполняется несколько быстрей
функции randn. Выполнение функ-
ции rand по времени примерно
равно 3-м вызовам фунцкии mul,
в то время как время выполнения
функции randn сопоставимо с 4-мя
вызовами функции mul.

srand
Функция устанавливает генера-
тор случайных чисел. При устано-
вке генератора одним значением
генерируемая последовательность
псевдослучайных чисел будет
всегда повторяться.


Функции рассчетя контрольных кодов:
-------------------------------------

flatcher
Функция рассчитывает значения
кода Флетчера. В регистре IX
передается указатель на область
памяти, по содержимому которой
будет произведен рассчет. В ре-
гистре BC передается размер
области памяти в байтах.
В регистрах HL и DE возвраща-
ются значения 16-разрядного
кода Флетчера. Это не слишком
удачная функция для контроля
целостности данных, но работает
быстрей функций рассчета КЦК.

crc16_init
Функция инициализирует таблицу
для быстрого подсчета 16-разряд-
ного циклического избыточного
кода (ЦИК) функцией crc16_fast.
В регистре de передается адрес
памяти размером 512 байт для
сохранения рассчитанной таблицы.
В регистре BC указывается порож-
дающий многочлен ЦИК. В телеком-
муникационных протоколах исполь-
зуется рекомендованное МККТТ
значение: #1021.

crc16_fast
Функция рассчитывает значение
ЦИК для области памяти с началь-
ным адресом заданным в регистре
IX и длиной в байтах заданной в
регистре BC. В регистре DE пере-
дается адрес таблицы предвари-
тельно рассчитанной с помощю
функции crc16_init. В регистре
HL указывается начальное значе-
ние ЦИК. Результат рассчется
возвращается в регистре HL.

crc16
Функция рассчитывает значение
ЦИК для области памяти с началь-
ным адресом заданным в регистре
IX и длиной в байтах заданной в
регистре BC. В регистре DE ука-
зывается порождающий многочлен
ЦИК. В регистре HL задается на-
чальное значение ЦИК. Результат
рассчета возвращается в реги-
стре HL. В качестве порождающего
ЦИК многочлена в телекоммуни
кационных протоколах использует-
ся рекомендуемое МККТТ значение
#1021.

Результат работы данной функ-
ции полностью аналогичен выпол-
нению функции crc16_fast, однако
эта функция не использует зара-
нее рассчитанную таблицу и время
ее работы значительно больше.
Рекомендуется использовать функ-
ции crc16_init и crc16_fast,
если требуется вести подсчет
ЦИК больших объемов данных.

от: Kirill Frolov
кому: Kirill Frolov
дата: 06 Jul 2003

- --- begin of forward ---
From: Kirill Frolov
Newsgroups: zxnet.code
Subject: некоторые полезные функции
Date: Sun, 6 Jul 2003 08:07:24 +0000 (UTC)


[...пингвины..сожрали...]


ifndef htoa
ifused htoa
; a=0..FF, HL=str[3] -> hl=*0
htoa
push af
rra
rra
rra
rra
call nib2hex
pop af
nib2hex and #0f
cp #0a
sbc a, #69
daa
ld (hl), a
inc hl
ld (hl), 0
ret
endif
endif


ifndef strglob
ifused strglob
; hl=string, de=mask -> Z
strglob
ld a, (de)
or a
jr nz, strglob_1
cpi ; end
ret
strglob_0
xor a
inc a
ret
strglob_1
ld a, (hl)
or a
jr z, strglob_0 ; not equal
ld a, (de)
cp "?"
jr z, strglob_q
cp "*"
jr z, strglob_a
cp (hl)
ret nz ; not equal
strglob_q
inc hl
inc de
jr strglob
strglob_a
inc hl
push hl
push de
call strglob
pop de
pop hl
ret z
inc de
jr strglob
endif
endif


ifused wtoa
ifndef wtoa
; функция записывает 16-разрядное беззнаковое число
; в десятичном виде, ведущие нули не отбрасываются.
; по адресу (hl) будет записано 5 цифр числа и
; символ с кодом 0 завершающий строку.
; (C) Kirill Frolov
; *hl = itoa(de) -> hl=указатель на завершающий 0.
wtoa
push hl
ex de, hl
call w2bcd
pop hl ; d,e,c=bcd
ld a, d
or a
jr nz, wtoa0
ld a, e
and #f0
jr nz, wtoa1
ld a, e
and #0f
jr nz, wtoa2
ld a, c
and #f0
jr nz, wtoa3
jr wtoa4
wtoa0
or #30
ld (hl), a
inc hl
wtoa1
ld (hl), e
ld a, #33
rrd
inc hl
wtoa2
or #30
ld (hl), a
inc hl
wtoa3
ld (hl), c
ld a, #33
rrd
inc hl
wtoa4
or #30
ld (hl), a

inc hl
ld (hl), 0
ret
endif
endif





ifused randn
; Генератор случайных чисел, медленный
; (C) Kirill Frolov ~3000 takts.
; hl = random(0.. randn
push de
call rand
ex de, hl
pop bc
call mul
ex de, hl
ret
endif

ifused rand
randx dw 0, 0
RAND_MAX equ #ffff
; Получение случайного числа
; -> hl = случайное число 0..65535 ~2300 takts.
rand
; randx = randx*1103515245 + 12345)>>16) & 077777)
ld de, (randx+2)
ld bc, #4e6d
call mul
push hl
ld de, (randx)
ld bc, #41c6
call mul
pop de
add hl, de
push hl
ld de, (randx)
ld bc, #4e6d
call mul
ld bc, #3039
add hl, bc
ld (randx), hl
pop hl
adc hl, de
ld (randx+2), hl
ret
endif


ifused srand
; Установка генератора случайных чисел
; de = инициирующее значение
srand
ld (randx), de
ret
endif




ifused div
ifndef div
; функция 16-разрядного беззнакового деления
; (C) Aleksey Malov aka Vivid
; little optimized by Vitaly Vidmirov
; hl = de/bc de = de%bc ~840 takts.
; hl = 0, de = de(dividend) if bc(divisor) == 0.
div
xor a ;меняем знак
sub c ; у делителя
ld c, a
sbc a, b
sub c
ld b, a
ld hl,0 ;обнулили новое делимое
ld a,d ;сначала двигаем
rla ;старший байт делимого
;t=18
REPT 8
rl l ;
add hl,bc ;
jr c,$+4 ;8 раз
sbc hl,bc ;
rla ; t=8*45=360
ENDR

ld d,a ;ст. байт результата
ld a,e ;теперь двигаем
rla ;младший байт t=12

REPT 8
adc hl,hl ;
add hl,bc ;
jr c,$+4 ;8 раз
sbc hl,bc ;
rla ; t=8*52=416
ENDR


ld e,a ;мл. байт результата
;hl-остаток от деления
;t=4
ex de, hl
ret
endif
endif



ifused mul
ifndef mul
; функция беззнакового умножения 16-разрядных чисел
; (C) Kirill Frolov
; idea by Vasil Ivanov
; dehl=de*bc ~730t.
mul
ld hl, 0
ld a, c
ld c, l ; 18

add a, a
jr nc, $+4
add hl, de
adc a, c ; 29
rept 7
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c ; 40*7 309
endr

ld c, a
push hl ; 0chl
ld hl, 0
ld a, b
ld b, l ; 33

add a, a
jr nc, $+4
add hl, de
add a, b ; 29
rept 7
add hl, hl
rla
jr nc, $+4
add hl, de
add a, b ; 40*7 309
endr

; ahl0 + 0cde = hlde
pop de
ld b, l
ld l, h
ld h, a
ld a, d
add a, b
ld d, a
ld b, 0
adc hl, bc
ex de, hl ; 60

ret ; 729t.
endif
endif


ifused amul
ifndef amul
; функция 8-разрядного умножения с суммированием
; (C) Kirill Frolov
; hl = hl + a*de ~338 takts.
amul
add a, a
jr nc, $+4
add hl, de
adc a, c ; 39
rept 7
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c ; 40*7 309
endr
ret
endif
endif


ifused sqrt
ifndef sqrt
; функция вычисления квадратного корня 16-разрядных чисел
; (C) Aleksey Malov aka Vivid
; a = sqrt(hl) ~470 takts.
sqrt
xor a ;обнулили a ;-)
ld de,64 ;этого требует алгоритм
; t=14
sla h ;берем два самых левых
adc a,a ;бита аргумента
sla h ;
adc a,a ;
jr z,$+4 ;если они не равны
dec a ;нулю, то увеличиваем
inc d ;результат
; t=39
REPT 3
sla h ;далее следуем
adc a,a ;алгоритму извлечения
sla h ;квадратного корня
adc a,a ;"столбиком", только
sla d ;
ld c,d ;3 раза
sli c ;
cp c ;
jr c,$+4 ;
sub c ;
inc d ; t=63*3=189
ENDR

REPT 2
sla l ;проделываем похожую
adc a,a ;операцию с
sla l ;младшим байтом
adc a,a ;аргумента
sla d ;
ld c,d ;2 раза
sli c ;
cp c ;
jr c,$+4 ;
sub c ;
inc d ; t=63*2=126
ENDR

ld h,a ;
or a ;обнулили флаг переноса
; t=8
sbc hl,de ;теперь нам не хватает
jr nc,$+3 ;одного регистра d для
add hl,de ;выполнения последних
ccf ;двух циклов, придется
rl d ;использовать более
add hl,hl ;медленные операции
add hl,hl ;с регистровыми парами
; t=67
sbc hl,de ;и последний раз
ccf ;выполняем расчеты, не
ld a,d ;восстанавливая hl
adc a,a ;в a-результат
; t=27
ret
endif
endif


ifused w2bcd
ifndef w2bcd
; функция переводит 16-разрядное беззнаковое
; двоичное число в двоично-десятичный формат
; (C) Kirill Frolov
; d,e,c = bin2bcd(hl) ~1330 takts.
w2bcd
ld b, 10h
xor a
ld c, a
ld e, a
ld d, a ; 23
w2bcd0
add hl, hl ; D,E,C=bcd digits
ld a, c
adc a, a
daa
ld c, a
ld a, e
adc a, a
daa
ld e, a
ld a, d
adc a, a
daa
ld d, a
djnz w2bcd0 ; ~83 ~1328
ret
endif
endif



; Внимание!
; Все функции подсчета 16-разрядного ЦИК
; используют только сдвиг влево!

ifused flatcher
; Функция подсчёта кода Флетчера
; (более быстрый, но менее эффективный чем CRC)
; (C) Kirill Frolov
; ix=данные, bc=размер,
; -> hl=код флетчера (A), de=(B), E&L=8bit code
flatcher
ld hl, 0
ld e, l
ld d, h
flatch0
ld a, b
or c
ex de, hl
ret z
ex de, hl
ld a, (ix)
inc ix
add a, e
ld e, a
jr nc, $+3
inc d
add hl, de
dec bc
jr flatch0
endif


ifused crc16_init
; Функция инициализирующая таблицу CRC.
; (C) Kirill Frolov
; de=адрес рамещения таблицы (512 байт),
; bc=полином (0x1021 рекомендовано CCITT).
crc16_init
push ix
ld xl, e
inc d
inc d
ld xh, d
ld e, c
ld d, b
ld c, 0
crc_i0
ld l, 0
ld h, c
dec h
ld b, 8
crc_i1
add hl, hl
jr nc, crc_i2
ld a, l
xor e
ld l, a
ld a, h
xor d
ld h, a
crc_i2 djnz crc_i1
dec ix
ld (ix+0), l
dec xh
ld (ix+0), h
inc xh
dec c
jr nz, crc_i0
pop ix
ret
endif


ifused crc16_fast
; быстрая (табличная) функция подсчёта CRC-16,
; требует инициализации функцией crc16_init
; (C) Kirill Frolov
; ix=*data, bc=size,
; de=таблица CRC, hl=начальное значение
; на выходе -> hl=подсчитанное значение
crc16_fast
push de
exx
pop de
exx
crc16f0
ld a, b
or c
ret z
ld a, h
xor (ix)
inc ix
exx
ld l, a
ld h, 0
adc hl, de
ld a, (hl)
inc h
exx
xor l
ld h, a
exx
ld a, (hl)
exx
ld l, a
dec bc
jr crc16f0
endif


ifused crc16
; медленная функция подсчёта CRC-16
; (C) Kirill Frolov
; ix=*data, bc=size
; de=полином (#1021), hl=начальное значение
; на выходе -> hl=подсчитанное значение
crc16
crc16_0
ld a, b
or c
ret z
ld a, (ix)
inc ix
xor h
ld h, a
ld a, 8
crc16_1
add hl, hl
jr nc, crc16_2
exa
ld a, l
xor e
ld l, a
ld a, h
xor d
ld h, a
exa
crc16_2
dec a
jr nz, crc16_1
dec bc
jr crc16_0
endif



- --- end of forward ---

от: Kirill Frolov
кому: Kirill Frolov
дата: 06 Jul 2003

- --- begin of forward ---
From: Kirill Frolov
Newsgroups: zxnet.code
Subject: некоторые полезные функции
Date: Sun, 6 Jul 2003 08:07:24 +0000 (UTC)


[...пингвины..сожрали...]


ifndef htoa
ifused htoa
; a=0..FF, HL=str[3] -> hl=*0
htoa
push af
rra
rra
rra
rra
call nib2hex
pop af
nib2hex and #0f
cp #0a
sbc a, #69
daa
ld (hl), a
inc hl
ld (hl), 0
ret
endif
endif


ifndef strglob
ifused strglob
; hl=string, de=mask -> Z
strglob
ld a, (de)
or a
jr nz, strglob_1
cpi ; end
ret
strglob_0
xor a
inc a
ret
strglob_1
ld a, (hl)
or a
jr z, strglob_0 ; not equal
ld a, (de)
cp "?"
jr z, strglob_q
cp "*"
jr z, strglob_a
cp (hl)
ret nz ; not equal
strglob_q
inc hl
inc de
jr strglob
strglob_a
inc hl
push hl
push de
call strglob
pop de
pop hl
ret z
inc de
jr strglob
endif
endif


ifused wtoa
ifndef wtoa
; функция записывает 16-разрядное беззнаковое число
; в десятичном виде, ведущие нули не отбрасываются.
; по адресу (hl) будет записано 5 цифр числа и
; символ с кодом 0 завершающий строку.
; (C) Kirill Frolov
; *hl = itoa(de) -> hl=указатель на завершающий 0.
wtoa
push hl
ex de, hl
call w2bcd
pop hl ; d,e,c=bcd
ld a, d
or a
jr nz, wtoa0
ld a, e
and #f0
jr nz, wtoa1
ld a, e
and #0f
jr nz, wtoa2
ld a, c
and #f0
jr nz, wtoa3
jr wtoa4
wtoa0
or #30
ld (hl), a
inc hl
wtoa1
ld (hl), e
ld a, #33
rrd
inc hl
wtoa2
or #30
ld (hl), a
inc hl
wtoa3
ld (hl), c
ld a, #33
rrd
inc hl
wtoa4
or #30
ld (hl), a

inc hl
ld (hl), 0
ret
endif
endif





ifused randn
; Генератор случайных чисел, медленный
; (C) Kirill Frolov ~3000 takts.
; hl = random(0.. randn
push de
call rand
ex de, hl
pop bc
call mul
ex de, hl
ret
endif

ifused rand
randx dw 0, 0
RAND_MAX equ #ffff
; Получение случайного числа
; -> hl = случайное число 0..65535 ~2300 takts.
rand
; randx = randx*1103515245 + 12345)>>16) & 077777)
ld de, (randx+2)
ld bc, #4e6d
call mul
push hl
ld de, (randx)
ld bc, #41c6
call mul
pop de
add hl, de
push hl
ld de, (randx)
ld bc, #4e6d
call mul
ld bc, #3039
add hl, bc
ld (randx), hl
pop hl
adc hl, de
ld (randx+2), hl
ret
endif


ifused srand
; Установка генератора случайных чисел
; de = инициирующее значение
srand
ld (randx), de
ret
endif




ifused div
ifndef div
; функция 16-разрядного беззнакового деления
; (C) Aleksey Malov aka Vivid
; little optimized by Vitaly Vidmirov
; hl = de/bc de = de%bc ~840 takts.
; hl = 0, de = de(dividend) if bc(divisor) == 0.
div
xor a ;меняем знак
sub c ; у делителя
ld c, a
sbc a, b
sub c
ld b, a
ld hl,0 ;обнулили новое делимое
ld a,d ;сначала двигаем
rla ;старший байт делимого
;t=18
REPT 8
rl l ;
add hl,bc ;
jr c,$+4 ;8 раз
sbc hl,bc ;
rla ; t=8*45=360
ENDR

ld d,a ;ст. байт результата
ld a,e ;теперь двигаем
rla ;младший байт t=12

REPT 8
adc hl,hl ;
add hl,bc ;
jr c,$+4 ;8 раз
sbc hl,bc ;
rla ; t=8*52=416
ENDR

ld e,a ;мл. байт результата
;hl-остаток от деления
;t=4
ex de, hl
ret
endif
endif



ifused mul
ifndef mul
; функция беззнакового умножения 16-разрядных чисел
; (C) Kirill Frolov
; idea by Vasil Ivanov
; dehl=de*bc ~730t.
mul
ld hl, 0
ld a, c
ld c, l ; 18

add a, a
jr nc, $+4
add hl, de
adc a, c ; 29
rept 7
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c ; 40*7 309
endr

ld c, a
push hl ; 0chl
ld hl, 0
ld a, b
ld b, l ; 33

add a, a
jr nc, $+4
add hl, de
add a, b ; 29
rept 7
add hl, hl
rla
jr nc, $+4
add hl, de
add a, b ; 40*7 309
endr

; ahl0 + 0cde = hlde
pop de
ld b, l
ld l, h
ld h, a
ld a, d
add a, b
ld d, a
ld b, 0
adc hl, bc
ex de, hl ; 60

ret ; 729t.
endif
endif


ifused amul
ifndef amul
; функция 8-разрядного умножения с суммированием
; (C) Kirill Frolov
; hl = hl + a*de ~338 takts.
amul
add a, a
jr nc, $+4
add hl, de
adc a, c ; 39
rept 7
add hl, hl
rla
jr nc, $+4
add hl, de
adc a, c ; 40*7 309
endr
ret
endif
endif


ifused sqrt
ifndef sqrt
; функция вычисления квадратного корня 16-разрядных чисел
; (C) Aleksey Malov aka Vivid
; a = sqrt(hl) ~470 takts.
sqrt
xor a ;обнулили a ;-)
ld de,64 ;этого требует алгоритм
; t=14
sla h ;берем два самых левых
adc a,a ;бита аргумента
sla h ;
adc a,a ;
jr z,$+4 ;если они не равны
dec a ;нулю, то увеличиваем
inc d ;результат
; t=39
REPT 3
sla h ;далее следуем
adc a,a ;алгоритму извлечения
sla h ;квадратного корня
adc a,a ;"столбиком", только
sla d ;
ld c,d ;3 раза
sli c ;
cp c ;
jr c,$+4 ;
sub c ;
inc d ; t=63*3=189
ENDR

REPT 2
sla l ;проделываем похожую
adc a,a ;операцию с
sla l ;младшим байтом
adc a,a ;аргумента
sla d ;
ld c,d ;2 раза
sli c ;
cp c ;
jr c,$+4 ;
sub c ;
inc d ; t=63*2=126
ENDR

ld h,a ;
or a ;обнулили флаг переноса
; t=8
sbc hl,de ;теперь нам не хватает
jr nc,$+3 ;одного регистра d для
add hl,de ;выполнения последних
ccf ;двух циклов, придется
rl d ;использовать более
add hl,hl ;медленные операции
add hl,hl ;с регистровыми парами
; t=67
sbc hl,de ;и последний раз
ccf ;выполняем расчеты, не
ld a,d ;восстанавливая hl
adc a,a ;в a-результат
; t=27
ret
endif
endif


ifused w2bcd
ifndef w2bcd
; функция переводит 16-разрядное беззнаковое
; двоичное число в двоично-десятичный формат
; (C) Kirill Frolov
; d,e,c = bin2bcd(hl) ~1330 takts.
w2bcd
ld b, 10h
xor a
ld c, a
ld e, a
ld d, a ; 23
w2bcd0
add hl, hl ; D,E,C=bcd digits
ld a, c
adc a, a
daa
ld c, a
ld a, e
adc a, a
daa
ld e, a
ld a, d
adc a, a
daa
ld d, a
djnz w2bcd0 ; ~83 ~1328
ret
endif
endif



; Внимание!
; Все функции подсчета 16-разрядного ЦИК
; используют только сдвиг влево!

ifused flatcher
; Функция подсчёта кода Флетчера
; (более быстрый, но менее эффективный чем CRC)
; (C) Kirill Frolov
; ix=данные, bc=размер,
; -> hl=код флетчера (A), de=(B), E&L=8bit code
flatcher
ld hl, 0
ld e, l
ld d, h
flatch0
ld a, b
or c
ex de, hl
ret z
ex de, hl
ld a, (ix)
inc ix
add a, e
ld e, a
jr nc, $+3
inc d
add hl, de
dec bc
jr flatch0
endif


ifused crc16_init
; Функция инициализирующая таблицу CRC.
; (C) Kirill Frolov
; de=адрес рамещения таблицы (512 байт),
; bc=полином (0x1021 рекомендовано CCITT).
crc16_init
push ix
ld xl, e
inc d
inc d
ld xh, d
ld e, c
ld d, b
ld c, 0
crc_i0
ld l, 0
ld h, c
dec h
ld b, 8
crc_i1
add hl, hl
jr nc, crc_i2
ld a, l
xor e
ld l, a
ld a, h
xor d
ld h, a
crc_i2 djnz crc_i1
dec ix
ld (ix+0), l
dec xh
ld (ix+0), h
inc xh
dec c
jr nz, crc_i0
pop ix
ret
endif


ifused crc16_fast
; быстрая (табличная) функция подсчёта CRC-16,
; требует инициализации функцией crc16_init
; (C) Kirill Frolov
; ix=*data, bc=size,
; de=таблица CRC, hl=начальное значение
; на выходе -> hl=подсчитанное значение
crc16_fast
push de
exx
pop de
exx
crc16f0
ld a, b
or c
ret z
ld a, h
xor (ix)
inc ix
exx
ld l, a
ld h, 0
adc hl, de
ld a, (hl)
inc h
exx
xor l
ld h, a
exx
ld a, (hl)
exx
ld l, a
dec bc
jr crc16f0
endif


ifused crc16
; медленная функция подсчёта CRC-16
; (C) Kirill Frolov
; ix=*data, bc=size
; de=полином (#1021), hl=начальное значение
; на выходе -> hl=подсчитанное значение
crc16
crc16_0
ld a, b
or c
ret z
ld a, (ix)
inc ix
xor h
ld h, a
ld a, 8
crc16_1
add hl, hl
jr nc, crc16_2
exa
ld a, l
xor e
ld l, a
ld a, h
xor d
ld h, a
exa
crc16_2
dec a
jr nz, crc16_1
dec bc
jr crc16_0
endif



- --- end of forward ---

от: Vlad Sotnikov
кому: Kirill Frolov
дата: 08 Jul 2003
Пpивет, Kirill!

06 июля 2003 года (а было тогда 12:08)
Kirill Frolov в своем письме к Kirill Frolov писал:


KF> Hекотоpыми спектpyмистами задавался вопpос о генеpации
KF> слyчайных чисел и таблично pассчёте CRC...

Hекотоpыми спектpyмистами :)



Vega/ex-Style Group.

<филфак-СПбГУ>
FIDO: 2:5030/1512 ZXNET: 500:812/19 E-mail: vega56@mail.ru

от: Pavel Vasilyev
кому: Kirill Frolov
дата: 08 Jul 2003

Привет, Kirill!

Воскресенье, 06 Июля 2003, в 12:09:19,
Kirill Frolov -> Kirill Frolov.

KF> ; функция переводит 16-разрядное беззнаковое
KF> ; двоичное число в двоично-десятичный формат
KF> ; (C) Kirill Frolov
KF> ; d,e,c = bin2bcd(hl) ~1330 takts.
KF> w2bcd
KF> ld b, 10h
KF> xor a
KF> ld c, a
KF> ld e, a
KF> ld d, a ; 23
KF> w2bcd0
KF> add hl, hl ; D,E,C=bcd digits
KF> ld a, c
KF> adc a, a
KF> daa
KF> ld c, a
KF> ld a, e
KF> adc a, a
KF> daa
KF> ld e, a
KF> ld a, d
KF> adc a, a
KF> daa
KF> ld d, a
KF> djnz w2bcd0 ; ~83 ~1328
KF> ret

w2bcd ld bc,#1000: ld e,c
w2bcd0 add hl,hl
ld a,c: adc a,a: daa: ld c,a
ld a,e: adc a,a: daa: ld e,a
rl d: djnz w2bcd0
ret

; b=18 ; t=1043


Закрой за мной дверь, Kirill, я ухожу.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
FIDO - Модем. Первые шаги.
Смайлик - анекдоты про женщин.
От редакции - Вот, наконец-то я родил-таки эту ужасную газетку.
AD&D - описания монстров AD&D (часть третья).
Что-где-почем - новая поpция пpогpаммного обеспечения от VELа из г.Ковpова.

В этот день...   25 апреля