ndr-nkc.de ndr-nbc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
8088 Section
Baugruppen
Downloads
 
Bussysteme
Stromversorgung
Input / Output
Grafikkarten
Speicherkarten
Massenspeicher
Weitere Baugruppen
 
Projekte
 
Dokumentation
Datenblätter
Glossar
Portraits
Links

Impressum

 

HEXMON - Der Monitor für Z80

Der Monitor ist die einfachste Möglichkeit bei begrenztem Hardwareeinsatz Programme und Daten in einen Computer einzugeben sowie die unterstützte Hardware anzusprechen.

Der Monitor ist für den Einsatz auf einer SBC1 oder SBC2 gedacht und benötigt die Baugruppen IOE in Verbindung mit HEXIO zur Eingabe und Ausgabe. Zusätzlich werden die Baugruppen CAS zur Speicherung auf Cassette und PROMER zum Programmieren von EPROMS direkt vom Monitor unterstützt. Alle anderen Baugruppen können durch eigene Programme angesprochen werden und erfahren keine spezielle Unterstützung durch den Monitor.

Mit HEXMON Programme entwickeln

Das Buch zeigt, dass man auch ohne Grafikkarte und Bildschirm sinnvoll mit dem modularen NDR-Klein-Computer arbeiten kann. Anfangs widmet sich das Buch dem Anschluß und der Inbetriebnahme des Hexmon und erlütert die Befehle und Unterprogramme des Monitors.

Im Anhang (etwa die Hälfte des Buches) werden die Baugruppen POW5V, BUS, SBC2, IOE und HEXIO beschrieben, sowie der komplette Quelltext des Monitors abgebildet.

Befehle und Funktionen auf dem Tastenfeld

