1984-12-17 11:03:13 +00:00
|
|
|
.define Mul4
|
1987-01-30 18:41:42 +00:00
|
|
|
.sect .text
|
|
|
|
.sect .rom
|
|
|
|
.sect .data
|
|
|
|
.sect .bss
|
|
|
|
.sect .text
|
1984-12-17 11:03:13 +00:00
|
|
|
|
|
|
|
! This subroutine multiplies two fourbyte signed integers.
|
|
|
|
! For more details see mli.s
|
|
|
|
! The only difference is that zeropage locations are twice as big.
|
|
|
|
|
|
|
|
|
|
|
|
Mul4:
|
|
|
|
3: lda #0
|
|
|
|
sta ARTH+8
|
|
|
|
sta ARTH+9
|
|
|
|
sta ARTH+10
|
|
|
|
sta ARTH+11
|
|
|
|
sta ARTH+12
|
|
|
|
sta ARTH+13
|
|
|
|
sta ARTH+14
|
|
|
|
sta ARTH+15 ! clear accumulator
|
|
|
|
ldy #32
|
1988-08-19 17:05:03 +00:00
|
|
|
1: lda #0x01
|
1984-12-17 11:03:13 +00:00
|
|
|
bit ARTH
|
|
|
|
beq 2f ! multiplying by zero: no addition
|
|
|
|
clc
|
|
|
|
lda ARTH+12
|
|
|
|
adc ARTH+4
|
|
|
|
sta ARTH+12
|
|
|
|
lda ARTH+13
|
|
|
|
adc ARTH+5
|
|
|
|
sta ARTH+13
|
|
|
|
lda ARTH+14
|
|
|
|
adc ARTH+6
|
|
|
|
sta ARTH+14
|
|
|
|
lda ARTH+15
|
|
|
|
adc ARTH+7
|
|
|
|
sta ARTH+15
|
|
|
|
2: lsr ARTH+3
|
|
|
|
ror ARTH+2
|
|
|
|
ror ARTH+1
|
|
|
|
ror ARTH ! shift multiplier
|
|
|
|
lsr ARTH+15
|
|
|
|
ror ARTH+14
|
|
|
|
ror ARTH+13
|
|
|
|
ror ARTH+12
|
|
|
|
ror ARTH+11
|
|
|
|
ror ARTH+10
|
|
|
|
ror ARTH+9
|
|
|
|
ror ARTH+8 ! shift accumulator
|
|
|
|
lda UNSIGN
|
|
|
|
beq 3f ! it's unsigned: so no shift in of signbit
|
|
|
|
lda ARTH+7
|
|
|
|
bpl 3f
|
1988-08-19 17:05:03 +00:00
|
|
|
lda #0x40
|
1984-12-17 11:03:13 +00:00
|
|
|
bit ARTH+15
|
|
|
|
beq 3f
|
|
|
|
lda ARTH+15
|
1988-08-19 17:05:03 +00:00
|
|
|
ora #0x80
|
1984-12-17 11:03:13 +00:00
|
|
|
sta ARTH+15
|
|
|
|
3: dey
|
|
|
|
bne 1b
|
|
|
|
ldx ARTH+10
|
|
|
|
lda ARTH+11
|
|
|
|
jsr Push
|
|
|
|
ldx ARTH+8
|
|
|
|
lda ARTH+9
|
|
|
|
jmp Push
|
|
|
|
|
|
|
|
|