47 lines
754 B
ArmAsm
47 lines
754 B
ArmAsm
|
.define .mlu2
|
||
|
|
||
|
! 16 bits unsigned multiply routine
|
||
|
! Expects operands on stack
|
||
|
! Yields result in de-registers
|
||
|
! This routine could also be used for signed integers, but it won't
|
||
|
! because there is a more clever one just for signed integers.
|
||
|
|
||
|
.mlu2:
|
||
|
pop h
|
||
|
shld .retadr
|
||
|
mov h,b
|
||
|
mov l,c
|
||
|
shld .bcreg
|
||
|
|
||
|
pop b ! bc = multiplier
|
||
|
pop d ! de = multiplicand
|
||
|
lxi h,0 ! hl = product
|
||
|
|
||
|
1: mov a,b ! if multiplier = 0 then finished
|
||
|
ora c
|
||
|
jz 3f
|
||
|
|
||
|
xra a ! reset carry
|
||
|
mov a,b ! shift multiplier right
|
||
|
rar
|
||
|
mov b,a
|
||
|
mov a,c
|
||
|
rar
|
||
|
mov c,a
|
||
|
|
||
|
jnc 2f !if carry set: add multiplicand to product
|
||
|
dad d
|
||
|
|
||
|
2: xchg ! shift multiplicand left
|
||
|
dad h
|
||
|
xchg
|
||
|
jmp 1b ! keep looping
|
||
|
|
||
|
3: xchg ! de becomes product
|
||
|
|
||
|
lhld .bcreg
|
||
|
mov b,h
|
||
|
mov c,l
|
||
|
lhld .retadr
|
||
|
pchl
|