.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
