Лисья Нора

Оглавление


§ Краткое описание

На вход подается DE и BC, на выходе получается результат HL:DE.
Скорость выполнения этой процедуры не фиксирована и зависит от количества бит в BC. Чем меньше единичных бит – тем быстрее работает процедура за счет того, что пропускается сложение 32-х битных чисел, находящихся в памяти.

§ Программный код

; ----------------------------------------------------------------------
; Умножение DE на BC (16 bit)
; HL:DE-результат
; ----------------------------------------------------------------------
 
mult32r: defw 0, 0
mul16u: push bc
push af
 
ld a, 16
ld hl, $0000
ld (mult32r), hl
ld (mult32r+2), hl
 
; Пересчитать 16 бит (максимум)
mul16ul: push af
ld a, b
or c
; Не считать старшие незначимые разряды
jr z, mul16ule
 
; Проверка следующего бита
srl b
rr c
jr nc, mul16us
 
; Сложить RES32 += HL:DE
push bc
push de
push hl
ex de, hl
ld bc, (mult32r)
add hl, bc
ld bc, (mult32r+2)
ex de, hl
adc hl, bc
ld (mult32r), de
ld (mult32r+2), hl
pop hl
pop de
pop bc
 
; Умножение HL:DE на 2
mul16us: sla e
rl d
adc hl, hl
pop af
dec a
jr nz, mul16ul
 
; Выгрузка результата
mul16uls: ld hl, (mult32r+2)
ld de, (mult32r)
pop af
pop bc
ret
mul16ule: pop af
jr mul16uls