; 
; RAM-Test bei defektem Rechner, wenn nichts geht ("wirre Zeichen")
; 
; Allgemeines
; Ist der System-RAM defekt, meldet sich der Rechner nur mit den "wirren Zeichen".
; Die Grafik-LED leuchtet. Das System wird nicht gestartet.
; Erklärung:
; Nach Einschalten des Rechners startet die CPU auf der Adresse 0000H.
; Im Z9001 wird der System-ROM von F000H zum Startzeitpunkt auf 0000H umgeschaltet.
; Mit dem ersten Befehl wird der ROM wieder nach F000H zurückgeschaltet und das System initialisiert.
; Ist das Signal /ROMDI aktiviert, wird verhindert, daß der System-ROM auf der Adresse 0000H eingeblendet wird.
; Liegt zum Startzeitpunkt auf der Adresse 0000H ein anderes bootfähiges Programm,
; z.B. ein RAM-Testprogramm, kann man damit den/die defekten RAM-IS ermitteln.
; Dieses Programm kann nicht den System-RAM nutzen, der ist ja defekt! Es läuft ausschließlich im ROM.
; Es gibt noch eine Hürde:
; Damit zum Startzeitpunkt der System-ROM auf der Adresse 0000H ansprechbar ist,
; wird der System-RAM ausgeblendet. Der soll doch aber geprüft werden!
; Aus diesem Grund wird der Arbeitsbereich des TEST-ROMs auf die Adresse 8000H verlagert.
; Mit dem ersten Befehl wird in den Bereich 8000H gesprungen.
; Gleichzeitig wird mit Aktivwerden der Adresse AB15 (der Bereich ab 8000H) der Adreßbereich
; des TEST-ROMs umgeschaltet und das Signal /ROMDI aufgehoben, so daß der System-ROM (hier uninteressant)
; und auch der System-RAM wieder aktiviert sind.
; Durch diese Umschalt­mög­lichkeit unterscheidet sich der RAMTEST-Modul von einem normalen ROM-Modul.
; Wenn die Bildausgabe funktioniert, kann die Ausgabe von Programmreaktionen über den Bildschirm erfolgen.
; Eine Ausgabe von Pieptönen wäre auch möglich, dazu muß aber der CTC initialisiert werden.
; Die einfachste Ausgabe wird durch Schalten der Grafik-LED erreicht.
; Dafür müssen die CPU, Daten- und Adreßbus, deren Treiber und die PIO 1 (D12) funktionieren.
; Da dem Startbild mit den wirren Zeichen nicht zu entnehmen ist, ob der Bildspeicher ansprechbar ist,
; werden im Prüfprogramm sowohl die Ausgabe auf den Bildschirm, als auch die Ausgabe über die
; Grafik-LED umgesetzt.
; Das gesamte Programm wird im ROM abgearbeitet.
; Die Ausgabe am Bildschirm ist ohne Verwendung eines Kellerspeichers (Stack) nicht möglich.
; Der System-RAM steht nicht zur Verfügung.
; Nach Prüfung des Bildspeichers wird zur einfachen Ausgabe unter Nutzung der Grafik-LED bzw. zur
; komfortableren Ausgabe über den Bildschirm verzweigt.
; Im letzteren Fall wird im Bildspeicher ein Stack angelegt.
; Es wird eine umfangreiche Prüfung des gesamten RAMs durchgeführt (Einschreiben und Prüfen von 00 und FF).
; Bei einem Lesefehler stoppt das Programm, und es erfolgt eine Ausgabe über die PIO --> Grafik-LED.
; Für den gesamten Durchlauf mit Anzeige benötigt das Programm ca. 32 Sekunden, ohne Anzeige etwa 2 Sekunden.
; 
; Funktionsbeschreibung
; 0.  	Sprung in den EPROM auf F000H
; 
; 1. 	Interrupt wird nicht erlaubt.
; 
; 2.  	Bildspeicher wird gelöscht (Leerzeichen).
; 
; 3a.  	Im BWS wird ein Stack angelegt.
; 	Es folgt die Anzeige "RAMTEST" auf dem Bildschirm. (weiter mit 4.)
; 
; 4. 	Der RAM wird von 0000 bis 3FFFF mit 00-Bytes beschrieben.
; 
; 5.  	Der RAM wird Byte für Byte gelesen, und die aktuelle RAM-Adresse, das geschriebene Byte,
; 	das gelesene Byte und sein Wert binär ausgegeben.
; 
; 6.  	Kommt es zu einem Fehler, wird der Lesevorgang abgebrochen.
; 	Anhand der Bildschirmausgabe des gelesenen binären Wertes kann man feststellen,
; 	welches Bit defekt ist (welche Bits defekt sind).
; 	Zusätzlich erscheint die Ausgabe "FEHLER".
; 
; 7. 	Wird kein Fehler gefunden, wird der RAM von 0000 bis 3FFFF mit FF-Bytes beschrieben.
; 
; 8. 	Die weitere Prüfung erfolgt wie ab Punkt 5.
; 	Wird auch jetzt kein Fehler gefunden, erfolgt die Ausschrift "RAM OK" und
; 	Die CPU wird angehalten. ENDE
; 
; Beispiel eines Fehlers auf Adresse 0091 (geschriebenes Byte 00, gelesenes Byte 41):
; 
;                        8      1----- Datenbit
;                        |      |
; RAMTEST     0091 00 41 01000001   FEHLER
;             |    |  |  |____________ Binärwert
;             |    |  |_______________ gelesenes Byte
;             |    |__________________ geschriebenes Byte
;             |_______________________ aktuelle Adresse
; 
; 
; RAMTEST   0231 FF FB 11111011  FEHLER --> Datenbit 3 (D2) ist defekt
; 
; RAMTEST   3FFF FF FF 11111111  RAM OK --> Beispiel bei intaktem RAM
; 



	page	0
	CPU	z80

