*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 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 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 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 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 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 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 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 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