PN RAMTEST ORG 08000H ;(D)= geschriebenes Zeichen ;(E)= gelesenes Zeichen BILD1: EQU 0EC00H BILD2: EQU 0EC0AH BILD3: EQU 0EC1FH STACK: EQU 0EFBFH AADR: EQU 0000H ;RAM-Anfangsadresse (0000) LANG: EQU 4000H ;Länge der ersten 16KBytes ;------------- ;HAUPTPROGRAMM ;------------- 8000H C3 03 80 JMP START 8003H F3 START: DI 8004H 3E 20 LD A,20H ;grün auf schwarz, Leerzeichen 8006H 21 00 E8 LD HL,0E800H ;Anfang Bildspeicher 8009H 11 01 E8 LD DE,0E801H 800CH 01 FF 07 LD BC,07FFH ;Größe des BWS 800FH 77 LD M,A 8010H ED B0 LDIR ;Bildschirm löschen 8012H 3E 03 LD A,3 ;Initialisierung der PIO 8014H D3 8A OUT 8AH 8016H 3E CF LD A,0CFH ;Bitmodus 8018H D3 8A OUT 8AH 801AH AF XOR A ;A=00 801BH D3 8A OUT 8AH 801DH D3 88 OUT 88H 801FH 21 00 EC LD HL,BILD1 ;BWS testen 8022H 3E 58 LD A,58H ;'X' schreiben 8024H 77 LD M,A 8025H 34 INC M ;'X' nach 'Y' ändern 8026H 7E LD A,M 8027H FE 59 CMP 59H ;'Y' lesen 8029H C2 35 81 JPNZ PIO-# ;weiter über PIO-Ausgabe 802CH 31 BF EF LD SP,0EFBFH ;Stack ab Bildspeicherende nach unten 802FH 21 00 EC LD HL,BILD1 ;BWS 1. Zeile, 1. Spalte 8032H 11 11 81 LD DE,MSG0 ;Startmeldung 8035H CD 03 81 CALL PRNST ;Ausgabe auf den Bildschirm 8038H 16 00 LD D,00H ;00 803AH CD 4B 80 CALL WRIT ;in den Speicher schreiben 803DH CD 5B 80 CALL READ ;Speicherinhalt prüfen 8040H 16 FF LD D,0FFH ;FF 8042H CD 4B 80 CALL WRIT ;in den Speicher schreiben 8045H CD 5B 80 CALL READ ;Speicherinhalt prüfen 8048H C3 27 81 JMP END ;---------------------- ;UNTERPROGAMM SCHREIBEN ;---------------------- 804BH 21 00 00 WRIT: LD HL,AADR 804EH 01 00 40 LD BC,LANG 8051H 72 WRIT1: LD M,D ;Byte schreiben 8052H 23 INC HL ;nächste Adresse 8053H 0D DEC C ;Länge -1 8054H 79 LD A,C 8055H B7 OR A ;schon 0? 8056H 20 F9 JRNZ WRIT1-# ;100H x nächste Adresse 8058H 10 F7 DJNZ WRIT1-# ;40H x nächste 100H Adressen 805AH C9 RET ;------------------ ;UNTERPROGAMM LESEN ;------------------ 805BH 21 00 00 READ: LD HL,AADR 805EH 01 00 40 LD BC,LANG 8061H 7E READ1: LD A,M ;gelesenes Byte (IST) 8062H 5F LD E,A ;nach E retten 8063H CD 73 80 CALL DISP ;Ausgabe des geschriebenen Bytes (HEX) ;Ausgabe des gelesenen Bytes (HEX) ;Ausgabe des gelesenen Bytes (BIN) 8066H BA CMP D ;Vergleich mit dem geschriebenen (SOLL) 8067H C2 F6 80 JRNZ FEHL-# ;Fehler und raus!!! 806AH 23 INC HL ;nächste Adresse 806BH 0D DEC C ;Länge -1 806CH 79 LD A,C 806DH B7 OR A ;=0? 806EH 20 F1 JRNZ READ1-# ;100H x nächste Adresse 8070H 10 EF DJNZ READ1-# ;40H x nächste 100H Adressen 8072H C9 RET ;-------------------- ;UNTERPROGAMM ANZEIGE ;-------------------- 8073H C5 DISP: PUSH BC 8074H F5 PUSH AF 8075H 7C LD A,H ;1. Byte der Adresse 8076H E5 PUSH HL ;1. Byte sichern 8077H 21 0A EC LD HL,BILD2 ;BWS 1. Zeile, 10.Spalte 807AH F5 DISP0: PUSH AF 807BH CB 3F SRL A 807DH CB 3F SRL A 807FH CB 3F SRL A 8081H CB 3F SRL A 8083H FE 0A CMP 0AH ;>9? 8085H 38 02 JRC DISP3-# ;nein 8087H C6 07 ADD 07H ;dann Buchstabe 8089H C7 30 DISP3: ADD 30H 808BH CD 0B 81 CALL OUTA ;1. bzw. 3. Zeichen ausgeben 808EH F1 POP AF ;1. Byte der Adresse 808FH E6 0F AND 0FH 8091H FE 0A CMP 0AH ;>9? 8093H 38 02 JRC DISP4-# ;nein; dann Ziffer 8095H C6 07 ADD 07H ;Buchstabe 8097H C6 30 DISP4: ADD 30H 8099H CD 0B 81 CALL OUTA ;2. bzw.4. Zeichen ausgeben 809CH 7D LD A,L 809DH FE 0E CMP 0EH ;auf EC0DH liegt das 4. Zeichen ;nach dem 4. Zeichen steht in HL = EC0E 809FH 28 08 JRZ DISP5-# ;4.Zeichen erreicht --> BIN ausgeben 80A1H E1 POP HL ;wiedereinladen der aktuellen Adresse 80A2H E5 PUSH HL 80A3H 7D LD A,L ;2. Byte der Adresse 80A4H 21 0C EC LD HL,BILD2+2 ;BWS 1. Zeile, 12.Spalte 80A7H 18 D1 JR DISP0-# ;bearbeiten 80A9H 23 DISP5: INC HL 80AAH 7A LD A,D ;geschriebenes Zeichen 80ABH B7 OR A ;=00? 80ACH 20 0A JRNZ DISP2-# ;=FF 80AEH C6 30 ADD 30H 80B0H CD 0B 81 DISP1: CALL OUTA 80B3H CD 0B 81 CALL OUTA 80B6H 18 04 JR IST0-# 80B8H 3E 46 DISP2: LD A,46H ;FF 80BAH 18 F4 JR DISP1-# 80BCH 23 IST0: INC HL 80BDH 7B LD A,E ;gelesenes Zeichen 80BEH CB 3F SRL A ;4x nach rechts schieben 80C0H CB 3F SRL A 80C2H CB 3F SRL A 80C4H CB 3F SRL A 80C6H FE 0A CMP 0AH ;<9? 80C8H 38 02 JRC LBYT1-# ;nein, dann Ziffer 80CAH C6 07 ADD 07H ;Buchstabe 80CCH C6 30 LBYT1: ADD 30H 80CEH CD 0B 81 CALL OUTA ;1. Zeichen ausgeben 80D1H 7B LD A,E 80D2H E6 0F AND 0FH 80D4H FE 0A CMP 0AH ;>9? 80D6H 38 02 JRC LBYT2-# ;nein 80D8H C6 07 ADD 07H ;dann Buchstabe 80DAH C6 30 LBYT2: ADD 30H 80DCH CD 0B 81 CALL OUTA ;2. Zeichen ausgeben 80DFH 23 INC HL ;BWS: eine Spalte weiter 80E0H 7B LD A,E ;gelesenes Zeichen wieder herstellen 80E1H 06 08 LD B,8 ;Anzahl der Bits 80E3H CB 27 IST1: SLA A 80E5H 38 0B JRC IST2-# ;Bit ist 1 80E7H 0E 30 LD C,30H ;Bit ist 0 80E9H CD 0E 81 IST3: CALL OUTC ;Bit 0/1 ausgeben 80ECH 10 F5 DJNZ IST1-# 80EEH E1 POP HL 80EFH F1 POP AF 80F0H C1 POP BC 80F1H C9 RET 80F2H 0E 31 IST2: LD C,31H ;Bit ist 1 80F4H 18 F3 JR IST3-# ;------------------- ;UNTERPROGAMM FEHLER ;------------------- 80F6H 21 1F EC FEHL: LD HL,BILD3 ;BWS 1. Zeile, 31.Spalte 80F9H D5 PUSH DE 80FAH 11 20 81 LD DE,MSG2 ;Fehlermeldung 80FDH CD 03 81 CALL PRNST ;Ausgabe auf den Bildschirm 8100H D1 POP DE 8101H 18 5F JR FLED-# ;Bit blinken ;------------------------- ;UNTERPROGAMME MSG-AUSGABE ;------------------------- 8103H 1A PRNST: LD A,(DE) ;Zeichenkettenausgabe über- 8104H B7 OR A ;nommen vom Z9001-System-ROM 8105H C8 RZ 8106H 77 LD M,A 8107H 23 INC HL 8108H 13 INC DE 8109H 18 F8 JR PRNST-# 810BH 77 OUTA: LD M,A 810CH 23 INC HL 810DH C9 RET 810EH 71 OUTC: LD M,C 810FH 23 INC HL 8110H C9 RET 8111H 52 41 4D 54 45 53 54 MSG0: DB 'RAMTEST' ;Startmeldung 8119H 00 DB 0 811AH 52 41 4D 20 4F 4B MSG1: DB 'RAM OK' ;Endemeldung 811FH 00 DB 0 8120H 46 45 48 4C 45 52 MSG2: DB 'FEHLER' ;Fehlermeldung 8126H 00 DB 0 8127H 21 1F EC END: LD HL,BILD3 ;BWS 1. Zeile, 12.Spalte 812AH 11 19 81 LD DE,MSG1 ;Endemeldung 812DH CD 03 81 CALL PRNST ;Ausgabe auf den Bildschirm 8130H 3E 40 LEDOK: LD A,40H 8132H D3 88 OUT 88H ;LED einschalten, kein Fehler -> ENDE 8134H 76 HALT ;---------------- ;UNTERPROGAMM PIO ;---------------- 8135H 16 00 PIO: LD D,00H ;00 8137H 18 02 JR WR-# ;in den Speicher schreiben 8139H 16 FF WRF: LD D,0FFH ;FF 813BH 21 00 00 WR: LD HL,AADR 813EH 01 00 40 LD BC,LANG 8141H 72 WR1: LD M,D ;Byte schreiben 8142H 23 INC HL ;nächste Adresse 8143H 0D DEC C ;Länge -1 8144H 79 LD A,C 8145H B7 OR A ;schon 0? 8146H 20 F9 JRNZ WR1-# ;100H x nächste Adresse 8148H 10 F7 DJNZ WR1-# ;40H x nächste 100H Adressen 814AH 21 00 00 RD: LD HL,AADR 814DH 01 00 40 LD BC,LANG 8150H 7E RD1: LD A,M ;gelesenes Byte (IST) 8151H 5F LD E,A ;nach E retten 8152H BA CMP D ;Vergleich mit dem geschriebenen (SOLL) 8153H 20 0D JRNZ FLED-# ;Fehler und raus!!! 8155H 23 INC HL ;nächste Adresse 8156H 0D DEC C ;Länge -1 8157H 79 LD A,C 8158H B7 OR A ;=0? 8159H 20 F5 JRNZ RD1-# ;100H x nächste Adresse 815BH 10 F3 DJNZ RD1-# ;40H x nächste 100H Adressen 815DH BA CMP D ;prüfen, ob 2. Durchlauf (D)=FF? 815EH 28 D9 JRZ WRF-# ;noch nicht 8160H 18 CE JR LEDOK-# ;----------------------- ;UNTERPROGAMM FEHLER-LED ;----------------------- 8162H 7A FLED: LD A,D 8163H B7 OR A ;00? 8164H 7B LD A,E ;Fehlerbyte wiederherstellen 8165H 06 08 LD B,8 ;Anzahl der Bits 8167H 20 08 JRNZ GKF-# ;ist FF 8169H CB 27 GK0: SLA A 816BH 38 0B JRC LED-# ;Anzahl ausgeben 816DH 10 FA DJNZ GK0-# ;i.O.-Bits überspringen 816FH 18 C8 JR WRF-# ;kein Fehler ? 8171H CB 27 GKF: SLA A 8173H 30 03 JRNC LED-# ;Anzahl ausgeben 8175H 10 FA DJNZ GKF-# ;i.O.-Bits überspringen 8177H 76 HALT ;ENDE 8178H 3E 40 LED: LD A,40H 817AH D3 88 OUT 88H ;LED ein 817CH 18 08 JR WARTE-# 817EH AF RET1: XOR A 817FH D3 88 OUT 88H ;LED aus 8181H 18 03 JR WARTE-# 8183H 10 F3 RET2: DJNZ LED-# 8185H 76 HALT 8186H 08 WARTE: EXAF ;Warteschleife für Blinken 8187H D9 EXX 8188H 01 FF FF LD BC,0FFFFH ;Blinkzeit 818BH 0D TX: DEC C 818CH 79 LD A,C 818DH B7 OR A 818EH 20 FB JRNZ TX-# 8190H 10 F9 DJNZ TX-# 8192H D9 EXX 8193H 08 EXAF 8194H B7 OR A ;00? 8195H 28 EC JRZ RET2-# ;kam vom 1. CALL 8197H 18 E5 JR RET1-# 8199H FF DB 0FFH 819AH 28 43 29 2D 55 5A DB '(C)-UZ'