Mathematic library


Содержание

1. Введение
2. amul
3. crc16
4. crc16_init
5. crc16_fast
6. div
7. flatcher
8. i2bcd
9. l2bcd
10. labs
11. ldiv
12. lmax
13. lmin
14. lmul
15. lshl
16. lshr
17. max
18. min
19. mul
20. abs
21. negate
22. randn
23. rand
24. srand
25. wshl
26. wshr
27. sqrt

1. Введение

блалабла.

2. amul

Перемножение с суммированием. HL = A * DE + HL ~350 тактов.

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

Смотрите также: mul, div, lmul, ldiv.

3. crc16

Вход:

IX
указатель массив данных
BC
размер массива данных в байтах
DE
коэффициенты многочлена (0x1021, обычно)
HL
начальное значение ЦИК

Выход:

HL
значение ЦИК

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

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

4. crc16_init

Вход:

DE
указатель на массив памяти, 512 байт
BC
коэффициенты многочлена (обычно 0x1021)

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

5. crc16_fast

Вход:

DE
указатель на рассчитанную таблицу ЦИК.
IX
указатель на массив данных
BC
размер массива данных в байтах
HL
начальное значение ЦИК

Выход:

HL
значение ЦИК

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

Результат работы данной функции полностью аналогичен выполнению функции crc16, которая не использует заранее рассчитанную таблицу, но время её работы значительно больше.

Пример использования функций crc16_init и crc16_fast для рассчёта ЦИК файла не умещающегося целиком в оперативную память:


	ld hl, -512-4096 ; выделили память:
	add hl, sp	; 512 байт для таблицы ЦИК
	ld sp, hl	; и 4096 для чтения файла
			
	ex de, hl	; адрес таблицы ЦИК = SP+0
	ld bc, 0x1021	
	call crc16_init	; инициализация таблицы ЦИК

	ld hl, 0	; начальное значение ЦИК
	push hl
loop:
	ld hl, 512
	add hl, sp	; адрес буфера файла = SP+512
	push hl
	call read_file	; считывание части файла	

	pop ix		; данные: часть файла
	ld bc, 4096	; размер части файла
	ld hl, 0
	add hl, sp
	ex de, hl	; адрес таблицы ЦИК = SP+0
	pop hl		; промежуточное значение ЦИК
	call crc16_fast
	push hl

	call eof	; проверка достижения конца файла
	jr nz, loop	; ещё есть данные

	pop de		; конечное значение ЦИК
	ld hl, 512+4096
	add hl, sp
	ld sp, hl	; освободили память

	ex de, hl	; здесь HL = рассчитанное значение ЦИК
	ret

6. div

Целочисленное деление: HL=DE/BC, DE=DE%BC.

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

7. flatcher

Вход:

IX
указатель на массив памяти
BC
размер массива в байтах

Выход:

HL
младшие разряды 16-разрядного кода
DE
старшие разряды 16-разрядного кода
E, L
8-разрядный код

Функция рассчитывает значения кода Флетчера. В регистре IX передается указатель на область памяти, по содержимому которой будет произведен рассчет. В регистре BC передается размер области памяти в байтах. В регистрах HL и DE возвращаются значения 16-разрядного кода Флетчера. Значения 8-разрядного кода могут быть получены из регистров E (старший байт) и L (младший найт).

Это не слишком удачная функция для контроля целостности данных, но работает быстрей функций рассчета КЦК.

Смотрите также: crc16, crc16_init, crc16_fast.

8. i2bcd

Вход:

HL
двоичное число

Выход:

E, H, L
двоично-десятичный эквиэвалент

Функция переводит значение 16-разрядного (двоичного) числа заданного в регистре HL в двоично-десятичный формат. Результат возвращается в регистрах E,H,L (в Е — старшие разряды, в L — младшие).

9. l2bcd

Вход:

(DE,HL)
двоичное число

Выход:

(C,D,E,H,L)
двоично-десятичный эквиэвалент

Функция переводит значение 32-разрядного (двоичного) числа заданного в регистрах DE и HL (в HL младшие разряды) в двоично-десятичный формат. Результат возвращается в регистрах C,D,E,H,L (в C -- старшие разряды, в L -- младшие).

10. labs

(HL',HL) = abs (HL', HL)

Функция возвращает в регистрах HL' и HL (в HL' старшие разряды) абсолютное значение 32-разрядного числа со знаком заданного в регистрах HL' и HL (в HL' старшие разряды).

11. ldiv

