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

На вход подается 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
2 сен, 2020
© 2007-2022 Корень в том, что мышь плывет кнутом