Keyboard Beschreibung
0 mve MOVE - Verschieben von Speicherbereichen
Verschiebt einen Datenbereich von einer Speicheradresse an eine andere Adresse. Der Befehl arbeitet in jedem Fall so, dass der zu verschiebende Bereich auch bei überlappenden Speicherbereichen komplett an der Zieladresse erscheint.
Zunächst wird die Eingabe der Startadresse des zu verschiebenden Bereichs VON, dann die Endadresse des zu verschiebenden Bereichs BIS und als Letztes die Startadresse des Ziels NAC eingegeben. Die Endadresse des Ziels wird automatisch berechnet. Nach dem Verschieben von Programmbereichen müssen absolute Adressen und Sprungbefehle entsprechend der Verschiebung angepasst werden.
1 brk BREAK - Angeben von Unterbrechnungspunkten
Es lassen sich nacheinander bis zu drei Adressen angeben, an denen die Ausführung eines Programms unterbrochen wird. Die Adresse 0000 bedeutet, dass der betreffende Breakpunkt nicht verwendet wird.
Die Adressen der Breakpoints werden im RAM gespeichert und können durch diesen Befehl jederzeit bearbeitet werden. Bei der Ausführung eines Programmes über den Befehl START werden die Befehle, die an den Adressen der Haltepunkte stehen, gegen RST-Befehle ausgetauscht. In der RST-Behandlungsroutine können Register und Speicherinhalte angesehen werden, nachdem der ursprüngliche Befehle ausgeführt wurde. Danach wird die Ausführung des Programms normal fortgesetzt, bis wieder ein RST-Befehl auftritt.
2 ful FILL - Füllen eines Speicherbereiches
Dient zum Füllen eines Speicherbereiches mit einem konstanten Wert. Falls beim Füllen einer der Werte nicht geschrieben werden konnte - z.B. weil dort kein RAM vorhanden ist - wird die Adresse der Fehlerstelle ausgegeben.
Zunächst wird die Eingabe der Startadresse des zu füllenden Bereichs VON, dann die Endadresse des zu füllenden Bereichs BIS und als Letztes der Datenwert DTA eingegeben. Nach jedem Schreiben eines Füllbytes testet die Funktion, ob der eben geschribene Wert wieder eingelesen werden kann. Falls dies nicht der Fall ist wird ERR mit der Adresse der fehlerhaften Stelle angegeben. Dies zeigt an, dass versucht wurde in einen Speicherbereich zu schreiben der nicht oder von ROM-Speicher belegt ist oder dass die zu beschreibende Speicherstelle defekt ist.
3 vgl COMPARE - Vergleichen von Speicherbereichen
Vergleicht zwei Speicherbereiche miteinander. Wenn der Inhalt nicht übereinstimmt, wird die Adresse der ersten nicht übereinstimmenden Stelle ausgegeben.
Zunächst wird die Eingabe der Startadresse des zu prüfenden Bereichs VON, dann die Endadresse des zu prüfenden Bereichs BIS und als Letztes die Adresse des Zielbereiches NAC eingegeben. Die Endadresse des Zielbereiches wird automatisch berechnet. Tritt ein Unterschied in den Speicherbereichen auf, wird die Meldung PRF mit der Adresse der unterschiedlichen Stelle ausgegeben.
4 reg REGISTER - Ändern von Registerinhalten
Dient zum interaktiven Ändern der Inhalte der Z80 Prozessorregister. Der Befehl kann auch im Einzelschrittmodus verwendet werden.
Die Inhalte aller Prozessorregister werden aus einem speziellen RAM-Bereich geladen, wenn ein Programm gestartet wird oder ein Einzelschritt ausgeführt wird. Bei Erreichen eines RST6-Befehls oder nach Ausführung eines Einzelschritts werden die Registerinhalte wieder im RAM gerettet. Nach Betätigen der REG-Taste wird der Inhalt der Register AF, durch CR, + oder - wird in der Reihenfolge zwischen AF BC DE HL SP IX IY AF' BC' DE' HL' und RI gewechselt. Falls vor der Eingabe von CR eine Zahl eingegeben wird, so wird dier Zahlenwert im RAM gespeichert und beim nächsten Einzelschritt oder Start des Programms in das betreffende Register geladen.
5 prf VERIFY - Prüfen einer Aufzeichnung auf Cassette
Daten werden vom Cassettenrekorder gelesen und mit dem Inhalt des Speicherbereiches verglichen, von dem zuvor aufgezeichnet wurde.
Im Fehlerfall wird entweder die Meldung PRF gefolgt von der Adresse der fehlerhaften Stelle oder die Meldung CHE ausgegeben, wenn die Prüfsumme nicht mit der aufgezeichneten Prüfsumme übereinstimmt. Wenn kein beim Prüflesen aufgetreten ist, wird mit der Meldung ST die Startadresse des aufgezeichneten Programms ausgegeben.
6 spe SAVE - Speichern auf Cassette
Die Daten eines anzugebenden Speicherbereiches werden auf Cassette gespeichert.
Nacheinander wird die Startadresse VON und die Endadresse BIS des zu sichernden Bereichs abgefragt. Vor Bestätigen der Endadresse mit CR muss der Rekorder gestartet werden, do sofort mit der Aufzeichnung begonnen wird. Nach Ende der Speicherung wird BEF angezeigt. Zu Beginn wird ein Vospann aufgezeichnet, der beim Lesen zur Synchronisation verwendet wird. Danach werden die Startadresse und Endadresse gefolgt von den Daten des angegebenen Speicherbereiches aufgezeichnet. Den Abschluss bildet eine 16 Bit umfassende Prüfsumme über alle aufgezeichneten Daten.
7 lad LOAD - Laden von Cassette
Dient zum Laden eines Speicherbereiches von Cassette. Während des Ladens wird die Prüfsumme aller gelesenen Daten gebildet und abschließend mit der zuvor aufgezeichneten Prüfsumme verglichen. So werden Aufzeichnungs- oder Lesefehler erkannt.
Falls beim Lesen der Daten ein Fehler auftritt, wird die Meldung PRF und die Adresse der als fehlerhaft erkannten Stelle ausgegeben. Dies sit zum Beispiel der Fall, wenn Daten in einen Nicht-RAM-Bereich zurückgelesen wird. Falls nach dem Einlesen die Prüfsumme nicht mit der aufgezeichneten übereinstimmt, wird die Meldung CHE ausgegeben.
8 ios IOSET - Setzen eines I/O Ports
Dient zum interaktiven Setzen von Ausgabeports. Damit lassen sich eigene Schaltungen oder nicht direkt unterstützte Hardware des Computers steuern.
Zunächst muss die Portadresse angegeben und mit CR bestätigt werden, danach kann die Eingabe des Wertes zur Ausgabe eingegeben werden. CR übernimmt den Wert an den Ausgabeport. Eine neue Datenausgabe an den gleichen Port kann direkt durch die Eingabe eines neuen Wertes und CR erfolgen. Mit BEF gelangt man zurück zur Befehlseingabe.
9 iol IOREAD - Lesen eines I/O Ports
Dient zum interaktiven Lesen von Daten eines Eingabeports. Mit der OPT Taste kann dabi zwischen Binärdarstellung oder Hexadezimaldarstellung gewechselt werden.
Nach der Eingabe einer Portadresse und CR wird ein Byte vom angegebenen Port gelesen und auf dem Display dargestellt. Durch die START- Taste ist ein dauerhaftes Einlesen der Werte vom Eingabeport im Abstand von 1 ms möglich. Durch BEF gelangt man zurück in den Befehlsmodus. Mit der Taste OPT wird zwischen hexadezimaler und binärer Anzeige des Wertes gewechselt.
A prp PROMPROG - EPROM programmieren
Dient zum Brennen eines EPROMS mit der Baugruppe PROMER.
Zunächst ist die Eingabe der Startadresse VON und der Endadresse BIS des zu brennenden Speicherbereiches notwendig. Die Zieladresse NAC bestimmt die Startadresse im EPROM. Danach erscheint auf dem Display die Anzeige CR. In diesem Zusatnd ist die PROMER Baugruppe startbereit und das zu programmierende EPROM kann eingesetzt werden. Der Brennvorgang beginnt mit einem Druck auf die Taste CR. Während des Programmiervorgangs werden die aktuelle Adresse und die programmierten Daten auf dem Display angezeigt. Nach jedem Byte wird getestet, ob der Programmiervorgang erfolgreich war. Bei erfolgreicher Programmierung wird BURNED auf dem Display angezeigt.
B prl PROMREAD - EPROM einlesen
Dient zum Übertragen der Daten eines EPROM aus der Baugruppe PROMER in einen beliebigen Speicherbereich.
Zuerst wird die Startadresse VON und die Endadresse BIS der zu übertragenden Daten im EPROM eingegeben. Danach erfolgt die Eingabe der Zieladresse NAC im RAM. Nach jedem gelesenen Byte wird getestet, ob dieses korrekt ins RAM übertragen werden konnte. Bei einem Fehler wird die Meldung PRF mit der Adresse der Fehlerstelle ausgegeben.
C prm PROMMER - Abgleich der Baugruppe PROMER
Auf der Anzeige erscheint ein Zahlenwert, der der Dauer des Programmierimpulse in Millisekunden entspricht. Das Monoflop der PROMER Baugruppe kann hiermit auf die geforderten 50 ms abgeglichen werden. Für korrekten Abgleich reicht das einfache Einstecken der Baugruppe ohne zu programmierendes EPROM aus.
D per PERIOD - Periodendauer messen
Dient zum Abgleich der Baugruppe CAS. Misst die Periodendauer des an Bit 7 einer IOE-Baugruppe anliegenden Signals. Zum Abgleich der Baugruppe CAS muss eine Verbindung zwischen dem Aufzeichnungssignal der CAS und Bit 7 der IOE erstellt werden. Der Abgleich erfolgt auf 833 µs.
E pul PULSE - Pulsdauer messen
Dient zum Abgleich der Baugruppe CAS. Misst die 0-Signal-Dauer des an Bit 7 einer IOE-Baugruppe anliegenden Signals. Zum Abgleich der Baugruppe CAS muss eine Verbindung zwischen dem Aufzeichnungssignal der CAS und Bit 7 der IOE erstellt werden. Der Abgleich erfolgt auf 624 µs.
F umw CONVERT - Hexadezimal / Dezimal Wandlung
Dient zum Umrechnen von Zahlen aus dem Deziamlsystem in das Hexadezimalsystem und umgekehrt.
Hexadezimale Zahlen werden als Zweierkomplement-Zahlen betrachtet, Dezimalzahlen können mit einem Vorzeichen (-) eingegeben werden. Nach Start der Funktion ist die Eingabe von Hexadezimalen Zahlen möglich, die durch CR in eine Dezimalzahl umgerechnet werden. Durch die Taste OPT kann auf Eingabe von Dezimalen Zahlen umgeschaltet werden. Diese werden durch CR in Hexadezimale Zahlen umgerechnet. Nach der Umrechnung wird das Zahlensystem D (dezimal) oder S (sedezimal) vor dem Ergebnis angezeigt. Mit der Taste BEF gelangt man zurück zur Befehlseingabe.
bef COMMAND - Befehlseingabe
Mit dieser Taste kann man wieder zur Befehlseingabe zurückgelangen. Zum Beispiel kann man hiermit das Dauerlesen von Eingabeports beenden.
cr CARRIAGE RETURN - Eingabebestätigung
Dient zum Beenden einer Zahleneingabe oder zum Abschließen des aktuellen Befehls.
opt OPTION - Kein eigener Befehl
Dient zum Umschalten von Zahlenbereichen oder Darstellungsarten, wenn dies von einem zuvor ausgeführten Befehl unterstützt wird.
speich EDIT - Speicherinhalt ansehen und bearbeiten
Dient zum Ansehen und modifizieren des aktuellen Speicherinhaltes ab einer beliebigen Adresse. Als Option kann CR, + und - verwendet werden.
start START - Starten eines Programms ab Adresse
Dient zum Starten des an der angegebenen Adresse abgelegten Programms. Falls Breakpunkte definiert sind, werden diese beachtet und die Ausführung unterbricht an den betreffenden Adressen mit der Meldung BRE xxxx, wobei xxxx die Adresse der Unterbrechnungsstelle angibt.
step STEP - Einzelschritt
Dient zum Ausführen einer einzelnen Z80 Anweisung. Nach jedem Schritt lassen sich die Inhalte der Prozessorregister oder Speicherinhalte ansehen.
- MINUS - Kein eigener Befehl
Dient zum Aufrufen der vorhergehenden Eingabe innerhalb von Befehlen, die dies unterstützen.
+ PLUS - Kein eigener Befehl
Dient zum Aufrufen der nächsten Eingabe innerhalb von Befehlen, die dies unterstützen.


