ack/mach/i80/libem/mli4.s
1987-01-28 18:57:04 +00:00

78 lines
962 B
ArmAsm

.define .mli4
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
! 32 bits signed and unsigned integer multiply routine
! Expects operands on stack
! Yields product on stack
.mli4: pop h
shld .retadr
mov h,b
mov l,c
shld .bcreg
pop h ! store multiplier
shld block1
pop h
shld block1+2
pop h ! store multiplicand
shld block2
pop h
shld block2+2
lxi h,0
shld block3 ! product = 0
shld block3+2
lxi b,0
lp1: lxi h,block1
dad b
mov a,m ! get next byte of multiplier
mvi b,8
lp2: rar
jnc 2f
lhld block2 ! add multiplicand to product
xchg
lhld block3
dad d
shld block3
lhld block2+2
jnc 1f
inx h
1: xchg
lhld block3+2
dad d
shld block3+2
2: lhld block2 ! shift multiplicand left
dad h
shld block2
lhld block2+2
jnc 3f
dad h
inx h
jmp 4f
3: dad h
4: shld block2+2
dcr b
jnz lp2
inr c
mov a,c
cpi 4
jnz lp1
lhld block3+2
push h
lhld block3
push h
lhld .bcreg
mov b,h
mov c,l
lhld .retadr
pchl