mirror of
https://github.com/A2osX/A2osX.git
synced 2025-02-21 06:29:08 +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
|