📄 snd_modulator.asm
字号:
.ref exp_temp
.ref data_address
.ref table_g
.ref data_out
.ref data_temp
.mmregs
.text
.def snd_modulator
snd_modulator:
AMOV #data_address,XAR0
AMOV #data_out,XAR2
XOR AC0
XOR AC1
XOR AC2
XOR AC3
XOR T0
XOR T1
XOR T2
XOR T3
MOV #148,T0
MOV #149,BRC0
MOV #-1,T3
RPTB cov150_over
AMOV #data_temp,XAR3 ;设置每次做乘法的3个a[n]
AMOV #data_temp,XAR4
RPT #2 ;将要进行累加的数据装如入data_temp
MOV *AR3+,AC3
RPT #1
MOV *AR4+,AC3
RPT #1
MOV *AR4-,*AR3-
MOV *AR4,*AR3
MOV *AR0+,*AR4
BCC add0_cov,T0>#0 ;最后两个字
MOV #0000h,*AR4
add0_cov: SUB #1,T0
AMOV #table_g,XAR1
RPT #3 ;准备进行累加的数值
ADD *AR1+,AC0
RPT #3
ADD *AR1+,AC1
RPT #3
ADD *AR1+,AC2
SFTL AC0,#16
SFTL AC1,#16
SFTL AC2,#16
AMOV #exp_temp,XAR3
BCC time1_run,T3>=#0 ;第一次运行
MANT AC0,AC0
::NEXP AC0,T1
CMP *AR4==#0FFFFh,TC1
BCC sum_negtive1,!TC1 ;若结果为零取补
XOR #0FFFFh,AC0
XOR #0FFFFh<<#16,AC0
ADD #1,AC0
sum_negtive1: MOV HI(AC0),*AR3+ ;储存数据
MOV T1,*AR3-
time1_run: BCC time2_run,T3!=#0 ;第二次运行
CMP *AR4==#0001h,TC1 ;累加开始,记录当前值的符号
MOV *AR4,T1
BCC sum_not_zero1,T1==#0
MAR *AR4+
CMP *AR4==#0001h,TC2
BCC same_symbol1,TC1^TC2
ADD AC0,AC1
same_symbol1: BCC diff_symbol1,!TC1^TC2
SUB AC0,AC1
diff_symbol1: NOP
sum_not_zero1: MANT AC1,AC1 ;储存结果
::NEXP AC1,T1
BCC sum_negtive2,TC2 ;若结果为零取补
XOR #0FFFFh,AC1
XOR #0FFFFh<<#16,AC1
ADD #1,AC1
sum_negtive2: MOV HI(AC1),*AR3+ ;储存数据
MOV T1,*AR3-
time2_run: BCC time3_run,T3<=#0 ;第三次以后运行
CMP *AR4==#0001h,TC1 ;累加开始,记录当前值的符号
MOV *AR4,T1
BCC sum_not_zero21,T1==#0
MAR *AR4+
CMP *AR4==#0001h,TC2
BCC same_symbol21,TC1^TC2
ADD AC0,AC1
same_symbol21: BCC diff_symbol21,!TC1^TC2
SUB AC0,AC1
diff_symbol21: NOP
sum_not_zero21: BCC add_1,T1!=#0
MAR *AR4+
add_1: NOP
CMP *AR4==#0001h,TC1 ;累加开始,记录当前值的符号
MOV *AR4,T1
BCC sum_not_zero22,T1==#0
MAR *AR4+
CMP *AR4==#0001h,TC2
BCC same_symbol22,TC1^TC2
ADD AC1,AC2
same_symbol22: BCC diff_symbol22,!TC1^TC2
SUB AC1,AC2
diff_symbol22: NOP
sum_not_zero22: MANT AC2,AC2 ;储存结果
::NEXP AC2,T2
BCC sum_negtive3,TC2 ;若结果为零取补
XOR #0FFFFh,AC2
XOR #0FFFFh<<#16,AC2
ADD #1,AC2
sum_negtive3: MOV HI(AC2),*AR3+ ;储存数据
MOV T2,*AR3-
time3_run: ADD #1,T3
XOR AC0
XOR AC1
XOR AC2
XOR AC3
MOV *AR3+,*AR2+
MOV *AR3-,*AR2+
cov150_over: NOP
XOR T1
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -