📄 at0.asm
字号:
.title "DTMF SIGNAL DECTECTOR & GENERATOR"
.version 50
.mmregs
LENGTH: .set 120
THRES: .set 30
ST: .set 16330
.sect ".table"
.label TABLE_SRC
DIGIT: .int 1, 2, 3,13 ;NUMBER TABLE
.int 4, 5, 6,14
.int 7, 8, 9,15
.int 11, 0,12,10
TRANS: .int 13, 0, 1, 2 ;ROW&COLUMN ADDRESS TABLE
.int 4, 5, 6, 8 ;ROW ADDRESS IS LOW GROUP INDEX.
.int 9,10,15,12 ;COLUMN ADDRESS IS HIGH GROUP INDEX.
.int 14, 3, 7,11 ;ROW*4+COLUMN (4 BITS) SPANS 0--15.
WEIGHT: .word 0800H
WEIGHT_L: .word 1220H,1140H,0FC0H,0E40H
WEIGHT_H: .word 0E00H,0CC0H,0AC0H,0800H
CTONE: .int 7686 ;DEFAULT AS 450Hz
COS_L: .int 6995,6739,6425,6055 ;2*COS(WiT)
COS_H: .int 4768,4081,3271,2329
SINWKT: .int 0, -313 ;902(-10dB)
.int 0, -526,0, -575,0, -628,0, -682 ;1012(-9dB)
.int 0,-1036,0,-1105,0,-1168,0,-1221 ;1274(-7dB)
;SIN(WiKT), SIN[Wi(K-1)T] .
;INITIALIZE K=0.
LP_FILTER:
.int 7248,-3910,1636,-3037
.int 5286,-3777,2875,-3369 ;-B,-C,A(AE),AD
.int 5940,-3146,-818,0 ;-B,-C,AE(-A),0
HP_FILTER:
.int 5246,-3729,1898,-2789 ;-B,-C,A(AE),AD
.int 2866,-1412,4022,-7365
DBHL: .int 450
DBLH: .int 320
ACT: .int 0
.label TABLE_END
; .table section will be mapped into onchip B1
.sect ".adat"
.copy "adat.asm"
SEQ: .usect ".seq",32
PRCS: .usect ".cnts",512
.bss GET_L,1
.bss GET_H,1
.bss SMPL,1
.bss TEMP,1
.bss TEMPX,1
.bss SIGN,1
.bss COUNTER,1
.bss SEQUENCE_SRC,1
.bss SEQUENCE_END,1
.bss RCV_SLOT,1
.bss DCSN_SLOT,1
.bss DS,1
.bss SAMPLE_L,1
.bss SAMPLE_H,1
.bss AR3TEMP,1
.bss AR4TEMP,1
.bss SLOT,1
.bss FB_FLAG,1
.bss OE_FLAG,1
.bss MARK,1
.bss DCSN_SIGN,1
.bss RECU_SIGN,1
.bss S450,1
.bss TE,1
.bss LOOPC,1
.bss ITER,1
.bss DTCT_SMPL,16
.bss S,80
.bss Y,144
.bss ENERGY,48
;****************************************************************************
.sect ".vectors"
RESET: B INIT
.space 8*16
RINT: B ISR2
.space 6*16
INT4: B ISR1
;****************************************************************************
.text
INIT: LDP #0
SPLK #3,PDWSR
CLRC SXM
SETC OVM
CLRC XF
MAR *,0
LAR AR0,#PRCS
RPT #(CONTENT_END-CONTENT_SRC-1)
BLPD #CONTENT_SRC,*+ ;LOAD TIME CRITICAL CODES INTO ON_CHIP B0
SETC CNF ;MAP B0 INTO PROGRAM MEMORY
LAR AR0,#DIGIT
RPT #(TABLE_END-TABLE_SRC-1)
BLPD #TABLE_SRC,*+ ;LOAD DATA TABLES INTO ON_CHIP B1
OPL #6,PMST ;ENABLE MULTIPLE TREGs
;ENABLE EXTRA INDEX REGISTER
SPLK #2,INDX ;AUX. REGISTER INDEX STEP=2
SPLK #8,SPC
;INITIALIZE SERIAL PORT:
;FSM=1,MCM=TXM=DLB=FO=0
;CONTIOUS MODE,16-BIT FORMAT,
;EXTERNAL CLKX & FSX,
;NOT LOOPBACK,FREE RUN,
;PUT SP INTO RESET(XRST=RRST=0)
SPLK #0FFFFH,IFR
;CLEAR IFR
LAR AR0,#SEQUENCE_SRC
LACC #SEQ
SACL *+
SACL * ;INITIALIZE THE SEQUENCE POINTER
LAR AR0,#S
ZAP
RPT #80+144+48-1
SACL *+ ;CLEAR S,Y,ENERGY
SPLK #TRANS,CBSR1
SPLK #TRANS+15,CBER1
SPLK #9,CBCR ;AR1 POINTS TO TRANS AS CIRCULAR BUFFER 1
LAR AR1,#TRANS+2 ;INITIALIZE AR1 TO POINT TO SLOT NO.1
SPLK #SEQ,CBSR2
SPLK #SEQ+31,CBER2
OPL #0A0H,CBCR ;AR2 POINTS TO SEQ AS CIRCULAR BUFFER 2
LDP #6
SPLK #0,RCV_SLOT
SPLK #0,SIGN ;THE 16 BITS OF SIGN REPRESENT THE STATES
; OF 16 SLOTS. "1" MEANS ON , "0" MEANS OFF.
SPLK #0,COUNTER
SPLK #0,RECU_SIGN ;RECU_SIGN=0 MEANS NO RECUSION .
SPLK #1,DCSN_SIGN ;DCSN_SIGN=1 MEANS NO DECISION .
SPLK #0,FB_FLAG ;THE 16 SLOTS AT THE BEGINING OF A FRAME
;ARE AVAILABLE FOR DTMF DETECTION AND
;GENERATION.
SPLK #13,ITER
SPLK #0,OE_FLAG ;EVEN SLOTS OF THE 16 SLOTS WILL BE PROCESSED
;FIRST.
LAR AR5,#S
LAR AR6,#Y
LAR AR7,#ENERGY
LARP AR2
LACC #100H
SAMM IMR
CLRC INTM
WAIT0: CPL #1,ACT
BCND WAIT0,NTC
SETC INTM
LDP #0
OPL #0C0H,SPC ;TAKE SP OUT OF RESET
SPLK #5555H,DXR
SPLK #010H,IMR ;TURN ON RINT
LDP #6
CLRC INTM
B DETECT
;****************************************************************************
DETECT: CPL #0,DCSN_SIGN ;IF DCSN_SIGN=0, GO TO DCSN ROUTINE.
CC DCSN,TC ;DCSN_SIGN IS RESET WHEN RECUSIVE CALCUTION
;OF THE MATCHED FILTER COMPLETED, AND SET
;WHEN DECISION COMPLETED.
LACL SEQUENCE_SRC
SUB SEQUENCE_END
BCND DETECT,EQ ;SEQUENCE_SRC=SEQUENCE_END MEANS NO FURTHER
;NUMBER DETECTED.
LAR AR2,SEQUENCE_SRC ;IF SEQUENCE_SRC != SEQUENCE_END, NEW NUMBER
;DETECTED WILL BE SENT TO 8031 THROUGH I/O
;PORT WITH HAND-SHAKING.
OUT *+,50H
SAR AR2,SEQUENCE_SRC ;UPDATE THE SOURCE POINT.
SETC XF ;SET XF, WAIT UNTIL BIO SET, CLEAR XF.
WAIT2: CPL #0,DCSN_SIGN
CC DCSN,TC
BCND WAIT2,BIO
CLRC XF
B DETECT
;****************************************************************************
ISR1: SAR AR3,AR3TEMP ;ISR OF EXT. INT4.
SAR AR4,AR4TEMP ;INT4 IS ACTIVATED BY 8031.
IN TEMP,50H ;GET 5-BIT SLOT INDEX AND 5-BIT DIALING NUMBER.
APL #0FFH,TEMP ;ONLY 8 LSBs USED.
CPL #020H,TEMP
BCND CMD1,TC
CPL #030H,TEMP
BCND CMD2,TC
CPL #040H,TEMP
BCND CMD3,TC
CPL #041H,TEMP
BCND CMD4,TC
CPL #042H,TEMP
BCND CMD5,TC
CPL #0E0H,TEMP
BCND CMD6,TC
BACK: LAR AR3,AR3TEMP
LAR AR4,AR4TEMP
RETE
CMD1: SPLK #00H,FB_FLAG
SPLK #13,ITER
B BACK
CMD2: SPLK #10H,FB_FLAG
SPLK #3,ITER
B BACK
CMD3: SPLK #7791,CTONE
SPLK #-278,SINWKT+1
B BACK
CMD4: SPLK #7686,CTONE
SPLK #-313,SINWKT+1
B BACK
CMD5: SPLK #7568,CTONE
SPLK #-345,SINWKT+1
B BACK
CMD6: SPLK #1,ACT
B BACK
;****************************************************************************
.sect ".content"
.label CONTENT_SRC
;****************************************************************************
ISR2: SAR AR3,AR3TEMP ;STORE AR3 AND AR4
SAR AR4,AR4TEMP
SETC SXM
LAMM IFR
AND #01H
SAMM IFR
BCNDD XMT,EQ ;EXT. INT1 IS USED FOR SYNCHRONIZATION.
LACL #20H
SAMM IFR ;CLEAR XMT INTERRUPT FLAG.
;IF INT1 IS SET THEN:
SPLK #0FH,RCV_SLOT ;1. RECEIVED SAMPLE OF SLOT 30 & 31
;CAN BE GOT FROM THE SERIAL PORT.
LAR AR1,#TRANS+1 ;2. THE SAMPLE OF SLOT 2 & 3 SHOULD BE PASSED
;TO THE SERIAL PORT.
XMT: LARP 1
LACC *
AND #0CH
SFR
ADD #SINWKT+2
SAMM AR3 ;ROW ADDRESS -->AR3
LACC *+,1,AR3
AND #6
ADD #SINWKT+10
SAMM AR4 ;COLUMN ADDRESS -->AR4
LARP AR3
LACC *,AR4
ADD *,AR3
AND #01FFFH
ADD #ENC ;ALAW ENCODE
TBLR TEMP
LACC S450,8
ADD TEMP
SACL TEMP
LMMR DXR,#TEMP
LACL RCV_SLOT
SUB ITER
BCND RCV,NEQ
REFRESH:LAR AR3,#SINWKT ;UPDATE 9 SAMPLES AT 9 FREQUENCIES
LAR AR4,#CTONE ;WHEN RCV_SLOT=13.
LARP AR3 ;FORMULA:
LACL #8 ;sin[w(k+1)T]=2*cos(wT)*sin(wT)-sin[w(k-1)T].
SAMM BRCR
RPTB L0-1
LT *+,AR4
MPY *+,AR3
PAC
SUB *-,12
DMOV *
SACH *0+,4
L0:
LACC SINWKT
AND #01FFFH
ADD #ENC
TBLR S450
RCV: CLRC SXM
LACC RCV_SLOT,1
XOR FB_FLAG ;FB_FLAG=00H POINTS TO THE 1ST HALF OF ALL 32 SLOTS.
;FB_FLAG=10H POINTS TO THE 2ND HALF.
SACL SLOT
SUB #10H
BCNDD STEP0,GEQ
LAMM DRR
NOP
SACL TEMP
LACC #DTCT_SMPL
ADD SLOT
SAMM AR3
LARP AR3
LACC TEMP,8
SACH *+
LACL TEMP
AND #0FFH
SACL * ;STORE THE RECEIVED SAMPLES INTO "DTCT_SMPL" BUFFER
STEP0: CPL #0,RECU_SIGN ;IF RECU_SIGN=1 THEN CARRY OUT RECUSION
BCND RETURN,TC
LACL RCV_SLOT ;IF OE_FLAG=0, THEN PROCESS EVEN SLOTS;
AND #1 ;IF OE_FLAG=1, THEN PROCESS ODD SLOTS.
SUB OE_FLAG
BCND RETURN,NEQ
CPL #0,COUNTER ;IF COUNTER=0, THEN GO TO CLR ROUTINE.
BCND CLR,TC
LACC #DTCT_SMPL ;GET THE SAMPLE FROM DTCT_SMPL BUFFER.
ADD RCV_SLOT
SAMM AR3
LARP AR3
LACC #DEC
ADD *,AR5
TBLR SMPL
RES: SETC SXM
LAR AR4,#LP_FILTER
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -