mirror of
https://github.com/A2osX/A2osX.git
synced 2025-02-19 23:29:29 +00:00
257 lines
4.4 KiB
Plaintext
257 lines
4.4 KiB
Plaintext
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
|