Unterprogramme für den Anwender

Befehl Adresse Beschreibung / Beispiel
RI 0003 Das Unterprogramm wartet auf die Eingabe eines Zeichens von der Baugruppe CAS. Wenn das Zeichen gelesen wurde, wird es im Register A des Z80 gespeichert.
CD 03 00   ANF: CALL RI        ; Warten bis 00
FE 00           CP 0      
20 F9           JR NZ,ANF      ; dauerhaft
POO 0006 Überträgt ein Zeichen aus dem Register C des Z80 an die Baugruppe CAS. Zur Aufzeichnung muss das Band vorher manuell gestartet werden.
0E 41      SVE: LD C,41H       ; Wert ausgeben
CD 06 00        CALL POO
ANZEIGE 0009 Gibt die Segmentcodes aus dem RAM-Bereich 8000 bis 8007 für 1 ms auf dem Display aus. Für eine fortlaufende Anzeige muss die Routine mehrfach aufgerufen werden. Im Register A wird der Tastencode einer eventuell gedrückten Taste zurückgegeben, sonst FF.
CD 09 00   LP:  CALL ANZEIGE   ; Ausgabe
18 FB           JR LP          ; Endlos
HOLETASTE 000C Das Unterprogramm wartet solange, bis eine Taste gedrückt wird. Gleichzeitig werden die Segmentcodes des Anzeigefeldes zyklisch ausgegeben. Der Tastencode erscheint im Register A.
CD 0C 00   LP:  CALL HOLETASTE ; warten
FE 47           CP 47H         ; bis BEF
20 F9           JR NZ,LP       ; gedrückt
TONUM 000F Das Unterprogramm übernimmt einen Tastencode im Register A. Wenn der Tastencode von einer der Tasten 0-F stammt, enthält der Accu nachher den Wert 0-F, bei den Befehlstasten bleibt der Tastencode erhalten und das Carry-Flag wird gesetzt.
CD 0C 00   LP:  CALL HOLETASTE ; Tastencode
CD 0F 00        CALL TONUM     ; umrechnen
TOSEG 0012 Das Unterprogramm berechnet aus einem Datenwort 0-F den entsprechenden 7 Segment Code, der direkt in das Anzeigenfeld geladen werden kann.
3E 0F           LD A,0FH       ; Code 0F
CD 12 00        CALL TOSEG     ; umrechnen
32 00 80        LD (ANZFELD),A ; Adresse
CD 09 00    LP: CALL ANZEIGE   ; Ausgabe
18 FB           JR LP          ; dauerhaft
PRINT 0015 Im Registerpaar HL wird eine Adresse angegeben. Die suf diese Adresse folgenden 8 Bytes werden in das Anzeigenfeld übertragen. Das Unterprogramm wird benötigt, um Texte in das Anzeigenfeld zu bringen.
21 0B 81        LD HL,TABELLE  ; Tabelle
CD 15 00        CALL PRINT     ; ausgeben
CD 09 00    LP: CALL ANZEIGE   ; anzeigen
18 FB           JZ LP          ; endlos
87 86 92 87                    ; TEST
FF FF FF FF                    ; Leerfeld
PRTAC 0018 Das Registerpaar IX enthält die Adresse im Anzeigenfeld, ab der der hexadezimale Zahlenwert des Akkuinhaltes abgelegt werden soll. Die Ausgabe belegt immer zwei Ziffern. Nach dem Aufruf zeigt das Registerpaar hinter das letzte ausgegebene Zeichen. Der Rest der Anzeige bleibt undefiniert.
CD 33 80        CALL CLEAR     ; Löschen
3E 5A           LD A,5AH       ; Wert
DD 21 00 80     LD IX,8000H    ; laden
CD 18 00        CALL PRTAC     ; Ausgabe
CD 09 00    LP: CALL ANZEIGE
18 FB           JR LP
PRTHL 001B Das Registerpaar IX zeigt auf die letzte Adresse im Anzeigenfeld, ab der der hexadezimale Zahlenwert des Registerpaares HL abgelegt werden soll. Die Ausgabe belegt genau vier Stellen.
CD 33 80        CALL CLEAR     ; Löschen
21 5A 12        LD HL,125AH    ; Wert
DD 21 00 80     LD IX,8000H    ; laden
CD 1B 00        CALL PRTHL     ; Ausgabe
CD 09 00    LP: CALL ANZEIGE
18 FB           JR LP
PRTBIN 001E Das Registerpaar IX enthält die Adresse im Anzeigenfeld, ab der der binäre Zahlenwert des Akkuinhaltes abgelegt werden soll. Die Ausgabe belegt immer acht Ziffern.
CD 33 80        CALL CLEAR     ; Löschen
3E 5A           LD A,5AH       ; Wert
DD 21 00 80     LD IX,8000H    ; laden
CD 1E 00        CALL PRTBIN    ; Ausgabe
CD 09 00    LP: CALL ANZEIGE   ; 
18 FB           JR LP
PRTDEZ 0021 Das Registerpaar IX zeigt auf die letzte Adresse im Anzeigenfeld, ab der der dezimale Zahlenwert des Registerpaares HL nach links abgelegt werden soll. Die Ausgabe belegt maximal sechs Stellen. (-32768).
CD 33 80        CALL CLEAR     ; Löschen
21 D2 04        LD HL,04D2H    ; Wert
DD 21 07 80     LD IX,8007H    ; laden
CD 21 00        CALL PRTDEZ    ; Ausgabe
CD 09 00    LP: CALL ANZEIGE
18 FB           JR LP
GETC 0024 Es wird eine hexadezimalzahl von 2 Ziffern eingelesen. IX enthält die Adresse des Anzeigenfeldes, C enthält den Vorgabewert, der schon vor der Eingabe auf der Anzeige ausgegeben wird. Nach der Eingabe steht in C der neue Wert, in A der Wert der gedrückten nichtnumerischen Taste, die zum Beenden der Funktion führte.
CD 33 80        CALL CLEAR     ; Löschen
0E 12           LD C,12H       ; Vorgabe
DD 21 00 80     LD IX,8000H    ; Anzeige
CD 24 00        CALL GETC      ; Eingabe
GETHL 0027 Es wird eine hexadezimalzahl von 4 Ziffern eingelesen. IX enthält die Adresse des Anzeigenfeldes, HL enthält den Vorgabewert, der schon vor der Eingabe auf der Anzeige ausgegeben wird. Nach der Eingabe steht in HL der neue Wert, in A der Wert der gedrückten nichtnumerischen Taste, die zum Beenden der Funktion führte.
CD 33 80        CALL CLEAR     ; Löschen
21 00 00        LD HL,0        ; Vorgabe
DD 21 00 80     LD IX,8000H    ; Anzeige
CD 27 00        CALL GETHL     ; Eingabe
GETDEZ 002A Es wird eine dezimalzahl von 5 Ziffern eingelesen. IX enthält die Adresse des Anzeigenfeldes, HL enthält den Vorgabewert, der schon vor der Eingabe auf der Anzeige ausgegeben wird. Nach der Eingabe steht in HL der neue Wert, in A der Wert der gedrückten nichtnumerischen Taste, die zum Beenden der Funktion führte. Zum Eingeben einer negativen Zahl kann diese mit der Taste - abgeschlossen werden.
CD 33 80        CALL CLEAR     ; Löschen
21 00 00        LD HL,0        ; Vorgabe
DD 21 00 80     LD IX,8000H    ; Anzeige
CD 2A 00        CALL GETDEZ    ; Eingabe
STEP 002D Dient zum Ausführen eines Z80 Befehls. HL zeigt auf den auszuführenden Befehl. Vor der Ausführung wird der Inhalt aller Register aus den Speicherstellen 801Dh folgende wiederhergestellt, nach der Ausführung gesichert. HL zeigt nachher auf den nächsten Befehl.
21 0B 0E        LD HL,0E0BH    ; Adresse
31 00 83        LD SP,8300H    ; Stack
CD 2D 00    LP: CALL STEP      ; Ausführen
18 FB           JR LP          ; dauerhaft
BREAK 0030 Ein Sprung auf diese Adresse führt zurück zum HEXMON. Es werden alle Register gerettet und die Breakpoints entfernt. Auf der Anzeige erscheint BRE und die Unterbrechungsadresse.
F7              RST 6          ; Aufruf BREAK
CLEAR 0033 Belegt den internen Speicher für das Anzeigefeld mit FF so dass beim nächsten Aufruf von Anzeige das Display komplett gelöscht wird.
CD 33 00        CALL CLEAR     ; Feld löschen
CD 09 00    LP: CALL ANZEIGE   ; ausgeben
18 FB           JR LP          ; endlos
INTLOC 0038 Adresse, die bei einem Interrupt im Modus IM1 angesprungen wird. Dort steht ein Sprung ins RAM, wo eigene Routinen eingebunden werden können.
LENGTH 003B HL enthält die Adresse eines Z80-Befehls, nach dem Aufruf enthält das B-Register die Länge des bei HL hinterlegten Befehls.
21 00 00        LD HL,0        ; Adresse laden
CD 3B 00        CALL LENGTH    ; Länge holen
F7              RST6           ; Ende
LASTMEM 003E Nach dem Aufruf enthält HL die letzte Adresse des ersten zusammenhängenden Speicherbereiches, an der RAM angesprochen werden kann.
CD 33 00        CALL LASMEM    ; Berechnen
F7              RST6           ; Ende
SUCHL 0041 Wie LASTMEM, außer dass zuvor in HL die Startadresse der Suche nach einem RAM-Bereich angegeben werden kann.
21 00 84        LD HL,8400H    ; Startadresse
CD 33 00        CALL LASMEM    ; Suchen
F7              RST6           ; Ende
GETRI 0044 Wie RI, es erfolgt zusätzlich eine binäre Ausgabe der eingelesenen Daten in den Punkten der 7-Segment-Anzeige.
CD 41 00    LP: CALL GETRI     ; Suchen
18 FB           JR LP          ; endlos
NMILOC 0066 Adresse, die bei einem Nicht Maskierbaren Interrupt NMI angesprungen wird. Dort steht ein Sprung ins RAM, wo eigene Routinen eingebunden werden können.