P8000/firmware/MON8/U880EIG.S

2629 lines
42 KiB
ArmAsm

*H P8000 U880-FIRMWARE 3.0
*P 84
;******************************************************************************
;* *
;* *
;* P8000 - SOFTWARE *
;* *
;* Entwicklerdokumentation *
;* *
;* Betriebssystem UDOS *
;* *
;* Programm: U880EIG *
;* *
;* Version: 3.1 *
;* *
;* Bearbeiter: M. Weber *
;* *
;* Datum: 18.01.1989 *
;* *
;* *
;******************************************************************************
;
;P8000 U880-Eigentest
;
;
JR START
DEFM '(C)KEAW_01/89'
;
; Es wird die Funktionsfaehigkeit von PIO2, Kanal A vorausgesetzt.
; Es gilt: Bit 7 = 1 ---> Spannungs-Reset
; Bit 7 = 0 ---> Bediener-Reset, es wird kein Eigentest
; durchgefuehrt
;
START
LD B,0
DECB1 LD C,0
DECB2 DEC C
JR NZ,DECB2
DEC B
JR NZ,DECB1
LD A,0CFH ;Bit-Mode PIO2, Kanal A
OUT (P2AC),A
LD A,80H ;nur Bit 7 ist Eingabebit
OUT (P2AC),A
LD A,3
OUT (P2AC),A
IN A,(P2AD)
BIT 7,A
JP Z,INSM1 ;kein Spannungs-Reset
; Initialisierung der Speicherbanksteuerung
ISPBST
XOR A
LD I,A
LD C,WEADP
LD DE,10H
XOR A ;Anfangsadresse
AUSA LD B,A ;Adressbildung
OUT (C),D
ADD A,10H ;naechste Adresse wird berechnet
DEC E
JR NZ,AUSA
LD D,1 ;PROM_SEL aktiv
LD B,0 ;Adresse gleich 0
OUT (C),D
IN A,(RFF) ;Aktivierung des Adressports
LD D,1
LD B,10H
OUT (C),D
JR START1
ENSMON
LD H,0
LD C,0
EXX
LD A,0FH
OUT (P1AC),A
LD A,3
OUT (P1AC),A
LD C,S0BD
LD B,43
LD HL,AHWT1
JP ATEST
; Beginn des Eigentest des P8000 8-Bit-Teils
; Test des PIO1, Kanal A durch Ausgabe und Ruecklesen.
; Bei Fehler werden Fehlerkode 10H, Adresse 18H, ausgegebener und
; rueckgelesener Wert gemerkt.
; Benutzte Register: A, B, C, H, L
;
START1 JR WENMI
; Hier Einsprung fuer NMI fuer Hardwaretestung !
JP 4000H
WENMI
LD A,0FH
OUT (P1AC),A ;Ausgabemode PIO1, Kanal A
LD A,3
OUT (P1AC),A
LD A,0AAH
OUT (P1AD),A
LD C,0 ;Initialisierung fuer Register C
IN A,(P2AD) ;Veraenderung auf dem Datenbus
IN A,(P1AD)
CP 0AAH ;Ist der Wert gleich dem ausgegebenen Wert?
JR Z,WTP1A ;Ja, kein Fehler.
;
LD H,A ;rueckgelesenen Wert merken
LD C,1 ;Fehler beim ersten Test
WTP1A
LD A,55H
OUT (P1AD),A
IN A,(P2AD) ;Veraenderung auf dem Datenbus
IN A,(P1AD)
CP 055H ;Ist der Wert gleich dem ausgegebenen Wert?
JR Z,WTC11 ;Ja, kein Fehler.
;
LD L,A ;rueckgelesenen Wert merken
SET 1,C ;Fehler beim zweiten Test
;
; Es wird der CTC1, Kanal 1 getestet.
; Bei Fehler werden Fehlerkode 15H oder 16H, Portadresse 2DH sowie
; ausgegebener und rueckgelesener Wert gemerkt.
; Benutzte Register: A, C, D, E
;
WTC11
LD A,0FFH
OUT (P1AD),A ;Start: Ausgabe von 0FFH
;
LD A,7
OUT (CTC1+1),A
LD A,0AAH ;Zeitkonstante ist 0AAH
OUT (CTC1+1),A
LD D,5
ZC1 DEC D
JR NZ,ZC1
IN A,(CTC1+1)
CP 0AAH ;Ist der Wert gleich dem ausgegebenen Wert?
JR C,NTC11 ;Nein, kleiner.
;
LD D,A ;rueckgelesenen Wert merken
SET 2,C ;Fehler beim dritten Test
;
NTC11
LD A,3
OUT (CTC1+1),A ;CTC anhalten
IN A,(CTC1+1)
CP 0AAH ;Ist der Wert gleich dem ausgegebenen Wert?
JR Z,WTS0B ;Ja, kein Fehler.
;
LD E,A ;rueckgelesenen Wert merken
SET 3,C ;Fehler beim vierten Test
;
; Test des SIO0 durch Programmierung und Ruecklesen des Interruptvektors (nur
; in Kanal B moeglich).
; Bei Fehler werden Fehlerkode 20H, Adresse 26H, ausgegebener und rueckgelese-
; ner Wert gemerkt.
; Benutzte Register: AF', BC', DE', HL'
;
WTS0B
LD A,38H
OUT (S0BC),A
LD A,10H
OUT (S0BC),A
LD A,11H
OUT (S0BC),A
XOR A
OUT (S0BC),A
LD A,12H ;Schreibregister 2 ansprechen
OUT (S0BC),A
LD A,50H ;Wert 50H eintragen
OUT (S0BC),A
Daten
;auf dem Datenbus
LD A,12H ;Leseregister 2 ansprechen
OUT (S0BC),A
IN A,(S0BC),A
CP 50H ;Ist der Wert gleich dem ausgegebenen Wert?
JR Z,NTS0B ;Ja, kein Fehler.
;
LD I,A
SET 4,C ;Fehler beim fuenften Test
NTS0B
LD A,12H ;Leseregister 2 ansprechen
OUT (S0BC),A
LD A,20H
OUT (S0BC),A
LD A,12H
OUT (S0BC),A
IN A,(S0BC) ;Einlesen des Interruptvektors
CP 20H ;Ist der Wert gleich dem ausgegebenen Wert?
JR Z,SPF ;Ja, kein Fehler, restliche Fehler speichern.
;
LD B,A ;rueckgelesenen Wert merken
SET 5,C ;Fehler beim sechsten Test
SPF
EXX ;Werte in den Zweitregistersatz
;
; Initialisierung von CTC1 Kanal 1 und SIO0 Kanal B fuer die Ausgabe der
; Eigentestmeldungen.
; PIO1 Kanal A ist bereits initialisiert.
;
LD A,57H ;Zeitgeber-Mode mit externem Takt
OUT (CTC1+1),A
LD A,2 ;Baudrate von 9600 Bd
OUT (CTC1+1),A
LD HL,INITAB ;Initialisierungstabelle fuer den SIO
LD B,8
LD C,S0BC
OTIR ;acht Werte werden ausgegeben
LD C,S0BD
LD B,ANZHWT
LD HL,AUSHWT
ATEST OUTI ;Ausgabe der Anfangsaussschrift fuer den Hardwareeigentest
INC B
P1WAIT IN A,(S0BC)
BIT 2,A ;Ist der SIO fertig?
JR Z,P1WAIT ;Nein, warten.
LD C,2
ZAUS11 LD D,0
ZAUS1 DEC D
JR NZ,ZAUS1 ;Realisierung einer Wartezeit
DEC C
JR NZ,ZAUS11
LD C,S0BD
DJNZ ATEST ;alle Zeichen, bis Anzahl gleich 0
;
; Ausgabe eventuell beim Test von CTC1 Kanal 1, SIO0 Kanal B und PIO1 Kanal A
; entstandener und gemerkter Fehler.
;
EXX ;holen der Werte aus dem Zweitregistersatz
LD A,C
AND A ;Ist ueberhaupt ein Fehler aufgetreten?
JR NZ,AFKP ;Ja, Ausgabe der Fehler.
;
; Ausgabe der Eigentestnummern der durchgefuehrten Tests
;
LD HL,TENRAN
LD B,ANZANF
NZANF LD A,(HL)
OUT (S0BD),A
ANFWRS IN A,(S0BC)
BIT 2,A
JR Z,ANFWRS
INC HL
LD D,0
TD1 DEC D
JR NZ,TD1
DJNZ NZANF
EXX
LD H,0 ;Register H mit 0 laden, da kein Fehler
EXX
LD A,10H ;Fehlerkode PIO Test
OUT (P1AD),A
LD A,15H ;Fehlerkode CTC Test
OUT (P1AD),A
LD A,16H ;zweiter Fehlerkode CTC-Test
OUT (P1AD),A
LD A,20H ;Fehlerkode SIO Test
OUT (P1AD),A
;
JP W1EIG ;weiter im Eigentest
;
AFKP EXX
LD E,10H ;Fehlerkode laden
LD IX,$+7
JP AUSTNR
EXX
BIT 0,C ;Fehler beim Test PIO1 Kanal A?
JR Z,NEAUS
;
EXX ;Ja! Speichern der Werte im Zweitregistersatz
LD C,S0BD ;Daten SIO0 Kanal B
LD B,ANAUS1 ;Anzahl erster Fehler
LD HL,AUSF1 ;Ausschrift erster Fehler
A1TE OUTI
INC B
P2W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P2W
LD D,0FFH ;Ja, Zeitschleife
ZAUS2 DEC D
JR NZ,ZAUS2
DJNZ A1TE
EXX ;gespeicherte Werte holen
LD A,H
AND 0F0H
RRCA
RRCA
RRCA
RRCA
CP 0AH
JR C,ADD2
ADD A,7
ADD2 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P3W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P3W
LD A,H ;Ja, naechstes Halbbyte
AND 0FH ;naechstes Halbbyte
CP 0AH
JR C,ADD3
ADD A,7
ADD3 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P4W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P4W
LD H,0FFH ;in <H> Fehler merken
EXX
;
NEAUS BIT 1,C ;Fehler beim zweiten Test PIO1 Kanal A?
JR Z,NEAUS2
;
EXX ;Ja! Speichern der Werte im Zweitregistersatz
LD C,S0BD ;Daten SIO0 Kanal B
LD B,ANAUS2 ;Anzahl zweiter Fehler
LD HL,AUSF2 ;Ausschrift zweiter Fehler
A2TE OUTI
INC B
P5W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P5W
LD D,0FFH ;Ja, Zeitschleife
ZAUS3 DEC D
JR NZ,ZAUS3
DJNZ A2TE
EXX ;gespeicherte Werte holen
LD A,L
AND 0F0H
RRCA
RRCA
RRCA
RRCA
CP 0AH
JR C,ADD4
ADD A,7
ADD4 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P6W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P6W
LD A,L ;Ja, naechstes Halbbyte
AND 0FH ;naechstes Halbbyte
CP 0AH
JR C,ADD5
ADD A,7
ADD5 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P7W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P7W
LD H,0FFH ;in <H> Fehler merken
EXX
NEAUS2 EXX
LD E,15H Nein, Fehlerkode CTC Test ausgeben.
LD IX,$+7
JP AUSTNR
EXX
BIT 2,C ;Fehler beim Test CTC1 Kanal 1?
JR Z,NEAUS3
;
EXX ;Ja! Speichern der Werte im Zweitregistersatz
LD C,S0BD ;Daten SIO0 Kanal B
LD B,ANAUS3 ;Anzahl dritter Fehler
LD HL,AUSF3 ;Ausschrift dritter Fehler
A3TE OUTI
INC B
P8W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P8W
LD D,0FFH ;Ja, Zeitschleife
ZAUS4 DEC D
JR NZ,ZAUS4
DJNZ A3TE
EXX ;gespeicherte Werte holen
LD A,D
AND 0F0H
RRCA
RRCA
RRCA
RRCA
CP 0AH
JR C,ADD6
ADD A,7
ADD6 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P9W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P9W
LD A,D ;Ja, naechstes Halbbyte
AND 0FH ;naechstes Halbbyte
CP 0AH
JR C,ADD7
ADD A,7
ADD7 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P10W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P10W
LD H,0FFH ;in <H> Fehler merken
EXX
;
NEAUS3 EXX
LD E,16H
LD IX,$+7
JP AUSTNR
EXX
BIT 3,C ;Fehler beim Test CTC1 Kanal 1?
JR Z,NEAUS4
;
EXX ;Ja! Speichern der Werte im Zweitregistersatz
LD C,S0BD ;Daten SIO0 Kanal B
LD B,ANAUS4 ;Anzahl vierter Fehler
LD HL,AUSF4 ;Ausschrift vierter Fehler
A4TE OUTI
INC B
P11W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P11W
LD D,0FFH ;Ja, Zeitschleife
ZAUS5 DEC D
JR NZ,ZAUS5
DJNZ A4TE
EXX ;gespeicherte Werte holen
LD A,E
AND 0F0H
RRCA
RRCA
RRCA
RRCA
CP 0AH
JR C,ADD8
ADD A,7
ADD8 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P12W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P12W
LD A,E ;Ja, naechstes Halbbyte
AND 0FH ;naechstes Halbbyte
CP 0AH
JR C,ADD9
ADD A,7
ADD9 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P13W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P13W
LD H,0FFH ;in <H> Fehler merken
EXX
NEAUS4 EXX
LD E,20H ;Fehlerkode fuer SIO-Test ausgeben.
LD IX,$+7
JP AUSTNR
EXX
NEA4 BIT 4,C ;Fehler beim Test SIO0 Kanal A?
JR Z,NEAUS5
;
EXX ;Ja! Speichern der Werte im Zweitregistersatz
LD C,S0BD ;Daten SIO0 Kanal B
LD B,ANAUS5 ;Anzahl fuenfter Fehler
LD HL,AUSF5 ;Ausschrift fuenfter Fehler
A5TE OUTI
INC B
P14W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P14W
LD D,0FFH ;Ja, Zeitschleife
ZAUS6 DEC D
JR NZ,ZAUS6
DJNZ A5TE
EXX ;gespeicherte Werte holen
LD A,I
AND 0F0H
RRCA
RRCA
RRCA
RRCA
CP 0AH
JR C,ADD10
ADD A,7
ADD10 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P15W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P15W
LD A,I ;Ja, naechstes Halbbyte
AND 0FH ;naechstes Halbbyte
CP 0AH
JR C,ADD11
ADD A,7
ADD11 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P16W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P16W
LD H,0FFH ;in <H> Fehler merken
EXX
;
NEAUS5 BIT 5,C ;Fehler beim Test SIO0 Kanal A?
JR Z,W1EIG
;
EXX ;Ja! Speichern der Werte im Zweitregistersatz
LD C,S0BD ;Daten SIO0 Kanal B
LD B,ANAUS6 ;Anzahl sechster Fehler
LD HL,AUSF6 ;Ausschrift sechster Fehler
A6TE OUTI
INC B
P17W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P17W
LD D,0FFH ;Ja, Zeitschleife
ZAUS7 DEC D
JR NZ,ZAUS7
DJNZ A6TE
EXX ;gespeicherte Werte holen
LD A,B
AND 0F0H
RRCA
RRCA
RRCA
RRCA
CP 0AH
JR C,ADD12
ADD A,7
ADD12 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P18W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P18W
LD A,B ;Ja, naechstes Halbbyte
AND 0FH ;naechstes Halbbyte
CP 0AH
JR C,ADD13
ADD A,7
ADD13 ADD A,30H ;ASCII-Zeichen fertig
OUT (S0BD),A
P19W IN A,(S0BC)
BIT 2,A ;Sendepuffer leer?
JR Z,P19W
LD H,0FFH ;in <H> Fehler merken
EXX
;
; Nach den Ausgaben evtl. aufgetretener Fehler wird der Eigentest fortgesetzt.
; Das Register H wird in den Zweitregistersatz gerettet.
;
W1EIG EXX
LD E,0
LD IX,TEPROM
JP AUSTNR
TEPROM EXX
; Programm Test EPROM
; Fuer den EPROM wird ausser den letzten zwei Bytes die Pruefsumme gebildet und
; mit dem in den letzten zwei Bytes stehenden Wert verglichen.
; Bei Fehler wird der Fehlerkode 00 an PIO und Terminal ausgegeben.
; Benutzte Register:
;
; BERECHNUNG DES CRC VOM PROM NACH DEM SDLC POLYNOM
; Berechnung des CRC fuer EPROM0
CRCANF
LD IX,TENEP
LD HL,0
LD BC,1000H
ld de,-1
crc1: ld a,(hl)
xor d
ld d,a
rrca
rrca
rrca
rrca
and 0fh
xor d
ld d,a
rrca
rrca
rrca
LD I,A
and 1fh
xor e
ld e,a
LD A,I
LD I,A
rrca
and 0f0h
xor e
ld e,a
LD A,I
and 0e0h
xor d
ld d,e
ld e,a
inc hl
dec bc
ld a,b
or c
jr nz,crc1
LD HL,(CRCEP0)
LD A,D
CP H
JP NZ,FAUSA3
LD A,E
CP L
JP NZ,FAUSA3
LD HL,(NCEP0)
ADD HL,DE
LD A,0FFH
CP H
JP NZ,FAUSA3
CP L
JP NZ,FAUSA3
; Berechnung und Test des CRC fuer EPROM1
TENEP LD IX,TSRAM
LD HL,1000H
LD BC,0FF8H
ld de,-1
crc10: ld a,(hl)
xor d
ld d,a
rrca
rrca
rrca
rrca
and 0fh
xor d
ld d,a
rrca
rrca
rrca
LD I,A
and 1fh
xor e
ld e,a
LD A,I
LD I,A
rrca
and 0f0h
xor e
ld e,a
LD A,I
and 0e0h
xor d
ld d,e
ld e,a
inc hl
dec bc
ld a,b
or c
jr nz,crc10
LD HL,(CRCEP1)
LD A,D
CP H
JP NZ,FAUSA3
LD A,E
CP L
JP NZ,FAUSA3
LD HL,(NCEP1)
ADD HL,DE
LD A,0FFH
CP H
JP NZ,FAUSA3
CP L
JP NZ,FAUSA3
;
; Programm Test SRAM
; Es werden ein Test der Adressleitungen, der Datenleitungen, der Datenhaltigkeit
; des Speichers durch das Durchschieben von 0 oder 1 und ein Programmtest des Speichers durchgefuehrt.
; Bei auftretenden Fehlern wird der entsprechende Fehlerkode an das Terminal und, wenn vorher kein
; Fehler aufgetreten war, an den PIO Port ausgegeben. Am Terminal werden ausserdem die Speicheradresse,
; der ausgegebene und der rueckgelesene Wert angezeigt.
; Benutzte Register:
;
TSRAM EXX ;holen Zweitregistersatz
LD E,5
LD IX,WTSR1
JP AUSTNR
WTSR1 EXX
; Initialisierung des SRAM auf die Adresse 2000H
;
LD D,2 ;SRAM_SEL aktiv
LD B,20H ;Adresse ist 2000H
LD C,WEADP
OUT (C),D ;Einschalten des SRAM auf die Adresse 7000H
;
; Test der Datenleitungen des SRAM
;
XOR A ;alle Bits auf 0 setzen
TAUFD LD HL,2000H ;Anfangsadresse ist 2000H
LD DE,2001H
LD BC,7FFH ;Datenlaenge ist 2k-1
LD (HL),A ;0 oder 0FFH auf den ersten Speicherplatz
LDIR ;Wert wird in alle Speicherzellen des SRAM eingetragen
CP (HL) ;Letztes Byte gleich dem Akkumulator?
JP Z,DTSR1
LD B,A ;Testwert eintragen
LD A,(HL)
LD IX,WT2SR
JR FAUSA3
; Ausgabe der Testschrittnummer an den SIO0, Kanal B (Terminal)
; An den PIO erfolgt die Ausgabe nur, wenn vorher kein Fehler auftrat.
; Programm arbeitet mit dem Zweitregistersatz, im Register E steht die
; auszugebende Testschrittnummer.
AUSTNR LD B,2
BB0 LD A,8 ;Ausgabe von 2 Backspace
OUT (S0BD),A
WSBSR IN A,(S0BC)
BIT 2,A
JR Z,WSBSR
LD D,0
Z1AUS DEC D
JR NZ,Z1AUS
DJNZ BB0
LD A,E
LD IY,$+7
JP HCAHL
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD D,0
Z2AUS DEC D
JR NZ,Z2AUS
LD A,C
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD A,E
BIT 0,H
JR NZ,VORFE
OUT (P1AD),A
VORFE LD BC,0
ZAUSN2 DEC C
JR NZ,ZAUSN2
DEC B
JR NZ,ZAUSN2
JP (IX)
; Ausgabe der Werte, wenn ein Fehler im SRAM-Test auftritt
; Speicheradresse in HL, Testwert in B, rueckgelesener Wert in D
; in IX ist die Rueckkehradresse eingetragen
FAUSA3 EXX
LD HL,ADRERR
LD B,ANAUSE
LD C,S0BD
NZAERR OUTI
INC B
WSREA IN A,(S0BC)
BIT 2,A
JR Z,WSREA
LD D,0
ZSAE DEC D
JR NZ,ZSAE
DJNZ NZAERR
LD A,E
LD IY,$+7
JP HCAHL
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD A,C
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD H,0FFH
LD A,E
LD I,A
EXX
LD D,A
LD A,I
AND A
JP Z,AENDZ
LD A,' '
OUT (S0BD),A
WSREA1 IN A,(S0BC)
BIT 2,A
JR Z,WSREA1
LD C,B
LD B,2
NASP LD A,20H
OUT (S0BD),A
WSREA2 IN A,(S0BC)
BIT 2,A
JR Z,WSREA2
LD E,0
ZSAE1 DEC E
JR NZ,ZSAE1
DJNZ NASP
LD B,C
LD A,H ;Speicheradresse ist erste Ausgabe
LD IY,$+7
JP HCAHL ;Umwandlung in Hexadezimalzahl
OUT (S0BD),A ;Ausgabe an das Terminal
LD IY,$+7
JP SRAHL ;Ist SIO fertig?
LD A,C
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD A,L
LD IY,$+7
JP HCAHL
OUT (S0BD),A ;Ausgabe zu lesender Wert
LD IY,$+7
JP SRAHL
LD A,C
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD A,20H
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD A,B ;Ausgabe zu lesender Wert
LD IY,$+7
JP HCAHL
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD A,C
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD A,20H
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD A,D ;Ruecklesen gelesener Wert
LD IY,$+7
JP HCAHL
OUT (S0BD),A
LD IY,$+7
JP SRAHL
LD A,C
OUT (S0BD),A
LD IY,$+7
JP SRAHL
AENDZ LD HL,ENDZEI
LD B,ANZEZ
NZENDZ LD A,(HL)
OUT (S0BD),A
WSIOFR IN A,(S0BC)
BIT 2,A
JR Z,WSIOFR
INC HL
LD D,0
ZSAEND DEC D
JR NZ,ZSAEND
DJNZ NZENDZ
JP (IX)
SRAHL IN A,(S0BC)
BIT 2,A
JR Z,SRAHL
JP (IY)
HCAHL LD C,A
AND 0F0H
RRCA
RRCA
RRCA
RRCA
CP 0AH
JR C,OR0
ADD A,7
OR0 ADD A,30H
LD I,A ;in I wird der Wert zwischengespeichert
LD A,C
AND 0FH
CP 0AH
JR C,OR1
ADD A,7
OR1 ADD A,30H
LD C,A
LD A,I
JP (IY)
ADRM1T NOP
ADC A,B
LD BC,07FH
ADC A,B
NOP
INC B
ADC A,B
NOP
EX AF,AF'
NOP
EX AF,AF'
NOP
DJNZ TST_P1
LD C,8
TST_P1 INC B
ADC A,B
DEC L
NOP
ADC A,B
NOP
EX AF,AF'
ADD A,B
NOP
NOP
JP (IX)
DTSR1 XOR 0FFH ;Ja.
JP NZ,TAUFD ;Test mit 0FFH
;
WT2SR EXX
LD E,6
LD IX,T2SR
JP AUSTNR
T2SR EXX
;
; Test der Adressleitungen des statischen RAM
; Test der oberen Adressleitungen
; Der Speicher wird in Bloecke zu je 256 Byte aufgeteilt. Die Bloecke werden nacheinander
; mit jeweils einem Wert gefuellt (0-7). Anschliessend werden die Bloecke nacheinander
; getestet. War der Test der Datenleitungen fehlerfrei und stimmen die Werte eines
; Blockes mit dem eingegebenen Wert nicht ueberein, dann ist die Ansteuerung fuer
; das Adressbit dieses Blockes fehlerhaft.
; Test der unteren Adressleitungen
TUALSR LD IX,NT2SR ;Rueckkehradresse bei Fehler eintragen
LD HL,2000H
LD DE,2000H
LD C,8
SRT3 XOR A
SRT4 LD (DE),A
INC DE
INC A
JR NZ,SRT4
LD B,A
SRT5 LD A,(HL)
CP B
JP NZ,FAUSA3
INC HL
INC B
JR NZ,SRT5
DEC C
JR NZ,SRT3
NT2SR EXX
LD E,7
LD IX,T01SR
JP AUSTNR
T01SR EXX
; Durchschieben von 0 und 1
; Durchschieben einer Null
TE0SR
LD HL,2000H
LD (HL),0FFH
LD DE,7FFH
LD B,E
LD A,(424) ;nur wegen Aenderung auf dem Bus
LD A,(HL)
CP B ;Testen des ersten Wertes
JP NZ,FAUSA3
INC HL
AND A
NZNL RLA
LD (HL),A ;Laden des Speichers mit den Werten
EX AF,AF'
INC HL
DEC DE
LD A,D
OR E
JR Z,T2ZSR
EX AF,AF'
JR NZNL
T2ZSR
LD HL,2001H
LD DE,7FEH
SCF
LD B,E ;Register mit 0FEH laden
EX AF,AF'
TNZSR2
LD A,(HL)
CP B ;Vergleich der Werte
JP NZ,FAUSA3
INC HL
DEC DE
LD A,D
OR E
JR Z,KAT3SR
EX AF,AF'
LD A,B
RLA
LD B,A
EX AF,AF'
JR TNZSR2
KAT3SR
EXX
LD E,8
LD IX,T3SR
JP AUSTNR
T3SR EXX
; M1-Test des statischen RAM
LD DE,2000H
NT3SR LD HL,ADRM1T
LD BC,30
LDIR
AND A
EX DE,HL
LD DE,30
SBC HL,DE
LD IX,WTM1SR
JP (HL)
WTM1SR LD DE,100H
INC L
ADD HL,DE
EX DE,HL
LD A,D
CP 28H
JR NZ,NT3SR
TALLP LD SP,2800H ;Stackpointer mit bestimmten Wert laden
LD A,0FFH
LD (MAWE),A ;Initialisierung fuer den Merker
EXX
LD E,10H
CALL ANRRET ;Ausgabe der Fehlernummer an PIO und Terminal
EXX
; Es werden alle PIO's im Ausgabemode getestet (ohne Interrupt).
; Im Fehlerfall werden Port-Adresse, eingetragener und rueckgelesener
; Wert an das Terminal ausgegeben.
; Test PIO0, Kanal A im Ausgabemode (ohne Interrupt)
LD A,3
LD C,P0AC
OUT (C),A
LD A,55H
CALL PTAUS
CALL NZ,FA3RET
;
; Test PIO0, Kanal B im Ausgabemode
;LD C,P0BC
;LD A,0D5H
;CALL PTAUS
;CALL NZ,FA3RET
; Test PIO1, Kanal B im Ausgabemode
LD A,3
LD C,P1BC
OUT (C),A
LD A,0F3H
CALL PTAUS
CALL NZ,FA3RET
; Test PIO2, Kanal A im Ausgabemode
LD A,3
LD C,P2AC
OUT (C),A
LD A,9FH
CALL PTAUS
CALL NZ,FA3RET
; Test PIO2, Kanal B im Ausgabemode
LD A,3
LD C,P2BC
OUT (C),A
LD A,6FH
CALL PTAUS
CALL NZ,FA3RET
EI
IM 2
LD A,23H
LD I,A ;Interruptvektorregister mit 73H laden
LD HL,TABISR ;Tabelle fuer alle Interrupts
LD DE,ADISR ;Adresse fuer ISR-Adressen
LD BC,42H ;Anzahl der Werte
LDIR
XOR A
LD HL,M1CISR ;Merker fuer ISR initialisieren
LD B,20 ;Anzahl der Merkzellen
ALLMZ LD (HL),A
INC HL
DJNZ ALLMZ
EXX
LD A,0FFH
LD (MAWE),A ;vorher war Test mit Interrupt
LD E,15H
CALL ANRRET
EXX
; Test der CTC-Kanaele als Zaehler (ohne Interrupt)
; Test von CTC0, Kanal 0-3 und CTC1, Kanal 0,2,3
LD C,C0K0
LD B,40H
CALL CZPR
CALL NC,FA3RET
LD C,C0K1
LD B,50H
CALL CZPR
CALL NC,FA3RET
LD C,C0K2
LD B,60H
CALL CZPR
CALL NC,FA3RET
LD C,C0K3
LD B,70H
CALL CZPR
CALL NC,FA3RET
LD C,C1K0
LD B,80H
CALL CZPR
CALL NC,FA3RET
LD C,C1K2
LD B,90H
CALL CZPR
CALL NC,FA3RET
LD C,C1K3
LD B,0A0H
CALL CZPR
CALL NC,FA3RET
EXX
LD E,16H
CALL ANRRET
EXX
; Test des CTC, ob die Zeitkonstanten richtig ruecklesbar sind
LD B,40H
LD C,C0K0
IN A,(C)
CP B
CALL NZ,FA3RET
LD B,50H
LD C,C0K1
IN A,(C)
CP B
CALL NZ,FA3RET
LD B,60H
LD C,C0K2
IN A,(C)
CP B
CALL NZ,FA3RET
LD B,70H
LD C,C0K3
IN A,(C)
CP B
CALL NZ,FA3RET
LD B,80H
LD C,C1K0
IN A,(C)
CP B
CALL NZ,FA3RET
LD B,90H
LD C,C1K2
IN A,(C)
CP B
CALL NZ,FA3RET
LD B,0A0H
LD C,C1K3
IN A,(C)
CP B
CALL NZ,FA3RET
EXX
LD A,1
LD (MAWE),A
LD E,17H
CALL ANRRET
EXX
; Test der CTC-Kanaele mit Interrupt
; CTC0, Kanal0 auf Interrupt programmieren
XOR A
LD C,C0K0
OUT (C0K0),A ;Interruptvektor wird nur einmal programmiert
CALL CIPR ;Interruptprogrammierung CTC
CALL Z,FA3RET ;bei Fehler Ausgabe
LD C,C0K1
CALL CIPR
CALL Z,FA3RET
LD C,C0K2
CALL CIPR
CALL Z,FA3RET
LD C,C0K3
CALL CIPR
CALL Z,FA3RET
LD A,8
LD C,C1K0
OUT (C),A ;Interruptvektor wird einmal ausgegeben
CALL CIPR
CALL Z,FA3RET
LD C,C1K2
CALL CIPR
CALL Z,FA3RET
LD C,C1K3
CALL CIPR
CALL Z,FA3RET
EXX
LD E,20H
LD A,0FFH
LD (MAWE),A
CALL ANRRET
TSLES EXX
; Test des SIO durch Lesen des Interruptvektors (ohne Interrupt)
; Eingabe des Interruptvektors und anschliessendes Ruecklesen
; nur Test des SIO1, da SIO0 bereits getestet
; Test ist auch nur im Kanal B moeglich
LD A,11H
OUT (S1BC),A
XOR A
OUT (S1BC),A
LD A,12H ;Schreibregister 2 ansprechen
OUT (S1BC),A
LD A,50H ;Wert 50H eintragen
OUT (S1BC),A
IN A,(S1BC) ;Lesen des Leseregisters 0, damit aendern der Daten
;auf dem Datenbus
LD A,12H ;Leseregister 2 ansprechen
OUT (S1BC),A
LD C,S1AD ;erste SIO-Adresse fuer evt. Fehlerausgabe eintragen
LD B,50H
IN A,(S1BC)
CP B ;Ist der Wert gleich dem ausgegebenen Wert?
CALL NZ,FA3RET ;Nein, Fehler bei Aufruf
; Wiederholung gleicher Test, nur mit anderem Wert
LD A,12H ;Leseregister 2 ansprechen
OUT (S1BC),A
LD A,30H
OUT (S1BC),A
IN A,(S1BC) ;Veraenderung auf dem Datenbus
LD A,12H
OUT (S1BC),A
LD C,S1AD
LD B,30H
IN A,(S1BC) ;Einlesen des Interruptvektors
CP B
CALL NZ,FA3RET
EXX
LD A,1
LD (MAWE),A
LD E,21H
CALL ANRRET
TSINT EXX
; Programmierung SIO0 und SIO1 als Sender (mit Interrupt)
; Aussenden von 0
; Interruptvektoren sind bereits programmiert
LD B,CTC1
LD E,S0AC
CALL SINIT
LD A,11H
OUT (S0AC),A
OUT (S0BC),A
LD A,6 ;Sendeinterrupt einschalten, Status wird nicht modifiziert
OUT (S0AC),A
OUT (S0BC),A
; Senden von SIO0, Kanal A
LD C,S0AD
CALL SI0APR ;Interruptprogrammierung SIO aufrufen
CALL Z,FA3RET ;kein Interrupt in ausreichender Zeit
; Senden von SIO0, Kanal B
LD C,S0BD
CALL SI0BPR
CALL Z,FA3RET ;kein Interrupt in ausreichender Zeit
LD B,CTC1+2
LD E,S1AC
CALL SINIT
LD B,CTC0
LD E,S1BC
CALL SINIT
LD A,11H
OUT (S1AC),A
OUT (S1BC),A
LD A,6 ;Sendeinterrupt einschalten, Status wird nicht modifiziert
OUT (S1AC),A
OUT (S1BC),A
; Senden von SIO1, Kanal A
LD C,S1AD
CALL SI1APR
CALL Z,FA3RET ;kein Interrupt in ausreichender Zeit
; Senden von SIO1, Kanal B
LD C,S1BD
CALL SI1BPR
CALL Z,FA3RET ;kein Interrupt in ausreichender Zeit
TEFDC1
EXX
LD A,0FFH
LD (MAWE),A
LD E,25H
CALL ANRRET
EXX
; Test des FDC
; Programmierung SPECIFY-Kommando und Ruecklesen
DI
CALL FDCREA
JR NZ,VTDPA ;FDC meldet keine Freigabe, damit keine weitere
;Initialisierung moeglich
LD A,3
OUT (DFDC),A
CALL FDCREA
JR NZ,VTDPA
LD A,1FH
OUT (DFDC),A
CALL FDCREA
JR NZ,VTDPA
LD A,0FFH
OUT (DFDC),A
CALL FDCREA
JR NZ,VTDPA
LD B,0FFH
LD C,DFDC
IN A,(C)
CP B
CALL NZ,FA3RET
LD A,0CFH ;Bitmode programmieren
OUT (P2BC),A
LD A,10H
OUT (P2BC),A
LD A,3
OUT (P2BC),A
LD A,8FH ;Wert fuer RESET ermitteln
OUT (P2BD),A ;RESET an den FDC
EI
VTDPA EXX
LD E,26H
CALL ANRRET
TEDMA EXX
; Test des DMA durch Programmieren und Ruecklesen Statusbyte und
; Blocklaenge (ohne Interrupt)
LD HL,DMATA
LD B,DMATE-DMATA
LD C,DMAADR
OTIR
LD B,3BH ;Maske fuer ersten Wert aus Leseregister
IN A,(C)
AND B
CALL Z,FA3RET ;Ergebnis Maske und eingelesener Wert nicht 0
LD C,DMAADR
LD B,0 ;zweiter Testwert wird eingetragen
IN A,(C)
CP B
CALL NZ,FA3RET
LD C,DMAADR
LD B,1 ;dritter Testwert wird eingetragen
IN A,(C)
CP B
CALL NZ,FA3RET
EXX
LD A,1
LD (MAWE),A
LD E,27H
CALL ANRRET
DMAIT EXX
; Test des DMA mit Interrupt
; Programmieren eines Speichertransfers und warten auf den Interrupt
LD HL,DMATA
LD B,DMATE2-DMATA
LD C,DMAADR
OTIR
LD HL,DMATA1
LD B,DMATE1-DMATA1
LD C,DMAADR
OTIR ;Programmierung des DMA fuer Interrupt
CALL ZEIT
LD A,(MIDMA)
AND A
CALL Z,FA3RET
DIEND LD A,0C3H
OUT (DMAADR),A ;partielles RESET an den DMA
EXX
LD A,0FFH
LD (MAWE),A
LD E,30H
CALL ANRRET
TDRAM EXX
; Programm Test DRAM
; Es werden ein Test der Adressleitungen, der Datenleitungen, der Datenhaltigkeit
; des Speichers durch das Durchschieben von 0 oder 1 und ein Programmtest des Speichers durchgefuehrt.
; Bei auftretenden Fehlern wird der entsprechende Fehlerkode an das Terminal und, wenn vorher kein
; Fehler aufgetreten war, an den PIO Port ausgegeben. Am Terminal werden ausserdem die Speicheradresse,
; der ausgegebene und der rueckgelesene Wert angezeigt.
; Benutzte Register:
; Der Test erfolgt in zwei Teilen. Erster Teil: Einschalten des DRAM auf den
; Adressen 3000H-FFFFH und Test dieses Bereichs.
; Initialisierung des DRAM auf den Adressen 3000H-0FFFFH
LD DE,040DH ;DRAM_SEL aktiv
LD B,30H ;Adresse ist 3000H
LD C,WEADP
W1EDR LD A,10H
OUT (C),D ;Einschalten des DRAM bis E=0
ADD A,B
LD B,A
DEC E
JR NZ,W1EDR
; Test der Datenleitungen des DRAM
XOR A ;alle Bits auf 0 setzen
LD HL,3000H ;Anfangsadresse ist 3000H
LD DE,3001H
LD BC,0CFFFH ;Datenlaenge ist 32k-1
LD (HL),A ;0 oder 0FFH auf den ersten Speicherplatz
LDIR ;Wert wird in die Speicherzellen des DRAM eingetragen
LD A,(HL)
CP B ;Testwert ist 0
CALL NZ,FAHLR
LD A,0FFH ;Test mit 0FFH
LD HL,3000H
LD DE,3001H
LD BC,0CFFFH
LD (HL),A
LDIR
LD B,A ;Testwert eintragen
LD A,(HL)
CP B
CALL NZ,FAHLR
EXX
LD E,31H
CALL ANRRET
T2DR EXX
; Test der Adressleitungen des dynamischen RAM
; Test der oberen Adressleitungen
; Der Speicher wird in Bloecke zu je 256 Byte aufgeteilt. Die Bloecke werden nacheinander
; mit jeweils einem Wert gefuellt (0-7). Anschliessend werden die Bloecke nacheinander
; getestet. War der Test der Datenleitungen fehlerfrei und stimmen die Werte eines
; Blockes mit dem eingegebenen Wert nicht ueberein, dann ist die Ansteuerung fuer
; das Adressbit dieses Blockes fehlerhaft.
LD HL,3000H
LD DE,3001H
XOR A
SLDRT LD BC,0FFH
LD (HL),A
LDIR
INC HL
INC DE
INC A
CP 0D0H
JR NZ,SLDRT
LD HL,3000H
DRT1 LD E,0
DRT2 LD A,(HL)
CP B
CALL NZ,FAHLR ;Fehler? dann Aufruf
INC HL
DEC E
JR NZ,DRT2
INC B ;Erhoehen von B fuer die naechsten 256 Byte
LD A,B
CP 0D0H
JR NZ,DRT1
EXX
LD E,32H
CALL ANRRET
T01DR EXX
; Durchschieben von 0 und 1
; Durchschieben einer Null
TE0DR LD HL,3000H
LD B,0FFH
LD (HL),0FFH
LD DE,0CFFEH
LD A,(HL)
CP B
CALL NZ,FAHLR
INC HL
NZNLDR RLA
LD (HL),A
INC HL
DEC DE
PUSH AF
LD A,D
OR E
JR Z,T2ZDR
POP AF
JR NZNLDR
T2ZDR LD HL,3001H
LD DE,0CFFEH
LD A,E
SCF
TNZDR2 PUSH AF
LD B,A
LD A,(HL)
CP B
CALL NZ,FAHLR
INC HL
DEC DE
LD A,D
OR E
JR Z,KAT3DR
POP AF
RLA
JR TNZDR2
KAT3DR POP AF
EXX
LD E,33H
CALL ANRRET
T3DR EXX
; M1-Test des dynamischen RAM
LD DE,3000H
NT3DR LD HL,ADRM1T
LD BC,30
LDIR
AND A
EX DE,HL
LD DE,30
SBC HL,DE
LD IX,WTM1DR
JP (HL)
WTM1DR LD DE,100H
INC HL
ADD HL,DE
EX DE,HL
LD A,D
AND A
JR NZ,NT3DR
; Der zweite Teil des DRAM-Test wird nach der Initialisierung und nach dem Umladen
; des EPROM's in den dynamischen RAM ausgefuehrt.
LD A,0DH
CALL AUSSP1
CALL AUSSP
CALL AUSSP
CALL AUSSP
JP INITSM ;Sprung zum Initialisierungsteil
; Unterprogramme fuer die Eigentestroutinen
; Programmierung PIO im Ausgabemode (ohne Interrupt)
; Testwert in B, rueckgelesener Wert in A, Portadresse in C
PTAUS LD B,A ;Testwert in B retten
LD A,0FH ;Ausgabemode
OUT (C),A
LD A,3 ;Interrupt sperren
OUT (C),A
DEC C ;Adresse Datenport einstellen
LD A,B ;Testwert fuer die Ausgabe holen
OUT (C),A
IN A,(P1AD) ;Eingabe fuer Aenderung auf dem Bus
IN A,(C)
CP B ;Vergleich mit dem Testwert
RET
; Programmierung CTC als Zaehler (ohne Interrupt)
; Zeitkonstante in B, rueckgelesener Wert in A, Portadresse in C
CZPR LD A,7
OUT (C),A
LD A,B
OUT (C),A
CALL ZEIT2
IN A,(C)
CP B
PUSH AF
LD A,3
OUT (C),A ;CTC ausschalten
POP AF
RET
; Programmierung CTC-Kanal als Zaehler (mit Interrupt).
; Portadresse steht in C, Warten auf den Interrupt, nach bestimmter
; Zeit wird abgebrochen.
; In der ISR wird HL entsprechend des ausgewaehlten Kanals veraendert.
CIPR LD A,87H
OUT (C),A
LD B,70H
LD HL,ADRM1T ;Inhalt von HL ist 0
LD A,0FFH ;fuer ISR mit Wert ungleich 0 laden
OUT (C),B
CALL ZEIT1
CALL ZEIT1
LD A,(HL) ;in der ISR wird HL veraendert
AND A
RET
; Programmierung des SIO fuer Zeichen senden (mit Interrupt).
; Portadresse steht in C, Warten auf den Interrupt, nach bestimmter
; Zeit wird abgebrochen.
; In der ISR wird HL entsprechend ausgewaehltem SIO-Kanal veraendert.
SI0APR
XOR A
OUT (C),A
CALL ZEIT
CALL ZEIT
CALL SIORES
LD A,3
OUT (CTC1),A
LD A,(MIS0KA)
AND A
RET
SI0BPR
XOR A
OUT (C),A
CALL ZEIT
CALL ZEIT
INC C
LD A,11H
OUT (C),A
XOR A
OUT (C),A
LD A,38H
OUT (S0AC),A
DEC C
LD A,(MIS0KB)
AND A
RET
SI1APR
XOR A
OUT (C),A
CALL ZEIT
CALL ZEIT
CALL SIORES
LD A,3
OUT (CTC1+2),A
LD A,(MIS1KA)
AND A
RET
SI1BPR
XOR A
OUT (C),A
CALL ZEIT
CALL ZEIT
CALL SIORES
LD A,3
OUT (CTC0),A
LD A,(MIS1KA)
AND A
RET
SIORES
INC C
LD A,11H
OUT (C),A
XOR A
OUT (C),A
LD A,30H
OUT (C),A
LD A,38H
OUT (C),A
LD A,18H
OUT (C),A
DEC C
RET
; Interruptserviceroutinen der CTC-Kanaele
ISC0K0 LD HL,MIC0K0
ICRET LD (HL),A
LD A,3
OUT (C),A
EI
RETI
ISC0K1 LD HL,MIC0K1
JR ICRET
ISC0K2 LD HL,MIC0K2
JR ICRET
ISC0K3 LD HL,MIC0K3
JR ICRET
ISC1K0 LD HL,MIC1K0
JR ICRET
ISC1K2 LD HL,MIC1K2
JR ICRET
ISC1K3 LD HL,MIC1K3
JR ICRET
; Interruptserviceroutinen der SIO-Kanaele
ISS0KA
PUSH AF
LD A,0FFH
LD (MIS0KA),A
ISRET
INC C
LD A,28H
OUT (C),A
DEC C
POP AF
EI
RETI
ISS0KB
PUSH AF
LD A,0FFH
LD (MIS0KB),A
JR ISRET
ISS1KA
PUSH AF
LD A,0FFH
LD (MIS1KA),A
JR ISRET
ISS1KB
PUSH AF
LD A,0FFH
LD (MIS1KB),A
JR ISRET
; Interruptserviceroutine DMA
ISDMA LD A,0A3H
OUT (DMAADR),A
LD (MIDMA),A
EI
RETI
; Zeitschleifen
ZEIT LD HL,0FFFFH
DECZL DEC L
JR NZ,DECZL
DEC H
JR NZ,DECZL
RET
ZEIT1 LD D,0FFH
DECDL DEC D
JR NZ,DECDL
RET
ZEIT2 LD D,6
DECD1 DEC D
JR NZ,DECD1
RET
; Unterprogramm SIO-Programmierung
SINIT
LD C,B
LD A,57H
OUT (C),A
LD A,2
OUT (C),A
LD HL,INITAB
LD B,8
LD C,E
OTIR
RET
; Unterprogramm fuer die Ausgabe der Testschrittnummer an den PIO1, Kanal A
; fuer die Ziffernanzeige und Ausgabe an das Terminal ueber den SIO0, Kanal B
; Die Testschrittnummer wird im Zweitregistersatz im Register E uebergeben.
ANRRET LD B,2 ;Anzahl von Backspace
NBSP LD A,8 ;Backspace laden
OUT (S0BD),A
WSBSP IN A,(S0BC)
BIT 2,A
JR Z,WSBSP
CALL ZEIT1
DJNZ NBSP
LD A,E
BIT 0,H ;Kennzeichnung fuer bereits aufgetretenen Fehler
JR NZ,OHNPA
OUT (P1AD),A ;bei Fehler keine weiteren Ausgaben an den PIO
OHNPA CALL HEXCON
OUT (S0BD),A
CALL SIOREA
CALL ZEIT1
LD A,C
OUT (S0BD),A
CALL SIOREA
LD C,0
ZAUSNR CALL ZEIT1
DEC C
JR NZ,ZAUSNR
RET
; Unterprogramm fuer die Fehlerausgabe an das Terminal fuer drei, zwei
; oder einen Wert entsprechend in MAWE eingetragener Anzahl
; Uebergabewerte sind: Register B enthaelt den Testwert
; Register C enthaelt die Portadresse
; Akkumulator enthaelt den gelesenen Wert
FA3RET PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD D,A ;rueckgelesenen Wert in <D> speichern
CALL AUSERR ;Ausschrift Error, Nummer entsprechend E
LD A,C ;Portadresse ist erste Ausgabe
AUS2WE CALL HEXCON ;Umwandlung in Hexadezimalzahl
OUT (S0BD),A ;Ausgabe an das Terminal
CALL SIOREA ;Ist SIO fertig?
LD A,C
OUT (S0BD),A
CALL SIOREA
LD A,(MAWE) ;Anzahl der auszugebenden Werte dekrementieren
DEC A
JR Z,FEAEND ;bei 0, Sprung an das Ende der Fehlerausgabe
LD C,B ;zu lesenden Wert in <C> speichern
CALL AUSSP ;Ausgabe von Space
LD A,C
CALL HEXCON
OUT (S0BD),A ;Ausgabe zu lesender Wert
CALL SIOREA
LD A,C
OUT (S0BD),A
CALL SIOREA
CALL AUSSP
LD A,D ;Ruecklesen gelesener Wert
CALL HEXCON
OUT (S0BD),A ;Ausgabe gelesener Wert
CALL SIOREA
LD A,C
OUT (S0BD),A
CALL SIOREA
FEAEND LD HL,ENDZEI
LD B,ANZEZ
NAEZEI LD A,(HL)
OUT (S0BD),A ;Ausgaben am Ende einer Zeile
WEZEI IN A,(S0BC)
BIT 2,A
JR Z,WEZEI
INC HL
CALL ZEIT1
DJNZ NAEZEI
POP HL
POP DE
POP BC
POP AF
RET
; Unterprogramm fuer die Ausgabe ERROR und der Fehlernummer
AUSERR EXX
LD HL,ADRERR
LD C,S0BD
LD B,ANAUSE ;Anzahl der Werte
WAUSE LD A,(HL)
OUT (C),A
CALL SIOREA
INC HL
DJNZ WAUSE
LD A,E
CALL HEXCON
OUT (S0BD),A
CALL SIOREA
LD A,C
OUT (S0BD),A
CALL SIOREA
CALL AUSSP
CALL AUSSP
CALL AUSSP
LD H,0FFH
EXX
RET
; Unterprogramm fuer die Ausgabe von HL
FAHLR PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD D,A ;rueckgelesenen Wert retten
CALL AUSERR
LD A,H
CALL HEXCON
OUT (S0BD),A
CALL SIOREA
LD A,C
OUT (S0BD),A
CALL SIOREA
LD A,L
JP AUS2WE
; Unterprogramm fuer die Abfrage der SIO-Fertigmeldung
SIOREA IN A,(S0BC)
BIT 2,A
JR Z,SIOREA
RET
; Unterprogramm fuer die Konvertierung eines Bytes in zwei ASCII-Zeichen
HEXCON LD C,A
AND 0F0H
RRCA
RRCA
RRCA
RRCA
CP 0AH
JR C,ORUP0
ADD A,7
ORUP0 ADD A,30H
PUSH AF
LD A,C
AND 0FH
CP 0AH
JR C,ORUP
ADD A,7
ORUP ADD A,30H
LD C,A
POP AF
RET
; Unterprogramm fuer die Ausgabe von SPACE
AUSSP LD A,20H
AUSSP1 OUT (S0BD),A
CALL SIOREA
RET
; Unterprogramm fuer die Abfrage der Fertigmeldung des FDC
FDCREA LD C,MSRFDC
LD B,80H
PUSH HL
POP HL
PUSH HL
POP HL ;Initialisierung einer Zeit
IN A,(C) ;Einlesen Hauptstatusregister
AND 0C0H
CP B
JR Z,TW1FDC
CALL ZEIT
CALL ZEIT
CALL ZEIT
IN A,(C)
CP B
PUSH AF
CALL NZ,FA3RET
POP AF
TW1FDC RET
; Vereinbarungen fuer den Eigentest
; Portadressen
CTC0 EQU 8
C0K0 EQU CTC0
C0K1 EQU CTC0+1
C0K2 EQU CTC0+2
C0K3 EQU CTC0+3
CTC1 EQU 02CH
C1K0 EQU CTC1
C1K1 EQU CTC1+1
C1K2 EQU CTC1+2
C1K3 EQU CTC1+3
SIO0 EQU 024H
S0AD EQU SIO0
S0AC EQU SIO0+1
S0BD EQU SIO0+2
S0BC EQU SIO0+3
SIO1 EQU 028H
S1AD EQU SIO1
S1AC EQU SIO1+1
S1BD EQU SIO1+2
S1BC EQU SIO1+3
PIO0 EQU 0CH
P0AD EQU PIO0
P0AC EQU PIO0+1
P0BD EQU PIO0+2
P0BC EQU PIO0+3
PIO1 EQU 018H
P1AD EQU PIO1
P1AC EQU PIO1+1
P1BD EQU PIO1+2
P1BC EQU PIO1+3
PIO2 EQU 1CH
P2AD EQU PIO2
P2AC EQU PIO2+1
P2BD EQU PIO2+2
P2BC EQU PIO2+3
DMAADR EQU 3CH
FDC EQU 20H
MSRFDC EQU FDC
DFDC EQU FDC+1
; Vereinbarungen fuer die SIO-Programmierung
R0 EQU 0
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4
R5 EQU 5
R6 EQU 6
R7 EQU 7
;
COMM6 EQU 30H ; FEHLER RUECKSETZEN
COMM3 EQU 18H ; KANAL RUECKSETZEN
COMM2 EQU 10H ; RUECKSETZEN EXT./STAT. INTERRUPT
NOPRTY EQU 0 ; PARITAETSPRUEFUNG AUSSCHALTEN
S2 EQU 0CH ; 2 STOP/BITS JE ZEICHEN
C16 EQU 40H ; *16
RENABLE EQU 1
B8 EQU 0C0H
XENABLE EQU 8
T8 EQU 60H
PDAVCT EQU 18H
SAVECT EQU 04H
XMTRIE EQU 02H
C32 EQU 80H
; Initialisierungstabelle fuer den SIO
INITAB
DEFB COMM6
DEFB COMM3
DEFB R4+COMM2
DEFB NOPRTY+S2+C32
DEFB R3+COMM2
DEFB RENABLE+B8
DEFB R5+COMM2
DEFB XENABLE+T8
; Initialisierungstabelle fuer den DMA
DMATA DEFB 0C3H
DEFB 7DH
DEFB 0
DEFB 21H
DEFB 0
DEFB 1
DEFB 0CFH
DEFB 14H
DEFB 10H
DEFB 80H
DEFB 0BDH
DEFB 0
DEFB 20H
DEFB 12H
DEFB 40H
DEFB 1
DEFB 0CFH
DEFB 5
DEFB 82H
DMATE2 DEFB 87H
DEFB 0BBH
DEFB 7
DMATE
DMATA1 DEFB 0ABH
DEFB 87H
DEFB 0BFH
DMATE1
; Initialisierungswerte fuer die ISR-Tabelle
TABISR DEFW ISC0K0
DEFW ISC0K1
DEFW ISC0K2
DEFW ISC0K3
DEFW ISC1K0
DEFW 0
DEFW ISC1K2
DEFW ISC1K3
DEFW 0
DEFW 0
DEFW 0
DEFW 0
DEFW 0
DEFW 0
DEFW 0
DEFW 0
DEFW ISS0KB
DEFW 0
DEFW 0
DEFW 0
DEFW ISS0KA
DEFW 0
DEFW 0
DEFW 0
DEFW ISS1KB
DEFW 0
DEFW 0
DEFW 0
DEFW ISS1KA
DEFW 0
DEFW 0
DEFW 0
DEFW ISDMA
; Vereinbarungen fuer die Merkzellen
ADISR EQU 2300H
M1CISR EQU 234FH
MIDMA EQU 234FH
MIC0K0 EQU 2350H
MIC0K1 EQU 2351H
MIC0K2 EQU 2352H
MIC0K3 EQU 2353H
MIC1K0 EQU 2354H
MIC1K2 EQU 2355H
MIC1K3 EQU 2356H
MIP0KA EQU 2357H
MIP0KB EQU 2358H
MIP1KB EQU 2359H
MIP2KA EQU 235AH
MIP2KB EQU 235BH
MIS0KA EQU 235CH
MIS0KB EQU 235DH
MIS1KA EQU 235EH
MIS1KB EQU 235FH
MAWE EQU 2360H
; Ausschrift fuer die Meldung des Eigentest
AUSHWT
DEFW 0D0AH
DEFW 0A0AH
DEFW 0A0AH
DEFW 0A0AH
DEFW 0A0AH
DEFW 0A0AH
DEFW 0A0AH
DEFW 0A0AH
DEFW 0A0AH
DEFW 0A0AH
DEFW 0A0AH
DEFW 0A0AH
DEFB 07H
AHWT1 DEFB 0DH
DEFB 0AH
DEFM 'P8000 Hardwaretest U880 - Version 3.1'
DEFB 0AH
DEFB 0DH
DEFB 20H
DEFB 20H ;2* Space wegen Testschrittnummer
ANZHWT EQU 68
; Ausschrift bei Fehler
ADRERR DEFW 0808H ;2* Backspace wegen Loeschen der Testschrittnummer
DEFM '*** ERROR '
ANAUSE EQU 12
; Ausgaben am Ende der Zeile
ENDZEI DEFB 0AH
DEFB 0DH
DEFB 20H
DEFB 20H
ANZEZ EQU 4
; Ausschrift bei Fehler PIO1, Kanal A, Testwert AA (Test ohne verfuegbaren RAM)
AUSF1 DEFW 0808H
DEFM '*** ERROR 10 18 AA '
DEFW 0D0DH
ANAUS1 EQU 25
; Ausschrift bei Fehler PIO1, Kanal A, Testwert 55 (Test ohne verfuegbaren RAM)
AUSF2 DEFW 0808H
DEFM '*** ERROR 10 18 55 '
DEFW 0D0DH
ANAUS2 EQU 25
; Ausschrift bei Fehler CTC1, Kanal 1 (Test ohne verfuegbaren RAM)
AUSF3 DEFW 0808H
DEFM '*** ERROR 15 2D 80 '
DEFW 0D0DH
ANAUS3 EQU 25
; Ausschrift bei Fehler CTC1, Kanal1 (Test ohne verfuegbaren RAM)
AUSF4 DEFW 0808H
DEFM '*** ERROR 16 2D 80 '
DEFW 0D0DH
ANAUS4 EQU 25
; Ausschrift bei Fehler SIO0, Kanal B (Test ohne verfuegbaren RAM)
AUSF5 DEFW 0808H
DEFM '*** ERROR 20 26 A0 '
DEFW 0D0DH
ANAUS5 EQU 25
; Ausschrift bei Fehler SIO0, Kanal B (Test ohne verfuegbaren RAM)
AUSF6 DEFW 0808H
DEFM '*** ERROR 21 26 50 '
DEFW 0D0DH
ANAUS6 EQU 25
; Ausgabe der Testnummern zu Beginn des Eigentest, wenn kein Fehler
; auftrat (bei Test ohne verfuegbaren RAM)
TENRAN DEFW 0808H
DEFM '10'
DEFW 0808H
DEFM '15'
DEFW 0808H
DEFM '16'
DEFW 0808H
DEFM '20'
ANZANF EQU 16
WEADP EQU 0
RFF EQU 4
INSM1
MEMINI LD C,WEADP
LD DE,10H
XOR A
AUSWE LD B,A
OUT (C),D
ADD A,10H
DEC E
JR NZ,AUSWE
LD D,1
LD B,0
OUT (C),D
IN A,(RFF)
LD B,10H
OUT (C),D
INITSM
LD A,57H
OUT (CTC1+1),A
LD A,2
OUT (CTC1+1),A
LD HL,INITAB
LD C,S0BC
LD B,8
OTIR
LD A,12H
OUT (S0BC),A
OUT (S1BC),A
LD A,20H
OUT (S0BC),A
LD A,30H
OUT (S1BC),A
LD C,WEADP
LD D,4
LD E,0EH
LD A,20H
AUSDR LD B,A
OUT (C),D
ADD A,10H
DEC E
JR NZ,AUSDR
LD BC,2000H
LD DE,0C000H
LD HL,0
LDIR
JP RAMADR+0C000H
RAMADR LD C,WEADP
LD D,4
LD B,0
EINDR OUT (C),D
LD B,10H
OUT (C),D
LD BC,0C00H
LD DE,0
LD HL,0CF00H
LDIR
LD HL,ANFSM+0C000H
LD B,ANZASM
NZSM LD A,(HL)
OUT (S0BD),A
WSFER IN A,(S0BC)
BIT 2,A
JR Z,WSFER
INC HL
LD D,0
SLDEE DEC D
JR NZ,SLDEE
DJNZ NZSM
; Initialisierung des PIO2 auf der U880-Karte
;
LD B,11
LD HL,IOWERT+0C000H
ILOOP LD C,(HL) ;Adresse
INC HL
OUTI ;Ausgabe
JR NZ,ILOOP
; Initialisierung DMA
LD HL,DMAINI+0C000H
LD BC,0B00H+DMAADR
OTIR
;
LD A,0FFH
OUT (P0BD),A ;RESET-U8000 HIGH
LD A,4FH ;PROGRAMMIERUNG PIO0 (KOPPELPIO)
OUT (P0AC),A ;PORT A: INPUT
IN A,(P0AD) ;SCHEINEINGABE
LD BC,0C00H
LD HL,0CF00H
LD DE,0
NVERGL LD A,(DE)
CP (HL)
JR NZ,ERR35
INC DE
INC HL
DEC BC
LD A,B
OR C
JR NZ,NVERGL
LD HL,0D00H
NWZUDR LD A,(HL)
LD D,A
XOR A
LD (HL),A
LD A,(0C000H)
LD A,(HL)
AND A
JR NZ,ERR34
LD A,D
LD (HL),A
LD A,(0C000H)
LD A,(HL)
CP D
JR NZ,ERR34
INC HL
LD A,H
CP 30H
JR NZ,NWZUDR
LD HL,0D00H
NWZDR1 LD A,(HL)
LD D,A
LD A,0FFH
LD (HL),A
LD A,(0C000H)
LD A,(HL)
CP 0FFH
JR NZ,ERR34
LD A,D
LD (HL),A
LD A,(0C000H)
LD A,(HL)
CP D
JR NZ,ERR34
INC HL
LD A,H
CP 30H
JR NZ,NWZDR1
MZU0 LD C,S0BC
LD A,11H
OUT (C),A
LD A,1CH
OUT (C),A
XOR A
OUT (CTC0),A
XOR A
LD (0E88H),A ;Floppy-Neuinitialisierung fuer Start aus SMON
DI
JP 0
ERR34
LD HL,AUSE34+0C000H
A34 LD B,ANZ34
LD C,S0BD
SLE34 OUTI
INC B
ABFE34
IN A,(S0BC)
BIT 2,A
JR Z,ABFE34
LD D,0
ZSLA34 DEC D
JR NZ,ZSLA34
DJNZ SLE34
JP MZU0+0C000H
ERR35 LD HL,AUSE35+0C000H
JR A34
;;;;;;;;;;;;;;;;;;;;;;;;;
;
DMAINI DEFB 0C3H ;DMA Reset
DEFB 5 ;Speicher ist Quelle, FDC ist Ziel, keine Adressen, Datentransfer
DEFB 54H ;Time Byte folgt, Port A-MREQ, Adresse inkrementiert
DEFB 0FCH ;Time-Byte (4 Takte)
DEFB 78H ;Time Byte folgt, Port B-IORQ, Adresse fest
DEFB 0FCH ;Time Byte (4 Takte)
DEFB 95H ;Byte-Mode, IC-Byte folgt, Adresse Port B folgt
DEFB 21H ;Adresse FDC
DEFB 12H ;Int.-Vektor folgt, Interrupt bei Blockende
DEFB INTABD.AND.0FFH ;Interruptvektor
DEFB 8AH ;Ready ist "high activ"
;
;
; Initialisierungswerte fuer PIO2
IOWERT
DEFB PIO2AC
DEFB 0CFH ;Modeauswahl --> Bit-Mode
DEFB PIO2AC
DEFB 80H
DEFB PIO2AC
DEFB 3
DEFB PIO2AD
DEFB 5FH ;Motoren aus, TC ein, Praekompensation aus
;5,25"-Laufwerke
DEFB PIO2AD
DEFB 1FH ;TC aus
DEFB PIO2BC
DEFB INTABP.AND.0FFH ; LOW-TEIL DES INT.VEKT.
DEFB PIO2BC
DEFB 0CFH ;Modeauswahl --> Bitmode
DEFB PIO2BC
DEFB 010H ;Festlegung E/A-Bits fuer Bit-Mode
DEFB PIO2BC
DEFB 0B7H ;Interruptsteuerung Port B
;EI/Maske folgt/jedes auf HIGH gehende
;Bit loest Interrupt aus
DEFB PIO2BC
DEFB 0EFH ;nur Bit 4 kann Interrupts ausloesen (FDC)
DEFB PIO2BD
DEFB 0FH ;Index erlaubt, kein Laufwerk selektiert
;
;Adressen der benutzten peripheren Schaltkreise
PIO2AD EQU 01CH
PIO2AC EQU 01DH
PIO2BD EQU 01EH
PIO2BC EQU 01FH
MSR EQU 020H
DATREG EQU 021H
CTC EQU 08H
;
;Adressen der Interruptserviceroutinen
INTABP EQU 0F1AH
INTAB EQU 0F00H
INTABD EQU 0F1CH
ANFSM DEFB 0AH
DEFB 0DH
DEFM 'U880-Softwaremonitor Version 3.1 - Press RETURN'
DEFB 0AH
DEFB 0DH
ANZASM EQU 51
AUSE34 DEFM 'ERROR 34'
DEFB 0AH
DEFB 0DH
ANZ34 EQU 10
AUSE35 DEFM 'ERROR 35'
DEFB 0AH
DEFB 0DH
ORG 0EF0H
DI
LD D,1
LD B,0
LD C,0
OUT (C),D
LD B,10H
OUT (C),D
JP ENSMON
CRCEP0 EQU 1FF8H
NCEP0 EQU 1FFAH
CRCEP1 EQU 1FFCH
NCEP1 EQU 1FFEH