我直接贴上来:
math.asm
--------8<----------------------------
Code:
.dataseg
;math
.public mtht0 .byte
.public mtht1 .byte
.public mtht2 .byte
.public mtht3 .byte
;result
.public mthr0 .byte
.public mthr1 .byte
.public mthr2 .byte
.public mthr3 .byte
.codeseg
.extrn str_addr : byte
;;
;; 24bitx8bit->24bit
;; mtht[210] x a => mthr[210]
;;
.proc mul24x8
sta mtht3
txa
pha
lda #$00
sta mthr0
sta mthr1
sta mthr2
tax
-: lda #$01
and mtht3
beq +
clc
lda mthr0
adc mtht0
sta mthr0
lda mthr1
adc mtht1
sta mthr1
lda mthr2
adc mtht2
sta mthr2
+: cpx #$07
beq +
clc
rol mtht0
rol mtht1
rol mtht2
clc
ror mtht3
inx
jmp -
+: pla
tax
rts
.endp
;;
;; 24bit/16bit => 24bit,16bit
;; mtht[210] / mthr[10] => mtht[210], mthr[32]
;;
.proc div24d16
txa
pha
lda #$00
sta mthr2
sta mthr3
ldx #$18
-: clc
rol mtht0
rol mtht1
rol mtht2
rol mthr2
rol mthr3
bcs +
lda mthr3
cmp mthr1
bne +
lda mthr2
cmp mthr0
+: bcc +
sec
lda mthr2
sbc mthr0
sta mthr2
lda mthr3
sbc mthr1
sta mthr3
lda mtht0
ora #$01
sta mtht0
+: dex
bne -
pla
tax
rts
.endp
;;
;; 24bit/8bit => 24bit,8bit
;; mtht[210] / a => mtht[210], mtht[3]
;;
.proc div24d8
sta str_addr
txa
pha
lda #$00
sta mtht3
ldx #$18
-: clc
rol mtht0
rol mtht1
rol mtht2
rol mtht3
lda mtht3
bcs ++
cmp str_addr
bcc +
++: sec
sbc str_addr
sta mtht3
lda mtht0
ora #$01
sta mtht0
+: dex
bne -
pla
tax
rts
.endp
;;
;; 24bit+8bit => 24bit
;; x[210] + a => x[210]
;;
.proc add24a8
clc
adc $00,x
sta $00,x
lda $01,x
adc #$00
sta $01,x
lda $02,x
adc #$00
sta $02,x
rts
.endp
;;
;; 24bit-8bit => 24bit
;; x[210] - a => x[210]
;;
.proc sub24s8
sta str_addr
sec
lda $00,x
sbc str_addr
sta $00,x
lda $01,x
sbc #$00
sta $01,x
lda $02,x
sbc #$00
sta $02,x
rts
.endp
.public mul24x8, div24d8, div24d16, add24a8, sub24s8