📄 math.s
字号:
include h/mori.h
public mul_ax
public mul2
public mul4
public mul41
public divid42
public divid2
public random_it
save_a1_a8:
ldx #15
save_a1_a81:
lda a1,x
sta random_buf,x
dex
bpl save_a1_a81
rts
load_a1_a8:
ldx #15
load_a1_a81:
lda random_buf,x
sta a1,x
dex
bpl load_a1_a81
rts
;------------------------------------------
; a1 = Areg * Xreg
; d: a1 a2
;------------------------------------------
mul_ax:
sta a2
stx a2h
lm2 a1,#0
ldx #8
mul_loop:
asl2 a1
asl a2h
bcc mul_con
lda a2
adda2 a1
mul_con:
dbne x,mul_loop
rts
;------------------------------------------
; a1 a2 = a1 * a2
; input: a1 a2
; output: a1 a2(result)
; d: a1 a2 a3 a4
;------------------------------------------
mul2:
lm2 a3,a1
lm2 a4,a2
lm2 a1,#0
lm2 a2,#0
ldx #16
mul2_loop:
asl2 a1
rol2 a2
asl2 a4
bcc mul2_con
add a1,a3
bcc mul2_con
inc2 a2
mul2_con:
dbne x,mul2_loop
rts
;------------------------------------------
; 四字节乘法
; input: a1 a2 (被乘数) a3,a4 (乘数)
; output: a1 a2 a3 a4
; d: a1 a2 a3 a4 a5 a6 a7 a8
;------------------------------------------
mul41:
lda #0
sta a3h
sta a4
sta a4h
mul4:
lm2 a5,a1
lm2 a6,a2
lm2 a7,a3
lm2 a8,a4
lm2 a1,#0
lm2 a2,#0
lm2 a3,#0
lm2 a4,#0
ldx #32
mul4_loop:
asl2 a1
rol2 a2
rol2 a3
rol2 a4
asl2 a7
rol2 a8
bcc mul4_con
add a1,a5
lda a2
adc a6
sta a2
lda a2h
adc a6h
sta a2h
bcc mul4_con
inc a3
bcc mul4_con
inc a3h
bcc mul4_con
inc a4
bcc mul4_con
inc a4h
bcc mul4_con
mul4_con:
dbne x,mul4_loop
rts
;------------------------------------------
; a1 = a1 / a2
; a2 = remaider
; input: a1(分母) a2(分子)
; output: a1(result) a2(remaider)
; d: a1 a2 a3 a4
;------------------------------------------
divid2:
lm2 a3,a1
lm2 a4,a2
lm2 a1,#0
lm2 a2,#0
ldx #16
divid2_loop:
asl2 a3
rol2 a2
cmp2 a2,a4
bcc divid2_con
sub a2,a4
divid2_con:
rol2 a1
dbne x,divid2_loop
rts
;------------------------------------------
; a1 a2 = a1 a2 / a3
; a3 = remaider
; input: a1 a2(分母) a3(分子)
; output: a1 a2 (result) a3(remaider)
; d: a1 a2 a3 a4 a5 a6
;------------------------------------------
divid42:
lm2 a4,a1
lm2 a5,a2
lm2 a6,a3
lm2 a1,#0
lm2 a2,#0
lm2 a3,#0
ldx #32
divid42_loop:
asl2 a4
rol2 a5
rol2 a3
bcs to_sub42
cmp2 a3,a6
bcc divid42_con
to_sub42:
sub a3,a6
sec
divid42_con:
rol2 a1
rol2 a2
dbne x,divid42_loop
rts
;************************************************;
; random set in Areg
; input: Areg(range)
; output: Areg
;************************************************;
random_it:
sta range
cmp #1
bne random_it0
lda #0
rts
random_it0:
jsr save_a1_a8
lm2 a1,my_seed
lm2 a2,my_seed+2
lm2 a3,#4e35h
lm2 a4,#15ah
jsr mul4
inc a1
bne random_it1
inc a1h
bne random_it1
inc a2
bne random_it1
inc a3
random_it1:
lm2 my_seed,a1
lm2 my_seed+2,a2
lda range
bne random_it2
jsr load_a1_a8
lda my_seed+2
rts
random_it2:
sta a2
lm a2h,#0
lm2 a1,my_seed+2
jsr divid2
lda a2
pha
jsr load_a1_a8
pla
rts
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -