PN RAMTEST ORG 0C000H ;(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 ;------------- C000H C3 03 C0 JMP START C003H F3 START: DI C004H 3E 20 LD A,20H ;grün auf schwarz, Leerzeichen C006H 21 00 E8 LD HL,0E800H ;Anfang Bildspeicher C009H 11 01 E8 LD DE,0E801H C00CH 01 FF 07 LD BC,07FFH ;Größe des BWS C00FH 77 LD M,A C010H ED B0 LDIR ;Bildschirm löschen C012H 3E 03 LD A,3 ;Initialisierung der PIO C014H D3 8A OUT 8AH C016H 3E CF LD A,0CFH ;Bitmodus C018H D3 8A OUT 8AH C01AH AF XOR A ;A=00 C01BH D3 8A OUT 8AH C01DH D3 88 OUT 88H C01FH 21 00 EC LD HL,BILD1 ;BWS testen C022H 3E 58 LD A,58H ;'X' schreiben C024H 77 LD M,A C025H 34 INC M ;'X' nach 'Y' ändern C026H 7E LD A,M C027H FE 59 CMP 59H ;'Y' lesen C029H C2 35 C1 JPNZ PIO-# ;weiter über PIO-Ausgabe C02CH 31 BF EF LD SP,0EFBFH ;Stack ab Bildspeicherende nach unten C02FH 21 00 EC LD HL,BILD1 ;BWS 1. Zeile, 1. Spalte C032H 11 11 C1 LD DE,MSG0 ;Startmeldung C035H CD 03 C1 CALL PRNST ;Ausgabe auf den Bildschirm C038H 16 00 LD D,00H ;00 C03AH CD 4B C0 CALL WRIT ;in den Speicher schreiben C03DH CD 5B C0 CALL READ ;Speicherinhalt prüfen C040H 16 FF LD D,0FFH ;FF C042H CD 4B C0 CALL WRIT ;in den Speicher schreiben C045H CD 5B C0 CALL READ ;Speicherinhalt prüfen C048H C3 27 C1 JMP END ;---------------------- ;UNTERPROGAMM SCHREIBEN ;---------------------- C04BH 21 00 00 WRIT: LD HL,AADR C04EH 01 00 40 LD BC,LANG C051H 72 WRIT1: LD M,D ;Byte schreiben C052H 23 INC HL ;nächste Adresse C053H 0D DEC C ;Länge -1 C054H 79 LD A,C C055H B7 OR A ;schon 0? C056H 20 F9 JRNZ WRIT1-# ;100H x nächste Adresse C058H 10 F7 DJNZ WRIT1-# ;40H x nächste 100H Adressen C05AH C9 RET ;------------------ ;UNTERPROGAMM LESEN ;------------------ C05BH 21 00 00 READ: LD HL,AADR C05EH 01 00 40 LD BC,LANG C061H 7E READ1: LD A,M ;gelesenes Byte (IST) C062H 5F LD E,A ;nach E retten C063H CD 73 C0 CALL DISP ;Ausgabe des geschriebenen Bytes (HEX) ;Ausgabe des gelesenen Bytes (HEX) ;Ausgabe des gelesenen Bytes (BIN) C066H BA CMP D ;Vergleich mit dem geschriebenen (SOLL) C067H C2 F6 C0 JRNZ FEHL-# ;Fehler und raus!!! C06AH 23 INC HL ;nächste Adresse C06BH 0D DEC C ;Länge -1 C06CH 79 LD A,C C06DH B7 OR A ;=0? C06EH 20 F1 JRNZ READ1-# ;100H x nächste Adresse C070H 10 EF DJNZ READ1-# ;40H x nächste 100H Adressen C072H C9 RET ;-------------------- ;UNTERPROGAMM ANZEIGE ;-------------------- C073H C5 DISP: PUSH BC C074H F5 PUSH AF C075H 7C LD A,H ;1. Byte der Adresse C076H E5 PUSH HL ;1. Byte sichern C077H 21 0A EC LD HL,BILD2 ;BWS 1. Zeile, 10.Spalte C07AH F5 DISP0: PUSH AF C07BH CB 3F SRL A C07DH CB 3F SRL A C07FH CB 3F SRL A C081H CB 3F SRL A C083H FE 0A CMP 0AH ;>9? C085H 38 02 JRC DISP3-# ;nein C087H C6 07 ADD 07H ;dann Buchstabe C089H C7 30 DISP3: ADD 30H C08BH CD 0B C1 CALL OUTA ;1. bzw. 3. Zeichen ausgeben C08EH F1 POP AF ;1. Byte der Adresse C08FH E6 0F AND 0FH C091H FE 0A CMP 0AH ;>9? C093H 38 02 JRC DISP4-# ;nein; dann Ziffer C095H C6 07 ADD 07H ;Buchstabe C097H C6 30 DISP4: ADD 30H C099H CD 0B C1 CALL OUTA ;2. bzw.4. Zeichen ausgeben C09CH 7D LD A,L C09DH FE 0E CMP 0EH ;auf EC0DH liegt das 4. Zeichen ;nach dem 4. Zeichen steht in HL = EC0E C09FH 28 08 JRZ DISP5-# ;4.Zeichen erreicht --> BIN ausgeben C0A1H E1 POP HL ;wiedereinladen der aktuellen Adresse C0A2H E5 PUSH HL C0A3H 7D LD A,L ;2. Byte der Adresse C0A4H 21 0C EC LD HL,BILD2+2 ;BWS 1. Zeile, 12.Spalte C0A7H 18 D1 JR DISP0-# ;bearbeiten C0A9H 23 DISP5: INC HL C0AAH 7A LD A,D ;geschriebenes Zeichen C0ABH B7 OR A ;=00? C0ACH 20 0A JRNZ DISP2-# ;=FF C0AEH C6 30 ADD 30H C0B0H CD 0B C1 DISP1: CALL OUTA C0B3H CD 0B C1 CALL OUTA C0B6H 18 04 JR IST0-# C0B8H 3E 46 DISP2: LD A,46H ;FF C0BAH 18 F4 JR DISP1-# C0BCH 23 IST0: INC HL C0BDH 7B LD A,E ;gelesenes Zeichen C0BEH CB 3F SRL A ;4x nach rechts schieben C0C0H CB 3F SRL A C0C2H CB 3F SRL A C0C4H CB 3F SRL A C0C6H FE 0A CMP 0AH ;<9? C0C8H 38 02 JRC LBYT1-# ;nein, dann Ziffer C0CAH C6 07 ADD 07H ;Buchstabe C0CCH C6 30 LBYT1: ADD 30H C0CEH CD 0B C1 CALL OUTA ;1. Zeichen ausgeben C0D1H 7B LD A,E C0D2H E6 0F AND 0FH C0D4H FE 0A CMP 0AH ;>9? C0D6H 38 02 JRC LBYT2-# ;nein C0D8H C6 07 ADD 07H ;dann Buchstabe C0DAH C6 30 LBYT2: ADD 30H C0DCH CD 0B C1 CALL OUTA ;2. Zeichen ausgeben C0DFH 23 INC HL ;BWS: eine Spalte weiter C0E0H 7B LD A,E ;gelesenes Zeichen wieder herstellen C0E1H 06 08 LD B,8 ;Anzahl der Bits C0E3H CB 27 IST1: SLA A C0E5H 38 0B JRC IST2-# ;Bit ist 1 C0E7H 0E 30 LD C,30H ;Bit ist 0 C0E9H CD 0E C1 IST3: CALL OUTC ;Bit 0/1 ausgeben C0ECH 10 F5 DJNZ IST1-# C0EEH E1 POP HL C0EFH F1 POP AF C0F0H C1 POP BC C0F1H C9 RET C0F2H 0E 31 IST2: LD C,31H ;Bit ist 1 C0F4H 18 F3 JR IST3-# ;------------------- ;UNTERPROGAMM FEHLER ;------------------- C0F6H 21 1F EC FEHL: LD HL,BILD3 ;BWS 1. Zeile, 31.Spalte C0F9H D5 PUSH DE C0FAH 11 20 C1 LD DE,MSG2 ;Fehlermeldung C0FDH CD 03 C1 CALL PRNST ;Ausgabe auf den Bildschirm C100H D1 POP DE C101H 18 5F JR FLED-# ;Bit blinken ;------------------------- ;UNTERPROGAMME MSG-AUSGABE ;------------------------- C103H 1A PRNST: LD A,(DE) ;Zeichenkettenausgabe über- C104H B7 OR A ;nommen vom Z9001-System-ROM C105H C8 RZ C106H 77 LD M,A C107H 23 INC HL C108H 13 INC DE C109H 18 F8 JR PRNST-# C10BH 77 OUTA: LD M,A C10CH 23 INC HL C10DH C9 RET C10EH 71 OUTC: LD M,C C10FH 23 INC HL C110H C9 RET C111H 52 41 4D 54 45 53 54 MSG0: DB 'RAMTEST' ;Startmeldung C119H 00 DB 0 C11AH 52 41 4D 20 4F 4B MSG1: DB 'RAM OK' ;Endemeldung C11FH 00 DB 0 C120H 46 45 48 4C 45 52 MSG2: DB 'FEHLER' ;Fehlermeldung C126H 00 DB 0 C127H 21 1F EC END: LD HL,BILD3 ;BWS 1. Zeile, 12.Spalte C12AH 11 19 C1 LD DE,MSG1 ;Endemeldung C12DH CD 03 C1 CALL PRNST ;Ausgabe auf den Bildschirm C130H 3E 40 LEDOK: LD A,40H C132H D3 88 OUT 88H ;LED einschalten, kein Fehler -> ENDE C134H 76 HALT ;---------------- ;UNTERPROGAMM PIO ;---------------- C135H 16 00 PIO: LD D,00H ;00 C137H 18 02 JR WR-# ;in den Speicher schreiben C139H 16 FF WRF: LD D,0FFH ;FF C13BH 21 00 00 WR: LD HL,AADR C13EH 01 00 40 LD BC,LANG C141H 72 WR1: LD M,D ;Byte schreiben C142H 23 INC HL ;nächste Adresse C143H 0D DEC C ;Länge -1 C144H 79 LD A,C C145H B7 OR A ;schon 0? C146H 20 F9 JRNZ WR1-# ;100H x nächste Adresse C148H 10 F7 DJNZ WR1-# ;40H x nächste 100H Adressen C14AH 21 00 00 RD: LD HL,AADR C14DH 01 00 40 LD BC,LANG C150H 7E RD1: LD A,M ;gelesenes Byte (IST) C151H 5F LD E,A ;nach E retten C152H BA CMP D ;Vergleich mit dem geschriebenen (SOLL) C153H 20 0D JRNZ FLED-# ;Fehler und raus!!! C155H 23 INC HL ;nächste Adresse C156H 0D DEC C ;Länge -1 C157H 79 LD A,C C158H B7 OR A ;=0? C159H 20 F5 JRNZ RD1-# ;100H x nächste Adresse C15BH 10 F3 DJNZ RD1-# ;40H x nächste 100H Adressen C15DH BA CMP D ;prüfen, ob 2. Durchlauf (D)=FF? C15EH 28 D9 JRZ WRF-# ;noch nicht C160H 18 CE JR LEDOK-# ;----------------------- ;UNTERPROGAMM FEHLER-LED ;----------------------- C162H 7A FLED: LD A,D C163H B7 OR A ;00? C164H 7B LD A,E ;Fehlerbyte wiederherstellen C165H 06 08 LD B,8 ;Anzahl der Bits C167H 20 08 JRNZ GKF-# ;ist FF C169H CB 27 GK0: SLA A C16BH 38 0B JRC LED-# ;Anzahl ausgeben C16DH 10 FA DJNZ GK0-# ;i.O.-Bits überspringen C16FH 18 C8 JR WRF-# ;kein Fehler ? C171H CB 27 GKF: SLA A C173H 30 03 JRNC LED-# ;Anzahl ausgeben C175H 10 FA DJNZ GKF-# ;i.O.-Bits überspringen C177H 76 HALT ;ENDE C178H 3E 40 LED: LD A,40H C17AH D3 88 OUT 88H ;LED ein C17CH 18 08 JR WARTE-# C17EH AF RET1: XOR A C17FH D3 88 OUT 88H ;LED aus C181H 18 03 JR WARTE-# C183H 10 F3 RET2: DJNZ LED-# C185H 76 HALT C186H 08 WARTE: EXAF ;Warteschleife für Blinken C187H D9 EXX C188H 01 FF FF LD BC,0FFFFH ;Blinkzeit C18BH 0D TX: DEC C C18CH 79 LD A,C C18DH B7 OR A C18EH 20 FB JRNZ TX-# C190H 10 F9 DJNZ TX-# C192H D9 EXX C193H 08 EXAF C194H B7 OR A ;00? C195H 28 EC JRZ RET2-# ;kam vom 1. CALL C197H 18 E5 JR RET1-# C199H FF DB 0FFH C19AH 28 43 29 2D 55 5A DB '(C)-UZ'