⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ram.asm

📁 lf2407自检源代码
💻 ASM
字号:
	.title "TMS320C2xx PROCESSOR SELFCHECK -- RAM TEST"
	.length 60
	.width 120
	.option X
************************************************************
*                                                          *
* RAM TEST                                                 *
*                                                          *
* This routine checks on-chip and external RAM.            *
*                                                          *
* Written by David M. Alter                                *
*            member technical staff                        *
*            Texas Instruments Inc.                        *
*                                                          *
* Release Version 1.0                                      *
*                                                          *
************************************************************
	.def    ram
	.nolist
	.copy   "options.h"
	.copy   "memmap.h"
	.list

B0DMA0  .set    200h            ;first address in block B0
							  
;C2xx family common RAM blocks        
B0STRT  .set    200h            ;start address of block B0 DARAM
B0LNTH  .set    100h            ;length of block B0 DARAM
B1STRT  .set    300h            ;start address of block B1 DARAM
B1LNTH  .set    100h            ;length of block B1 DARAM
B2STRT  .set    60h             ;start address of block B2 DARAM
B2LNTH  .set    20h             ;length of block B2 DARAM

;C209 SARAM block
C209STRT .set 1000h             ;start address of SARAM block  
C209LNTH .set 1000h             ;length of SARAM block

	.text
ram:    .set    $+SS

;preliminary setup
	LDP     #0h             ;data page @ 0h
	CLRC    CNF             ;map RAM block B0 to data space
	MAR     *,AR0           ;ARP --> AR0

;test block B2

;first save contents of block B2 in block B1
	LAR     AR0,#B1STRT     ;AR0 points to address 300h
	RPT     #B2LNTH-1       ;execute next instruction "length" times
	BLDD    #B2STRT,*+      ;perform save copy
;perform the test
	LAR     AR0,#B0DMA0     ;AR0 points to address 200h
	SPLK    #B2STRT,*+      ;data(200h) = START
	SPLK    #B2LNTH-1,*-    ;data(201h) = LENGTH-1
	CALL    ptrn            ;call pattern test subroutine
	BCND    eriram1,NEQ     ;abort if RAM block failed test
;restore original contents of block B2 from block B1
	LAR     AR0,#B1STRT     ;AR0 points to address 300h
	RPT     #B2LNTH-1       ;execute next instruction "length" times
	BLDD    *+,#B2STRT      ;perform restore copy

;test block B0
	LAR     AR0,#TEMP00     ;AR0 points to TEMP00
	SPLK    #B0STRT,*+      ;data(TEMP00) = START
	SPLK    #B0LNTH-1,*-    ;data(TEMP01) = LENGTH-1
	CALL    ptrn            ;call pattern test subroutine
	BCND    eriram2,NEQ     ;abort if RAM block failed test

;test block B1
	LAR     AR0,#TEMP00     ;AR0 points to TEMP00
	SPLK    #B1STRT,*+      ;data(TEMP00) = START
	SPLK    #B1LNTH-1,*-    ;data(TEMP01) = LENGTH-1
	CALL    ptrn            ;call pattern test subroutine
	BCND    eriram3,NEQ     ;abort if RAM block failed test

;test C209 SARAM block
	.if RAM_C209 == 1
	LAR     AR0,#TEMP00     ;AR0 points to TEMP00
	SPLK    #C209STRT,*+    ;data(TEMP00) = START
	SPLK    #C209LNTH-1,*-  ;data(TEMP01) = LENGTH-1
	CALL    ptrn            ;call pattern test subroutine
	BCND    eriram4,NEQ     ;abort if RAM block failed test
	.endif

;test External RAM block #1
	.if RAM_EXT1 == 1
	LAR     AR0,#TEMP00     ;AR0 points to TEMP00
	SPLK    #EXT1STRT,*+    ;data(TEMP00) = START
	SPLK    #EXT1LNTH-1,*-  ;data(TEMP01) = LENGTH-1
	CALL    ptrn            ;call pattern test subroutine
	BCND    eriram5,NEQ     ;abort if RAM block failed test
	.endif