;Z1013-MONITOR 2.02, A.2

; Makros
hi              function x, (x>>8) & 0ffh	; High-Byte
lo              function x, x & 0ffh		; Low-Byte

;-------------------------------------------------------------------------------
; Marken
;-------------------------------------------------------------------------------
	BILD0:	EQU 	0EC00H
	BILD1:	EQU 	0EC20H
	BILD2:	EQU	0EC2AH
	BILD3:	EQU	0EC40H
	STACK:	EQU	0EFFFH
	AADR:	EQU	0000H		;RAM-Anfangsadresse (0000)
	LANG:	EQU	4000H		;Länge der ersten 16KBytes
;
;
;-------------------------------------------------------------------------------
; Start
;-------------------------------------------------------------------------------
START:
	ORG	0F000H

	DI
	LD	A,20H		;Leerzeichen
	LD	HL,0EC00H	;Anfang Bildspeicher
	LD	DE,0EC01H
	LD	BC,03FFH	;Größe des BWS
	LD	(HL),A
	LDIR			;Bildschirm löschen

	LD	SP,STACK	;Stack ab Bildspeicherende nach unten

	LD	HL,BILD0	;BWS 1. Zeile, 1. Spalte
	LD	DE,MSG		;Startmeldung
	CALL	PRNST		;Ausgabe auf den Bildschirm

	LD	HL,BILD1	;BWS 2. Zeile, 1. Spalte
	LD	DE,MSG0		;Startmeldung
	CALL	PRNST		;Ausgabe auf den Bildschirm


;-------------------------
; Test 00
	LD	D,000H		;00
	LD	HL,AADR
	LD	BC,LANG
TEST00:
	LD	(HL),D		;Byte schreiben (SOLL)
	CALL	BYTETEST	;Speicherinhalt prüfen
	INC	HL		;nächste Adresse
	DEC	C		;Länge -1
	LD	A,C
	OR	A		;schon 0?
	JR	NZ,TEST00	;100H x nächste Adresse
	DJNZ	TEST00		;40H x nächste 100H Adressen

;-------------------------
; Test FF
	LD	D,0FFH		;FF
	LD	HL,AADR
	LD	BC,LANG
TESTFF:
	LD	(HL),D		;Byte schreiben (SOLL)
	CALL	BYTETEST	;Speicherinhalt prüfen
	INC	HL		;nächste Adresse
	DEC	C		;Länge -1
	LD	A,C
	OR	A		;schon 0?
	JR	NZ,TESTFF	;100H x nächste Adresse
	DJNZ	TESTFF		;40H x nächste 100H Adressen
;-------------------------
; MSG-AUSGABE Test ende
;-------------------------
END:
	LD	HL,BILD3	;BWS 3. Zeile, 1.Spalte 
	LD	DE,MSG1		;Endemeldung
	CALL	PRNST		;Ausgabe auf den Bildschirm
	HALT
;------------------
;UNTERPROGAMM BYTE TEST
;------------------
BYTETEST:
	LD	A,(HL)		;gelesenes Byte (IST)
	LD	E,A		;nach E retten
	CALL	DISP		;Ausgabe des geschriebenen Bytes (HEX) 
				;Ausgabe des gelesenen Bytes (HEX) 
				;Ausgabe des gelesenen Bytes (BIN)
	CP	D		;Vergleich mit dem geschriebenen (SOLL)
	JR	NZ, FEHL	;Fehler und raus!!!
	RET
;-------------------
;UNTERPROGAMM FEHLER
;-------------------
FEHL:
	LD	HL,BILD3	;BWS 3. Zeile, 1.Spalte
	LD	DE,MSG2		;Fehlermeldung
	CALL	PRNST		;Ausgabe auf den Bildschirm
	HALT
;--------------------
;UNTERPROGAMM ANZEIGE
;--------------------
; D  soll
; E  ist
DISP:
	PUSH	BC
	PUSH	AF
	PUSH	HL		;1. Byte sichern

;--------------------
; Adresse 1.stelle
	LD	A,H		;1. Byte der Adresse
	SRL	A
	SRL	A
	SRL	A
	SRL	A
	CP	0AH		;>9?
	JR	C, DISP1	;nein
	ADD	A, 07H		;dann Buchstabe
