.define Mli2, Mlinp, Mul
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text

! The subroutine Mli2 multiplies two signed integers. The integers
! are popped from the stack.
! The subroutine Mlinp expects the two integer to be in zeropage.
! While the subroutine Mul an unsigned multiply subroutine is.
! For the algoritme see A. S. Tanenbaum
!	Structured Computer Organisation. 1976.


Mli2:
	stx ARTH
	sta ARTH+1
	jsr Pop
	stx ARTH+2
	sta ARTH+3
Mlinp:	ldy #1
	sty UNSIGN	! it's signed
	lda ARTH+1
	bpl 3f		! multiplier negative so:
	ldx ARTH
	jsr Ngi2	! negate multiplier
	stx ARTH
	sta ARTH+1
	ldx ARTH+2
	lda ARTH+3
	jsr Ngi2	! negate multiplicand
	stx ARTH+2
	sta ARTH+3
Mul:
    3:	lda #0	
	sta ARTH+4
	sta ARTH+5
	sta ARTH+6
	sta ARTH+7	! clear accumulator
    	ldy #16
    1:	lda #0x01
	bit ARTH
	beq 2f		! multiplying by zero: no addition
	clc
	lda ARTH+6
	adc ARTH+2
	sta ARTH+6
	lda ARTH+7
	adc ARTH+3
	sta ARTH+7
    2:	lsr ARTH+1
	ror ARTH	! shift multiplier
	lsr ARTH+7
	ror ARTH+6
	ror ARTH+5
	ror ARTH+4	! shift accumulator
	lda UNSIGN
	beq 3f		! unsigned multiply: so no shift in of signbit
	lda ARTH+3
	bpl 3f
	lda #0x40
	bit ARTH+7
	beq 3f
	lda ARTH+7
	ora #0x80
	sta ARTH+7
    3:	dey
	bne 1b
	ldx ARTH+4
	lda ARTH+5
	rts


