A2osX/SYS/KERNEL.S.MATH32.txt
2020-03-12 17:44:11 +01:00

257 lines
4.4 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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