;---------------------------------------------------------------------;
; DSK_MEM.ASM
;
; Dieses Programm testet die 64K*32Bit Speichererweiterung für das 
; TI DSK TMS320C31 wie in der ELRAD 01/97 vorgestellt.
;
;	LED orange:		Speicher wird getestet (Dauer: ca. 1,5 sec)
;	LED grün:		Speichertest erfolgreich
;	LED blinkt grün-rot	Fehler im Speicher
; 
; Peter Schwalbach
; Ing.-Büro Bayer, Neuss	
; 12.96
;---------------------------------------------------------------------;
        .start  "mem_test",0x809802; Avoid 0x809800-0x809801 boot stack
        .sect   "mem_test"

MMRBASE .word   0x00808000      ; Constants used to initialize the timers
PRD0    .word   0x100000	; Periode Timer 0 
PRD1    .word   0x200000	; Periode Timer 1  für Error	
TSTART  .word   0x000003C3      ;

MEMBASE	.word	0x900000	; ein Basisadresse der Speichererweiterung
MEMEND	.word	0x910000	; Basisadresse + Speicherlänge, hier 64k Worte


START   ldp     @START          ; Lade Page Pointer
	ldi	10,R1		; LED auf konstant orange
	ldi	20,R2		; also Speichertest 
	call	SET_LED		;
		
	ldi	@MEMBASE,AR1	
	ldi	@MEMEND,AR0
NEXT0	
	call	BIT_TEST	; 
	sti	AR1,*AR1++	; Adresse+1 als Wert in akt. Adresse
	subi3	AR0,AR1,R0	; Ende?	
	bnz	NEXT0
	
	ldi	@MEMBASE,AR1
	ldi	@MEMEND,AR0
NEXT1				
	subi3	AR1,*AR1++,R0	; Adresswerte im Speicher prüfen
	bnz	ERROR
	subi3	*AR1,AR0,R1	; Ende?
	bnz	NEXT1
	
	ldi	1000,R1		; LED auf konstant grün
	ldi	1000,R2		; also Speicher OK
	call	SET_LED		;
	
LOOP    or      0x4,IE          ; Wait for a new command
        idle                    ;
        b       LOOP            ;
        

BIT_TEST			; AR1: Testadresse	
	ldi	 0,R4
	ldi 	 1,R3
	ldi	31,RC		; 31+1 Bits testen
	
	rptb	BIT		; Bits einzeln setzen, Summe in R4
	sti	R3,*AR1		; bilden, invertieren und wenn !=0
	addi	*AR1,R4		; dann Fehler
BIT	lsh	1,R3		;
	ldi	0xffffffff,R0	;
	not	R4,R4		;
	and3	R0,R4,R1	;
	bnz	ERROR
	rets		

ERROR	
	ldi	@PRD0,R1	; LED blinkt grün - rot
	ldi	@PRD1,R2	; also Speicher kaputt
	call	SET_LED		;
	b	LOOP	

SET_LED				; R1: PRD0, R2: PRD1 
	ldi     @MMRBASE,AR0    ; Init timers for slow PWM modulation
        ldi     3,R0            ; HALT timers
        sti     R0,*+AR0(0x20)  ;
        sti     R0,*+AR0(0x30)  ;
        sti     R0,*+AR0(0x24)  ; Init count registers
        sti     R0,*+AR0(0x34)  ;
        sti     R1,*+AR0(0x28)  ; Init periods
        sti     R2,*+AR0(0x38)  ;
        ldi     @TSTART,R0      ; Start timers
        sti     R0,*+AR0(0x20)  ;
        sti     R0,*+AR0(0x30)  ;
	rets
