ack/mach/i80/libem/mlu2.s

52 lines
812 B
ArmAsm
Raw Normal View History

1985-03-18 12:46:51 +00:00
.define .mlu2
1987-01-28 18:57:04 +00:00
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
1985-03-18 12:46:51 +00:00
! 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