(HL',HL) = (HL',HL) / (DE',DE)

(DE',DE) = (HL',HL) % (DE',DE)

Функция делит беззнаковые 32-разрядные числа. Делимое задаётся в регистрах HL' и HL (в HL' старшие разряды). Делитель задаётся в регистрах DE' и DE (в DE' старшие разряды). Результат деления возвращается в регистрах HL' и HL (в HL' старшие разряды). Остаток от деления возвращается в регистрах DE' и DE (в DE' старшие разряды).

12. lmax

(HL',HL) = max ( (HL',HL), (DE',DE) )

Функция возвращает в регистрах HL' и HL (в HL' старшие разряды) максимальное значение от двух 32-разрядных беззнаковых чисел. Первое число задаётся в регистрах HL' и HL (в HL' старшие разряды). Второе число в регистрах DE' и DE (в DE' старшие разряды).

13. lmin

(HL',HL) = min ( (HL',HL), (DE',DE) )

Функция возвращает в регистрах HL' и HL (в HL' старшие разряды) минимальное значение от двух 32-разрядных беззнаковых чисел. Первое число задаётся в регистрах HL' и HL (в HL' старшие разряды). Второе число в регистрах DE' и DE (в DE' старшие разряды).

14. lmul

(DE',DE,HL',HL) = (HL'HL) * (DE',DE)

Функция перемножает беззнаковые 32-разрядные числа и получает 64-разрядный результат. Первый сомножитель задаётся в регистрах HL' и HL (в HL' старшие разряды). Второй сомножитель задаётся в регистрах DE' и DE (в DE' старшие разряды). Результат возвращается в регистрах DE',DE,HL',HL (в DE' -- старшие разряды, в HL младшие).

15. lshl

CF,(HL',HL) = (HL',HL) << A

Функция осуществляет поразрядный сдвиг "влево" 32-разрядного беззнакового числа заданного в регистрах HL' и HL (в HL' — старшие разряды). Число сдвигается на количество разрядов указанное в регистре A. Младшие разряды числа устанавливается в ноль. Старшие разряды сдвигаются в флаг переноса. Результат возвращается в флаге переноса и регистрах HL' и HL (в HL' — старшие разряды).

16. lshr

CF,(HL',HL) = (HL',HL) >> A

Функция осуществляет поразрядный сдвиг "вправо" 32-разрядного беззнакового числа заданного в регистрах HL' и HL (в HL' — старшие разряды). Число сдвигается на количество разрядов указанное в регистре A. Старшие разряды числа устанавливается в ноль. Младшие разряды сдвигаются в флаг переноса. Результат возвращается в флаге переноса и регистрах HL' и HL (в HL' — старшие разряды).

17. max

HL = max ( HL, DE )

Функция возвращает в регистре HL максимальное значение от двух 16-разрядных беззнаковых чисел заданных в регистрах HL и DE.

18. min

HL = min ( HL, DE )

Функция возвращает в регистре HL минимальное значение от двух 16-разрядных беззнаковых чисел заданных в регистрах HL и DE.

19. mul

(DE,HL) = DE * BC

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

20. abs

HL = abs (HL)

Функция возвращает абсолютное значение от 16-разрядного числа со знаком. Аргумент задаётся в регистре HL и результат возвращается в регистре HL.

21. negate

HL = 0 - HL

Функция вычитает 16-разрядное беззнаковое число, заданное в регистре HL, из нуля. Результат помещается в регистр HL. Если аргумент функции не равен нулю, то флаг C будет установлен.

22. randn

Вход:

DE
максимальное значение случайного числа

Выход:

HL
псевдослучайное число

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

23. rand

Выход:

HL
0…65535

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

24. srand

Вход:

DE
0..65535

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

25. wshl

CF,HL = HL << A

Функция осуществляет поразрядный сдвиг "влево" 16-разрядного беззнакового числа заданного в регистре HL. Число сдвигается на количество разрядов указанное в регистре A. Младшие разряды числа устанавливается в ноль. Старшие разряды сдвигаются в флаг переноса. Результат возвращается в флаге переноса и регистре HL.

26. wshr

CF,HL = HL >> A

Функция осуществляет поразрядный сдвиг "вправо" 16-разрядного беззнакового числа заданного в регистре HL. Число сдвигается на количество разрядов указанное в регистре A. Старшие разряды числа устанавливается в ноль. Младшие разряды сдвигаются в флаг переноса. Результат возвращается в флаге переноса и регистре HL.

27. sqrt

A = sqrt (HL)

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