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

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

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

1; ----------------------------------------------------------------------
2; Умножение DE на BC (16 bit)
3; HL:DE-результат
4; ----------------------------------------------------------------------
5
6mult32r:    defw    0, 0
7mul16u:     push    bc
8            push    af
9
10            ld      a, 16
11            ld      hl, $0000
12            ld      (mult32r), hl
13            ld      (mult32r+2), hl
14
15            ; Пересчитать 16 бит (максимум)
16mul16ul:    push    af
17            ld      a, b
18            or      c
19            ; Не считать старшие незначимые разряды
20            jr      z, mul16ule
21
22            ; Проверка следующего бита
23            srl     b
24            rr      c
25            jr      nc, mul16us
26
27            ; Сложить RES32 += HL:DE
28            push    bc
29            push    de
30            push    hl
31            ex      de, hl
32            ld      bc, (mult32r)
33            add     hl, bc
34            ld      bc, (mult32r+2)
35            ex      de, hl
36            adc     hl, bc
37            ld      (mult32r), de
38            ld      (mult32r+2), hl
39            pop     hl
40            pop     de
41            pop     bc
42
43            ; Умножение HL:DE на 2
44mul16us:    sla     e
45            rl      d
46            adc     hl, hl
47            pop     af
48            dec     a
49            jr      nz, mul16ul
50
51            ; Выгрузка результата
52mul16uls:   ld      hl, (mult32r+2)
53            ld      de, (mult32r)
54            pop     af
55            pop     bc
56            ret
57mul16ule:   pop     af
58            jr      mul16uls