home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware 1 2 the Maxx
/
sw_1.zip
/
sw_1
/
PROGRAM
/
ZSIM12.ZIP
/
ZSIMGER.DOC
< prev
Wrap
Text File
|
1992-01-12
|
34KB
|
883 lines
**********************************************************************
**********************************************************************
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