📄 实时回放5410.c
字号:
.title "bigt8n"
.include "init54x.inc"
.include "initbsp.inc"
.include "cpu_reg.inc"
.include "K_def.inc"
.mmregs
RBLENG .set 7FFFH ;循环buffer的长度
;FOLLOWING IS MACRO DEFINE FOR AD 以下是为AD定义的宏
;**********************************************************************
;设置写MCBSP加法寄存器,将addr和val分别送入地址和数据中
WR_MCBSP_SUB_REG .macro addr,val
stm addr,SPSA0 ;addr -> SPSA0
nop
stm val,SPSD0 ;val->SPSD0
nop
.endm
;设置读MCBSP减法寄存器存器,
RD_MCBSP_SUB_REG .macro addr,acc
stm #:addr:,SPSA0
nop
ldm SPSD0,acc ;SPSD0 -> acc;送入acc累加器
nop
nop
nop
.endm
WAITTRX .macro ; Wait for serial port to Rx word
WAITR?
RD_MCBSP_SUB_REG SPCR20,A
and #1<<1, A
bc WAITR?, AEQ
.endm
PROGREG .macro progword
WAITTRX
stm #01h,DXR10
WAITTRX
stm :progword:,DXR10
.endm
wait .macro val
RPT val ;repeat the #val of times
NOP ;do nothing in the loop
.endm
;*********************************************************************
.def MAIN_START
.data ;汇编进初始化的数据段.data
RES_SPACE:
.space 07E0h ;reserve 127 words and clear 0
;保留07E0h比特的空间(即127个字的空间),并清零.
.word 8000h
.word 0000H
.sect ".DISPLAY" ;汇编进命名的(初始化)段,后面引号是段名.
.label DISPLAY_SRC ;指示当前段内的装入时间地址.
.word 08AAH ;INDICATE 8BITS PARALLEL BOOT MODE
.word 7fffH ;VALUE FOR SWWSR
.word 0F000H ;VALUE FOR BSCR
.word 0000h ;xpc for entry point ; xpc是程序计数器扩展寄存器
.word 0100h ;pc for entry point
.word 02f0h ;size of first section; 第一部分大小
.word 0000h ;xpc for first section
.word 0100h ;pc for first section
.copy "vector.asm" ;转向读取该文件的源代码,然后转回.
MAIN_START: ;主程序起始点
DISPLAY:
LD #00H,DP ;将立即数加载到DP中
STM #K_SP,SP ;将K_SP的值写入SP中,一下类同.
STM #K_ST0,ST0 ;DP=0,ARP=0
STM #K_ST1,ST1 ;INTM=1,SXM=0,CMPT=0,XF=0
RSBX XF ;置XF=0
STM #K_PMST,PMST ;IPTR=02,MP/MC=1,OVLY=1,AVIS=0,drom=1, clkoff=1,
STM #K_SWWSR,SWWSR ;I/O is ONE cycle wait
STM #K_SWCR,SWCR
STM #K_BSCR,BSCR
STM #SPCR12,SPSA2 ;POINT TO SPCR12
STM #0000H,SPSD2 ;CONFIG SPCR1 TO 0000H
STM #SPCR22,SPSA2 ;POINT TO SPCR22
STM #0000H,SPSD2 ;CONFIG SPCR2 TO 0000H
STM #PCR2,SPSA2 ;POINT TO PCR2
STM #3F6FH,SPSD2 ;0011111101101111b,SET BDX2=1
ST #0FFF7H,PORT2_BUF
PORTW PORT2_BUF,0002H ;将PORT2_BUF内数写入0002H地址
STM #0b,CLKMD
T_STATU0X: ;该模块检查CLKMD是否清零
LDM CLKMD,A ;将CLKMD加载到累加器A
AND #01b,A
BC T_STATU0X,ANEQ ;累加器A!=0,则跳到T_STATU0X
STM #0b,CLKMD
;*************************************************************************
;* audio_init:
;*************************************************************************
_DSS_init
WR_MCBSP_SUB_REG SPCR10, #SPCR10_VAL ; reset McBSP0;左边地址右边数值
WR_MCBSP_SUB_REG SPCR20, #SPCR20_VAL ;将SPCR20_VAL的值送入SPCR20指示的地址中
WAIT #1000H ;等待1000H个周期
WR_MCBSP_SUB_REG PCR0, #PCR0_VAL
WR_MCBSP_SUB_REG RCR10, #RCR10_VAL
WR_MCBSP_SUB_REG RCR20, #RCR20_VAL
WR_MCBSP_SUB_REG XCR10, #XCR10_VAL
WR_MCBSP_SUB_REG XCR20, #XCR20_VAL
WAIT #1000H
; set interrupts to come from serial ports not DMA
; by clearing bits 6 and 7 in DMPREC;将DMPREC第6,7位清零
andm #0ff3fh, 54h ;结果存入54H地址
;AFTER ENABLE mcbsp0, SEND 0 TO EXTERNAL TO SET UP DATA ACQUISTION AS REQUIRED
stm #0, DXR10
; now enable McBSP transmit and receive;使MCSBP可以进行传输和接收工作
WR_MCBSP_SUB_REG SPCR10,#SPCR10_VAL | 1
WR_MCBSP_SUB_REG SPCR20,#SPCR20_VAL | 1
WAIT #1000H
CALL DELAY
CALL DELAY
;*************************************************************************
;* AIC_INIT:
;* Initialization of TLC320AD50.
;*************************************************************************
_AIC_INIT
WAIT #1000H
PROGREG #AD50REG3_VAL ;将立即数送入DXR10
WAIT #1000H
PROGREG #AD50REG4_VAL
nop
nop
nop
CALL DELAY
CALL DELAY
CALL DELAY
ld DRR10, A ;将DRR10加载到A中
ld DRR10, A
STM #0000H,DXR10
STM #0000H,DXR10
BOOT_DISPLAY
STM #0001H,AR5 ;循环两次
LOOPF: ANDM #NOTEPT,PORT2_BUF
portw PORT2_BUF,0002h
CALL DELAY
ORM #EPTLED,PORT2_BUF ;两者相或存到PORT2_BUF
portw PORT2_BUF,0002h
CALL DELAY
BANZ LOOPF,*AR5- ;AR5不为零就转到LOOPF
INIT ;初始化
STM #K_IMR,IMR ;ENABLE INT1 AND BRINT0
STM #8000H,AR5
STM #8000H,AR6
STM #RBLENG,BK ;前面设定
ST #00FFH,TEMP ;EMPTY STATUS 设置TEMP
ST #0FFF7H,PORT2_BUF
ST #00FFH,INT1FLAG ;HAVE INTERRUPT
ORM #EPTLED,PORT2_BUF ;两者相或存到PORT2_BUF
PORTW PORT2_BUF,0002H ;DISPLAY EMPTY STATUS
RSBX INTM ;ENABLE INTERRUPT
STM #K_CLKMD,CLKMD ;set clock to 100Mhz
WAIT #1000H
MAIN_LOOP
RSBX XF ;SET XF LOW FOR READ EF1.通用输出引脚置0(复位);
BITF TEMP,#0FF00H; 获取指定位域;
BC READ,TC ;FULL,JUMP TO READ DATA; 满(TC=1)就跳到READ
RPT #08H
NOP
BC READ,BIO ;满足BIO(BIO=0)条件就跳转到READ
PORTR 0000H,LENTEMP ;READ PACK LENGTH
LD LENTEMP,-1,A ;LENGTH=LENGTH/2 FOR WRITE AND READ
AND #003FH,A
BC READ,AEQ
SUB #0001H,A,A
STL A,*AR5+% ;STORE (LENGTH/2-1)
STLM A,AR3
WAITS BC WAITS,BIO
PORTR 0000H,HIGHBYTE
LD HIGHBYTE,8,A
WAITT BC WAITT,BIO
PORTR 0000H,LOWBYTE
ANDM #00FFH,LOWBYTE
OR LOWBYTE,A
STL A,*AR5+%
BANZ WAITS,*AR3-
MVMM AR5,AR0
MVMD AR5,WRITEP
LDM AR6,A
CMPR 2,AR6
BC SETFULL,TC
ADD #RBLENG,A
SETFULL SUB WRITEP,A
SUB #0060H,A
BC NOTFULL,AGEQ
ST #0FF00H,TEMP ;FULL FLAG
ANDM #NOTEPT,PORT2_BUF
PORTW PORT2_BUF,0002H ;DISPLAY
B READ
NOTFULL ST #0000H,TEMP
ANDM #NOTEPT,PORT2_BUF
PORTW PORT2_BUF,0002H
READ SSBX XF ;SET XF HIGH FOR READ HF2
BITF TEMP,#00FFH
BC MAIN_LOOP,TC ;EMPTY ,JUMP TO ANOTHER LOOP
BITF INT1FLAG,#00FFH
BC MAIN_LOOP,NTC
RPT #08H
NOP
BC MAIN_LOOP,BIO ;MORE THAN HALF FULL
LD *AR6+%,A
STLM A,AR3 ;PACK LENGTH COUNTER TO AR3
ADD #0001,A
STL A,1,LENTEMP
PORTW LENTEMP,0000H ;WRITE PACK LENGTH TO FIFO2
RPTWR LD *AR6,-8,A
STL A,HIGHBYTE
PORTW HIGHBYTE,0000H ;WRITE HIGH BYTE TO FIFO2
PORTW *AR6+%,0000H ;WRITE LOW BYTE TO FIFO2
BANZ RPTWR,*AR3-
ST #0000H,INT1FLAG
ORM #SETINTHIGH,PORT2_BUF
PORTW PORT2_BUF,0002H
RPT #10 ;SET INT OUT HIGH
NOP
MVMM AR5,AR0
CMPR 0,AR6
BC SETEMPTY,TC
ST #0000H,TEMP
ANDM #NOTEPT,PORT2_BUF
ANDM #SETINTLOW,PORT2_BUF
PORTW PORT2_BUF,0002H
B MAIN_LOOP
SETEMPTY ST #00FFH,TEMP
ORM #EPTLED,PORT2_BUF
ANDM #SETINTLOW,PORT2_BUF
PORTW PORT2_BUF,0002H
B MAIN_LOOP
INT1 ST #00FFH,INT1FLAG
POPM ST1
POPM ST0
RETE
;*************************************************************************
;* ANALOG_IFC:
;*
;* Serial port receive interrupt service routine
;************************************************************************
_CPU_to_codec_ch1
PSHM AL
PSHM AH
PSHM AG
LDM DRR10, a ;将DRR10加载到寄存器A中
and #0fffeh, A ;masking out LSB
STL A,DXR10
POPM AG
POPM AH
POPM AL
POPM ST1
POPM ST0
rete
DELAY:
PSHM AR6
STM #0020H,AR6
DELAY_LOOP:
RPT #(0fff0h)
NOP
BANZ DELAY_LOOP,*AR6-
POPM AR6
RET
.space 2000h
.label DISPLAY_END
.text
LD #00H,DP
STM #K_SP,SP
STM #0FFA0H,PMST ;OVLY=1&MP/MC=0,drom=0,clkoff=0
STM #07FFFH,SWWSR
STM #0FFFFH,SWCR
STM #SPCR12,SPSA2 ;POINT TO SPCR12
STM #0000H,SPSD2 ;CONFIG SPCR1 TO 0000H
STM #SPCR22,SPSA2 ;POINT TO SPCR22
STM #0000H,SPSD2 ;CONFIG SPCR2 TO 0000H
STM #PCR2,SPSA2 ;POINT TO PCR2
STM #3F4FH,SPSD2 ;0011111101001111b
SSBX INTM ;disable all interrupt
ST #0FFFFH,PORT2_BUF
ORM #EPTLED,PORT2_BUF
ANDM #CLR_CWR,PORT2_BUF ;SET CWR LOW
PORTW PORT2_BUF,0002H ;SHUT LED
STM #8000H,AR3
STM DISPLAY_SRC,AR5
STM #0BH,AR4 ;WRITE FIRST BLOCK OF BOOT ABLE
WRI_RPT ;768 WORDS TOTAL
STM #63,AR1 ;WRITE 128 BYTES
WRI_LOP:
LD *AR5,-8,A
STL A,*AR3+
NOP
NOP
NOP
LD *AR5+,A
STL A,*AR3+
nop
BANZ WRI_LOP,*AR1-
CALL DELAYY
BANZ WRI_RPT,*AR4-
STM #RES_SPACE,AR1 ;WRITE THE SOURCE ADDRESS
STM #0FF80H,AR5
STM #127,AR3
WRI_LOOP:
LD *AR1+,-8,A
STL A,*AR5+
nop
BANZ WRI_LOOP,*AR3-
LOAD_LOOP:
ANDM #NOTEPT,PORT2_BUF
ORM #SET_CWR,PORT2_BUF
PORTW PORT2_BUF,0002H ;LIT LED
B $
DELAYY:
PSHM AR2
STM #0020H,AR2
DELAYY_LOOP:
RPT #0fff0h
NOP
BANZ DELAYY_LOOP,*AR2-
POPM AR2
RET
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -