;*********************************************************
; NAMN		:	RAM - TEST
; PROGRAMMERARE	:	L-O/IND
; DATUM		:	86-10-14
; MODIFIERAD	:	
;*********************************************************
;
; SYFTE		:	Kontrollera att RAM fungerar
;
; ANROPAS FR]N	:	tknkoll
;
; SUBRUTINER
;    INTERNA	:	TEST	Testar RAM
;
;    EXTERNA	:	PUTNUM	Konverterar testresultatet
;				till HEX-tecken och
;				anropar PUTCHR
;			PUTCHR	L{gger tkn i tx-buffert
;			INIRAM	Initierar RAM
;
;*********************************************************
;
	FORMLN	42
	NAME	RAMTEST

	INCLUDE	TMC.H
;
COMND	EQU	'G'		; Kommando = G
;
; VARIABLER:
;
	EXTERN	PARAM, TSTFLG, STKTOP
;
; LABLAR:
;
	EXTERN	MAIN
	EXTERN	OTHRCH, INIRAM
	EXTERN	PUTNUM, PUTCHR
;
	INTERN	RAMTST
;
	PAGE
;*********************************************************
;
; L{s l}g och h|g adress
; CASE "Adresskoll"
;     WHEN l}g adress = h|g adress
;         CASE "Noll"
;             WHEN b}da adresserna {r 0
;                 Anv{nd defaultadresserna
;                 "TESTA"
;         END "Noll"
;     OTHERWISE
;         Swappa adresserna WHEN l}g adress > h|g adress
;         "TESTA" WHEN adresserna {r RAM-adresser
; END "Adresskoll"
; "SKICKA SVAR"
;
;*********************************************************
;
	RSECT	PROM
;
RAMTST:
	LD	HL,TSTFLG	; 
	LD	(HL),FALSE	;

	LD	HL,(PARAM)	; L}g adress
	LD	DE,(PARAM+2)	; H|g adress
	SCF
	CCF
	SBC	HL,DE		; L}g adress = h|g adress?
	JP	NZ,DIFF		; Nej
;
	LD	HL,(PARAM)	; Ja
	LD	A,H		; 
	OR	L		; Adresserna = 0?
	CP	0		; 
	JP	NZ,SNDSTX	; Nej
