home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / ZSIM12.ZIP / ZSIMGER.DOC < prev   
Text File  |  1992-01-12  |  34KB  |  883 lines

  1.  
  2. **********************************************************************
  3. **********************************************************************
  4.  
  5.  
  6.  
  7.    ZZZZZZZZZZ                 SSSSSSSS      IIII    M         M
  8.           ZZ                 SS              II     MM       MM
  9.          ZZ                  SS              II     M M     M M
  10.         ZZ                     SS            II     M  M   M  M
  11.        ZZ       ---------         SS         II     M   M M   M
  12.       ZZ        ---------          SS        II     M    M    M
  13.      ZZ                           SS         II     M         M
  14.     ZZ                           SS          II     M         M
  15.   ZZZZZZZZZZZ                SSSS           IIII   MMM       MMM
  16.  
  17.  
  18.  
  19.              Der hundert%ige Z80 Emulator
  20.  
  21.              Version 1.2
  22.  
  23.              (C) 1990,1992 by Jürgen Weber
  24.  
  25.  
  26.  
  27.              Jürgen Weber
  28.              Wiesentalstr. 1
  29.              W-7170 Schwäbisch Hall
  30.              Bundesrepublik Deutschland
  31.  
  32.  
  33. **********************************************************************
  34. **********************************************************************
  35.  
  36. WICHTIG:
  37.  
  38. Der Autor übernimmt keinerlei Garantie für die Richtigkeit der
  39. Anleitung oder das Funktionieren der Software. Dem Benutzer wird
  40. geraten, das Programm vollständig zu testen. Das Risiko, diese
  41. Software anzuwenden, liegt ausschließlich beim Benutzer. Der Autor
  42. übernimmt keine Verantwortung für Schäden irgendwelcher Art, die aus
  43. der Benutzung dieses Programmes resultieren.
  44.  
  45.  
  46.  
  47. Hardware/Softwarevorraussetzungen:
  48.  
  49. PC/XT/AT, 1 Diskettenlaufwerk (sinnvoll 5 1/4 Zoll), 256K freier
  50. Speicher, MsDos 2.1 oder kompatible.
  51.  
  52. Sinnvolles Arbeiten ist jedoch erst ab 8 MHz 80286 möglich. Jeden 10
  53. MHz nach dem Landmarktest entspricht eine Arbeitsgeschwindigkeit von
  54. ungefähr 1 MHz des emulierten Z80.
  55.  
  56.  
  57. Die genannten Firmen- und Produktnamen sind Warenzeichen.
  58.  
  59.  
  60.  
  61. !WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG!
  62. *****************************************************************
  63. !WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG!
  64.  
  65. Achten Sie genau darauf, daß Sie keine MS-Dos Diskette als CP/M
  66. Diskette einlegen. Das CP/M Bios würde die MS-Diskette ohne
  67. Rückfrage überschreiben. Ebenso überschreibt MS-Dos CP/M Disketten.
  68.  
  69. Also: Sobald Sie der Emulator zum Einlegen einer CP/M Diskette
  70. auffordert, dürfen Sie nur noch CP/M Disketten verwenden.
  71. Achten Sie auch darauf, daß die CP/M Diskette das richtige Format hat.
  72. Legen Sie dazu die CP/M Diskette MIT SCHREIBSCHUTZ ein und lassen Sie
  73. sich ein Inhaltsverzeichnis ausgeben. Falls nur Punkte ausgegeben
  74. werden, ist das ein Hinweis für ein falsches Format. Aber auch wenn
  75. nur "NO FILE" ausgegeben wird, kann das ein Anzeichen für ein nicht
  76. erkanntes Format sein, außer Sie sind sicher, daß die Diskette
  77. wirklich leer ist.
  78.  
  79. !WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG!
  80. *****************************************************************
  81. !WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG WICHTIG!
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88. INSTALLATION:
  89.  
  90. Kopieren Sie die Files in ein Direktory auf der Festplatte.
  91.  
  92.  
  93.  
  94. ALLGEMEINES:
  95.  
  96. ZSIM emuliert einen Z80 CP/M Rechner (CP/M 2.2), jedoch nicht das CP/M
  97. Betriebssystem selbst. Um CP/M zu starten, muß eine CP/M
  98. Systemdiskette ins A Laufwerk eingelegt werden, von der dann ZSIM CP/M
  99. bootet. Das CP/M System oder ein kompatibles Betriebssystem (SUPERDOS
  100. und Z80DOS werden mitgeliefert) können auch in einem File CPMSYS.CPM
  101. auf der Festplatte abgelegt werden.
  102. Sämtliche CP/M Programme, die ich testen konnte, liefen korrekt. Dies
  103. gilt auch für die Fließkommabibliothek des Public Domain Programmes
  104. Small-C, die sehr hohe Anforderungen an die Emulation stellt, da sie
  105. undokumentierte Z80 Codes benutzt.
  106. Die vollständige Kompatibilität zu einem CP/M Rechner dadurch
  107. erreicht, daß anders als andere Emulatoren, die das CP/M
  108. Betriebssystem selbst emulieren, von ZSIM nur der Z80 und das Bios
  109. emuliert werden. Auf dieser virtuellen Maschine läuft dann ein orginal
  110. CP/M kompatibles Betriebssystem oder CP/M selbst.
  111.  
  112.  
  113.  
  114. Der EMULATOR:
  115.  
  116. Im folgenden werden nur die Besonderheiten der virtuellen CP/M
  117. Maschine ZSIM beschrieben. Für Informationen zum Betriebssystem CP/M
  118. selbst und dessen Bedienung sei auf entsprechende Fachliteratur
  119. verwiesen.
  120.  
  121.  
  122. ZSIM stellt eine CP/M Maschine mit 64K Ram, einem Diskettenlaufwerk
  123. und einer Ramdisk zur Verfügung. Es wird nur ein physikalisches
  124. Laufwerk unterstützt. Das physikalische Laufwerk kann vom Control-
  125. Break Menü aus (Diskettenparameter) auf das PC Laufwerk 0 oder 1
  126. gesetzt werden. Dabei ist das gewählte Diskettenlaufwerk auf jeden
  127. Fall CP/M Laufwerk A. Sämtlicher freier Speicher, der nach Abzug des
  128. Bedarfs von Dos, von ZSIM und den 64K Arbeitsbereich für den Z80
  129. übrigbleibt, wird als Ramdisk benutzt (440K Ramdisk in einem 640K PC).
  130. Diese Ramdisk kann in ein MS-Dos File abgespeichert werden. Beim
  131. nächsten Start wird sie dann automatisch geladen, jedoch nur, wenn der
  132. Platz Ramdisk nicht kleiner als zuvor ist. Dies kann vorkommen, wenn
  133. man z.B. residente Programme lädt. Die Abspeicherung kann man dadurch
  134. ausnutzen, daß man wichtige Utilities in der Ramdisk hält und sie dann
  135. bei jedem Neustart sofort zur Verfügung hat.
  136.  
  137.  
  138. DER START:
  139.  
  140. Beim Start versucht ZSIM, das CP/M Bdos aus einem MS-Dos File
  141. CPMSYS.CPM in den Speicher zu laden. Das File muß in dem Direktory
  142. sein, aus dem ZSIM gestartet wurde.
  143. Im Paket ZSIM sind zwei CP/M kompatible Public Domain Betriebssysteme
  144. enthalten in den Dateien SUPERDOS.SYS und Z80DOS.SYS. Beide
  145. Betriebssysteme enthalten den ZCPR1 Kommandozeilen Prozessor. Z80DOS
  146. ist eine Weiterentwicklung von SUPERDOS, die Datum und Uhrzeit
  147. unterstützt (das Bios von ZSIM ist hierfür eingerichtet). Allerdings
  148. kann es bei Benutzung von Z80DOS zu Schreibfehlern auf Disketten
  149. kommen, die vom originalen CP/M Betriebssystem beschrieben wurden, da
  150. Z80DOS eine etwas andere Fileverwaltung hat.
  151. Wenn Sie eines der beiden PD Betriebssysteme anstelle des orginalen
  152. CP/M Betriebssystems benutzen wollen, kopieren Sie einfach
  153. SUPERDOS.SYS bzw. Z80DOS.SYS auf CPMSYS.CPM. Also z.B.
  154. COPY SUPERDOS.SYS CPMSYS.CPM
  155. Wenn Sie mit dem Utility CPMFRM eine Diskette formatieren, können Sie
  156. dann CP/M Programme, z.B. Small-C, auch ohne das orginal CP/M
  157. Betriebssystem starten. Erzeugen Sie dazu wie beschrieben CPMSYS.CPM
  158. aus SUPERDOS.SYS und legen Sie dazu die mit CPMFRM formatierte
  159. Diskette ins Laufwerk A: ein und starten Sie ZSIM.
  160.  
  161.  
  162. Falls CPMSYS.CPM nicht existiert, wird versucht, das System von den
  163. Systemspuren zu laden. Dabei werden alle Sektoren im reservierten
  164. Bereich (<OFF) nach der Copyright Meldung von Digital Research
  165. untersucht. Falls sie gefunden wird, werden die folgenden Sektoren
  166. dann als System geladen und DRs Copyright Meldung ausgeben.
  167.  
  168. Auch wenn Sie das orginal CP/M benutzen wollen, ist eine
  169. Systemdiskette nur zum Aufruf von ZSIM nötig, danach wird das System
  170. im Speicher behalten. Wenn CP/M erfolgreich gebootet wurde, kann mit
  171. MOVCPM ein File erzeugt werden, das das System enthält. Vergessen Sie
  172. dabei die Lehrstelle zwischen den beiden Sternen nicht. Dieses File
  173. wird dann nach MsDos übertragen (siehe Funktion 6). Dort muß dann das
  174. entstandene PUNCH.CPM in CPMSYS.CPM umbenannt werden.
  175. Beispiel:
  176.  
  177.  
  178. jgw 59K TPA cp/m 80 bios ver 1.0 --  05/09/90  (C) 1990 by Jürgen Weber
  179.  
  180. BDOS: COPYRIGHT (C) 1979, DIGITAL RESEARCH
  181.  
  182. A>b:
  183. B>movcpm * *
  184.  
  185. CONSTRUCTING 64k CP/M vers 2.2
  186. READY FOR "SYSGEN" OR
  187. "SAVE 34 CPM63.COM"
  188. B>save 34 cpm.sys
  189. B>pip
  190. *up2:=cpm.sys[o]
  191. *
  192.  
  193.  
  194. Löschen Sie sicherheitshalber das Punchfile, damit das CP/M System
  195. gewiß an den Anfang des Punch Files kommt. Übertragen Sie wie oben das
  196. CP/M System. Starten Sie eine Dos Shell und benennen Sie PUNCH.CPM in
  197. CPMSYS.CPM um.
  198. Sie können hinter MOVCPM übrigens auch eine kleinere Zahl angeben und
  199. ein kleineres CP/M System erzeugen lassen. Sie haben dann hinter der
  200. CP/M TPA und dem Systembereich noch Z80 Speicher frei. ZSIM lädt das
  201. kleinere CP/M automatisch an die richtige Stelle.
  202. Die Public Domain Betriebssysteme SUPERDOS und Z80DOS werden von ZSIM
  203. immer so geladen, daß das BDOS ab 0ec00h zu liegen kommt.
  204.  
  205.  
  206. DISKETTENFORMATE:
  207.  
  208. Folgende CP/M Diskettenformate werden unterstützt:
  209.  
  210.    Schneider CPC System  (169K, phys. Sektoren 41h-49h)
  211.    Schneider CPC Data    (178K, phys. Sektoren 0c1h-0c9h)
  212.    CP/M 86 SS DD  (153K)
  213.    CP/M 86 DS DD  (316K)
  214.  
  215.    sowie ein Spezialformat, das dem CPC Data Format entspricht, nur
  216.    daß die physikalischen Sektoren bei 1 beginnnen.
  217.  
  218. Die ersten beiden Formate sind die Spezialformate des Schneider CPCs.
  219. Dabei wurde das Highbyte der Sektornummer zur Formatunterscheidung
  220. benutzt. Die beiden anderen sind Formate, die von CP/M 86 auf dem PC
  221. benutzt werden. Sie werden auch von CCP/M 86 und DOS Plus benutzt. Die
  222. CP/M Formate bieten auch den Vorteil, daß sie mit dem normalen Dos
  223. Format Befehl formatiert werden können (FORMAT /8). Jedoch muß zuvor
  224. in der Laufwerkstabelle das Sektorfüllbyte auf 0e5h gesetzt werden.
  225. Wem dies zu umständlich ist, kann das beiliegende Programm CPMFRM.EXE
  226. benutzen. Es stellt die nötigen Parameter ein und ruft dann FORMAT.COM
  227. auf. Wenn im CP/M Direktory das bei MsDos standartmäßige 0F6H
  228. Formatbyte steht, wird dies von CP/M als Eintrag und die Diskette als
  229. voll interpretiert.
  230.  
  231. Der ZSIM erkennt bei jedem WarmStart automatisch das Format der
  232. eingelegten Diskette (sofern es eines der 5 bekannten ist). Es sollte
  233. also jedesmal, wenn eine Diskette mit neuem Format eingelegt wird,
  234. Control-C gedrückt werden. Dies empfiehlt sich aber sowieso, da sonst
  235. bei jedem Schreibzugriff auf eine nicht mit Control C angemeldete
  236. Diskette das Bdos mit der allseits gehaßten Fehlermeldung "Bdos Error
  237. on A: RO" abbricht.
  238. Es ist auch möglich, vom Control Break Menü aus von Hand die
  239. Diskettenparameter zu editieren und an ein bestimmtes Herstellerformat
  240. anzupassen. Sie können ZSIM auch mit dem Parameter /f <diskparfile>
  241. starten, wobei die Datei diskparfile mit dem Control Break Menü
  242. Kommando Save Parameters erzeugt werden kann.
  243. Single Density Formate verkraftet aber das IBM Bios nicht
  244. und 8 Zoll Disketten vertragen das Hineinstopfen in 5 1/4 Zoll
  245. Laufwerke nicht.
  246.  
  247. BILDSCHIRMTREIBER
  248.  
  249. Der Bildschirmtreiber unterstützt die von CP/M Plus vorgesehenen
  250. Bildschirmsteuerzeichen. Zusätzlich werden auch die Steuercodes des
  251. Schneider CPC verarbeitet. Eine Beschreibung der Steuerzeichen findet
  252. sich in Anhang 1.
  253. Anders als von Digital Research vorgeschlagen, wird Bit 7 des
  254. eingegebenen Asciicodes nicht gelöscht.
  255. Falls ein internationales Zeichen (z.B. deutscher Umlaut) eingegeben
  256. wird, wird er aus der IBM Darstellung in die CP/M Darstellung
  257. umgesetzt (z.B. ä => { ). Dabei ist zu beachten, daß für die Anzeige
  258. des deutschen Zeichensatzes er erst mit ESC 2 2 eingeschaltet werden
  259. muß.
  260.  
  261.  
  262. DRUCKERAUSGABE:
  263.  
  264. Die Zeichen werden auf den Drucker lpt0 ausgegeben.
  265. Es wird solange gewartet, bis der Drucker das Zeichen korrekt
  266. übernommen hat. Dabei kann es bei ausgeschaltetem Drucker natürlich zu
  267. einem Aufhänger kommen. Um dies zu verhindern, testet die Funktion, ob
  268. Control-C gedrückt wurden. Falls ja, wird ein Warmboot ausgeführt.
  269. Dies ist jedoch nur im Notfall zu empfehlen, da damit natürlich auch
  270. das aufrufende Programm abgebrochen wird.
  271.  
  272.  
  273. STANZER:
  274.  
  275. Digital Research hat die Bios Funktion 6 zur Bedienung eines
  276. Lochstreifenstanzers vorgesehen.
  277. Da Lochstreifenleser/Stanzer heute nicht mehr von überragender
  278. Bedeutung sind, verwendete ich diese Funktion zur Datenübergabe an
  279. MsDos. Zeichen, die an diese Funktion übergeben werden, werden an das
  280. MsDos File PUNCH.CPM angehängt. Falls es nicht existiert, wird es
  281. erzeugt. Die Zeichen werden gebuffert und erst ausgeschrieben, wenn
  282. der Buffer voll ist. Dieser Buffer wird auch bei Unterbrechung durch
  283. Control Break ausgeschrieben.
  284.  
  285. Ansprechen der Funktion 6:
  286.  
  287. Am einfachsten mit PIP. Das logische Gerät PUN: (Puncher) ist jedoch
  288. nicht zu empfehlen, da dann PIP zuerst einige Nullbytes sendet.
  289. Verwendet werden können entweder die physikalischen Geräte PTP: oder
  290. UP2:, wobei bei PTP: nach der Übertragung von Textdateien ein EOF
  291. gesendet wird:
  292.  
  293.   PIP UP2:=ANYFILE.EXT[o]
  294.  
  295. Die Option [o] (Objectfile) sorgt dafür, daß PIP bei Nicht-Textfiles
  296. nicht beim ersten 1aH (eof) Zeichen abbricht, bei Textdateien ist sie
  297. nicht nötig. Dabei ist zu beachten, daß die Daten an PUNCH.CPM
  298. ANGEHÄNGT werden.
  299.  
  300. Es ist folgender Ablauf zu empfehlen:
  301.   - Übertragen mit PIP wie oben
  302.   - Im Control-Break Menü OS Shell anwählen, und PUNCH.CPM in
  303.     richtigen Namen umbenennen: REN PUNCH.CPM file.txt
  304.                                 EXIT
  305.  
  306. Zur Übertragung größerer Datenmengen zwischen MsDos und CP/M empfehle
  307. ich das Programm 22DISK der Firma Sydex, das ebenfalls als Shareware
  308. erhältlich ist.
  309.  
  310.  
  311. BEENDEN DER EMULATION:
  312.  
  313. Die Z80 Emulation kann durch Drücken von Control-Break beendet werden,
  314. worauf ein Popupmenü erscheint. Dies geschieht auch, wenn im Z80 Code
  315. der Befehl HALT auftaucht.
  316. Dieser Tastendruck setzt jedoch wie bei MsDos auch nur ein Flag, das
  317. beim nächsten Bios Aufruf erst ausgewertet werden muß. Das heißt aber
  318. auch, daß wenn der Z80 in einer Endlosschleife hängt, der PC neu
  319. gebootet werden muß. Ein regelmäßiges Prüfen des Abruchflags in der
  320. Emulation wäre viel zu zeitaufwendig.
  321.  
  322.  
  323.  
  324. In seltenen Fällen kann es zu einem fatalen Fehler kommen: Dos lädt
  325. den ZSIM und damit auch die Diskettenpuffer an eine so unglückliche
  326. Adresse, daß es zum sogenannten DMA Boundary Crossing kommt. Die
  327. Emulation wird dann sofort abgebrochen. Als Abhilfe muß der Emulator
  328. an eine andere Adresse geladen werden. Starten Sie dazu einfach vor
  329. dem Start von ZSIM durch Eingabe von COMMAND eine Shell und danach
  330. nocheinmal ZSIM.
  331.  
  332.  
  333.  
  334.  
  335. CONTROL BREAK MENÜ
  336.  
  337.  
  338. Nach Drücken von Control Break erscheint folgendes Popup Menü:
  339.  
  340.  
  341.                     ┌─────────────────┐
  342.                     │Continue         │
  343.                     │Save Ramdisc/Quit│
  344.                     │Quit             │
  345.                     │Save Ramdisc     │
  346.                     │Delete Punch File│
  347.                     │Init Reader      │
  348.                     │OS Shell         │
  349.                     │Disk Parameters  │
  350.                     │Save Parameters  │
  351.                     │Load Parameters  │
  352.                     │Warm Boot        │
  353.                     │About            │
  354.                     └─────────────────┘
  355.  
  356.  
  357.  
  358. Die gewünschte Aktion kann mit den Cursortasten angewählt werden, Esc
  359. bricht das Menü ab.
  360.  
  361. Die Punkte im Einzelnen:
  362.  
  363. Continue           fährt mit der CP/M Emulation fort
  364.  
  365. Save Ramdisc/Quit  speichert die Ramdisk auf die Diskette/Festplatte,
  366.                    von der aus ZSIM gestartet wurde und beendet ZSIM.
  367.  
  368.  
  369. Quit               beendet ZSIM ohne die Ramdisk zu speichern.
  370.  
  371. Save Ramdisk       speichert die Ramdisk ab und kehrt zu Emulation
  372.                    zurück. Dies ist z.B. sinnvoll, um mehrere
  373.                    Zustände der Ramdisk auf Platte abzuspeichern.
  374.                    Achtung: dazu muß jedesmal eine OS Shell gestartet
  375.                    werden und der Name der Ramdisk (RAMDISC.CPM)
  376.                    geändert werden, da sie sonst überschrieben wird,
  377.                    wenn Sie das nächste mal die Ramdisk speichern.
  378.  
  379. Delete Punch File  löscht das MsDos File, in das die Punch Daten
  380.                    geschrieben werden.
  381.  
  382. Init Reader        bewirkt, daß Reader als nächstes Zeichen wieder das
  383.                    erste Zeichen von READER.CPM liefert. Dies ist z.B.
  384.                    nötig, falls man mehrere Files übertragen will.
  385.                    Dazu muß man um das nächste File zu übertragen,
  386.                    eine Dos Shell starten, das zu übertragende File
  387.                    in READER.CPM umbenennen und mit Init Reader den
  388.                    Lesezeiger auf den Anfang des neuen Files setzen.
  389.  
  390.  
  391. OS Shell           stellt eine MsDos Kommandoumgebung zur Verfügung,
  392.                    dabei erhält man allerdings nur 64K. Dies reicht
  393.                    aber für REN und COPY.
  394.  
  395. Disk Parameters    dient zum Editieren der CP/M Diskettenparameter
  396.                    (s.u.).
  397.  
  398. Save Parameters    speichert die Diskettenparameter in einem File ab.
  399.                    Geben Sie dazu einen Dateinamen mit Extention ein.
  400.                    Die Parameter werden als HexBytes in der selben
  401.                    Reihenfolge gespeichert, wie sie in der Editierbox
  402.                    erscheinen. Vor den Parametern werden noch die
  403.                    Bytes 'JW' als Kennung abgespeichert.
  404.                    Das Autologin Flag wird nicht abgespeichert.
  405.  
  406. Load Parameters    lädt die Diskettenparameter aus einem mit Save
  407.                    Parameters abgespeicherten Parameterfile. Geben Sie
  408.                    zum Laden wieder den Filenamen mit Extention ein.
  409.                    Nach dem Laden wird das Autologin Flag gelöscht und
  410.                    ein Warm Boot durchgeführt.
  411.  
  412.  
  413. Warm Boot          entspricht der Eingabe von Control-C unter CP/M,
  414.                    klappt aber auch aus einem laufenden Programm
  415.                    heraus.
  416.  
  417. About              gibt Programmnamen und Autor aus.
  418.  
  419.  
  420. DISKETTEN PARAMETER
  421.  
  422. Aus dem Control-Break Menü heraus können die Diskettenparameter in
  423. einer Editierfläche bearbeitet werden.
  424. Bei der Eingabe werden nur gültige Hexziffern akzeptiert, andere
  425. Zeichen ignoriert. ESC bricht die Editierung ab, Änderungen bis zur
  426. Zeile vor der, in der der Cursor steht, werden übernommen. Mit
  427. BACKSPACE können Zeichen in der Cursorzeile gelöscht werden. Eine
  428. Eingabe muß mit ENTER abgeschlossen werden. Wird nur Enter gedrückt,
  429. wird der alte Wert übernommen (wie im folgenden Beispiel in den
  430. Zeilen, wo hinter dem Doppelpunkt kein neuer Wert steht).
  431.  
  432.  
  433. Beispiel:
  434.  
  435.  
  436.  
  437. jgw 59K TPA cp/m 80 bios ver 1.1 --  10/12/91  (C) 1990 by Jürgen G. Weber
  438.  
  439. BDOS: COPYRIGHT (C) 1979, DIGITAL RESEARCH
  440.  
  441. Unknown disc format. Insert new disc and press any key
  442.      ┌──────────────────┐
  443.      │SPT: 0024  : 28   │
  444.      │BSH:   03  :      │
  445.      │BLM:   07  :      │
  446.      │EXM:   00  :      │
  447.      │DSM: 00A8  : B8   │
  448.      │DRM: 003F  :      │
  449.      │AL0:   C0  :      │
  450.      │AL1:   00  :      │
  451.      │CKS: 0010  : 40   │
  452.      │OFF :0002  : 3    │
  453.      │                  │
  454.      │DRV:   00  :      │
  455.      │PTR:   28  :      │
  456.      │PST:   09  : 5    │
  457.      │BPS:   02  : 3    │
  458.      │FSC:   01  :      │
  459.      │LOG:   FF  : 0    │
  460.      └──────────────────┘
  461.  
  462.  
  463.  
  464. Ich hatte hier eine fremde Diskette (Osbourne DD) eingelegt. Nachdem
  465. ZSIM sich über das unbekannte Diskettenformat beschwert hatte, hatte
  466. ich Control Break gedrückt. Danach gab ich die richtigen
  467. Diskparameter für das Osbourne Format ein.
  468.  
  469. Die Parameter in der oberen Hälfte sind CP/M üblich. Die unteren sind
  470. eine Erweiterung von mir mit folgende Bedeutung:
  471.  
  472. DRV: Physikalische Nummer des Laufwerks mit der CP/M Diskette (0 oder
  473.      1); hat unter CP/M aber immer die Bezeichnung A:
  474. PTR: Physikalische Trackzahl, bei einem 360K Laufwerk maximal 40,
  475.      sonst (bei 720K, 1.2 MB oder 1.4 MB) bis zu 80 Tracks möglich
  476. PST: Physikalische Sektoren pro Track, bei 360K Laufwerken maximal 9,
  477.      bei 720K (1.2MB, 1.4MB) maximal 9 (15,18) Sektoren.
  478. BPS: Physikalische Sektorlänge; BPS=ld(SecLen in Bytes )-7; dieser
  479.      Wert wird vom Diskettenkontroller verlangt
  480. FSC: Physikalischer erster Sektor jeder Spur, normalerweise 1
  481. LOG: FF=Autologin, 0=kein Autologin
  482.  
  483. Wenn Sie die Parameter verändern, setzen Sie LOG auf 0, da das nächste
  484. Autologin sonst gleich wieder die eingegebenen Parameter verändert.
  485. Um wieder die üblichen Parameter zu bekommen, genügt es, LOG auf FF zu
  486. setzen, eine Diskette mit normalem Format einzulegen und Control-C
  487. einzugeben. Eine einigermaßen sichere Formatanpassung ist mit der
  488. Einstellung der Diskettenparameter jedoch nur bei einseitigen Formaten
  489. möglich. Bei einigen zweiseitigen Formaten wird die zweite Seite als
  490. "Verlängerung" der Spuren der ersten Seite, bei anderen wiederum durch
  491. Verdopplung der Spurenzahl angesprochen. Das Bios von ZSIM ist jedoch
  492. nur für die Methode von CP/M 86 Double Sided (Verdopplung der
  493. Spurenzahl mit Spurübersetzung) eingerichtet.
  494.  
  495.  
  496.  
  497. EMULATION DES Z80
  498.  
  499. Die emulierte Maschine verhält sich fast komplett wie eine Z80 CP/M
  500. Maschine.
  501. Sämtliche Z80 Befehle, die Flags verändern oder verwenden wurden in
  502. ihrer Wirkung (vor allem auf die Flags) getestet. Alle definierten
  503. Flags werden in exakt gleicher Weise wie auf einem original Z80 Chip
  504. beeinflußt. Ich testete dies, indem ich in einer Schleife das
  505. Registerpaar HL mit allen Werten von 0 bis FFFFh belegte und sie mit
  506. PUSH HL - POP AF nach AF kopierte, den zu testenden Befehl ausführte
  507. und danach das erhaltene AF
  508. Registerpaar auf eine Checksumme aufaddierte. Ich verbesserte die
  509. Emulation solange, bis Flag beeinflussende Befehle auf dem Z80 und der
  510. Emulation die gleiche Checksumme ergaben.
  511. Die Flags im Z80 Flagregister, die von Zilog als nicht
  512. definiert ausgewiesen sind und mehr oder weniger zufälliges Verhalten
  513. haben, sind bei ZSIM auch nicht definiert. Jedoch können hier bei
  514. Emulation und Z80 unterschiedlich "nicht definierte" Flagzustände
  515. auftreten.
  516. ZSIM unterstützt undokumentierte Z80 Befehle, sogenannte illegale
  517. Opcodes.
  518. Sämtliche CP/M Programme, die ich getestet habe, verhalten sich wie
  519. auf dem Schneider CPC, sogar das Fließkommapaket des Small C
  520. Compilers, das undokumentierte Z80 Befehle verwendet.
  521.  
  522. Ein wesentlicher Unterschied zu einem Orginal Z80 Chip liegt natürlich
  523. in der Befehlsausführungszeit. Es gibt keinerlei proportinalen
  524. Zusammenhang zwischen Taktzyklenzahlen auf Emulation und Z80.
  525. Zeitkritische Echtzeitanwendungen (z.B.
  526. Kassettenaufzeichnungsroutinen) können also mit ZSIM nicht realisiert
  527. werden.
  528.  
  529. Beim Z80 wird das R (Refresh) Register für die Auffrischung
  530. dynamischer Rams benutzt und daher laufend incrementiert. Da manche
  531. Programmierer es auf dem Z80 als Zufallsgenerator benutzen, lädt es
  532. auch der Emulator mit "zufälligen" Werten, die aus der Systemzeit
  533. abgeleitet werden.
  534. Bei Portbefehlen wird die eigentliche Ausgabe nicht ausgeführt und als
  535. Eingabe wird immer 0FFH geliefert, die Flags werden jedoch gesetzt und
  536. bei Portbefehlen mit Blockwiederholung werden die Zählregister
  537. verändert. Dieses Verhalten kann jedoch im Modul PORTIO geändert
  538. werden.
  539.  
  540.  
  541. Einige Tests der Geschwindigkeit der Emulation:
  542.  
  543.  
  544. Zur Messung verwendete ich folgende Tests:
  545.  
  546. 1) Compilierung des beim Small-C Compilers mitgelieferten Programmes
  547.    TEST.C
  548.    Der Ablauf des ablauffähigen Programms TEST.COM stellt übrigens
  549.    sehr hohe Anforderungen an den Emulator, da seine
  550.    Fließkommaroutinen auf undokumentierte Z80 Befehle zurückgreifen.
  551.    Im Gegensatz zu den anderen mir bekannten Emulatoren ist meiner als
  552.    einziger in der Lage, diese Befehle korrekt zu emulieren und das
  553.    Programm ablaufen zu lassen.
  554.  
  555. 2) Compilierung des Programms MC.PAS mit TURBO PASCAL 3.0 auf
  556.    Diskette.
  557.  
  558. 3) Compilierung des mitgelieferten Programms LISTER.PAS mit TURBO
  559.    PASCAL 3.0 im Speicher.
  560.  
  561. 4) Eine kurze Schleife in Assembler mit dem Debugger eingeben und
  562.    ausführen:
  563.  
  564.       LD B,20
  565.    L1:LD HL,0
  566.    L2:INC HL
  567.       LD A,H
  568.       OR L
  569.       JP NZ,L2
  570.       DJNZ L1
  571.  
  572. 5) Mit DDT einen Speicherbereich ausdumpen:
  573.  
  574.    D0,8000
  575.  
  576.  
  577. ERGEBNISSE (auf einem 16 MHz 386 SX), Z80 Tests auf einem
  578. Amstrad/Schneider CPC, Z80 A, 4 Mhz durchgeführt:
  579.  
  580. TestNr ZSIM:Z80   CPC/Z80   ZSIM
  581.  
  582.   1     0,85     3.37.00   3.04.00
  583.  
  584.   2     0,88     1.20.00   1.10.00
  585.  
  586.   3     0,99     0.03.65   0.03.63
  587.  
  588.   4     1,37     0.17.10   0.23.45
  589.  
  590.   5     0,41     4.06.00   1.40.00
  591.  
  592.  
  593.  
  594. Der über die Emulationsgeschwindigkeit aussagekräftigste Test ist Test
  595. Nr. 4, da hier nur die reine Rechenzeit gemessen wird.
  596. Test Nr 1 stellt hohe Ansprüche an das Diskettenlaufwerk, da
  597. Compilierung, Assemblieren und Linken auf Diskette geschehen. Hierbei
  598. wirken sich die großen Diskettenbuffer von ZSIM recht günstig aus.
  599. Test Nr 2 ist ähnlich wie Test Nr 1.
  600. Test Nr 3 sollte eigentlich ein ähnliches Ergebnis wie Nr 4 zeigen,
  601. aber Turbo Pascal gibt laufend die compilierte Zeile aus und hier
  602. wirkt sich die langsame Bildschirmausgabe des CPC aus.
  603.  
  604. Test Nr 5 stellt sehr hohe Anforderungen an die
  605. Bildschirmausgabegeschwindigkeit, wobei der CPC mit seiner
  606. Bildschirmausgabe im Grafikmodus gegen die Bildschirmausgabe eines
  607. 80386 keine Chance hat.
  608.  
  609.  
  610. Anhang 1
  611. ========
  612.  
  613. Implementierte Bildschirmsteuerzeichen:
  614.  
  615. CPC
  616.  
  617. Ascii        Wirkung
  618.  2           cursor aus
  619.  3           cursor an
  620.  7           Bell
  621.  8           Cursor links
  622.  9           Cursor rechts
  623. 10           Cursor tief
  624. 11           Cursor hoch
  625. 12           Schirm löschen
  626. 13           Cursor an Zeilenanfang
  627. 16           Zeichen unter Cursor löschen
  628. 17           Zeile bis Cursor löschen
  629. 18           Zeile ab Cursor löschen
  630. 19           Schirm bis Cursor löschen
  631. 20           Schirm ab Cursor löschen
  632. 24           Helle Schrift an/aus
  633. 30           Cursor nach links oben
  634. 31 x y       Cursor Spalte x,Zeile y (links oben = 1,1 )
  635.  
  636. CP/M Plus:
  637.  
  638. ESC @        Bildschirm initialisieren: CLS,HOME,Helle Schrift aus
  639.              Cursor an, Unterstreichen aus,US Zeichensatz
  640. ESC 2 x      Zeichensatz auswählen:
  641.                 x        Land
  642.                 0        USA
  643.                 1        Frankreich
  644.                 2        Deutschland
  645.                 3        Großbrittanien
  646.                 4        Dänemark
  647.                 5        Schweden
  648.                 6        Italien
  649.                 7        Spanien
  650.  
  651. ESC A        Cursor hoch
  652. ESC B        Cursor tief
  653. ESC C        Cursor rechts
  654. ESC D        Cursor links
  655. ESC E        Schirm löschen, Cursor bleibt
  656. ESC H        Cursor links oben
  657. ESC I        Cursor hoch, wenn nötig scrollen
  658. ESC J        Schirm ab Cursor löschen
  659. ESC K        Zeile ab Cursor löschen
  660. ESC L        Zeile einfügen
  661. ESC M        Zeile löschen
  662. ESC N        Zeichen unter Cursor löschen
  663. ESC Y y x    Cursor nach Spalte x,Zeile y, links oben = 32,32
  664. ESC d        Zeile bis Cursor löschen
  665. ESC e        Cursor an
  666. ESC f        Cursor aus
  667. ESC j        Cursor Position merken
  668. ESC k        Cursor Position wieder holen
  669. ESC o        Zeile bis Cursor löschen
  670. ESC p        Helle Schrift an
  671. ESC q        Helle Schrift aus
  672. ESC r        Unterstreichen ein (bei Farbschirm: blau)
  673. ESC s        Blinken an
  674. ESC t        Blinken aus
  675. ESC u        Unterstreichen aus
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682. Anhang 2
  683. ========
  684.  
  685. Technische Beschreibung des implementierten CP/M 80 Bios
  686.  
  687. Jede Biosroutine wird durch einen Pseudo Z80 CALLN Befehl (EDED) mit
  688. Folgebyte Biosnummer aufgerufen.
  689.  
  690. Beschreibung der einzelnen Routinen:
  691.  
  692. 0 Cold boot
  693.  
  694.   Lädt das Bdos aus einem MS-Dos File CPMSYS.CPM in den Speicher und
  695.   installiert Biossprungleiste und Diskettenparameter im Z80 Ram.
  696.   Ferner wird Laufwerk A: gewählt und das IO-Byte und der Punchbuffer
  697.   gelöscht. Danach wird die Routine Warm Boot angesprungen.
  698.   Falls CPMSYS.CPM nicht existiert, versucht Boot, das System von den
  699.   Systemspuren zu laden. Dabei werden alle Sektoren im reservierten
  700.   Bereich (<OFF) nach der Copyright Meldung von Digital Research
  701.   untersucht. Falls sie gefunden wird, werden die folgenden Sektoren
  702.   dann als System geladen.
  703.   Wenn dies erfolgreich geschah, kann mit MOVCPM ein File erzeugt
  704.   werden, das das System enthält. Diese wird dann auf die MsDos
  705.   Startdiskette von ZSIM
  706.   übertragen (siehe Funktion 6). Dort muß dann das entstandene
  707.   PUNCH.CPM in CPMSYS.CPM umbenannt werden.
  708.  
  709. 1 Warm boot
  710.  
  711.   Kopiert das Bdos, das durch Funktion 0 in den Speicher geladen
  712.   wurde, an seine richtige Stelle im Z80 Speicherbereich; dabei wird
  713.   flexibel auf die durch MOVCPM gewählte Adresse des Bdos reagiert.
  714.   Anschließend wird getestet, welches Format die eingelegte Diskette
  715.   hat und die richtigen Diskettenparameter werden angelegt. Jetzt wird
  716.   der Z80 Emulator gestartet und der CP/M CCP aufgerufen.
  717.  
  718. 2 Consol Status
  719.  
  720.   Liefert 0ffh in A falls Zeichen auf Tastatur ansteht.
  721.  
  722.  
  723. 3 Consol Input
  724.  
  725.   Liefert Asciicode von Tastatur in A.
  726.   Anders als von Digital Research vorgeschlagen, wird Bit 7 des
  727.   eingegebenen Asciicodes nicht gelöscht.
  728.   Falls ein internationales Zeichen (z.B. deutscher Umlaut) eingegeben
  729.   wird, wird er aus der IBM Darstellung in die CP/M Darstellung
  730.   umgesetzt (z.B. ä => { ). Dabei ist zu beachten, daß für die Anzeige
  731.   des deutschen Zeichensatzes er erst mit ESC 2 2 eingeschaltet werden
  732.   muß.
  733.   Sondertasten der PC Tastatur: Falls in CONIO.ASM Konstante WS_KEY
  734.   auf TRUE gesetzt ist, werden die Cursortasten, Ins, Del, Home, End,
  735.   PgUp und PgDn in Wordstar Steuerseqenzen (^Q... ) umgesetzt. Dabei
  736.   wird beim nächsten Aufruf von conin ^Q und beim folgenden der
  737.   entsprechende Zweitcode zurückgeliefert.
  738.  
  739. 4 Consol Output
  740.  
  741.   Gibt Zeichen in C auf den Bildschirm aus. Dabei werden
  742.   Bildschirmsteuerzeichen gemäß Anhang 1 ausgewertet.
  743.  
  744. 5 List Character
  745.  
  746.   Diese Funktion gibt das Zeichen in C auf den Drucker lpt0 aus. Sie
  747.   wartet dabei solange, bis der Drucker das Zeichen korrekt übernommen
  748.   hat. Dabei kann es bei ausgeschaltetem Drucker natürlich zu einem
  749.   Aufhänger kommen. Um dies zu verhindern, testet die Funktion, ob
  750.   Control-C gedrückt wurden. Falls ja, springt die Routine die Z80
  751.   Adresse 0 an, wo normalerweiser ein Sprung zur  Warmboot Routine
  752.   steht.
  753.  
  754. 6 Punch Character
  755.  
  756.   Digital Research hat diese Funktion zur Bedienung eines
  757.   Lochstreifenstanzers vorgesehen.
  758.   Da Lochstreifenleser/Stanzer heute nicht mehr von überragender
  759.   Bedeutung sind, verwendete ich diese Funktion zur Datenübergabe an
  760.   MsDos. Zeichen, die an diese Funktion übergeben werden, werden an
  761.   das MsDos File PUNCH.CPM angehängt. Falls es nicht existiert, wird
  762.   es erzeugt.
  763.   Die Zeichen werden gebuffert und erst ausgeschrieben, wenn der
  764.   Buffer voll ist. Dieser Buffer wird auch ausgeschrieben, wenn das
  765.   Zeichen CPM_EOF gesendet wird und bei Unterbrechung durch Control
  766.   Break. Dabei wird an jedes File noch ein 1Ah angehängt, was aber
  767.   nichts ausmacht.
  768.  
  769.  
  770. 7 Read Character
  771.  
  772.   Liest Zeichen aus dem MsDos File READER.CPM. Das klappt jedoch nur
  773.   mit Dateien, in denen kein EOF (26) vorkommt. Die PIP Option [o]
  774.   klappt nicht, da dann auch das tatsächliche Dateiende nicht vorkommt
  775.   und PIP in einer Endlosschleife hängenbleibt.
  776.   Falls READER.CPM nicht existiert oder schon zu Ende gelesen ist,
  777.   wird EOF (26) geliefert.
  778.   Zur Unterscheidung von in einem Binärfile enthaltenen EOF Zeichen
  779.   wird am Ende von READER.CPM zusätzlich noch -1 (0ffffh) in HL
  780.   zurückgegeben (sonst H=0, L=Zeichen). Dies ist nicht von DR
  781.   vorgesehen, wird also von Standartprogrammen insbesondere PIP nicht
  782.   ausgewertet!
  783.   Die folgenden Assemblerzeilen liefern das gelesene Zeichen in L oder
  784.   -1 in HL:
  785.  
  786.   LD HL,(1)
  787.   LD DE,6*3  ; BIOS READER, RETURN IN HL OR -1 IF ERROR
  788.   ADD HL,DE
  789.   JP (HL)    ;
  790.  
  791.   Nach der Übertragung eines Files sollte im Control Break Menü die
  792.   Funktion Init Reader aufgerufen werden.
  793.   Beispiel:
  794.  
  795.           PIP B:ANYFILE.TXT=RDR:
  796.  
  797.  
  798.  
  799. 8 Home
  800.  
  801.   Ist zur Zurückführung des Lesekopfs auf Position 0 vorgesehen, wird
  802.   aber aus Zeitgründen nicht physikalisch ausgeführt und nur Set Track
  803.   mit Parameter 0 aufgerufen.
  804.  
  805. 9 Selekt Disk
  806.  
  807.   Wählt das im C-Register übergebene Laufwerk und liefert, falls das
  808.   Laufwerk existiert, im HL Register einen Zeiger auf dessen DPH,
  809.   falls nicht, 0. Es existieren nur das physikalisch Laufwerk A: und
  810.   die Ramdisk B:
  811.  
  812. 10 Set Track
  813.  
  814.    In Register C.
  815.  
  816. 11 Set Sektor
  817.  
  818.    In Register C.
  819.  
  820. 12 Set DMA
  821.  
  822.    Reg BC enthält Datenübertragungsbuffer
  823.  
  824. 13 Read Sector
  825.  
  826.    Liest durch Funktionen 9,10,11 gewählten Sektor. Das Lesen von der
  827.    Ramdisk ist relativ problemlos. Lesen von Diskette ist dies jedoch
  828.    aufwendiger, da aus Geschwindigkeitsgründen der Dirtrack und ein
  829.    Datentrack gebuffert werden. Es muß also zuerst entschieden werden,
  830.    ob der Sektor schon im Buffer ist. Falls nicht, muß der Track
  831.    zuerst von Diskette gelesen werden. Anschließend muß noch die
  832.    richtige Sektoradresse im Buffer berechnet werden.
  833.  
  834.  
  835. 14 Write Sector
  836.  
  837.    Schreibt den durch Funktionen 9,10,11 gewählten Sektor. Beim
  838.    Schreiben auf die Ramdisk ist dies relativ problemlos. Schreiben
  839.    auf Diskette ist jedoch aufwendig, da aus Geschwindigkeitsgründen
  840.    der Dirtrack und ein Datentrack gebuffert werden. Wenn der Sektor
  841.    im Direktory Track liegt, wird der Track aus Sicherheitsgründen
  842.    sofort ausgeschrieben. Andernfalls wird der Sektor im Speicher
  843.    gebuffert. Es genügt, die Direktorysektoren sofort auszuschreiben.
  844.    Nach jeder Änderung einer Datei wird noch das Direktory auf den
  845.    neuesten Stand gebracht. Und beim Schreibzugriff aufs Direktory
  846.    wird auch noch ein etwaiger Track im Schreibbuffer ausgeschrieben.
  847.  
  848. 15 ListStatus
  849.  
  850.    Meldet, ob der Drucker empfangsbereit ist (A=1).
  851.  
  852. 16 Sector Translation
  853.  
  854.    Manche CP/M Systeme führen eine logische Sektorübersetzung für den
  855.    Skewfaktor durch. Das bedeutet, die Sektoren sind nicht bei der
  856.    Formatierung physikalisch versetzt, sondern ihr Inhalt ist
  857.    versetzt. Diese Übersetzung wird durch Funktion 16 durchgeführt.
  858.  
  859.  
  860. 26 read/set time and date
  861.  
  862.    Diese Funktion ist eine im CP/M 80 Bios nicht vorgesehende
  863.    Ergänzung. Sie arbeitet entsprechend wie bei CP/M Plus. Sie wird
  864.    aber auch vom Public Domain Bdos Z80DOS unterstützt. Dabei muß im
  865.    Quelltext von Z80DOS die Biosadresse von time angegeben werden muß:
  866.  
  867.    BIOStim equ     BIOS+4EH
  868.  
  869.    Das Schreiben von Datum u. Zeit (c=0ffh) wird nicht unterstützt, um
  870.    die Echtzeituhr des PC nicht zu verändern.
  871.  
  872.    Bei C=0 wird die Zeit ausgelesen und ein Zeiger in HL auf folgende
  873.    Struktur geliefert:
  874.  
  875.    dw @date  ; volle Tage seit 1.1.1978 (am 2.1.1978 wäre dies 1)
  876.    db @hour  ; Stunden im BCD Format
  877.    db @min   ; Minuten im BCD Format
  878.    db @sec   ; Sekunden im BCD Format
  879.  
  880.  
  881.  
  882. Ende von ZSIM.DOC
  883.