|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
CPMTOOLS, FDUTILS und YAZECP/M Retrospektive via LinuxIn einem meiner vorherigen Artikel "CP/M for Linux (CPM4L)" wurde eine Werkzeugsammlung rund um die Thematik CP/M Emulation und Diskettenzugriff unter Linux vorgestellt. In diesem Artikel werden die wichtigsten Werkzeuge aus dieser Sammlung für die Sicherung alter Datenbestände und Weiterbenutzung alter CP/M Programme vorgestellt.
Inhalt1 Übersicht
1.1 notwendige Dateien
2 Diskettenzugriff mit FDUTILS und CPMTOOLS3 Emulation mit Yet Another Z80 Emulator (YAZE) 3.1 Erstellung eines PC/M Systems
4 Internetreferenzen
1 ÜbersichtMit den Freewareprogrammen CP/M Tools (CPMTOOLS), Floppy Disk Utilities (FDUTILS) und Yet Another Z80 Emulator (YAZE) kann man unter Linux auf CP/M Disketten zugreifen und CP/M Programme ausführen. Alle drei Pakete sind Bestandteil von CPM4L. Die Installation von CPM4L wird im Artikel "CP/M for Linux (CPM4L)" ausführlich beschrieben.
Der Zugriff auf CP/M Disketten erfolgt über verschiedene kleine Programme. Der Emulator arbeitet als Abstraktionsschicht der notwendigen CP/M Komponenten BIOS, BDOS und CCP. Das BIOS ist eine in C geschriebene Emulation und kann je nach Bedürfnissen an speziell zu simulierende Hardware angepasst werden, Spezialwissen vorausgesetzt. CP/M Binaries werden zunächst durch den integrierten "CP/M Disk Manager" in ein emulatorspezifisches "Disk Image File" kopiert und dann von dort ausgeführt. Mit den hier gesammelten Informationen soll gezeigt werden, wie man unter einem modernen Linux System die alten PC/M Quellen für die Software Entwicklung weiter benutzen kann. 1.1 notwendige Dateienpcmdevel-20021015.tar.gz
PC/M Software Entwicklungspaket PC/M Software Entwicklungspaket 2 Diskettenzugriff mit FDUTILS und CPMTOOLSNach der Installation der Floppy Disk Utilities (FDUTILS) befindet sich unter /opt/cpm4l/bin das Programm setfdprm, womit das zu benutzende Diskettenlaufwerk auf ein solches Low Level Format ingestellt wird, wie es in der Datei /opt/cpm4l/etc/mediaprm eingetragen ist. Die folgenden Einträge für Robotron SCP Formate sind bereits hinterlegt, wobei SCP640 und SCP800 getestet sind.
/opt/cpm4l/etc/mediaprm"SCP160": SS DD head=1 cyl=40 sect=16 ssize=256 dtr=1 fm=0 "SCP200": SS DD head=1 cyl=40 sect=5 ssize=1KB dtr=1 fm=0 "SCP320": SS DD head=1 cyl=80 sect=16 ssize=256 dtr=1 fm=0 "SCP400": SS DD head=1 cyl=80 sect=5 ssize=1KB dtr=1 fm=0 "SCP640": DS DD head=2 cyl=80 sect=16 ssize=256 dtr=1 fm=0 "SCP800": DS DD head=2 cyl=80 sect=5 ssize=1KB dtr=1 fm=0 Mit den CP/M Tools (CPMTOOLS) werden unter /opt/cpm4l/bin verschiedene Programme für den Zugriff auf CP/M Disketten abgelegt (*cpm*). Jedes dieser Programme arbeitet mit den Formatangaben aus der Datei /opt/cpm4l/etc/diskdefs. Die folgenden Robotron SCP Formate sind bereits eingetragen und teilweise getestet. Das Format scp624 ist für alle Programme voreingestellt.
/opt/cpm4l/etc/diskdefsdiskdef scp624 seclen 256 tracks 80 sectrk 32 blocksize 2048 maxdir 128 skew 0 boottrk 2 os 2.2 end diskdef scp640 seclen 256 tracks 80 sectrk 32 blocksize 2048 maxdir 128 skew 0 boottrk 0 os 2.2 end diskdef scp780 seclen 1024 tracks 80 sectrk 10 blocksize 2048 maxdir 128 skew 0 boottrk 2 os 2.2 end diskdef scp800 seclen 1024 tracks 80 sectrk 10 blocksize 2048 maxdir 128 skew 0 boottrk 0 os 2.2 end Wenn installiert, dann findet man die Dokumentation zu den beiden Programmpaketen unter /opt/cpm4l/doc/fdutils-5.5 und /opt/cpm4l/doc/cpmtools-2.4 bzw. in den Manpages unter /opt/cpm4l/man.
Um nun den Inhalt einer für den PC/M üblichen SCP formatierten Diskette mit 640 KByte Low Level Format und 624 KByte Dateninhalt (16 KByte für 4 Systemspuren) anzusehen, muss man nach einlegen einer solchen Diskette in /dev/fd1 folgendes tun: [user@host tryout]$ setfdprm /dev/fd1 SCP640 [user@host tryout]$ cpmls -f scp624 -d /dev/fd1 DW1 CHN : DW3 CHN : DW5 CHN : DW7 CHN DW COM : MCONFIG COM : MOVE COM : MOVE-IT COM MOVE UCF : MOVIT COM : NEWSWEEP COM : PCMDISK COM PCMFORM COM : PCMVDB COM : PCMVTC COM : PIP COM POWER COM : SCOPY COM : SDCOPY COM : SDIR COM STAT COM : SUBM COM : SUBMIT COM : TP COM TPDRUCK OVR : TPHT OVR : TPINSTD 000 : TPINSTD 001 TPINSTD 002 : TPINSTD COM : TPOVLY0 OVR : VERSION CNF VERSION DIL : XSUB COM : ZAP COM : ZIP COM ZIPIN COM : ZSCRN COM [user@host tryout]$ _ Wichtig hierbei ist, dass man das Programm setfdprm der durch CPM4L installierten Floppy Disk Utilities benutzt, da bereits auf (fast) jedem Linux System durch die Distribution ein Programm mit gleichem Namen (setfdprm) existiert; gewöhnlich unter /usr/bin. Man erkennt das aber an einer entsprechenden Fehlermeldung von nicht unterstützten Diskettenformaten.
Die Formatangabe -f scp624 könnte entfallen, da dieses Format voreingestellt ist. Für den Zugriff auf eine SCP formatierte Diskette mit 800 KByte Low Level Format und 780 KByte Fassungsvermögen (mit Systemspuren) braucht man nur die Formatangaben SCP640 mit SCP800 für setfdprm und scp624 mit scp780 für cpmls tauschen. Um nun gezielt alle "COM" Dateien aus dem Nutzerbereich 0 von der CP/M Diskette in das aktuelle Verzeichnis von Linux zu kopieren, gibt man folgendes an: [user@host tryout]$ setfdprm /dev/fd1 SCP640 [user@host tryout]$ cpmcp -f scp624 /dev/fd1 0:*.COM . [user@host tryout]$ _ Das obige setfdprm muss immer dann angegeben werden, wenn die Diskettenverriegelung gelöst wurde, da der Gerätetreiber bei jeder neue eingelegten Diskette seine voreingestellte Formatliste lädt und diese im Regelfall nicht dem gewünschten CP/M Diskettenformat entspricht. Genauso einfach können Dateien auf CP/M Diskette kopiert werden:
[user@host tryout]$ setfdprm /dev/fd1 SCP640 [user@host tryout]$ cpmcp -f scp624 /dev/fd1 *.* 0: [user@host tryout]$ _ Eine gute Möglichkeit der Archivierung alter CP/M Disketten ermöglicht sich durch das lineare Auslesen der Disketten mit dd. So könnte man mit folgenden Kommandos ein Diskettenimage einer 624 KByte SCP Diskette erstellen und mit diesem alle weiteren Diskettenoperationen durchführen:
[user@host tryout]$ setfdprm /dev/fd1 SCP640 [user@host tryout]$ dd if=/dev/fd1 of=cpmdsk-scp640.img bs=256 [user@host tryout]$ cpmls -f scp624 -d cpmdsk-scp640.img DW1 CHN : DW3 CHN : DW5 CHN : DW7 CHN DW COM : MCONFIG COM : MOVE COM : MOVE-IT COM MOVE UCF : MOVIT COM : NEWSWEEP COM : PCMDISK COM PCMFORM COM : PCMVDB COM : PCMVTC COM : PIP COM POWER COM : SCOPY COM : SDCOPY COM : SDIR COM STAT COM : SUBM COM : SUBMIT COM : TP COM TPDRUCK OVR : TPHT OVR : TPINSTD 000 : TPINSTD 001 TPINSTD 002 : TPINSTD COM : TPOVLY0 OVR : VERSION CNF VERSION DIL : XSUB COM : ZAP COM : ZIP COM ZIPIN COM : ZSCRN COM [user@host tryout]$ cpmcp -f scp624 cpmdsk-scp640.img 0:*.* . [user@host tryout]$ cp cpmdsk-scp640.img blank-scp640.img [user@host tryout]$ mkfs.cpm -f scp624 blank-scp640.img [user@host tryout]$ dd if=blank-scp640.img of=/dev/fd1 bs=256 [user@host tryout]$ _ Durch die letzten beiden Anweisungen wird das zuvor gesicherte Diskettenimage mit einer neuen SCP Formatierung mit 624 KByte Fassungsvermögen versehen und anschließend wieder zurück auf die Diskette kopiert (dd). Diese Formatierung erstellt nur ein neues Inhaltsverzeichnis nicht aber eine neue Sektorierung. Daher kann man mit mkfs.cpm auch auf Diskettenimages zugreifen.
Neben der Erstellung eines CP/M Dateisystems (neues Inhaltsverzeichnis) ist die Sektorierung als Low Level Formatierung wichtig bei der Erzeugung neuer CP/M Disketten. Dieser Arbeitsschritt ist normalerweise mit den Werkzeugen der Floppy Disk Utilities zu bewältigen. Aufgrund einiger Probleme mit meiner Hardware oder Software (???) kann ich hierzu noch keine genauen Angaben machen. Ich benutze z.Z. noch vorformatierte Disketten !!!
3 Emulation mit Yet Another Z80 Emulator (YAZE)Mit Yet Another Z80 Emulator (YAZE) kann der 8 Bit Prozessor Z80 komplett emuliert werden. Zusätzlich beinhaltet dieser Emulator einen speziellen, für Z80 Prozessoren geschriebenen Boot Strap Loader zusammen mit den systemunabhängigen CP/M Teilen CCP und BDOS. Das BIOS wird in Form einer C Quelle mit in den Emulator eingebaut. Das erleichtert die Erweiterung bzw. Portierung des Emulators erheblich. Ein Beispiel, wie man mit diesem Emulator ein CP/M System ausschließlich mit emuliertem Code, also einem realen BIOS aufbauen kann, wird von Michael Haardt am Beispiel von CP/M 2.2 (P2DOS) und CP/M 3.0 gezeigt.
Ebenfalls interessant ist die Fortentwicklung von YAZE durch Andreas Gerlich, zu finden unter http://www.mathematik.uni-ulm.de/users/ag/yaze-ag. Seine Arbeiten haben YAZE in die zweite Generation überführt und stehen seit kurzem auch als experimentelles CPM4L Paket zur Verfügung. Hier, an dieser Stelle, wird aber noch ausschließlich auf das Original von Frank D. Cringle eingegangen. Nachdem das Emulatorpaket installiert wurde, existiert unter /opt/cpm4l/bin das Programm yaze. Insofern man noch keine benutzereigene Konfigurationsdatei .yazerc unter $HOME liegen hat, sollte man sich diese von /opt/cpm4l/etc/yazerc nach $HOME/.yazerc kopieren. Normalerweise würde sich der Emulator nach seinem Start mit dem eingebauten Kontroll- und Steuermonitor melden. Durch die globale bzw. die durch das Kopieren angelegte eigene Konfigurationsdatei $HOME/.yazerc werden Anweisungen für diesen Monitor bereitgestellt, die nach dem Start abgearbeitet werden sollen. Die Voreinstellungen der globalen Konfiguration sieht hierfür das Einbinden (mount) des Verzeichnisinhaltes aus /opt/cpm4l/share/yaze/test als CP/M Diskettenlaufwerk A: vor und den anschließenden Emulationsbeginn (go). Ein Aufruf von yaze sollte also folgende Ausschriften liefern: [user@host tryout]$ yaze Yet Another Z80 Emulator version 1.14 (CPM4L 1.0 1.14-20050324), {IMAGE:icons/ungo.gif} Copyright 1995,1998 Frank D. Cringle. yaze comes with ABSOLUTELY NO WARRANTY; for details see the file "COPYING" in the distribution directory. Running '/opt/cpm4l/lib/yaze.boot' A>dir PRELIM .COM | PRELIM .Z80 | TIMEX .COM | ZEXDOC .COM ZEXDOC .Z80 | SYS .AZM | SYS .COM | SAVAGE .COM SAVAGE .PAS | ZEXALL .COM | ZEXALL .Z80 | ZEXLAX .PL A>timex elapsed=4798209.010, user=0.000, sys=0.000 (combine=0,optab=0,cb_inline=0,dfd_inline=0,ed_inline=1) A>sys $>quit [user@host tryout]$ _ Mit dem letzten CP/M Kommando sys wechselt man aus dem Emulationslauf in den Monitor zurück. Mit einem quit im Monitor beendet man das Programm. Eine Übersicht dieser Monitorkommandos und eine ausführliche Dokumentation zum Emulator selbst findet man unter /opt/cpm4l/doc/yaze-1.14/yaze.doc, insofern das Dokumentationspaket mit installiert wurde.
Für die häufige Arbeit mit dem Emulator wird man die eigene Konfigurationsdatei $HOME/.yazerc entsprechen abändern. Man sollte aber immer darauf achten, dass wenigstens die Datei sys.com aus dem Verzeichnis /opt/cpm/share/yaze/test als CP/M Kommando erreichbar ist, da ohne diesem CP/M Kommando der Wechsel aus der Emulation zurück in den Monitor und somit das ordentliche Beenden des Emulators unmöglich ist.
3.1 Erstellung eines PC/M SystemsMangels eines zu den Originalquellen kompatiblen Z80 Macroassemblers unter Linux, muss für die Übersetzung dieser Quellen der Emulator benutzt werden. In ihm werden die alten CP/M Programme ausgeführt. Hierbei sind einige Kopierarbeiten zwischen Linux und CP/M (besser den Diskettenimages für den Emulator) notwendig – das ist aufwändig. Einmal aus diesem Grund und wegen der Möglichkeit, neben den Originalquellen auch eigene Systemquellen übersetzen zu können, habe ich ein PC/M Entwicklerpaket erstellt, mit dem man über Makefiles gesteuert in der Lage sein soll, schnell und effektiv neue oder alte Software für den PC/M auf einem Linux System zu entwickeln und zu übersetzen.Zunächst lädt man sich aus Abschnitt 1 das aktuellste Tarball pcmdevel-yyyymmdd.tar.gz herunter und entpackt es mit tar xvzf pcmdevel-yyyymmdd.tar.gz an geeigneter stelle. Danach wechselt man in das neu entstandene Verzeichnis pcmdevel/system und gibt folgendes ein (eine funktionierende GNU Entwicklungsumgebung wird vorausgesetzt): [user@host tryout]$ make distclean && make >>> change directory am_distclean --- remove am.a PCMSYS.BIN --- remove --- remove cdm_1.scr cdm_2.scr yaze.scr yaze.rc build.dsk --- remove backup stuff --- remove log files --- remove critical error files <<< leave directory am_distclean >>> change directory am_clean --- remove am.a PCMSYS.BIN --- remove --- remove cdm_1.scr cdm_2.scr yaze.scr yaze.rc build.dsk <<< leave directory am_clean --- remove system.a --- remove backup stuff --- remove log files --- remove critical error files >>> change directory am --- build am.a from --- build yaze.scr --- build yaze.rc --- build cdm_1.scr --- build build.dsk CP/M Disk Manager 1.10, Copyright 1995 Frank D. Cringle. cdm comes with ABSOLUTELY NO WARRANTY; for details see the file "COPYING" in the distribution directory. build.dsk mounted as disk A with 32768 of 1048576 bytes allocated 0:LINKMT.COM 0:PCMBAS.MAC 0:PCMDEF.MAC 0:PCMURLAD.MAC 0:M80.COM 0:PCMBIOS.MAC 0:PCMDISK.MAC 0:PCMVAR.MAC 0:BDOS.ERL 0:PCMBOOT.MAC 0:PCMIO.MAC 0:PCMVTAPE.MAC 0:CCP.ERL 0:PCMCOM.MAC 0:PCMSVDB.MAC 186K of 1024K in use --- build cdm_2.scr --- build diskversion at PCMSYS.BIN Yet Another Z80 Emulator version 1.14 (CPM4L 1.0 1.14-20050324), {IMAGE:icons/ungo.gif} Copyright 1995,1998 Frank D. Cringle. yaze comes with ABSOLUTELY NO WARRANTY; for details see the file "COPYING" in the distribution directory. Running '/opt/cpm4l/lib/yaze.boot' A>b: B> B> B> B> B> B>M80 BAS.ERL=PCMBAS.MAC/L/C/M/Z No Fatal error(s) B> B> B> B> B>M80 BIOS.ERL=PCMBIOS.MAC/L/C/M/Z > Uebersetzung System PC/M * Version +++ AM90 +++ > Bildschirm 80*24 > Original PC/M-Tastatur > mit Tonausgabe > mit Statuszeile > Disketten-Urlader > System-RAM-Floppy 118k Byte (Laufwerk A) > Floppy-Laufwerke vorgesehen > V-Tape Kassettensystem > Disketten-Version (auf Adresse 0bff0h linken) > Eingabe: linkmt pcmsys=bas,ccp,bdos,bios/m/p:0bff0 No Fatal error(s) B> B> B> B>LINKMT PCMSYS=BAS,CCP,BDOS,BIOS/M/P:0BFF0 Link/MT+ Release 5.5 Processing file- BAS .ERL Processing file- CCP .ERL Processing file- BDOS .ERL Processing file- BIOS .ERL Undefined Symbols: No Undefined Symbols External Symbol Map: DISKIO E14D BEGVT E3F6 BDOS C800 CCP C000 BIOS D600 0102 (decimal) records written to .COM file Total Data: 0000H bytes Total Code: 32FEH bytes Remaining : 8AACH bytes Link/MT+ Release 5.5 processing completed B> B> B> B>dir M80 .COM | LINKMT .COM | BDOS .ERL | CCP .ERL PCMBAS .MAC | PCMBIOS .MAC | PCMBOOT .MAC | PCMCOM .MAC PCMDEF .MAC | PCMDISK .MAC | PCMIO .MAC | PCMSVDB .MAC PCMURLAD.MAC | PCMVAR .MAC | PCMVTAPE.MAC | PCMBAS .CRF BAS .ERL | PCMBIOS .CRF | BIOS .ERL | PCMSYS .COM B> B> B> B> B>sys $>$>$>$>$> CP/M Disk Manager 1.10, Copyright 1995 Frank D. Cringle. cdm comes with ABSOLUTELY NO WARRANTY; for details see the file "COPYING" in the distribution directory. build.dsk mounted as disk A with 747520 of 1048576 bytes allocated <<< leave directory am --- build system.a from [user@host tryout]$ _ Die Unterscheidung zwischen Diskettenversion und ROM Version wird dabei selbstständig durch den Makefile erledigt. Je nach Konfiguration der Quellen in PCMDEF.MAC unter pcmdevel/system/am/am wird die Art und Weise der Übersetzung gesteuert. Im obigen Fall informiert die Zeile mit --- build diskversion at PCMSYS.BIN, dass eine Diskettenversion erzeugt werden soll, welche anschließend unter pcmdevel/system/am als PCMSYS.BIN abgelegt wird. Der Inhalt dieser Datei kann eins zu eins auf eine bestehende Diskette kopiert werden, z.B. für eine SCP Diskette 624 KByte (4 Systemspuren) mit:
[user@host tryout]$ setfdprm /dev/fd1 SCP640 [user@host tryout]$ dd if=PCMSYS.BIN of=/dev/fd1 bs=256 [user@host tryout]$ _ Nachteilig dabei ist aber die fehlende Initialisierung des CP/M Dateisystems (Inhaltsverzeichnis), es sei denn, man will den restlichen Inhalt nicht löschen! Für eine vollständige Initialisierung kommen wieder die CP/M Tools zum Einsatz:
[user@host tryout]$ setfdprm /dev/fd1 SCP640 [user@host tryout]$ mkfs.cpm -f scp624 -b PCMSYS.BIN /dev/fd1 [user@host tryout]$ _ Mit der Option -b PCMSYS.BIN wird dem Dateisystemersteller mkfs.cpm mitgeteilt, welche Datei in den Bereich der Systemspuren geschrieben werden soll. Diese Methode zusammen mit der Kopie einiger nützlicher transienter CP/M Kommandos und Programme wird benutzt um mit folgender Make-Anweisung eine komplette PC/M Bootdiskette zu erstellen. Dabei ist natürlich wichtig, dass alles so eingestellt ist, dass eine Diskettenversion generiert wird.
[user@host tryout]$ make distclean && make bootdisk ... ... ... [user@host tryout]$ _ 4 InternetreferenzenAbstract of the floppy user guideby Michael HaardtHow to identify an unknown disk using FdutilsFrequently asked question about the Linux floppy driverLow level (physical) formatting tool on USB-FDD (Linux)YAZE by Frank D. CringleYAZE-AG by Andreas GerlichYAZE-AG documentationby Andreas GerlichWarnungWie weiter oben bereits erwähnt, habe ich noch keinen sicheren Weg gefunden, eine Diskette mit einem CP/M Low Level Format zu erzeugen. Daher sind zur Zeit alle Vorgänge beim Erzeugen einer Bootdiskette auf eine vorformatierte Diekstte angewiesen.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Copyright © 2000-2021 by Li-Pro.Net · info (at) li-pro (dot) net · Tel.: +49 (0) 3641 / 21 23 02 · cms: phpwcms | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||