;
	LD	BC,RAMSTA	; Ja
	LD	DE,RAMEND	; Anv{nd defaultparametrarna
	LD	HL,RAMEND	; F|r skrivloop
;
	EXX			;
	LD	BC,RAMSTA	; F|r l{sloop
	LD	DE,RAMEND	; 
	EXX			;
;
	CALL	TEST		; Testa RAM och hoppa till SNDSTX
DIFF:
	LD	HL,(PARAM)
	SCF
	CCF
	SBC	HL,DE		; L}g adress > h|g adress?
	JP	C,RAMADQ	; Nej
;
	LD	HL,(PARAM)	; Ja
	LD	(PARAM),DE	; Swappa adresserna
	LD	(PARAM+2),HL	;
RAMADQ:
	LD	HL,(PARAM)	;
	LD	BC,RAMSTA	;
	SCF
	CCF
	SBC	HL,BC		; [r adresserna RAM-adresser?
	JP	C,SNDSTX	;
	LD	HL,RAMEND	;
	LD	BC,(PARAM+2)	;
	SCF
	CCF
	SBC	HL,BC		;
	JP	C,SNDSTX	; Nej
;
	LD	BC,(PARAM)	; Ja
	LD	DE,(PARAM+2)	; F|r skrivloop
	LD	HL,(PARAM+2)	; 
;
	EXX			;
	LD	BC,(PARAM)	; F|r l{sloop
	LD	DE,(PARAM+2)	; 
	EXX			;
;
	CALL	TEST		; Testa RAM
;
	PAGE
;*********************************************************
;
;	SKICKA SVAR
;	-----------
;	
; "PUTCHAR" 'STX'
; Testresultat = FF WHEN test ej utf|rd
; "PUTNUM" testresultat
; "PUTCHAR" kommando
;
;*********************************************************
;
SNDSTX:
	LD	A,STX		; 
	CALL	PUTCHR		; Skicka STX
;
	LD	A,(TSTFLG)	; Testet utf|rt?
	CP	TRUE		;
	JP	Z,SNDRPM	; Ja
	LD	B,0FFH		; Nej
SNDRPM:
	LD	A,B		; 
	CALL	PUTNUM		; Skicka testresultat
SNDCMD:
	LD	A,COMND		; 
	CALL	PUTCHR		; Skicka kommando
;
	LD	HL,(TSTFLG)
	LD	(HL),FALSE
;
	RET
;
	PAGE
;*********************************************************
;
;	TESTA
;	-----
;
; Disable interrupt
; "ADRESSTEST"
; "VANDRANDE ETTA"
; "VANDRANDE NOLLA"
; Initiera stackpekare
; Initiera RAM
; Enable interrupt
;
;*********************************************************
;
TEST:
	DI
;
	EX	AF,AF'		;
	SUB	A		; Nollst{ll felmarkeringsregister
	EX	AF,AF'		;
;
	PAGE
;*********************************************************
;
;	ADRESSTEST: FYLL RAM
;	--------------------
;
;	Adress = Nedre adress
;	R{knare = 0
;	Skriv r{knare i adress
;	REPEAT "Skriv"
;	    \ka adress
;	    CASE "R{knare"
;	        WHEN r{knare <= 250
;	            \ka r{knare
;	        OTHERWISE
;	            R{knare = 0
;	    END "R{knare"
;	    Skriv r{knare i adress
;	END "Skriv" WHEN adress = \vre adress
;
;*********************************************************
;
	LD	A,0		; R{knare
	LD	(BC),A		; Skriv
FLOOP:
	INC	BC		; N{sta adr
	CP	251		; R{knare <= 250?
	JP	NC,FSETCNT	; Nej
;
	INC	A		; Ja, |ka r{knare
	JP	FWRITE
FSETCNT:
	LD	A,0		; R{knare = 0
FWRITE:
	LD	(BC),A		; Skriv
	LD	H,B
	LD	L,C
	SCF
	CCF
	SBC	HL,DE		; Sista adr i RAM?
	JP	NZ,FLOOP	; Nej

	EXX			; ]terst{ll BC
	LD	A,B
	EXX
	LD	B,A
	EXX
	LD	A,C
	EXX
	LD	C,A

	PAGE
;*********************************************************
;
;	ADRESSTEST KOLLA RAM
;	--------------------
;
;	Adress = L}g adress -1
;	R{knare = 251
;	REPEAT "Kontrollera"
;	    \ka adress
;	    CASE "R{knare"
;	        WHEN r{knare <= 250
;	            \ka r{knare
;	        OTHERWISE
;	            R{knare = 0
;	    END "R{knare"
;	    J{mf|r data i adress mot r{knare
;	    CASE "Error"
;	        WHEN olika
;	            Markera fel
;	            EXIT "Kontrollera"
;	    END "Error"
;	END "Kontrollera" WHEN adress = H|g adress
;
;*********************************************************
;
;
	DEC	BC
	LD	A,251		; > 250
KLOOP:
	INC	BC		; N{sta adress
	CP	251		; R{knare <= 250 ?
	JP	NC,KSETCNT	; Nej
;
	INC	A		; Ja, |ka r{knare
	JP	COMPAR
KSETCNT:
	LD	A,0		; R{knare = 0
COMPAR:
	LD	H,B
	LD	L,C
	CP	(HL)		; Cellinneh}ll = r{knare?
	JP	Z,READYQ	; Ja
ERROR:
	EX	AF,AF'		; Nej
	SET	0,A		; Markera felet
	EX	AF,AF'
	JR	EXADKO		; EXIT Loop
READYQ:
	SCF
	CCF
	SBC	HL,DE		; H|g adress i RAM?
	JP	NZ,KLOOP	; Nej

EXADKO:

	EXX			; ]terst{ll BC
	LD	A,B
	EXX
	LD	B,A
	EXX
	LD	A,C
	EXX
	LD	C,A

	PAGE
;*********************************************************
;
;	VANDRANDE ETTA
;	--------------
;
; Nollst{ll minnet
; Adress = \vre adress + 1
; REPEAT "Byteloop"
;     Adress minskas med 1
;     Ack-reg = 01
;     REPEAT "Bitloop"
;         Skriv inneh}llet i ack-reg p} adress
;         L{s p} adressen
;         CASE "Felhantering"
;             WHEN l{st v{rde <> ack-reg
;                 Markera felet
;                 EXIT "Byteloop"
;         END "Felhantering"
;         Rotera ack-reg ett steg v{nster
;     END "Bitloop" WHEN sista biten testad
; END "Byteloop" WHEN nedre adressen testad
;
;*********************************************************
;
WALK1:				; Ja
	LD	H,D		; 
	LD	L,E		; 
	INC	HL		;
RESETW1:			;
	SUB	A		;
	DEC	HL		; 
	LD	(HL),A		;
	LD	A,H		; Nollst{ller minnet
	CP	B		;
	JP	NZ,RESETW1	;
	LD	A,L		;
	CP	C		;
	JP	NZ,RESETW1	; 
;
	LD	H,D		; H|g adress
	LD	L,E		; 
	INC	HL
NXTCEW1:
	DEC	HL		; N{sta cell
	LD	A,01H		;
WRITEW1:
	LD	(HL),A		; Skriv
CHECKW1:
	CP	(HL)		; R{tt inneh}ll i cellen?
	JP	Z,OKW1		; Ja
ERRORW1:
	EX	AF,AF'		; Nej
	SET	2,A		; Markera felet
	EX	AF,AF'		;
	JP	EXITW1		; Exit WALK 1
OKW1:
	RLCA			; Rotera 1 steg
	CP	01H		; Roterat 1 varv ?
	JP	NZ,WRITEW1	; Nej
;
	LD	A,H		; Ja
	CP	B		; Nedre adr testad?
	JP	NZ,NXTCEW1	;
	LD	A,L		;
	CP	C		;
	JP	NZ,NXTCEW1	; Nej
;
EXITW1:
;
	PAGE
;*********************************************************
;
;	VANDRANDE NOLLA
;	---------------
;
; Ettst{ll minnet
; Adress = \vre adress + 1
; REPEAT "Byteloop"
;     Adress minskas med 1
;     Ack-reg = FE
;     REPEAT "Bitloop"
;         Skriv inneh}llet i ack-reg p} adress
;         L{s p} adressen
;         CASE "Felhantering"
;             WHEN l{st v{rde <> ack-reg
;                 Markera felet
;                 EXIT "Byteloop"
;         END "Felhantering"
;         Rotera ack-reg ett steg v{nster
;     END "Bitloop" WHEN sista biten testad
; END "Byteloop" WHEN nedre adressen testad
;
;*********************************************************
;
WALK0:				; Ja
	LD	H,D		; 
	LD	L,E		; 
	INC	HL		;
SETW0:				;
	LD	A,0FFH		;
	DEC	HL		; Ettst{ller minnet
	LD	(HL),A		;
	LD	A,H		; 
	CP	B		;
	JP	NZ,SETW0	;
	LD	A,L		;
	CP	C		;
	JP	NZ,SETW0	; 
;
	LD	H,D		; H|g adress
	LD	L,E		; 
	INC	HL
NXTCEW0:
	DEC	HL		; N{sta cell
	LD	A,0FEH		;
WRITEW0:
	LD	(HL),A		; Skriv
CHECKW0:
	CP	(HL)		; R{tt inneh}ll i cellen?
	JP	Z,OKW0		; Ja
ERRORW0:
	EX	AF,AF'		; Nej
	SET	3,A		; Markera felet
	EX	AF,AF'		;
	JP	TSTEND		; Exit Bit-test 2
OKW0:
	RLCA			; Rotera 1 steg
	CP	0FEH		; Roterat 1 varv ?
	JP	NZ,WRITEW0	; Nej
;
	LD	A,H		; Ja
	CP	B		; Nedre adr testad?
	JP	NZ,NXTCEW0	;
	LD	A,L		;
	CP	C		;
	JP	NZ,NXTCEW0	; Nej
;
;
TSTEND:
	LD	SP,STKTOP	; Initiera stackpekare
	CALL	INIRAM		; Initiera RAM
;
	LD	HL,MAIN		;
	PUSH	HL		; F|r att kunna g|ra RET
	LD	HL,OTHRCH	;
	PUSH	HL		;
;
	EX	AF,AF'		; H{mta resultat
	LD	B,A		;
;
	LD	HL,TSTFLG	; Returparameter skall skickas
	LD	(HL),TRUE	;
;
	EI
	JP	SNDSTX		; Special-return
;
	END
