{home}Li-Pro.Net{/home}
Das Familiennetzwerk
Home | Stephan Linz | Projekte | Hobby | Kontakt | Nutzerzugang

Inhalt

CP/M unter Linux
CP/M for Linux (CPM4L)
PC/M Tools

CPMTOOLS, FDUTILS und YAZE

CP/M Retrospektive via Linux

In 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.

Inhalt


1 Übersicht
1.1 notwendige Dateien
2 Diskettenzugriff mit FDUTILS und CPMTOOLS
3 Emulation mit Yet Another Z80 Emulator (YAZE)
3.1 Erstellung eines PC/M Systems
4 Internetreferenzen

1 Übersicht

Mit 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 Dateien

pcmdevel-20021015.tar.gz

PC/M Software Entwicklungspaket
gz, 460K, 12/07/05, 651 downloads

2 Diskettenzugriff mit FDUTILS und CPMTOOLS

Nach 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/diskdefs

diskdef 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), 
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 Systems

Mangels 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), 
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 Internetreferenzen

Abstract of the floppy user guide

by Michael Haardt

How to identify an unknown disk using Fdutils

Frequently asked question about the Linux floppy driver

Low level (physical) formatting tool on USB-FDD (Linux)

YAZE by Frank D. Cringle

YAZE-AG by Andreas Gerlich

YAZE-AG documentation

by Andreas Gerlich

Warnung

Wie 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.

Autor:Stephan Linz
Revision:2011/01/04 - 17:42 - © Li-Pro.Net

stopsoftwarepatents.eu petition banner