A2osX/SHARED/X.M32S.S.txt

217 lines
3.3 KiB
Plaintext
Raw Normal View History

2019-04-09 15:47:33 +00:00
NEW
2019-04-10 07:45:09 +00:00
AUTO 3,1
2019-04-09 15:47:33 +00:00
.LIST OFF
*--------------------------------------
* Uses: 12 ZP
* M32.ACC .BS 4
* M32.ARG .BS 4
* M32.TMP .BS 4
*--------------------------------------
* TODO : Make it SIGNED 32 bits, with OVERVLOW detection
* http://6502.org/source/integers/32muldiv.htm
* http://nparker.llx.com/a2/mult.html
*--------------------------------------
M32.Add ldx #4
ldy #0
clc ARG+ACC->ACC
.1 lda M32.ARG,y
adc M32.ACC,y
sta M32.ACC,y
iny
dex
bne .1
clc
rts if CS, Overflow
*---------------------------------------
M32.Sub ldx #4
ldy #0
sec ARG-ACC->ACC
.1 lda M32.ARG,y
sbc M32.ACC,y
sta M32.ACC,y
iny
dex
bne .1
clc
rts
bcs .8 if CC, Overflow
sec
rts
.8 clc
rts
*--------------------------------------
M32.Mul ldx #3 ARG*ACC->ACC
.1 lda M32.ACC,x
sta M32.TMP,x
stz M32.ACC,x
dex
bpl .1
ldx #32
.2 lsr M32.TMP+3
ror M32.TMP+2
ror M32.TMP+1
ror M32.TMP
bcc .3
clc
lda M32.ARG
adc M32.ACC
sta M32.ACC
lda M32.ARG+1
adc M32.ACC+1
sta M32.ACC+1
lda M32.ARG+2
adc M32.ACC+2
sta M32.ACC+2
lda M32.ARG+3
adc M32.ACC+3
sta M32.ACC+3
.3 asl M32.ARG
rol M32.ARG+1
rol M32.ARG+2
rol M32.ARG+3
dex
bne .2
clc
rts
*--------------------------------------
M32.Mod sec
.HS 90 BCC
*--------------------------------------
M32.Div clc
php
stz M32.TMP ARG/ACC->ACC
stz M32.TMP+1
stz M32.TMP+2
stz M32.TMP+3
ldx #32
.1 asl M32.ARG
rol M32.ARG+1
rol M32.ARG+2
rol M32.ARG+3
rol M32.TMP
rol M32.TMP+1
rol M32.TMP+2
rol M32.TMP+3
sec
lda M32.TMP
sbc M32.ACC
pha
lda M32.TMP+1
sbc M32.ACC+1
pha
lda M32.TMP+2
sbc M32.ACC+2
pha
lda M32.TMP+3
sbc M32.ACC+3
bcs .2
pla
pla
pla
dex
bne .1
bra .3
.2 sta M32.TMP+3
pla
sta M32.TMP+2
pla
sta M32.TMP+1
pla
sta M32.TMP
inc M32.ARG bit0 always 0 because of .1 asl
dex
bne .1
.3 plp
ldx #3
ldy #M32.ARG+3
bcc .4
ldy #M32.TMP+3
clc
.4 lda $0,y
sta M32.ACC,x
dey
dex
bpl .4
rts
*--------------------------------------
M32.ACC2ARG ldx #3 ACC->ARG
.1 lda M32.ACC,x
sta M32.ARG,x
dex
bpl .1
rts
*--------------------------------------
M32.Cmp ldx #4
ldy #0
sec
.1 lda M32.ARG,y
sbc M32.ACC,y
sta M32.ACC,y
iny
dex
bne .1
bcc .5 CC if ACC < ARG
lda M32.ACC
ora M32.ACC+1
ora M32.ACC+2
ora M32.ACC+3 Z if ACC = ARG
bne .4
lda #%010 010 ACC = ARG
rts
.4 lda #%100 100 ACC > ARG
rts
.5 lda #%001 001 ACC < ARG
rts
*--------------------------------------
MAN
2019-04-10 07:45:09 +00:00
SAVE USR/SRC/SHARED/X.M32S.S
2019-04-09 15:47:33 +00:00
LOAD USR/SRC/BIN/SH.S
ASM