Dies ist eine alte Version des Dokuments!
Zusatzmonitor ZM
Der Zusatzmonitor ZM stellt eine Erweiterung für das OS des Z9001 dar und bringt maschinennahe Funktionen wie Speichern von Programmen auf Kassette (ja, da gibt es nicht im OS!), Speichereditor (Move, Fill, Search, Edit), Portabfrage, Programmstart mit Breakpoints, Registeranzeige, Hex-Rechnen sowie zusätzliche Gerätetreiber für SIF1000, Drucker über den V24-Port sowie Ausgabe im Intex-HEX-Format oder ASCII auf allen unterstützten Geräten (auch TAPE!).
Version 2.0
Entwickelt wurde der Zusatzmonitor von Dr. Frank Schwarzenberg, dem Entwickler des CP/A für den Z9001 und vieler anderer Systemsoftware. Die Version 2.0 entstand 1985 und erschien in verschiedenen Varianten (die Ziffern im Programmnamen hinter ZM stehen dabei nicht für die Version, sondern für die Anfangsadresse des genutzten Speicherbereichs):
- ZM30 der Kassette R0112 (Gerätegrundkassette),
neue Variante des ZM 2.0 - IDAS-Modul robotron mit ZM im ROM (IDAS ohne Meldung, ZM mit Meldung „Z9001 MONITOR V2.0 (ROM) 1985“ und mit EPROM-Software für das Programmiermodul
(das ist die neue Variante des ZM 2.0) - IDAS-Modul Variante U. Zander sowie KCEMU (IDAS mit Meldung „INTERPRETING DIALOG-ASSEMBLER“, ZM mit Meldung „Z9001 MONITOR CENT. 1986“ und mit RENEW und QUICK, NORMAL, QLOAD
(das ist die alte Variante des ZM 2.0)
Bei den ersten Varianten des ZM und Version 1.2 des OS-KC85/1 kann es bei den Treibern SIFA und TD40 unter Umständen Probleme mit der CTRL/P-Funktion (Hardcopy) geben. Deshalb sei an dieser Stelle auf die erforderlichen Korrekturen für eine saubere Arbeitsweise der ZM-Treiber hingewiesen (aus treiber). In meinem Quellcode ist das entsprechend kommentiert.
Treiber | relative Adresse | Befehl alt | HEX | → | Befehl neu | HEX |
---|---|---|---|---|---|---|
SIFA | 0062H | ld a,e | 7B | ld a,c | 79H | |
TD40 | 00C3H | res 7,e | CB BB | res 7,c | CB B9 | |
00E0H | sub e | 93 | sub c | 91 | ||
00E8H | cp e | BB | cp c | B9 | ||
00FCH | ld a,e | 7B | ld a,c | 79 | ||
0102H | ld c,154 | 0E 9A | ld e,154 | 1E 9A | ||
0117H | ld b,c | 41 | ld b,e | 43 |
Die Version 3.0 wurde gegenüber der Version 2.0 stark erweitert. Die wesentlichste Erweiterung stellt das I-Kommando dar, über das eine gewisse Kompatibilität des Betriebssystems des Z 9001 zum Betriebssystem CP/M hergestellt wird. (s.u.)
Bedienung
Speicherbereiche
ZM30 : 3000-3FFF, 3000
ZM70 : 7000-7FFF, 7000
ZMA8 : A800-B7FF, A800
Hinweise zur Nutzung
- Komandos mit ENTER oder SPACE abschließen.
- Der Unterstrich _ steht in der Syntax für Leerzeichen. Es sind SPACE und Komma zulässig.
- Wird bei der Parametereingabe ein Fehler bemerkt, so kann durch weiterschreiben korrigiert werden, da nur die letzten 4 Zeichen gewertet werden.
- Fortlaufende Bildschirmausgaben können durch SPACE gestoppt werden. Erneute Betätigung setzt Ausgabe fort. STOP führt zum Abbruch des Kommandos. (Ausnahme Kommando S: Dort wird mit SPACE zur nächsten Zelle geschaltet und mit ENTER beendet).
Kommandos
A (Assign) | Gerätezuweisung (s. Treiber) | A<logisches Gerät>=<physisches Gerät> |
B (Bye) | Rückgabe an das OS | B |
C (Convert) | Umrechnung Dezimalzahl in Hexadezimalzahl und umgekehrt | CD(dez.z.) Dez. = > Hex. CH(hex.z.) Hex. = > Dez. |
D (Display) | Ausgabe von Speicherbereichen auf Konsole (Hexdump) | Danfadr_[endadr] |
E (Endeblock) | Ausgabe eines Endeblockes auf das Punch-Gerät (nicht sinnvoll bei AP=T) | E[adr] |
F (Fill) | Beschreiben eines Speicherbereiches mit konst. Wert | Fanfadr_endadr_wert |
G (Go) | Start eines Anwenderprogramms mit max. zwei Haltepunkten. | Ganfadr[_break1][_break2] |
H (Hex) | Bildung der Summe und Differenz zweier Hexzahlen | Hzahl1_zahl2 |
J | Nichtzerstörender Speichertest | Janfadr_endadr |
M (Move) | Transport eines Speicherbereiches auf einen anderen Speicherbereich | Manfadr_endadr_zieladr |
N (Null) | Ausgabe von binären Nullen auf den Punch-Kanal. (Lochbandvorschub, sinnlos bei AP=T) | N |
P (Punch) | Ausgabe im INTEL-Hex-Format auf den Punch-Kanal | Panfadr_endadr (_stadr bei AP=T) |
Q (Query) | Lesen und Schreiben auf I/O-Ports | QIport Lesen vom Port QOport_byte Schreiben zum Port |
R (Read) | Einlesen eines INTEL-Hex-Files über den Reader-Kanal | R[base] |
S (Substitute) | Modifizieren von Speicherzellen. Mit der Leertaste kann zur Adresse weitergeschaltet werden. Mit <ENTER> wird das Kommando beendet. | Sanfadr |
T (Type) | Ausgabe in ASCII-Darstellung | Tanfadr_[endadr] |
V (Verify) | Vergleich eines Speicherbereiches mit einem anderen | Vanfadr_endadr_zieladr |
W (Write) | Schreiben von ASCII-Zeichen in den Speicher. Mit <– kann zurückgeschritten werden. Mit <STOP> wird die Eingabe beendet. Die Adresse des zuletzt eingegebenen Zeichens +1 wird vom Monitor ausgegeben. | Wanfadr |
X | Ausgabe des Z80-Registersatzes | X 1.Registersatz X' 2.Registersatz X[']<reg> Ausgabe und Änderungsmöglichkeit für Register <reg> |
Y | Suchen einer Zeichenfolge von max. 255 byte | Ybyte_byte u.s.w. |
Z | Ausgabe der höchsten RAM-Adresse (RAM-TOP) |
Für die Kommandos I, K, L, O und U stehen ab 220H fünf Sprungvektoren, über die durch
Modifikation der Adressen zusätzliche Kommandoroutinen angebunden werden können.
Treiber
Im Zusatzmonitor sind verschiedene Gerätetreiber enthalten. s. auch Artikel über treiber. Den logischen Geräten Console, Reader, Punch, List können verschiedene physische Treiber zugeordnet werden. Im ZM sind physische Treiber für Tastatur mit Beep, SIF-1000 Lochbandleser und -stanzer, V24-Drucker und Kassettenzugriff enthalten.
Das Kommando A<logisches Gerät>=<physisches Gerät> dient der Zuweisung eines vorhandenen Gerätes zu einem logischen Gerät. Folgende Zuordnungen sind angebbar:
CONSOLE | READER | PUNCH | LIST |
---|---|---|---|
AC=C für Konsole (mit Tastatur-Beep) | AR=C für Konsole | AP=C für Konsole | AL=C für Konsole |
AC=V für Konsole (ohne Tastatur-Beep) | AR=P für LB-Leser (SIF-1000) | AP=P für LB-Stanzer (SIF-1000) | AL=V für Konsole |
AC=B für BATCH | AR=T für Kassette (Tape) | AP=T für Kassette | AL=L für V24-Drucker (TD40) |
AC=U für User-Konsole | AR=U für User-Read-Gerät | AP=U für V24-Ausgabegerät (TD40) | AL=U für SIF-1000-Ausgabegerät |
Nach Anlauf des Monitors gilt die Zuordnung AV=V, AR=C, AP=C und AL=C (alles auf Konsole).
Soll z.B. ein über den freien PIO-Port angeschlossener V24-Drucker verwendet werden, so muss vorher AL=L gegeben werden. AC=C bewirkt, dass jeder Tastendruck mit einem Ton quittiert wird.
Für den BATCH-Modus muss ein SIF-1000-Lesegerät an den PIO-Port angeschlossen werden. Ferner sind die Zuweisungen AR=P und AL=C (oder V) vorher unbedingt erforderlich! Nach AC=B werden jetzt alle Eingaben nicht mehr von der Tastatur, sondern vom angeschlossenen Lesegerät angefordert. Protokolliert wird infolge der Zuweisung AL=C nach wie vor auf dem Bildschirm. Eine Zuweisung AL=L oder U ist in diesem Fall nicht möglich, da an den PIO-Port zusätzlich zum Lesegerät kein LIST-Gerät anschließbar ist. Sollte der Druckermodul gesteckt sein, so wird bei AC=C auf dem Drucker protokolliert, bei AL=V auf dem Bildschirm.
Quellcode
Im Quellcode-Paket ist mein reassemblierter Quellcode für die verschiedenen ZM 2.0-Varianten zu finden. Der Code enthält einige interessante Assemblerabschnitte (und wird dem interessierten Z9001-Programmierer wärmstens zum Studium empfohlen).
Allgemein verwendbare Monitor-Routinen
Der Monitor stellt über eine Sprungtabelle eine Reihe von Subroutinen von allgemeiner Bedeutung bereit. Leider war diese Sprungtabelle durch Robotron nicht dokumentiert, so dass kein Programm bekannt ist, das diese Schnittstelle nutzt.
Die Sprungtabelle steht direkt an Monitor-Anfang (= base).
rel.Adr. (hex.) (base + ) | Subroutine | Register Ein | Register Aus | Register verändert |
---|---|---|---|---|
0 | Monitor-Neustart | |||
3 | Trap-Eingang (RST 38H) | Prozessorzustand wird für GO-Routine gerettet | ||
6 | Error-Eingang | SP wird initialisiert | ||
9 | I/O-Byte abfragen | - | A | |
C | I/O-Byte setzen | C | - | AF |
F | Test RAM-Größe | - | B | AF |
12 | Eingabekonvertierung | (CI) | HL | AFCDE |
15 | Ausgabekonvertierung | HL | (CO) | AFBCDEHL |
18 | HEX-Eingabe (2 Byte) C=Anzahl der Eingaben | (CI) | (SP) | AFBCHL |
1B | HEX-Ausgabe | A | (CO) | AF |
1E | BIT-Ausgabe | |||
21 | Kassetten-Ein/-Ausgabe Mit dieser Funktion sind Speicherbereiche als Files von/auf Kassette lad-/entladbar. Eintrittsparameter: (69H) : =0 Aus-, sonst Eingabe (58H) : Verschiebung bei Eingabe (6DH) : Anfangsadr. für Ausgabe (6FH) : Endeadr. für Ausgabe (71H) : Startadr. |
Neben dem ZM selbst ist im Code auch das OS-Kommando RENEW enthalten. Mit diesem Kommando kann ein versehentliches NEW im ROM-BASIC wieder rückgängig gemacht werden. BASIC löscht nicht den Programmspeicher, sondern setzt nur interne Variablen. Dies macht RENEW rückgängig. Dazu ist BASIC zu verlassen, auf OS-Ebene RENEW zu tippen und dann mit WBASIC zum BASIC zurückzukehren.
Version 3.01
s.a. mp 02/89, S.57
Der Zusatzmonitor ZM 3.0 ist eine stark erweiterte Form gegenüber der ursprünglichen von Robotron. Die Erweiterungen betreffen folgende Leistungen
- Herstellung einer Quasi-CP/M-Kompatibilität. In diesem Betriebsmode können eine Reihe von CP/M-Programmen ohne Änderung auf dem KC abgearbeitet werden (z. B. Turbo-Pascal, ZSID, MBasic etc.).
- Neue User-Port-Treiberroutinen für V.24-DTR-Protokoll (z. B. 1200 und 9600 Baud) und Centronics. Drucker wie Epson LX86 oder LX1000 (auch K6313) sind ohne Druckermodul betreibbar.
- Verbesserte Kassetten-E/A-Routinen
- Umschaltung 20/24-Zeilen-Bildschirmmode.
Neue Kommandos:
I (Init CP/M) | Dieses Kommando stellt CP/M-Kompatibilität für Anwenderprogramme her. Programme können jetzt ab der Anfangsadresse 100H geladen werden (nicht mehr 300H!). Die Verarbeitung der BDOS-Rufe erfolgt wie unter CP/M üblich. Diskettenrufe werden auf Kassette umverlegt! Zusätzlich wird der Standard-FCB (jetzt ab 5CH) mit filename.typ initialisiert. | I[Filename[.typ}} | |
K (Kassette) | Tapelook | ||
L (Laden) | Laden von Programmen, die auf Festwertspeicher vorliegen und der Konventionen für das symbolische Aufrufen von Anwenderprogrammen des 0S-Z 9001 entsprechen. | L<name> | |
O (Off CP/M) | wieder | im Z 9001-Mode |
---|
Die Sprungtabelle am Monitor-Anfang ist um eine Funktion erweitert:
rel.Adr. (hex.) (base + ) | Subroutine |
---|---|
24 | Call 5 : BDOS-Ruf im CP/M-Regime |
Neben der bekannten durch Robotron vertriebenen Version 2.0 sind verschiedene Varianten der 3. Version bekannt. Im Quellcode-Paket sind alle Versionen (reassembliert) enthalten.
Die Version 3.01 arbeitet auf einem Z9001 mit 2 RAM-Modulen und bietet durch die eingebaute BDOS-Emulation eine CP/M-Kompatibilität.
Die vorliegende Version 3.01 wurde offenbar nachträglich gepatcht und bietet veränderte Kommandos:
- Kommando E → Einzelschritt (Step), nach GO kann so ein Programm schrittweise ausgeführt werden, nach jedem Schritt werden alle Register, alle Flags und der Speicher angezeigt.
- Kommando N → CRC-Berechnung (CRC16, SDLC)
- Es wird ein PIO-Modul mit 2 PIO initialisiert (cmd_cold2) PIO1C (FA, FB), PIO2C (FE, FF) (Vermutlich das PARALLEL-INTERFACE ZfK 9902)
Version 3.02
Die verschiedenen vorhandenen Versionen 3.02 unterscheiden sich im Wesentlich nur in den implementierten Treibern für Drucker, und den unterschiedlichen Start-Möglichkeiten diverser anderer Programme. Der wesentliche Unterschied zur Version 3.01 ist die Benutzung eines 64K-RAM-Moduls 64 KB DRAM ZfK 9906. Im Shadow-RAM 4000H-7FFFH werden Teile des ZM kopiert, außerdem wird die verdeckte Speicherbank des 64-KByte-DRAM-Moduls für die Abbildung direkter (random) Diskettenrufe des CP/M genutzt. Weiterhin ist die Sprungtabelle am ZM-Anfang gegenüber Version 3.01 erweitert und nicht mehr kompatibel. Die Unterstützung von SIF-1000 wurde nicht mehr implementiert. Deshalb sind auch die Batch-Routine, Punch u.a. nur noch rudimentär vorhanden.
- ZM302_BITEX
- Diese Version steckt in einem ROM (C000-CFFF, ab D000 BITEX).
- läuft mit 2 RAM-Modulen (das 64K-Modul wird nicht ausgenutzt)
- Für LIST sind 2 Treiber vorhanden: V24 und CENTRONICS
- OS-Kommandos: ZM, RZM,
- BITEXZM302_CPM
- Diese Version wird von Kassette geladen (1B00-2AFF) und nach 0D800h in den 64K-RAM kopiert.
- Benutzung eines 64K-RAM-Moduls 64 KB DRAM ZfK 9906
- 1 LIST-Treiber
- zusätzlicher Code wg. Shadow-RAM-Umschaltung
- OS-Kommandos: ZMCPM, RZMCPM
- ZM302_BOOT
- Das ist die umfangreichste Version. Sie steckt in einem schaltbaren ROM-Modul 10 KB SCHALTBARER EPROM ZtK 9905.
- Benutzung eines 64K-RAM-Moduls 64 KB DRAM ZfK 9906.
- Für LIST sind 2 Treiber vorhanden: V24 und CENTRONICS
- OS-Kommandos: ZM, RZM, BASIC (da das integrierte BASIC durch 64K RAM und Schalt-ROM verdeckt ist), wbasic, BITEX, EDIT (für weitere schaltbare Module?), CPM (Starten des CP/A-Urladers)