📄 at0.asm
字号:
MPY *,AR5 ;A*E*S_OLD
DMOV * ;S_OLD'=S
SACH *,4 ;S'=Xn-B*S-C*S_OLD
LTP *+,AR4 ;ACC=A*E*S_OLD, TREG0=S'
MPY *+,AR5 ;A*S'
LTA *+,AR4 ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
MPY *+,AR5 ;A*D*S
APAC ;A*S'+A*D*S+A*E*S_OLD
LT *+,AR4 ;TREG0=S
MPY *+,AR5 ;-B*S
LTA *,AR4 ;Xn-B*S, TREG0=S_OLD
MPY *+,AR5 ;-C*S_OLD
LTA *-,AR4 ;Xn-B*S-C*S_OLD, TREG0=S_OLD
MPY *,AR5 ;A*E*S_OLD
DMOV * ;S_OLD'=S
SACH *,4 ;S'=Xn-B*S-C*S_OLD
LTP *+,AR4 ;ACC=A*E*S_OLD, TREG0=S'
MPY *+,AR5 ;A*S'
LTA *+,AR4 ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
MPY *+,AR5 ;A*D*S
APAC ;A*S'+A*D*S+A*E*S_OLD
LT *+,AR4 ;TREG0=S
MPY *+,AR5 ;-B*S
LTA *,AR4 ;Xn-B*S, TREG0=S_OLD
MPY *+,AR5 ;-C*S_OLD
LTA *-,AR4 ;Xn-B*S-C*S_OLD, TREG0=S_OLD
MPY *,AR5 ;A*E*S_OLD
DMOV * ;S_OLD'=S
SACH *,4 ;S'=Xn-B*S-C*S_OLD
LTP *+,AR4 ;ACC=A*E*S_OLD, TREG0=S'
MPY *+,AR5 ;-A*S'
LTS *+,AR4 ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
MPY *+,AR5 ;A*D*S
APAC ;A*S'+A*D*S+A*E*S_OLD
SACH SAMPLE_L,4
LACC SMPL,8 ;/16
LT *+,AR4 ;TREG0=S
MPY *+,AR5 ;-B*S
LTA *,AR4 ;Xn-B*S, TREG0=S_OLD
MPY *+,AR5 ;-C*S_OLD
LTA *-,AR4 ;Xn-B*S-C*S_OLD, TREG0=S_OLD
MPY *,AR5 ;A*E*S_OLD
DMOV * ;S_OLD'=S
SACH *,4 ;S'=Xn-B*S-C*S_OLD
LTP *+,AR4 ;ACC=A*E*S_OLD, TREG0=S'
MPY *+,AR5 ;A*S'
LTA *+,AR4 ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
MPY *+,AR5 ;A*D*S
APAC ;A*S'+A*D*S+A*E*S_OLD
LT *+,AR4 ;TREG0=S
MPY *+,AR5 ;-B*S
LTA *,AR4 ;Xn-B*S, TREG0=S_OLD
MPY *+,AR5 ;-C*S_OLD
LTA *-,AR4 ;Xn-B*S-C*S_OLD, TREG0=S_OLD
MPY *,AR5 ;A*E*S_OLD
DMOV * ;S_OLD'=S
SACH *,4 ;S'=Xn-B*S-C*S_OLD
LTP *+,AR4 ;ACC=A*E*S_OLD, TREG0=S'
MPY *+,AR5 ;A*S'
LTA *+,AR4 ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
MPY *+,AR6 ;A*D*S
APAC ;A*S'+A*D*S+A*E*S_OLD
SACH SAMPLE_H,4
;HIGHPASS FILTER COMPLETED
LAR AR4,#CTONE
LACC SMPL,8
SACH SMPL,4
LT *+,AR4
MPY *+,AR6
APAC
SUB *-,12
DMOV *
SACH *0+,4
LACL #3
SAMM BRCR
RPTB L1-1
LACC SAMPLE_L,12 ;FORMULA:
LT *+,AR4 ;Y(n+1)=X(n+1)+2*COS(WiT)*Y(n)-Y(n-1)
MPY *+,AR6
APAC
SUB *-,12
DMOV *
SACH *0+,4 ;LOW GROUP
L1:
LACL #3
SAMM BRCR
RPTB L2-1
LACC SAMPLE_H,12
LT *+,AR4
MPY *+,AR6
APAC
SUB *-,12
DMOV *
SACH *0+,4 ;HIGH GROUP
L2:
CLRC SXM
LARP AR7
LACL *+
ADD *-,16
ZPR
SQRA SMPL
APAC
SACL *+
SACH *+
LACL *+
ADD *-,16
ZPR
SQRA SAMPLE_L
APAC
SACL *+
SACH *+ ;LOW GROUP
LACL *+
ADD *-,16
ZPR
SQRA SAMPLE_H
APAC
SACL *+
SACH *+ ;HIGH GROUP
RETURN: LACC RCV_SLOT
ADD #1
SACL RCV_SLOT
SUB #16
BCND STEP2,LT
SACL RCV_SLOT
CPL #0,DCSN_SIGN
BCND BYPASS,TC
LAR AR5,#S ;IF RCV_SLOT RETURNS TO 0, RELOAD AR5,AR6 AND AR7.
LAR AR6,#Y
LAR AR7,#ENERGY
BYPASS: LACC COUNTER
ADD RECU_SIGN ;IF RECU_SIGN IS SET,
;COUNTER IS INCREASED BY ONE EVERY 32 SLOTS.
DMOV DCSN_SIGN ;RECU_SIGN=DCSN_SIGN.
SACL COUNTER
SUB #LENGTH
BCND STEP2,LT
SACL COUNTER
SACL DCSN_SIGN ;IF(COUNTER>=LENGTH),ZERO DCSN_SIGN & RECU_SIGN.
SACL RECU_SIGN
STEP2: LAR AR3,AR3TEMP ;LOAD AR3 AND AR4 BEFORE RETURNING FROM ISR.
LAR AR4,AR4TEMP
RETE
;****************************************************************************
CLR: ZAP ;CLR ROUTINE
LARP AR5 ;ZERO S,Y AND ENERGY OF CORRESPONDING SLOT.
RPT #9
SACL *+
LARP AR6
RPT #17
SACL *+
LARP AR7
RPT #5
SACL *+
B RETURN
;****************************************************************************
DCSN: SPLK #0,DS
LOOP1_START:
LACC DS,1
ADD OE_FLAG
SACL DCSN_SLOT
LACC DS,2
ADD DS,1
ADD #ENERGY
SAMM AR7
LACC DS,4
ADD DS,1
ADD #Y
SAMM AR6
LARP AR7
LACL #7
SAMM TREG1
SPLK #0,MARK
LACL *+
ADD *+,16,AR4
SATL
SACL TE
SUB #THRES
BCND KEEP1,LT
SUB #ST
BCND KEEP1,GT
LAR AR4,#CTONE
LT *+,AR6 ;ENV=Y(n)*Y(n)+Y(n-1)*Y(n-1)-2*COS(wT)*Y(n)*Y(n-1).
MPY *+
LTP *-
SACH TEMPX,4 ;TEMPX=Y(n)*COS(wT).
MPY TEMPX
LACL #0
SQRS *+ ;ACC=2*COS(wT)*Y(n)*Y(n-1).
SQRA *+,AR7
APAC
LT TE
MPY WEIGHT
SPAC
BCND KEEP,LT
SPLK #1,MARK
KEEP: LACC DCSN_SLOT
ADD MARK,8
SACL TEMPX
OUT TEMPX,51H
DTMF: LACL *+
ADD *,16
SATL ;ENERGY_L/64
SACL *+
SUB #THRES ;THRESHOLD USED TO ENSURE >-23dB SIGNAL LEVEL (L)
BCND RETURN1,LT
SUB #ST
BCND RETURN1,GT
LACL *+
ADD *-,16
SATL ;ENERGY_H/64
SACL *-
SUB #THRES ;THRESHOLD...................................(H)
BCND RETURN1,LT
SUB #ST
BCND RETURN1,GT
LAR AR4,#COS_L
LAR AR0,#0FFFFH
LARP AR4
ZAP
SACB
SPLK #3,LOOPC
LOOP2: LT *+,AR6 ;ENV=Y(n)*Y(n)+Y(n-1)*Y(n-1)-2*COS(wT)*Y(n)*Y(n-1).
MPY *+
LTP *-
SACH TEMPX,4 ;TEMPX=Y(n)*COS(wT).
MPY TEMPX
LACL #0
SQRS *+ ;ACC=2*COS(wT)*Y(n)*Y(n-1).
SQRA *+,AR0
APAC
CRGT
MAR *+,AR4
BCND P2,NC
SAR AR0,GET_L ;SEARCH FOR THE ROW INDEX WITH THE LARGEST ENV.
P2:
LACL LOOPC
SUB #1
SACL LOOPC
BCND LOOP2,GEQ
LACC #WEIGHT_L ;ENV_L*2>u*ENERGY_L/64*64*LENGTH_L
ADD GET_L ;WEIGHT_L=u*64*LENGTH_L/2
SAMM AR3
LARP AR7
LT *+,AR3
MPY *,AR7
LACB
SPAC
BCND RETURN1,LT
LACB ;ENV_L>ENERGY_H*DBHL
LT *
MPY DBHL
SPAC
BCND RETURN1,LT
LAR AR0,#0FFFFH
LARP AR4
ZAP
SACB
SPLK #3,LOOPC
LOOP3: LT *+,AR6
MPY *+
LTP *-
SACH TEMPX,4
MPY TEMPX
LACL #0
SQRS *+
SQRA *+,AR0
APAC
CRGT
MAR *+,AR4
BCND P3,NC
SAR AR0,GET_H
P3:
LACL LOOPC
SUB #1
SACL LOOPC
BCND LOOP3,GEQ
LACC #WEIGHT_H
ADD GET_H
SAMM AR3
LARP AR7
LT *-,AR3
MPY *,AR7
LACB
SPAC
BCND RETURN1,LT
LACB
LT *
MPY DBLH
SPAC
BCND RETURN1,LT
;PASSED ALL THRESHOLDS.
LACC DCSN_SLOT
SAMM TREG1
SPLK #1,TEMPX
LACT TEMPX
AND SIGN
BCND LOOP1_END,NEQ
LACT TEMPX
OR SIGN
SACL SIGN ;IF THE STATE OF THE CURRENT SLOT IS ON,DO NOTHING;
;ELSE STORE THE DETECTED NUMBER INTO "SEQ" BUFFER.
LACC GET_L,2
ADD GET_H
ADD #DIGIT
SAMM AR3
LARP AR3
NOP
LACC *
ADD DCSN_SLOT,4
LAR AR2,SEQUENCE_END
LARP AR2
SACL *+
SAR AR2,SEQUENCE_END ;UPDATE END POINTER
B LOOP1_END
RETURN1:LACC DCSN_SLOT
SAMM TREG1
SPLK #1,TEMPX
LACT TEMPX
CMPL
AND SIGN
SACL SIGN ;CHANGE THE STATE TO "OFF".
LOOP1_END:
LACL DS
ADD #1
SACL DS
SUB #8
BCND LOOP1_START,LT
XPL #1,OE_FLAG ;ALTER OE_FLAG.
SPLK #1,DCSN_SIGN ;SET DCSN_SIGN.
LARP AR2
RET
KEEP1: LARP AR6
MAR *0+,AR7
B KEEP
.label CONTENT_END
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -