1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- .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
|