DISP1:
	ADD	A, 30H
	LD	HL,BILD2	;BWS 2. Zeile, 10.Spalte
	CALL	OUTA		;1. Zeichen ausgeben

;--------------------
	POP	HL
	PUSH	HL		;1. Byte sichern

;--------------------
; Adresse 2.stelle
	LD	A,H		;1. Byte der Adresse
	AND	0FH
	CP	0AH		;>9?
	JR	C, DISP2	;nein; dann Ziffer
	ADD	A, 07H		;Buchstabe
DISP2:
	ADD	A, 30H
	LD	HL,BILD2+1	;BWS 2. Zeile, 11.Spalte
	CALL	OUTA		;2. Zeichen ausgeben

;--------------------
	POP	HL		;wiedereinladen der aktuellen Adresse
	PUSH	HL		;1. Byte sichern

;--------------------
; Adresse 3.stelle
	LD	A,L		;1. Byte der Adresse
	SRL	A
	SRL	A
	SRL	A
	SRL	A
	CP	0AH		;>9?
	JR	C, DISP3	;nein
	ADD	A, 07H		;dann Buchstabe
DISP3:
	ADD	A, 30H
	LD	HL,BILD2+2	;BWS 2. Zeile, 12.Spalte
	CALL	OUTA		;1. Zeichen ausgeben

;--------------------
	POP	HL
	PUSH	HL		;1. Byte sichern

;--------------------
; Adresse 4.stelle
	LD	A,L		;1. Byte der Adresse
	AND	0FH
	CP	0AH		;>9?
	JR	C, DISP4	;nein; dann Ziffer
	ADD	A, 07H		;Buchstabe
DISP4:
	ADD	A, 30H
	LD	HL,BILD2+3	;BWS 2. Zeile, 13.Spalte
	CALL	OUTA		;2. Zeichen ausgeben

;--------------------
; geschriebenes Zeichen ausgeben
	INC	HL		;BWS 2. Zeile, 14.Spalte: eine Spalte weiter
	LD	A,D		;geschriebenes Zeichen
	SRL	A		;4x nach rechts schieben
	SRL	A
	SRL	A
	SRL	A
	CP	0AH		;<9?
	JR	C, HBYT1		;nein, dann Ziffer
	ADD	A, 07H		;Buchstabe
HBYT1:
	ADD	A, 30H
	CALL	OUTA		;1. Zeichen ausgeben BWS 2. Zeile, 15.Spalte

	LD	A,D
	AND	0FH
	CP	0AH		;>9?
	JR	C, HBYT2	;nein
	ADD	A, 07H		;dann Buchstabe
HBYT2:
	ADD	A, 30H
	CALL	OUTA		;2. Zeichen ausgeben BWS 2. Zeile, 16.Spalte

;-------------------------
; gelesenes Zeichen ausgeben
	INC	HL		;BWS 2. Zeile, 17.Spalte: eine Spalte weiter
	LD	A,E		;gelesenes Zeichen
	SRL	A		;4x nach rechts schieben
	SRL	A
	SRL	A
	SRL	A
	CP	0AH		;<9?
	JR	C, LBYT1		;nein, dann Ziffer
	ADD	A, 07H		;Buchstabe
LBYT1:
	ADD	A, 30H
	CALL	OUTA		;1. Zeichen ausgeben BWS 2. Zeile, 18.Spalte

	LD	A,E
	AND	0FH
	CP	0AH		;>9?
	JR	C, LBYT2		;nein
	ADD	A, 07H		;dann Buchstabe
LBYT2:
	ADD	A, 30H
	CALL	OUTA		;2. Zeichen ausgeben BWS 2. Zeile, 19.Spalte

;-------------------------
; Bits ausgeben
	INC	HL		;BWS: eine Spalte weiter BWS 2. Zeile, 20.Spalte
	LD	A,E		;gelesenes Zeichen wieder herstellen
	LD	B,8		;Anzahl der Bits
IST1:
	SLA	A
	JR	C, IST2		;Bit ist 1
	LD	C,30H		;Bit ist 0
	JR	IST3
IST2:
	LD	C,31H		;Bit ist 1
IST3:
	CALL	OUTC		;Bit 0/1 ausgeben BWS 2. Zeile, 21-28.Spalte
	DJNZ	IST1
	POP	HL
	POP	AF
	POP	BC
	RET
;-------------------------
;UNTERPROGAMME MSG-AUSGABE
;-------------------------
PRNST:
	LD	A,(DE)		;Zeichenkettenausgabe über-
	OR	A		;nommen vom Z9001-System-ROM
	RET	Z
	LD	(HL),A
	INC	HL
	INC	DE
	JR	PRNST
OUTA:
	LD	(HL),A
	INC	HL
	RET
OUTC:
	LD	(HL),C
	INC	HL
	RET
MSG:
	DB	"RAMTEST 1.0 (c)PIC18F2550"	;Startmeldung
	DB	0
MSG0:
	DB	"RAMTEST"	;Startmeldung
	DB	0
MSG1:
	DB	"RAM OK"	;Endemeldung
	DB	0
MSG2:
	DB	"FEHLER"	;Fehlermeldung
	DB	0
	END