;test External RAM block #2
	.if RAM_EXT2 == 1
	LAR     AR0,#TEMP00     ;AR0 points to TEMP00
	SPLK    #EXT2STRT,*+    ;data(TEMP00) = START
	SPLK    #EXT2LNTH-1,*-  ;data(TEMP01) = LENGTH-1
	CALL    ptrn            ;call pattern test subroutine
	BCND    eriram6,NEQ     ;abort if RAM block failed test
	.endif

	RET                     ;test passes

*
* ERROR HANDLERS
*

eriram1: .set   $+SS
	LACL    #70h            ;Block B2 error
	RET                     ;test fails
eriram2: .set   $+SS
	LACL    #71h            ;Block B0 error
	RET                     ;test fails
eriram3: .set   $+SS
	LACL    #72h            ;Block B1 error
	RET                     ;test fails

	.if  RAM_C209 == 1
eriram4: .set   $+SS
	LACL    #73h            ;C209 SARAM block error
	RET                     ;test fails            
	.endif
	
	.if  RAM_EXT1 == 1
eriram5: .set   $+SS
	LACL    #74h            ;External RAM block #1 error
	RET                     ;test fails            
	.endif
	
	.if  RAM_EXT2 == 1
eriram6: .set   $+SS
	LACL    #75h            ;External RAM block #2 error
	RET                     ;test fails            
	.endif


	.page
************************************************************
*                                                          *
* SUBROUTINE ptrn                                          *
*                                                          *
* This subroutine performs the bit pattern testing in RAM. *
*                                                          *
************************************************************

PTRN1   .set    5555h           ;test pattern 1
PTRN2   .set    0aaaah          ;test pattern 2

ptrn:   .set    $+SS

;test pattern #1        
	LAR     AR1,*+          ;AR1 points to block start
	LACC    #PTRN1          ;ACC contains test pattern
	RPT     *,AR1           ;execute next instruction "length" times
	SACL    *+              ;write test pattern to memory
	
	MAR     *-,AR0          ;AR1 points to block end
	RPT     *,AR1           ;execute next instruction "length" times
	AND     *-              ;test that all 1's wrote correctly
	XOR     #PTRN1          ;XOR with the pattern
	BCND    erptrn,NEQ      ;if ACC != 0 then error
	
	MAR     *+,AR0          ;AR1 points to block start
	RPT     *-,AR1          ;execute next instruction "length" times
	OR      *+              ;test that all 0's wrote correctly
	XOR     #PTRN1          ;XOR with the pattern
	BCND    erptrn,NEQ      ;if ACC != 0 then error
	MAR     *,AR0           ;ARP --> AR0
	
;test pattern #2        
	LAR     AR1,*+          ;AR1 points to block start
	LACC    #PTRN2          ;ACC contains test pattern
	RPT     *,AR1           ;execute next instruction "length" times
	SACL    *+              ;write test pattern to memory
	
	MAR     *-,AR0          ;AR1 points to block end
	RPT     *,AR1           ;execute next instruction "length" times
	AND     *-              ;test that all 1's wrote correctly
	XOR     #PTRN2          ;XOR with the pattern
	BCND    erptrn,NEQ      ;if ACC != 0 then error
	
	MAR     *+,AR0          ;AR1 points to block start
	RPT     *-,AR1          ;execute next instruction "length" times
	OR      *+              ;test that all 0's wrote correctly
	XOR     #PTRN2          ;XOR with the pattern
	BCND    erptrn,NEQ      ;if ACC != 0 then error
	MAR     *,AR0           ;ARP --> AR0

	RET

erptrn  .set    $+SS
	LACL    #1h             ;return arbitrary non-zero ACC on error
	RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -