home *** CD-ROM | disk | FTP | other *** search
-
- **********************************************************************
- **********************************************************************
-
-
-
- ZZZZZZZZZZ SSSSSSSS IIII M M
- ZZ SS II MM MM
- ZZ SS II M M M M
- ZZ SS II M M M M
- ZZ --------- SS II M M M M
- ZZ --------- SS II M M M
- ZZ SS II M M
- ZZ SS II M M
- ZZZZZZZZZZZ SSSS IIII MMM MMM
-
-
-
- Der hundert%ige Z80 Emulator
-
- Version 1.2
-
- (C) 1990,1992 by Jürgen Weber
-
-
-
- Jürgen Weber
- Wiesentalstr. 1
- W-7170 Schwäbisch Hall
- Bundesrepublik Deutschland
-
-
- **********************************************************************
- **********************************************************************
-
- WICHTIG:
-
- Der Autor übernimmt keinerlei Garantie für die Richtigkeit der
- Anleitung oder das Funktionieren der Software. Dem Benutzer wird
- geraten, das Programm vollständig zu testen. Das Risiko, diese
- Software anzuwenden, liegt ausschließlich beim Benutzer. Der Autor
- übernimmt keine Verantwortung für Schäden irgendwelcher Art, die aus
- der Benutzung dieses Programmes resultieren.
-
-
-
- Hardware/Softwarevorraussetzungen:
-
- PC/XT/AT, 1 Diskettenlaufwerk (sinnvoll 5 1/4 Zoll), 256K freier
- Speicher, MsDos 2.1 oder kompatible.
-
- Sinnvolles Arbeiten ist jedoch erst ab 8 MHz 80286 möglich. Jeden 10
- MHz nach dem Landmarktest entspricht eine Arbeitsgeschwindigkeit von
- ungefähr 1 MHz des emulierten Z80.
-
-
- Die genannten Firmen- und Produktnamen sind Warenzeichen.
-
-
-
- !WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG!
- *****************************************************************
- !WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG!
-
- Achten Sie genau darauf, daß Sie keine MS-Dos Diskette als CP/M
- Diskette einlegen. Das CP/M Bios würde die MS-Diskette ohne
- Rückfrage überschreiben. Ebenso überschreibt MS-Dos CP/M Disketten.
-
- Also: Sobald Sie der Emulator zum Einlegen einer CP/M Diskette
- auffordert, dürfen Sie nur noch CP/M Disketten verwenden.
- Achten Sie auch darauf, daß die CP/M Diskette das richtige Format hat.
- Legen Sie dazu die CP/M Diskette MIT SCHREIBSCHUTZ ein und lassen Sie
- sich ein Inhaltsverzeichnis ausgeben. Falls nur Punkte ausgegeben
- werden, ist das ein Hinweis für ein falsches Format. Aber auch wenn
- nur "NO FILE" ausgegeben wird, kann das ein Anzeichen für ein nicht
- erkanntes Format sein, außer Sie sind sicher, daß die Diskette
- wirklich leer ist.
-
- !WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG!
- *****************************************************************
- !WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG!
-
-
-
-
-
-
- INSTALLATION:
-
- Kopieren Sie die Files in ein Direktory auf der Festplatte.
-
-
-
- ALLGEMEINES:
-
- ZSIM emuliert einen Z80 CP/M Rechner (CP/M 2.2), jedoch nicht das CP/M
- Betriebssystem selbst. Um CP/M zu starten, muß eine CP/M
- Systemdiskette ins A Laufwerk eingelegt werden, von der dann ZSIM CP/M
- bootet. Das CP/M System oder ein kompatibles Betriebssystem (SUPERDOS
- und Z80DOS werden mitgeliefert) können auch in einem File CPMSYS.CPM
- auf der Festplatte abgelegt werden.
- Sämtliche CP/M Programme, die ich testen konnte, liefen korrekt. Dies
- gilt auch für die Fließkommabibliothek des Public Domain Programmes
- Small-C, die sehr hohe Anforderungen an die Emulation stellt, da sie
- undokumentierte Z80 Codes benutzt.
- Die vollständige Kompatibilität zu einem CP/M Rechner dadurch
- erreicht, daß anders als andere Emulatoren, die das CP/M
- Betriebssystem selbst emulieren, von ZSIM nur der Z80 und das Bios
- emuliert werden. Auf dieser virtuellen Maschine läuft dann ein orginal
- CP/M kompatibles Betriebssystem oder CP/M selbst.
-
-
-
- Der EMULATOR:
-
- Im folgenden werden nur die Besonderheiten der virtuellen CP/M
- Maschine ZSIM beschrieben. Für Informationen zum Betriebssystem CP/M
- selbst und dessen Bedienung sei auf entsprechende Fachliteratur
- verwiesen.
-
-
- ZSIM stellt eine CP/M Maschine mit 64K Ram, einem Diskettenlaufwerk
- und einer Ramdisk zur Verfügung. Es wird nur ein physikalisches
- Laufwerk unterstützt. Das physikalische Laufwerk kann vom Control-
- Break Menü aus (Diskettenparameter) auf das PC Laufwerk 0 oder 1
- gesetzt werden. Dabei ist das gewählte Diskettenlaufwerk auf jeden
- Fall CP/M Laufwerk A. Sämtlicher freier Speicher, der nach Abzug des
- Bedarfs von Dos, von ZSIM und den 64K Arbeitsbereich für den Z80
- übrigbleibt, wird als Ramdisk benutzt (440K Ramdisk in einem 640K PC).
- Diese Ramdisk kann in ein MS-Dos File abgespeichert werden. Beim
- nächsten Start wird sie dann automatisch geladen, jedoch nur, wenn der
- Platz Ramdisk nicht kleiner als zuvor ist. Dies kann vorkommen, wenn
- man z.B. residente Programme lädt. Die Abspeicherung kann man dadurch
- ausnutzen, daß man wichtige Utilities in der Ramdisk hält und sie dann
- bei jedem Neustart sofort zur Verfügung hat.
-
-
- DER START:
-
- Beim Start versucht ZSIM, das CP/M Bdos aus einem MS-Dos File
- CPMSYS.CPM in den Speicher zu laden. Das File muß in dem Direktory
- sein, aus dem ZSIM gestartet wurde.
- Im Paket ZSIM sind zwei CP/M kompatible Public Domain Betriebssysteme
- enthalten in den Dateien SUPERDOS.SYS und Z80DOS.SYS. Beide
- Betriebssysteme enthalten den ZCPR1 Kommandozeilen Prozessor. Z80DOS
- ist eine Weiterentwicklung von SUPERDOS, die Datum und Uhrzeit
- unterstützt (das Bios von ZSIM ist hierfür eingerichtet). Allerdings
- kann es bei Benutzung von Z80DOS zu Schreibfehlern auf Disketten
- kommen, die vom originalen CP/M Betriebssystem beschrieben wurden, da
- Z80DOS eine etwas andere Fileverwaltung hat.
- Wenn Sie eines der beiden PD Betriebssysteme anstelle des orginalen
- CP/M Betriebssystems benutzen wollen, kopieren Sie einfach
- SUPERDOS.SYS bzw. Z80DOS.SYS auf CPMSYS.CPM. Also z.B.
- COPY SUPERDOS.SYS CPMSYS.CPM
- Wenn Sie mit dem Utility CPMFRM eine Diskette formatieren, können Sie
- dann CP/M Programme, z.B. Small-C, auch ohne das orginal CP/M
- Betriebssystem starten. Erzeugen Sie dazu wie beschrieben CPMSYS.CPM
- aus SUPERDOS.SYS und legen Sie dazu die mit CPMFRM formatierte
- Diskette ins Laufwerk A: ein und starten Sie ZSIM.
-
-
- Falls CPMSYS.CPM nicht existiert, wird versucht, das System von den
- Systemspuren zu laden. Dabei werden alle Sektoren im reservierten
- Bereich (<OFF) nach der Copyright Meldung von Digital Research
- untersucht. Falls sie gefunden wird, werden die folgenden Sektoren
- dann als System geladen und DRs Copyright Meldung ausgeben.
-
- Auch wenn Sie das orginal CP/M benutzen wollen, ist eine
- Systemdiskette nur zum Aufruf von ZSIM nötig, danach wird das System
- im Speicher behalten. Wenn CP/M erfolgreich gebootet wurde, kann mit
- MOVCPM ein File erzeugt werden, das das System enthält. Vergessen Sie
- dabei die Lehrstelle zwischen den beiden Sternen nicht. Dieses File
- wird dann nach MsDos übertragen (siehe Funktion 6). Dort muß dann das
- entstandene PUNCH.CPM in CPMSYS.CPM umbenannt werden.
- Beispiel:
-
-
- jgw 59K TPA cp/m 80 bios ver 1.0 -- 05/09/90 (C) 1990 by Jürgen Weber
-
- BDOS: COPYRIGHT (C) 1979, DIGITAL RESEARCH
-
- A>b:
- B>movcpm * *
-
- CONSTRUCTING 64k CP/M vers 2.2
- READY FOR "SYSGEN" OR
- "SAVE 34 CPM63.COM"
- B>save 34 cpm.sys
- B>pip
- *up2:=cpm.sys[o]
- *
-
-
- Löschen Sie sicherheitshalber das Punchfile, damit das CP/M System
- gewiß an den Anfang des Punch Files kommt. Übertragen Sie wie oben das
- CP/M System. Starten Sie eine Dos Shell und benennen Sie PUNCH.CPM in
- CPMSYS.CPM um.
- Sie können hinter MOVCPM übrigens auch eine kleinere Zahl angeben und
- ein kleineres CP/M System erzeugen lassen. Sie haben dann hinter der
- CP/M TPA und dem Systembereich noch Z80 Speicher frei. ZSIM lädt das
- kleinere CP/M automatisch an die richtige Stelle.
- Die Public Domain Betriebssysteme SUPERDOS und Z80DOS werden von ZSIM
- immer so geladen, daß das BDOS ab 0ec00h zu liegen kommt.
-
-
- DISKETTENFORMATE:
-
- Folgende CP/M Diskettenformate werden unterstützt:
-
- Schneider CPC System (169K, phys. Sektoren 41h-49h)
- Schneider CPC Data (178K, phys. Sektoren 0c1h-0c9h)
- CP/M 86 SS DD (153K)
- CP/M 86 DS DD (316K)
-
- sowie ein Spezialformat, das dem CPC Data Format entspricht, nur
- daß die physikalischen Sektoren bei 1 beginnnen.
-
- Die ersten beiden Formate sind die Spezialformate des Schneider CPCs.
- Dabei wurde das Highbyte der Sektornummer zur Formatunterscheidung
- benutzt. Die beiden anderen sind Formate, die von CP/M 86 auf dem PC
- benutzt werden. Sie werden auch von CCP/M 86 und DOS Plus benutzt. Die
- CP/M Formate bieten auch den Vorteil, daß sie mit dem normalen Dos
- Format Befehl formatiert werden können (FORMAT /8). Jedoch muß zuvor
- in der Laufwerkstabelle das Sektorfüllbyte auf 0e5h gesetzt werden.
- Wem dies zu umständlich ist, kann das beiliegende Programm CPMFRM.EXE
- benutzen. Es stellt die nötigen Parameter ein und ruft dann FORMAT.COM
- auf. Wenn im CP/M Direktory das bei MsDos standartmäßige 0F6H
- Formatbyte steht, wird dies von CP/M als Eintrag und die Diskette als
- voll interpretiert.
-
- Der ZSIM erkennt bei jedem WarmStart automatisch das Format der
- eingelegten Diskette (sofern es eines der 5 bekannten ist). Es sollte
- also jedesmal, wenn eine Diskette mit neuem Format eingelegt wird,
- Control-C gedrückt werden. Dies empfiehlt sich aber sowieso, da sonst
- bei jedem Schreibzugriff auf eine nicht mit Control C angemeldete
- Diskette das Bdos mit der allseits gehaßten Fehlermeldung "Bdos Error
- on A: RO" abbricht.
- Es ist auch möglich, vom Control Break Menü aus von Hand die
- Diskettenparameter zu editieren und an ein bestimmtes Herstellerformat
- anzupassen. Sie können ZSIM auch mit dem Parameter /f <diskparfile>
- starten, wobei die Datei diskparfile mit dem Control Break Menü
- Kommando Save Parameters erzeugt werden kann.
- Single Density Formate verkraftet aber das IBM Bios nicht
- und 8 Zoll Disketten vertragen das Hineinstopfen in 5 1/4 Zoll
- Laufwerke nicht.
-
- BILDSCHIRMTREIBER
-
- Der Bildschirmtreiber unterstützt die von CP/M Plus vorgesehenen
- Bildschirmsteuerzeichen. Zusätzlich werden auch die Steuercodes des
- Schneider CPC verarbeitet. Eine Beschreibung der Steuerzeichen findet
- sich in Anhang 1.
- Anders als von Digital Research vorgeschlagen, wird Bit 7 des
- eingegebenen Asciicodes nicht gelöscht.
- Falls ein internationales Zeichen (z.B. deutscher Umlaut) eingegeben
- wird, wird er aus der IBM Darstellung in die CP/M Darstellung
- umgesetzt (z.B. ä => { ). Dabei ist zu beachten, daß für die Anzeige
- des deutschen Zeichensatzes er erst mit ESC 2 2 eingeschaltet werden
- muß.
-
-
- DRUCKERAUSGABE:
-
- Die Zeichen werden auf den Drucker lpt0 ausgegeben.
- Es wird solange gewartet, bis der Drucker das Zeichen korrekt
- übernommen hat. Dabei kann es bei ausgeschaltetem Drucker natürlich zu
- einem Aufhänger kommen. Um dies zu verhindern, testet die Funktion, ob
- Control-C gedrückt wurden. Falls ja, wird ein Warmboot ausgeführt.
- Dies ist jedoch nur im Notfall zu empfehlen, da damit natürlich auch
- das aufrufende Programm abgebrochen wird.
-
-
- STANZER:
-
- Digital Research hat die Bios Funktion 6 zur Bedienung eines
- Lochstreifenstanzers vorgesehen.
- Da Lochstreifenleser/Stanzer heute nicht mehr von überragender
- Bedeutung sind, verwendete ich diese Funktion zur Datenübergabe an
- MsDos. Zeichen, die an diese Funktion übergeben werden, werden an das
- MsDos File PUNCH.CPM angehängt. Falls es nicht existiert, wird es
- erzeugt. Die Zeichen werden gebuffert und erst ausgeschrieben, wenn
- der Buffer voll ist. Dieser Buffer wird auch bei Unterbrechung durch
- Control Break ausgeschrieben.
-
- Ansprechen der Funktion 6:
-
- Am einfachsten mit PIP. Das logische Gerät PUN: (Puncher) ist jedoch
- nicht zu empfehlen, da dann PIP zuerst einige Nullbytes sendet.
- Verwendet werden können entweder die physikalischen Geräte PTP: oder
- UP2:, wobei bei PTP: nach der Übertragung von Textdateien ein EOF
- gesendet wird:
-
- PIP UP2:=ANYFILE.EXT[o]
-
- Die Option [o] (Objectfile) sorgt dafür, daß PIP bei Nicht-Textfiles
- nicht beim ersten 1aH (eof) Zeichen abbricht, bei Textdateien ist sie
- nicht nötig. Dabei ist zu beachten, daß die Daten an PUNCH.CPM
- ANGEHÄNGT werden.
-
- Es ist folgender Ablauf zu empfehlen:
- - Übertragen mit PIP wie oben
- - Im Control-Break Menü OS Shell anwählen, und PUNCH.CPM in
- richtigen Namen umbenennen: REN PUNCH.CPM file.txt
- EXIT
-
- Zur Übertragung größerer Datenmengen zwischen MsDos und CP/M empfehle
- ich das Programm 22DISK der Firma Sydex, das ebenfalls als Shareware
- erhältlich ist.
-
-
- BEENDEN DER EMULATION:
-
- Die Z80 Emulation kann durch Drücken von Control-Break beendet werden,
- worauf ein Popupmenü erscheint. Dies geschieht auch, wenn im Z80 Code
- der Befehl HALT auftaucht.
- Dieser Tastendruck setzt jedoch wie bei MsDos auch nur ein Flag, das
- beim nächsten Bios Aufruf erst ausgewertet werden muß. Das heißt aber
- auch, daß wenn der Z80 in einer Endlosschleife hängt, der PC neu
- gebootet werden muß. Ein regelmäßiges Prüfen des Abruchflags in der
- Emulation wäre viel zu zeitaufwendig.
-
-
-
- In seltenen Fällen kann es zu einem fatalen Fehler kommen: Dos lädt
- den ZSIM und damit auch die Diskettenpuffer an eine so unglückliche
- Adresse, daß es zum sogenannten DMA Boundary Crossing kommt. Die
- Emulation wird dann sofort abgebrochen. Als Abhilfe muß der Emulator
- an eine andere Adresse geladen werden. Starten Sie dazu einfach vor
- dem Start von ZSIM durch Eingabe von COMMAND eine Shell und danach
- nocheinmal ZSIM.
-
-
-
-
- CONTROL BREAK MENÜ
-
-
- Nach Drücken von Control Break erscheint folgendes Popup Menü:
-
-
- ┌─────────────────┐
- │Continue │
- │Save Ramdisc/Quit│
- │Quit │
- │Save Ramdisc │
- │Delete Punch File│
- │Init Reader │
- │OS Shell │
- │Disk Parameters │
- │Save Parameters │
- │Load Parameters │
- │Warm Boot │
- │About │
- └─────────────────┘
-
-
-
- Die gewünschte Aktion kann mit den Cursortasten angewählt werden, Esc
- bricht das Menü ab.
-
- Die Punkte im Einzelnen:
-
- Continue fährt mit der CP/M Emulation fort
-
- Save Ramdisc/Quit speichert die Ramdisk auf die Diskette/Festplatte,
- von der aus ZSIM gestartet wurde und beendet ZSIM.
-
-
- Quit beendet ZSIM ohne die Ramdisk zu speichern.
-
- Save Ramdisk speichert die Ramdisk ab und kehrt zu Emulation
- zurück. Dies ist z.B. sinnvoll, um mehrere
- Zustände der Ramdisk auf Platte abzuspeichern.
- Achtung: dazu muß jedesmal eine OS Shell gestartet
- werden und der Name der Ramdisk (RAMDISC.CPM)
- geändert werden, da sie sonst überschrieben wird,
- wenn Sie das nächste mal die Ramdisk speichern.
-
- Delete Punch File löscht das MsDos File, in das die Punch Daten
- geschrieben werden.
-
- Init Reader bewirkt, daß Reader als nächstes Zeichen wieder das
- erste Zeichen von READER.CPM liefert. Dies ist z.B.
- nötig, falls man mehrere Files übertragen will.
- Dazu muß man um das nächste File zu übertragen,
- eine Dos Shell starten, das zu übertragende File
- in READER.CPM umbenennen und mit Init Reader den
- Lesezeiger auf den Anfang des neuen Files setzen.
-
-
- OS Shell stellt eine MsDos Kommandoumgebung zur Verfügung,
- dabei erhält man allerdings nur 64K. Dies reicht
- aber für REN und COPY.
-
- Disk Parameters dient zum Editieren der CP/M Diskettenparameter
- (s.u.).
-
- Save Parameters speichert die Diskettenparameter in einem File ab.
- Geben Sie dazu einen Dateinamen mit Extention ein.
- Die Parameter werden als HexBytes in der selben
- Reihenfolge gespeichert, wie sie in der Editierbox
- erscheinen. Vor den Parametern werden noch die
- Bytes 'JW' als Kennung abgespeichert.
- Das Autologin Flag wird nicht abgespeichert.
-
- Load Parameters lädt die Diskettenparameter aus einem mit Save
- Parameters abgespeicherten Parameterfile. Geben Sie
- zum Laden wieder den Filenamen mit Extention ein.
- Nach dem Laden wird das Autologin Flag gelöscht und
- ein Warm Boot durchgeführt.
-
-
- Warm Boot entspricht der Eingabe von Control-C unter CP/M,
- klappt aber auch aus einem laufenden Programm
- heraus.
-
- About gibt Programmnamen und Autor aus.
-
-
- DISKETTEN PARAMETER
-
- Aus dem Control-Break Menü heraus können die Diskettenparameter in
- einer Editierfläche bearbeitet werden.
- Bei der Eingabe werden nur gültige Hexziffern akzeptiert, andere
- Zeichen ignoriert. ESC bricht die Editierung ab, Änderungen bis zur
- Zeile vor der, in der der Cursor steht, werden übernommen. Mit
- BACKSPACE können Zeichen in der Cursorzeile gelöscht werden. Eine
- Eingabe muß mit ENTER abgeschlossen werden. Wird nur Enter gedrückt,
- wird der alte Wert übernommen (wie im folgenden Beispiel in den
- Zeilen, wo hinter dem Doppelpunkt kein neuer Wert steht).
-
-
- Beispiel:
-
-
-
- jgw 59K TPA cp/m 80 bios ver 1.1 -- 10/12/91 (C) 1990 by Jürgen G. Weber
-
- BDOS: COPYRIGHT (C) 1979, DIGITAL RESEARCH
-
- Unknown disc format. Insert new disc and press any key
- ┌──────────────────┐
- │SPT: 0024 : 28 │
- │BSH: 03 : │
- │BLM: 07 : │
- │EXM: 00 : │
- │DSM: 00A8 : B8 │
- │DRM: 003F : │
- │AL0: C0 : │
- │AL1: 00 : │
- │CKS: 0010 : 40 │
- │OFF :0002 : 3 │
- │ │
- │DRV: 00 : │
- │PTR: 28 : │
- │PST: 09 : 5 │
- │BPS: 02 : 3 │
- │FSC: 01 : │
- │LOG: FF : 0 │
- └──────────────────┘
-
-
-
- Ich hatte hier eine fremde Diskette (Osbourne DD) eingelegt. Nachdem
- ZSIM sich über das unbekannte Diskettenformat beschwert hatte, hatte
- ich Control Break gedrückt. Danach gab ich die richtigen
- Diskparameter für das Osbourne Format ein.
-
- Die Parameter in der oberen Hälfte sind CP/M üblich. Die unteren sind
- eine Erweiterung von mir mit folgende Bedeutung:
-
- DRV: Physikalische Nummer des Laufwerks mit der CP/M Diskette (0 oder
- 1); hat unter CP/M aber immer die Bezeichnung A:
- PTR: Physikalische Trackzahl, bei einem 360K Laufwerk maximal 40,
- sonst (bei 720K, 1.2 MB oder 1.4 MB) bis zu 80 Tracks möglich
- PST: Physikalische Sektoren pro Track, bei 360K Laufwerken maximal 9,
- bei 720K (1.2MB, 1.4MB) maximal 9 (15,18) Sektoren.
- BPS: Physikalische Sektorlänge; BPS=ld(SecLen in Bytes )-7; dieser
- Wert wird vom Diskettenkontroller verlangt
- FSC: Physikalischer erster Sektor jeder Spur, normalerweise 1
- LOG: FF=Autologin, 0=kein Autologin
-
- Wenn Sie die Parameter verändern, setzen Sie LOG auf 0, da das nächste
- Autologin sonst gleich wieder die eingegebenen Parameter verändert.
- Um wieder die üblichen Parameter zu bekommen, genügt es, LOG auf FF zu
- setzen, eine Diskette mit normalem Format einzulegen und Control-C
- einzugeben. Eine einigermaßen sichere Formatanpassung ist mit der
- Einstellung der Diskettenparameter jedoch nur bei einseitigen Formaten
- möglich. Bei einigen zweiseitigen Formaten wird die zweite Seite als
- "Verlängerung" der Spuren der ersten Seite, bei anderen wiederum durch
- Verdopplung der Spurenzahl angesprochen. Das Bios von ZSIM ist jedoch
- nur für die Methode von CP/M 86 Double Sided (Verdopplung der
- Spurenzahl mit Spurübersetzung) eingerichtet.
-
-
-
- EMULATION DES Z80
-
- Die emulierte Maschine verhält sich fast komplett wie eine Z80 CP/M
- Maschine.
- Sämtliche Z80 Befehle, die Flags verändern oder verwenden wurden in
- ihrer Wirkung (vor allem auf die Flags) getestet. Alle definierten
- Flags werden in exakt gleicher Weise wie auf einem original Z80 Chip
- beeinflußt. Ich testete dies, indem ich in einer Schleife das
- Registerpaar HL mit allen Werten von 0 bis FFFFh belegte und sie mit
- PUSH HL - POP AF nach AF kopierte, den zu testenden Befehl ausführte
- und danach das erhaltene AF
- Registerpaar auf eine Checksumme aufaddierte. Ich verbesserte die
- Emulation solange, bis Flag beeinflussende Befehle auf dem Z80 und der
- Emulation die gleiche Checksumme ergaben.
- Die Flags im Z80 Flagregister, die von Zilog als nicht
- definiert ausgewiesen sind und mehr oder weniger zufälliges Verhalten
- haben, sind bei ZSIM auch nicht definiert. Jedoch können hier bei
- Emulation und Z80 unterschiedlich "nicht definierte" Flagzustände
- auftreten.
- ZSIM unterstützt undokumentierte Z80 Befehle, sogenannte illegale
- Opcodes.
- Sämtliche CP/M Programme, die ich getestet habe, verhalten sich wie
- auf dem Schneider CPC, sogar das Fließkommapaket des Small C
- Compilers, das undokumentierte Z80 Befehle verwendet.
-
- Ein wesentlicher Unterschied zu einem Orginal Z80 Chip liegt natürlich
- in der Befehlsausführungszeit. Es gibt keinerlei proportinalen
- Zusammenhang zwischen Taktzyklenzahlen auf Emulation und Z80.
- Zeitkritische Echtzeitanwendungen (z.B.
- Kassettenaufzeichnungsroutinen) können also mit ZSIM nicht realisiert
- werden.
-
- Beim Z80 wird das R (Refresh) Register für die Auffrischung
- dynamischer Rams benutzt und daher laufend incrementiert. Da manche
- Programmierer es auf dem Z80 als Zufallsgenerator benutzen, lädt es
- auch der Emulator mit "zufälligen" Werten, die aus der Systemzeit
- abgeleitet werden.
- Bei Portbefehlen wird die eigentliche Ausgabe nicht ausgeführt und als
- Eingabe wird immer 0FFH geliefert, die Flags werden jedoch gesetzt und
- bei Portbefehlen mit Blockwiederholung werden die Zählregister
- verändert. Dieses Verhalten kann jedoch im Modul PORTIO geändert
- werden.
-
-
- Einige Tests der Geschwindigkeit der Emulation:
-
-
- Zur Messung verwendete ich folgende Tests:
-
- 1) Compilierung des beim Small-C Compilers mitgelieferten Programmes
- TEST.C
- Der Ablauf des ablauffähigen Programms TEST.COM stellt übrigens
- sehr hohe Anforderungen an den Emulator, da seine
- Fließkommaroutinen auf undokumentierte Z80 Befehle zurückgreifen.
- Im Gegensatz zu den anderen mir bekannten Emulatoren ist meiner als
- einziger in der Lage, diese Befehle korrekt zu emulieren und das
- Programm ablaufen zu lassen.
-
- 2) Compilierung des Programms MC.PAS mit TURBO PASCAL 3.0 auf
- Diskette.
-
- 3) Compilierung des mitgelieferten Programms LISTER.PAS mit TURBO
- PASCAL 3.0 im Speicher.
-
- 4) Eine kurze Schleife in Assembler mit dem Debugger eingeben und
- ausführen:
-
- LD B,20
- L1:LD HL,0
- L2:INC HL
- LD A,H
- OR L
- JP NZ,L2
- DJNZ L1
-
- 5) Mit DDT einen Speicherbereich ausdumpen:
-
- D0,8000
-
-
- ERGEBNISSE (auf einem 16 MHz 386 SX), Z80 Tests auf einem
- Amstrad/Schneider CPC, Z80 A, 4 Mhz durchgeführt:
-
- TestNr ZSIM:Z80 CPC/Z80 ZSIM
-
- 1 0,85 3.37.00 3.04.00
-
- 2 0,88 1.20.00 1.10.00
-
- 3 0,99 0.03.65 0.03.63
-
- 4 1,37 0.17.10 0.23.45
-
- 5 0,41 4.06.00 1.40.00
-
-
-
- Der über die Emulationsgeschwindigkeit aussagekräftigste Test ist Test
- Nr. 4, da hier nur die reine Rechenzeit gemessen wird.
- Test Nr 1 stellt hohe Ansprüche an das Diskettenlaufwerk, da
- Compilierung, Assemblieren und Linken auf Diskette geschehen. Hierbei
- wirken sich die großen Diskettenbuffer von ZSIM recht günstig aus.
- Test Nr 2 ist ähnlich wie Test Nr 1.
- Test Nr 3 sollte eigentlich ein ähnliches Ergebnis wie Nr 4 zeigen,
- aber Turbo Pascal gibt laufend die compilierte Zeile aus und hier
- wirkt sich die langsame Bildschirmausgabe des CPC aus.
-
- Test Nr 5 stellt sehr hohe Anforderungen an die
- Bildschirmausgabegeschwindigkeit, wobei der CPC mit seiner
- Bildschirmausgabe im Grafikmodus gegen die Bildschirmausgabe eines
- 80386 keine Chance hat.
-
-
- Anhang 1
- ========
-
- Implementierte Bildschirmsteuerzeichen:
-
- CPC
-
- Ascii Wirkung
- 2 cursor aus
- 3 cursor an
- 7 Bell
- 8 Cursor links
- 9 Cursor rechts
- 10 Cursor tief
- 11 Cursor hoch
- 12 Schirm löschen
- 13 Cursor an Zeilenanfang
- 16 Zeichen unter Cursor löschen
- 17 Zeile bis Cursor löschen
- 18 Zeile ab Cursor löschen
- 19 Schirm bis Cursor löschen
- 20 Schirm ab Cursor löschen
- 24 Helle Schrift an/aus
- 30 Cursor nach links oben
- 31 x y Cursor Spalte x,Zeile y (links oben = 1,1 )
-
- CP/M Plus:
-
- ESC @ Bildschirm initialisieren: CLS,HOME,Helle Schrift aus
- Cursor an, Unterstreichen aus,US Zeichensatz
- ESC 2 x Zeichensatz auswählen:
- x Land
- 0 USA
- 1 Frankreich
- 2 Deutschland
- 3 Großbrittanien
- 4 Dänemark
- 5 Schweden
- 6 Italien
- 7 Spanien
-
- ESC A Cursor hoch
- ESC B Cursor tief
- ESC C Cursor rechts
- ESC D Cursor links
- ESC E Schirm löschen, Cursor bleibt
- ESC H Cursor links oben
- ESC I Cursor hoch, wenn nötig scrollen
- ESC J Schirm ab Cursor löschen
- ESC K Zeile ab Cursor löschen
- ESC L Zeile einfügen
- ESC M Zeile löschen
- ESC N Zeichen unter Cursor löschen
- ESC Y y x Cursor nach Spalte x,Zeile y, links oben = 32,32
- ESC d Zeile bis Cursor löschen
- ESC e Cursor an
- ESC f Cursor aus
- ESC j Cursor Position merken
- ESC k Cursor Position wieder holen
- ESC o Zeile bis Cursor löschen
- ESC p Helle Schrift an
- ESC q Helle Schrift aus
- ESC r Unterstreichen ein (bei Farbschirm: blau)
- ESC s Blinken an
- ESC t Blinken aus
- ESC u Unterstreichen aus
-
-
-
-
-
-
- Anhang 2
- ========
-
- Technische Beschreibung des implementierten CP/M 80 Bios
-
- Jede Biosroutine wird durch einen Pseudo Z80 CALLN Befehl (EDED) mit
- Folgebyte Biosnummer aufgerufen.
-
- Beschreibung der einzelnen Routinen:
-
- 0 Cold boot
-
- Lädt das Bdos aus einem MS-Dos File CPMSYS.CPM in den Speicher und
- installiert Biossprungleiste und Diskettenparameter im Z80 Ram.
- Ferner wird Laufwerk A: gewählt und das IO-Byte und der Punchbuffer
- gelöscht. Danach wird die Routine Warm Boot angesprungen.
- Falls CPMSYS.CPM nicht existiert, versucht Boot, das System von den
- Systemspuren zu laden. Dabei werden alle Sektoren im reservierten
- Bereich (<OFF) nach der Copyright Meldung von Digital Research
- untersucht. Falls sie gefunden wird, werden die folgenden Sektoren
- dann als System geladen.
- Wenn dies erfolgreich geschah, kann mit MOVCPM ein File erzeugt
- werden, das das System enthält. Diese wird dann auf die MsDos
- Startdiskette von ZSIM
- übertragen (siehe Funktion 6). Dort muß dann das entstandene
- PUNCH.CPM in CPMSYS.CPM umbenannt werden.
-
- 1 Warm boot
-
- Kopiert das Bdos, das durch Funktion 0 in den Speicher geladen
- wurde, an seine richtige Stelle im Z80 Speicherbereich; dabei wird
- flexibel auf die durch MOVCPM gewählte Adresse des Bdos reagiert.
- Anschließend wird getestet, welches Format die eingelegte Diskette
- hat und die richtigen Diskettenparameter werden angelegt. Jetzt wird
- der Z80 Emulator gestartet und der CP/M CCP aufgerufen.
-
- 2 Consol Status
-
- Liefert 0ffh in A falls Zeichen auf Tastatur ansteht.
-
-
- 3 Consol Input
-
- Liefert Asciicode von Tastatur in A.
- Anders als von Digital Research vorgeschlagen, wird Bit 7 des
- eingegebenen Asciicodes nicht gelöscht.
- Falls ein internationales Zeichen (z.B. deutscher Umlaut) eingegeben
- wird, wird er aus der IBM Darstellung in die CP/M Darstellung
- umgesetzt (z.B. ä => { ). Dabei ist zu beachten, daß für die Anzeige
- des deutschen Zeichensatzes er erst mit ESC 2 2 eingeschaltet werden
- muß.
- Sondertasten der PC Tastatur: Falls in CONIO.ASM Konstante WS_KEY
- auf TRUE gesetzt ist, werden die Cursortasten, Ins, Del, Home, End,
- PgUp und PgDn in Wordstar Steuerseqenzen (^Q... ) umgesetzt. Dabei
- wird beim nächsten Aufruf von conin ^Q und beim folgenden der
- entsprechende Zweitcode zurückgeliefert.
-
- 4 Consol Output
-
- Gibt Zeichen in C auf den Bildschirm aus. Dabei werden
- Bildschirmsteuerzeichen gemäß Anhang 1 ausgewertet.
-
- 5 List Character
-
- Diese Funktion gibt das Zeichen in C auf den Drucker lpt0 aus. Sie
- wartet dabei solange, bis der Drucker das Zeichen korrekt übernommen
- hat. Dabei kann es bei ausgeschaltetem Drucker natürlich zu einem
- Aufhänger kommen. Um dies zu verhindern, testet die Funktion, ob
- Control-C gedrückt wurden. Falls ja, springt die Routine die Z80
- Adresse 0 an, wo normalerweiser ein Sprung zur Warmboot Routine
- steht.
-
- 6 Punch Character
-
- Digital Research hat diese Funktion zur Bedienung eines
- Lochstreifenstanzers vorgesehen.
- Da Lochstreifenleser/Stanzer heute nicht mehr von überragender
- Bedeutung sind, verwendete ich diese Funktion zur Datenübergabe an
- MsDos. Zeichen, die an diese Funktion übergeben werden, werden an
- das MsDos File PUNCH.CPM angehängt. Falls es nicht existiert, wird
- es erzeugt.
- Die Zeichen werden gebuffert und erst ausgeschrieben, wenn der
- Buffer voll ist. Dieser Buffer wird auch ausgeschrieben, wenn das
- Zeichen CPM_EOF gesendet wird und bei Unterbrechung durch Control
- Break. Dabei wird an jedes File noch ein 1Ah angehängt, was aber
- nichts ausmacht.
-
-
- 7 Read Character
-
- Liest Zeichen aus dem MsDos File READER.CPM. Das klappt jedoch nur
- mit Dateien, in denen kein EOF (26) vorkommt. Die PIP Option [o]
- klappt nicht, da dann auch das tatsächliche Dateiende nicht vorkommt
- und PIP in einer Endlosschleife hängenbleibt.
- Falls READER.CPM nicht existiert oder schon zu Ende gelesen ist,
- wird EOF (26) geliefert.
- Zur Unterscheidung von in einem Binärfile enthaltenen EOF Zeichen
- wird am Ende von READER.CPM zusätzlich noch -1 (0ffffh) in HL
- zurückgegeben (sonst H=0, L=Zeichen). Dies ist nicht von DR
- vorgesehen, wird also von Standartprogrammen insbesondere PIP nicht
- ausgewertet!
- Die folgenden Assemblerzeilen liefern das gelesene Zeichen in L oder
- -1 in HL:
-
- LD HL,(1)
- LD DE,6*3 ; BIOS READER, RETURN IN HL OR -1 IF ERROR
- ADD HL,DE
- JP (HL) ;
-
- Nach der Übertragung eines Files sollte im Control Break Menü die
- Funktion Init Reader aufgerufen werden.
- Beispiel:
-
- PIP B:ANYFILE.TXT=RDR:
-
-
-
- 8 Home
-
- Ist zur Zurückführung des Lesekopfs auf Position 0 vorgesehen, wird
- aber aus Zeitgründen nicht physikalisch ausgeführt und nur Set Track
- mit Parameter 0 aufgerufen.
-
- 9 Selekt Disk
-
- Wählt das im C-Register übergebene Laufwerk und liefert, falls das
- Laufwerk existiert, im HL Register einen Zeiger auf dessen DPH,
- falls nicht, 0. Es existieren nur das physikalisch Laufwerk A: und
- die Ramdisk B:
-
- 10 Set Track
-
- In Register C.
-
- 11 Set Sektor
-
- In Register C.
-
- 12 Set DMA
-
- Reg BC enthält Datenübertragungsbuffer
-
- 13 Read Sector
-
- Liest durch Funktionen 9,10,11 gewählten Sektor. Das Lesen von der
- Ramdisk ist relativ problemlos. Lesen von Diskette ist dies jedoch
- aufwendiger, da aus Geschwindigkeitsgründen der Dirtrack und ein
- Datentrack gebuffert werden. Es muß also zuerst entschieden werden,
- ob der Sektor schon im Buffer ist. Falls nicht, muß der Track
- zuerst von Diskette gelesen werden. Anschließend muß noch die
- richtige Sektoradresse im Buffer berechnet werden.
-
-
- 14 Write Sector
-
- Schreibt den durch Funktionen 9,10,11 gewählten Sektor. Beim
- Schreiben auf die Ramdisk ist dies relativ problemlos. Schreiben
- auf Diskette ist jedoch aufwendig, da aus Geschwindigkeitsgründen
- der Dirtrack und ein Datentrack gebuffert werden. Wenn der Sektor
- im Direktory Track liegt, wird der Track aus Sicherheitsgründen
- sofort ausgeschrieben. Andernfalls wird der Sektor im Speicher
- gebuffert. Es genügt, die Direktorysektoren sofort auszuschreiben.
- Nach jeder Änderung einer Datei wird noch das Direktory auf den
- neuesten Stand gebracht. Und beim Schreibzugriff aufs Direktory
- wird auch noch ein etwaiger Track im Schreibbuffer ausgeschrieben.
-
- 15 ListStatus
-
- Meldet, ob der Drucker empfangsbereit ist (A=1).
-
- 16 Sector Translation
-
- Manche CP/M Systeme führen eine logische Sektorübersetzung für den
- Skewfaktor durch. Das bedeutet, die Sektoren sind nicht bei der
- Formatierung physikalisch versetzt, sondern ihr Inhalt ist
- versetzt. Diese Übersetzung wird durch Funktion 16 durchgeführt.
-
-
- 26 read/set time and date
-
- Diese Funktion ist eine im CP/M 80 Bios nicht vorgesehende
- Ergänzung. Sie arbeitet entsprechend wie bei CP/M Plus. Sie wird
- aber auch vom Public Domain Bdos Z80DOS unterstützt. Dabei muß im
- Quelltext von Z80DOS die Biosadresse von time angegeben werden muß:
-
- BIOStim equ BIOS+4EH
-
- Das Schreiben von Datum u. Zeit (c=0ffh) wird nicht unterstützt, um
- die Echtzeituhr des PC nicht zu verändern.
-
- Bei C=0 wird die Zeit ausgelesen und ein Zeiger in HL auf folgende
- Struktur geliefert:
-
- dw @date ; volle Tage seit 1.1.1978 (am 2.1.1978 wäre dies 1)
- db @hour ; Stunden im BCD Format
- db @min ; Minuten im BCD Format
- db @sec ; Sekunden im BCD Format
-
-
-
- Ende von ZSIM.DOC