A2osX/SYS/KERNEL.S.MATH32.txt

257 lines
4.4 KiB
Plaintext
Raw Normal View History

2020-03-12 16:44:11 +00:00
NEW
AUTO 3,1
*--------------------------------------
MATH32 jmp (.1,x)
.1 .DA MATH32.ADD
.DA MATH32.SUB
.DA MATH32.UMUL
.DA MATH32.IMUL
.DA MATH32.UDIV
.DA MATH32.IDIV
.DA MATH32.UMOD
.DA MATH32.IMOD
.DA MATH32.UCMP
.DA MATH32.ICMP
*--------------------------------------
MATH32.ADD clc
.HS B0 BCS
MATH32.SUB sec
php
jsr MATH32.PopACC32
ldy #0
ldx #3
plp
bcs .1
lda #$79 ADC Absolute,Y
.HS 2C BIT ABS
.1 lda #$F9 SBC Absolute,Y
sta .3
.2 lda (pStack),y
.3 adc ACC32,y SELF MODIFIED
sta (pStack),y
iny
dex
bpl .2
MATH32.SUB.RTS rts
*--------------------------------------
* Returns:
* ff X < Y
* 0 X = Y
* 1 X > Y
*--------------------------------------
MATH32.UCMP
MATH32.ICMP jsr MATH32.SUB
jsr MATH32.PopACC32 A = ACC32+3 (sign)
tay
bmi .2
.1 ora ACC32+2
ora ACC32+1
ora ACC32
beq .8
lda #1
rts
.2 lda #$ff
.8 rts
*--------------------------------------
MATH32.UMUL clc
.HS B0 BCS
MATH32.IMUL sec
php
jsr MATH32.MULDIVMOD.COMMON
jsr MATH32.MUL
plp
bcc MATH32.PutTMP32
MATH32.RETURN.ITMP
lda ACC32.Sign
eor ARG32.Sign
bpl MATH32.PutTMP32
bra MATH32.PutNotTMP32
*--------------------------------------
MATH32.UDIV clc
.HS B0 BCS
MATH32.IDIV sec
clv
bra MATH32.MOD
MATH32.UMOD clc
.HS B0 BCS
MATH32.IMOD sec
bit MATH32.SUB.RTS $60
MATH32.MOD php
jsr MATH32.MULDIVMOD.COMMON
jsr MATH32.DIVMOD
plp
bcc .3 unsigned
bvs MATH32.RETURN.ITMP IMOD
lda ACC32.Sign IDIV
eor ARG32.Sign
bpl MATH32.PutARG32
bra MATH32.PutNotARG32
.3 bvc MATH32.PutARG32 DIV
*--------------------------------------
MATH32.PutTMP32 lda #TMP32 MOD
.HS 2C BIT ABS
*--------------------------------------
MATH32.PutARG32 lda #ARG32
sta .1+1
ldy #3
.1 lda $ff,y SELF MODIFIED
sta (pStack),y
dey
bpl .1
rts
*--------------------------------------
MATH32.PutNotTMP32
lda #TMP32
.HS 2C BIT ABS
*--------------------------------------
MATH32.PutNotARG32
lda #ARG32
sta .1+1
ldy #0
ldx #3
sec
.1 lda $ff,y SELF MODIFIED
eor #$ff two's complement of X bytes
adc #0
sta (pStack),y
iny
dex
bpl .1
rts
*--------------------------------------
MATH32.PopACC32 ldy #0
.1 lda (pStack)
inc pStack
sta ACC32,y
iny
cpy #4
bne .1
sta ACC32.Sign
rts
*--------------------------------------
MATH32.GetARG32 ldy #0
.1 lda (pStack),y
sta ARG32,y
iny
cpy #4
bne .1
sta ARG32.Sign
MATH32.GetARG32.RTS
rts
*--------------------------------------
MATH32.MULDIVMOD.COMMON
php
jsr MATH32.PopACC32
jsr MATH32.GetARG32
plp
bcc MATH32.GetARG32.RTS
jsr MATH.ACC32ABS
jmp MATH.ARG32ABS
*--------------------------------------
* http://6502.org/source/integers/32muldiv.htm
* http://nparker.llx.com/a2/mult.html
*--------------------------------------
* ARG32*ACC32->TMP32
*--------------------------------------
MATH32.MUL jsr MATH.TMP32ZERO
ldx #32
.1 lsr ARG32+3
ror ARG32+2
ror ARG32+1
ror ARG32
bcc .3
clc
ldy #0
.2 lda TMP32,y
adc ACC32,y
sta TMP32,y
iny
tya
eor #4
bne .2
.3 jsr MATH.ACC32.T2
dex
bne .1
clc
rts
*--------------------------------------
* ARG32 = ARG32 div ACC32
* TMP32 = ARG32 mod ACC32
*--------------------------------------
MATH32.DIVMOD jsr MATH.TMP32ZERO
ldx #32
.1 asl ARG32
rol ARG32+1
rol ARG32+2
rol ARG32+3
rol TMP32
rol TMP32+1
rol TMP32+2
rol TMP32+3
sec
lda TMP32
sbc ACC32
pha
lda TMP32+1
sbc ACC32+1
pha
lda TMP32+2
sbc ACC32+2
pha
lda TMP32+3
sbc ACC32+3
bcs .2
pla
pla
pla
dex
bne .1
rts
.2 sta TMP32+3
pla
sta TMP32+2
pla
sta TMP32+1
pla
sta TMP32
inc ARG32 bit0 always 0 because of .1 asl
dex
bne .1
rts
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.MATH32
LOAD USR/SRC/SYS/KERNEL.S
ASM