CP/M v2.23
Uebersicht
Eine Version von CP/M wurde von Micro Technology fuer den Sharp MZ80A erstellt, aber da diesem ein 80-Spalten-Bildschirm fehlte, war sie ohne eine Erweiterung nicht so nuetzlich. Ein Blick rundherum zeigte, dass Drittanbieter wie Kuma eine 80-Spalten- Erweiterung entwickelten, die man spaeter ueber die SUC beziehen konnte, aber CP/M auf dem MZ80A, obwohl in vielen Artikeln erwaehnt, ist im Jahr 2020 tatsaechlich recht schwer zu bekommen. Verschiedene hervorragende Seiten wie original.sharpmz.org bieten die 80K/80B/800- Versionen an, aber nicht fuer den MZ80A.
Ich entwickelte die 80-Spalten-Farberweiterungsplatine und das Rom Filing System mit dem Hauptaugenmerk darauf, CP/M auf dem MZ80A zu realisieren. Es ist im FPGA-basierten Hardware-Emulator-Projekt sehr einfach, Aenderungen hinzuzufuegen, um verschiedene Spaltenausgaben, Farbe oder Grafik zu beruecksichtigen, aber dies auf der tatsaechlichen Originalhardware mit minimalen Aenderungen an einer Vintage-Maschine zu tun, war eine groessere Herausforderung und auch ein persoenlicher Wunsch, seit ich diese Maschine 1983 erstmals besass. Die meisten Erweiterungen, die man aus der Vergangenheit sieht, erfordern Schnitte und Bruecken an der originalen Platine, was ich ausdruecklich nicht wollte, ich moechte die Originalhardware so erhalten, wie Sharp sie gemacht hat! Die einzige Aenderung, die ich bei meinen Erweiterungen an der originalen Platine vornehme, ist, einen Chip zu sockeln (IC8 74LS165 Video-Schieberegister), was sich recht einfach machen liesse, falls er im Betrieb ausfallen und ersetzt werden wuerde, sodass die Maschine zu 100 % original ist und sehr einfach in ihren urspruenglichen Werkszustand zurueckversetzt werden kann.
So begann ich zu versuchen, CP/M zum Laufen zu bringen, was selbst mit einer Fuelle von Informationen im Netz keine leichte Aufgabe war. Erstens erwies sich die Beschaffung von Micro Technologys Version von CP/M fuer den MZ80A als sehr schwierig, sodass ich auf die MZ80K- und MZ80B-Versionen zurueckgriff. Dann stiess ich auf die verschiedenen kuriosen Diskettenformate, wobei der MZ80A, der darauf ausgelegt ist, invertierte Daten zu lesen, das Durcheinander noch vergroesserte. Um eine lange Geschichte kurz zu machen, entschied ich mich schliesslich, meine eigene ROM-basierte Version des CBIOS zu schreiben und sie mit dem BDOS+CCP von CP/M v2.23 zu verschmelzen. Dieser Abschnitt beschreibt die Informationen zu dieser Arbeit entsprechend.
CP/M-Bootvorgang
Das Booten von CP/M erfolgt in zwei Phasen:
- Mit der originalen AFI-Diskettensteuersoftware wird ein invertierter Bootsektor eingelesen, geprueft, ob er bei 0x0000 den Steuercode 0x02 + “IPLPRO” enthaelt, und dann die Kontrolle an den eingebetteten Bootlader uebergeben
- Laden, beginnend bei 0x9C00, des CCP, BDOS und CBIOS. Das CBIOS uebernimmt nun die Kontrolle und wendet ein anderes Diskettenformat an und verwendet eine andere FDC-Controller-Logik (d. h. invertiert die Daten erneut).
Da ich keine MZ80A-Kopie von CP/M hatte, versuchte ich, die MZ80K-Version zum Laden zu bringen, aber die nicht invertierten Daten bedeuteten, dass ich eine MZ80K-Bootdiskette in ein MZ80A-Format konvertieren musste. Sobald dies erledigt war, versuchte ich, CP/M zu booten, aber es gab Inkompatibilitaeten, zum Beispiel den Diskettencontroller!! Ich verbrachte dann Zeit damit, mir die MZ80B- und MZ800-Versionen von Micro Technologies CP/M anzusehen, die wiederum unterschiedliche Diskettenformate verwendeten, und am Ende entschied ich, dass der beste Ansatz darin bestuende, ein eigenes CP/M zu bauen und mein eigenes CBIOS zu schreiben.
01h + IPLPRO traegt, wird als MZ-80K-CP/M-Diskette erkannt: Die reservierten Systemspuren werden der Reihe nach geladen und die Kontrolle wird an den eingebetteten Bootloader uebergeben (JP 09803H). Sobald das System laeuft, werden originale MZ-80K-CP/M-Disketten direkt zum Lesen als CP/M-Laufwerke C: und D: eingebunden, zusaetzlich zu den SD-Karten- und ROM-Laufwerken. Dies funktioniert auf einem echten MZ-80A mit eingebauter MZ80AFI-Karte sowie auf dem picoZ80, der entweder die MZ-80A- oder die neue MZ-80K-Persona mit einer MZ80AFI-Schnittstelle ausfuehrt.
CBIOS
Alle 3 Komponenten wuerden von der Diskette gebootet, in den Speicher geladen (0x9C00 fuer den MZ80K/A) und die Kontrolle an das CBIOS uebergeben, das die Maschine einrichten wuerde, bevor es die Kontrolle an den CCP uebergibt. Unter normalen Betriebsbedingungen wuerde jede geladene Anwendung das BDOS aufrufen, um Dienste wie das Schreiben auf die Konsole, das Abrufen von Tasteneingaben, den Diskettenzugriff usw. ueber eine wohldefinierte API auszufuehren, aber wenn sie die BDOS-Dienste nicht benoetigte, konnte sie das CBIOS direkt ueber seine API aufrufen und wiederum den CCP+BDOS-RAM nutzen, um mehr Programmplatz zu gewinnen. Wenn eine Anwendung abgeschlossen ist, springt sie zu Vektor 0x0000 und leitet einen Warmstart ein, der das erneute Laden des CCP+BDOS umfasst.
Die Art und Weise, wie CPM geschrieben ist, eignet sich nicht dazu, im ROM gespeichert zu werden, da es sich selbst modifiziert/eingebettete Variablen verwendet, aber fuer das CBIOS ist es eine andere Geschichte. Es ist moeglich, das CBIOS im ROM zu platzieren, um mehr RAM zu gewinnen und Zugriff auf das Rom Filing System mit seinen ausgelagerten ROM-Baenken zu haben, dies ist der Weg, den ich eingeschlagen habe.
Um ein CBIOS zu erstellen, muessen Sie die folgenden API-Methoden bereitstellen:
| API-Methode | Beschreibung |
|---|---|
| BOOT | Kaltstart, alle Hardware initialisieren, bevor der CCP aufgerufen wird. |
| WBOOT | Warmstart, alle Hardware-Aenderungen zuruecksetzen und dann CCP+BDOS neu laden, bevor der CCP aufgerufen wird. |
| CONST | Console Status, pruefen, ob eine Tastatureingabe darauf wartet, gelesen zu werden. |
| CONIN | Console Input, eine Taste von der Tastatur abrufen, warten, wenn keine verfuegbar ist. |
| CONOUT | Console Output, ein Zeichen auf dem Bildschirm ausgeben. |
| LIST | List Device Output, ein Zeichen an das Listing-Geraet ausgeben (d. h. Drucker). |
| PUNCH | Punch Device Output, ein Zeichen an das Stanzgeraet ausgeben (ja, Lochstreifen oder Lochkarten wurden in den 70ern verwendet)! |
| READER | Reader Input, ein Zeichen vom Reader-Geraet eingeben (d. h. Lochstreifen)! |
| HOME | Den Kopf der aktuell ausgewaehlten Diskette auf Spur 0 bewegen. |
| SELDSK | Eine Diskette auswaehlen/aktivieren. |
| SETTRK | Die Diskettenspur fuer den naechsten Lese-/Schreibvorgang festlegen. |
| SETSEC | Den Diskettensektor auf der ausgewaehlten Spur fuer den naechsten Lese-/Schreibvorgang festlegen. |
| SETDMA | Die Disk Memory Address festlegen, den Ort, an dem Daten gelesen/gespeichert werden. |
| READ | Einen Diskettensektor lesen. |
| WRITE | Einen Diskettensektor schreiben. |
| LISTST | List Device Status, pruefen, ob das Listing-Geraet bereit ist, ein neues Zeichen anzunehmen. |
| SECTRN | Sector Translate, logische zu physische Sektoruebersetzung zur Anpassung an spezifische Hardware oder zur Verbesserung der Reaktionsfaehigkeit des Disketten-Subsystems. |
Eine weitere Anforderung ueber die grundlegenden Mechanismen fuer Zeichenein-/-ausgabe hinaus, die CP/M bereitstellt, ist, dass die meisten Anwendungen erwarten, dass ein Smart Terminal vor der CP/M-Maschine sitzt, um erweiterte Bildschirm- und Tastaturfunktionalitaet bereitzustellen. Dies wuerde normalerweise in Form eines Terminals wie eines DEC VT52 oder VT100 erfolgen. Da der MZ80A seinen eigenen Bildschirm und seine eigene Tastatur hat, muss diese intelligente Funktionalitaet geschrieben werden.
Um das CBIOS zu schreiben, muessen daher die folgenden Firmware-Untermodule programmiert werden:
| Untermodul | Beschreibung |
|---|---|
| Basic Screen I/O | Die Low-Level-Funktionen, um ein Zeichen auf dem Bildschirm zu platzieren, den Bildschirm zu loeschen usw. |
| Advanced Screen I/O | Intelligenz, um die Anzeigeausgabe zu positionieren, Bildschirmbereiche zu loeschen, spezielle Attribute wie Fett usw. |
| Keyboard I/O | Tastencodes scannen und zurueckgeben, bei Bedarf auf ASCII abbilden. |
| Disk I/O | Einrichtungen bereitstellen, um mehrere Diskettensektoren zu lesen und zu schreiben. |
All diese Funktionalitaet beansprucht Platz und sie wurde wie folgt aufgeteilt:
| ROM | Adresse | Beschreibung |
|---|---|---|
| 4K MROM (verschobenes Monitor-ROM von 0x0000 - 0x0FFF) | 0xC000 - 0xCFFF | CBIOS, das die CP/M-API, Initialisierungsroutinen, ROM-Disk-Controller-Routinen und Interrupt-Routinen bereitstellt. |
| 2K Paged ROM | 0xE800 - 0xEFFF, Bank 12 | Grundlegender Sound und Melodie, RTC, Tastatur und Hilfsfunktionalitaet. |
| 2k Paged ROM | 0xE800 - 0xEFFF, Bank 13 | Screen I/O und ANSI-Terminal-Parser. |
| 2k Paged ROM | 0xE800 - 0xEFFF, Bank 14 | SD-Karten-Controller-Funktionalitaet. |
| 2k Paged ROM | 0xE800 - 0xEFFF, Bank 15 | Diskettencontroller-Funktionalitaet. |
CPM-Diskettenlaufwerke
Die Reihenfolge der Laufwerke ist in der folgenden Tabelle dargestellt. Originale MZ-80K- (und MZ-80A-) CP/M-Disketten, die ueber die MZ80AFI-Karte gelesen werden, erscheinen in dieser Tabelle als Floppy Disk-Laufwerke — typischerweise C: und D:, wenn zusaetzlich ein ROM-Laufwerk und/oder eine SD-Karte vorhanden ist.
| Rom Drive # | Vorhanden | 0 | 1 | 2 | Vorhanden | 0 | 1 | 2 |
|---|---|---|---|---|---|---|---|---|
| Rom Drive | n/a | A | A,B | n/a | A | A,B | ||
| Floppy Disk | Ja | A,B | B,C | C,D | Nein | |||
| SD Card | Ja | C,D,E,F | D,E,F | E,F,G | Ja | A,B,C,D,E | B,C,D,E | C,D,E,F |
| SD Card | Nein | Ja |
Funktionen
Neben der Standard-BIOS-Funktionalitaet wurden dem CBIOS die folgenden Funktionen hinzugefuegt.
- Echtzeituhr mit 50-ms-Granularitaet
- Interrupt-gesteuerte Tastatur mit Puffer und automatischer Wiederholung.
- Drei-Modus-Tastensperre, Normal, Caps Lock, Shift Lock
- ANSI-Terminal-Funktionalitaet
- Neu zuweisbare Diskettenlaufwerke der Groesse 1.44M, 720K und 320K
- Direktes Booten und Lesen von originalen (nicht konvertierten) MZ-80K-CP/M-Disketten ueber die MZ80AFI-Karte, automatisch anhand der Sektorgroesse erkannt und als Laufwerke C:/D: eingebunden
- Neu zuweisbare ROM-Laufwerke der Groesse 240K (ueber Konfiguration aenderbar)
- Neu zuweisbare SD-Karten-16-MB-Festplatten.
- Beenden zum Monitor ueber SHIFT+GRAPH+BREAK.
Automatisierte Einrichtung und Build (empfohlen)
RFS_Files.zip, das die CP/M-Software enthaelt) und kann den ersten Build fuer Sie ausfuehren, ohne dass tiefgehende Kenntnisse der Toolchain erforderlich sind. Die manuellen, werkzeugweisen Schritte weiter unten sind fuer fortgeschrittene Benutzer und Teil-Neuerstellungen gedacht.
| Skript | Plattform | Hinweise |
|---|---|---|
setup_RFS.sh |
macOS / Linux / WSL | Installiert eine Java-JRE (GLASS-Assembler), eine C-Toolchain + make (zum Kompilieren des mitgelieferten cpmtools-Submoduls), perl, git, unzip, curl und (unter macOS) GNU coreutils. Der erste Build ist ./build.sh -m. |
setup_RFS_windows_native.ps1 |
Windows 10 / 11 — nativ, kein WSL (empfohlen) | Verwendet winget, um Git for Windows und eine Temurin 17 JRE zu installieren, und baut dann ueber Git Bash. Kein C-Compiler erforderlich — vorkompilierte tools\cpmcp.exe und tools\sdtool.exe sind mitgeliefert. |
setup_RFS_windows.ps1 |
Windows 10 / 11 — ueber WSL2 / Ubuntu | Installiert WSL2 + Ubuntu, falls fehlend (einmaliger Neustart), und fuehrt dann setup_RFS.sh innerhalb von Ubuntu aus. |
macOS / Linux / WSL — setup_RFS.sh
chmod +x setup_RFS.sh
./setup_RFS.sh
Windows 10 / 11 (nativ — empfohlen) — setup_RFS_windows_native.ps1, an einer PowerShell-Eingabeaufforderung:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_RFS_windows_native.ps1
Windows 10 / 11 (ueber WSL2) — setup_RFS_windows.ps1, aus einer PowerShell mit Administratorrechten:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_RFS_windows.ps1
Die Skripte beruecksichtigen die Umgebungsvariablen RFS_REPO_URL (Standard https://git.eaw.app/eaw/RFS.git) und RFS_FILES_URL (Speicherort des Inhaltspakets), um die interaktiven Eingabeaufforderungen zu ueberschreiben. Der Build schreibt die Monitor-/User-ROM-Images (mit dem eingepackten CP/M-CBIOS und der CP/M-MZF-Anwendung) und das SD-Karten-Image, das die CP/M-Disk-Images enthaelt, in das Verzeichnis roms/. Fuer die vollstaendige Schritt-fuer-Schritt-Anleitung siehe den RFS Technischen Leitfaden — Build-System.
CPM bauen
Um dies zu erreichen, benoetigen Sie mehrere Werkzeuge und im Moment ist es ein recht manueller Prozess.
Pfade
Zur einfacheren Lesbarkeit beziehen sich die folgenden Kurznamen auf den entsprechenden Pfad in diesem Kapitel.
| Kurzname | |
|---|---|
| [<ABS PATH>] | Der Pfad, in den dieses Repository auf Ihrem System extrahiert wurde. |
| <software> | [<ABS PATH>]/MZ80A_RFS/software |
| <roms> | [<ABS PATH>]/MZ80A_RFS/software/roms |
| <CPM> | [<ABS PATH>]/MZ80A_RFS/software/CPM |
| <tools> | [<ABS PATH>]/MZ80A_RFS/software/tools |
| <MZF> | [<ABS PATH>]/MZ80A_RFS/software/MZF |
| <MZB> | [<ABS PATH>]/MZ80A_RFS/software/MZB |
Werkzeuge
Z80 Glass Assembler - Ein Z80-Assembler zum Konvertieren von Assembler-Dateien in Maschinencode.
samdisk - Ein betriebssystemuebergreifendes kommandozeilenbasiertes Low-Level-Diskettenmanipulationswerkzeug.
cpmtools - Ein betriebssystemuebergreifendes kommandozeilenbasiertes CP/M-Diskettenmanipulationswerkzeug.
CPMToolsGUI - Ein Windows-basiertes GUI-CP/M-Diskettenmanipulationswerkzeug.
z88dk - Ein hervorragendes C-Entwicklungskit fuer die Z80-CPU.
sdcc - Ein weiterer hervorragender Small Device C Compiler, wobei der Z80 eines seiner Ziele ist. z88dk stellt in seinem Paket eine (fuer den Z80) erweiterte Version dieses Werkzeugs bereit.
Software
Das Bauen der Software-Images kann durch Klonen des Repositorys und Ausfuehren einiger der bereitgestellten Shell-Skripte und Binaries erfolgen.
| Skript | Beschreibung |
|---|---|
| assemble_cpm.sh | Ein Shell-Skript, um das CPM-Binary, die CPM-MZF-Format-Anwendung zum Laden ueber RFS und die CPM-ROM-Laufwerke 0 & 1 zu bauen |
| assemble_rfs.sh | Ein Bash-Skript, um die Rom-Filing-System-ROM-Images zu bauen. |
| assemble_roms.sh | Ein Bash-Skript, um alle Standard-MZ80A-ROMs zu bauen, wie z. B. das SA-1510-Monitor-ROM. |
| make_roms.sh | Ein Bash-Skript, um die RFS-ROMs zu bauen, die zur Programmierung in die 512-KByte-Flash-RAMs geeignet sind. Diese Images enthalten die gebankten RFS-ROMs, die verschiedenen System-ROMs wie SA-1510 und alle MZF-Programme, die vom RFS geladen werden sollen. |
| make_cpmdisks.sh | Ein Bash-Skript, um einen Satz von CPM-Disketten zu bauen, zur Verwendung als Raw-Images in der SD-Karte oder den Rom-Laufwerken und als CPC Extended Disk Formats zur Verwendung in einem Diskettenemulator oder zum Kopieren auf physische Medien. |
| make_sdcard.sh | Ein Bash-Skript, um ein SD-Karten-Image zu erstellen, das das RFS-Image und mehrere CPM-Diskettenlaufwerke kombiniert. Dieses Image wird dann binaer auf die SD-Karte kopiert und im RFS-SD-Kartenleser installiert. |
| mzftool.pl | Ein Perl-Skript, um MZF-Images zu erstellen/extrahieren und zu manipulieren. |
| processMZFfiles.sh | Ein Bash-Skript, um einen Satz von MZF-Programmen in sektorierte Images umzuwandeln, die zur Verwendung in den Rom-Filing-System-ROMs geeignet sind. |
| sdtool | Ein Binary, das im src/tools-Repository erstellt wird und das RFS-SD-Karten-Image baut, ein Verzeichnis erstellt und MZF/Binary-Anwendungen in das Laufwerks-Image hinzufuegt. |
Das CP/M-System wird in 4 Teilen gebaut,
1. die cpm22.bin, die den CCP, das BDOS und einen CBIOS-Stub enthaelt.
2. das gebankte CBIOS, dessen Hauptquelle in einem 4K-ROM und 4 gebankten 2K-ROMs liegt. Diese
werden zum Hinzufuegen in das RFS-Banked-Monitor-ROM und das Banked-User-ROM generiert.
3. bis zu 2 (derzeit) Read-Only-CP/M-ROM-Laufwerke, die jedem CP/M-Laufwerksbuchstaben
zugewiesen werden koennen.
4. Konvertierung der in 1. und 3. generierten Binaries in sektorierte MZF-Images, die geeignet sind,
direkt in das Rom Filing System als einfach ein weiteres Programm hinzugefuegt zu werden.
All das Obige ist im Bash-Skript assemble_cpm.sh kodiert, das wie folgt ausgefuehrt werden kann:
cd <software>
tools/assemble_cpm.sh
Das Skript ist derzeit so eingestellt, dass es 1 Read-Only-CPM-ROM-Laufwerk generiert. Um ein zweites CPM-ROM-Laufwerk hinzuzufuegen, befolgen Sie diese Anweisungen:
1. Edit the <tools>/make_cpmdisks.sh script and change the
variable:
from BUILDCPMLIST="cpm22 CPM_RFS_1"
to BUILDCPMLIST="cpm22 CPM_RFS_1 CPM_RFS_2"
change the variable:
from SOURCEDIRS="CPM_RFS_[1] CPM[0-9][0-9]_* CPM_MC_5 CPM_MC_C? CPM_MC_D? CPM_MC_E? CPM_MC_F? CPM[0-9][0-9]_MZ800*" to
to SOURCEDIRS="CPM_RFS_[1-2] CPM[0-9][0-9]_* CPM_MC_5 CPM_MC_C? CPM_MC_D? CPM_MC_E? CPM_MC_F? CPM[0-9][0-9]_MZ800*"
2. Create a directory (if it doesn't exist):
<CPM>/CPM_RFS_2
3. Fill the directory with required CPM files to be placed in the ROM.
4. Build the image by running the make_cpmdisks.sh script or as part of the sequence of commands listed below.
Um CPM zu verwenden, ist es notwendig, die MonitorROM- und USERROM-Images zu erstellen, die in die 2x512-KByte-Flash-RAMs programmiert werden koennen. Geben Sie die folgenden Befehle ein, um CPM zusammen mit dem gesamten RFS, den ROMs und Anwendungen im ROM zu bauen:
cd <software>
tools/assemble_cpm.sh
tools/assemble_rfs.sh
tools/assemble_roms.sh
tools/make_cpmdisks.sh
tools/make_roms.sh
tools/make_sdcard.sh
Die Ausgabe der obigen Befehle sind die ROM-Images <roms>/MROM_256.bin und <roms>/USER_ROM.256.bin, die in 512-KByte-Flash-RAMs geflasht und in die Sockel auf dem RFS-Adapter eingesteckt werden muessen.
Die CPM-Diskettenimages befinden sich in <CPM>/1M44/RAW fuer die Raw-Images oder <CPM>/1M44/DSK fuer die Diskettenimages im CPC-Extended-Format. Diese Images werden aus den Verzeichnissen in <CPM> erstellt, wobei jedes Verzeichnis, das mit CPM* beginnt, in ein 1.44-MB-Laufwerks-Image gepackt wird. Hinweis: Zusaetzlich werden die Verzeichnisse auch in alle anderen unterstuetzten Disketten als Images in einem entsprechenden Verzeichnis gepackt, d. h. <CPM>/SDC16M fuer das 16-MB-SD-Karten-Laufwerks-Image.
Das SD-Karten-Image befindet sich in <roms>/SHARP_MZ80A_RFS_CPM_IMAGE_1.img, das am Anfang das RFS-Disketten-Image <roms>/SHARP_MZ80A_RFS_IMAGE_1.img enthaelt, gefolgt von sieben CP/M-Format-Laufwerks-Images, die, wie oben, in <CPM>/SDC16M/RAW gespeichert sind. Diese Images werden aus den Verzeichnissen in <CPM> erstellt, werden aber manuell in die endgueltigen Images hinzugefuegt, indem sie im Skript make_cpmdisks.sh fest kodiert werden.
Die Anwendungen, die in den ROM-Laufwerken gespeichert sind, befinden sich im Verzeichnis <MZF>. Kopieren Sie alle gewuenschten Anwendungen in dieses Verzeichnis und geben Sie dann den folgenden Befehl ein, um sie in sektorgerundete Images zu verarbeiten, die im Verzeichnis <MZB> gespeichert werden.
cd <software>
tools/processMSFfiles.sh
Die tatsaechlichen Anwendungen, die in das ROM gebaut werden, werden im Skript <tools>/make_roms.sh ausgewaehlt. Dieses Skript listet alle erforderlichen Anwendungen auf und es packt so viele, wie der Platz zulaesst, in das ROM. Um sicherzustellen, dass Ihre Anwendung im ROM erscheint, fuegen Sie sie an den Anfang der Liste hinzu (nur der Dateiname, nicht die .MZF-Erweiterung), d. h.:
Edit the file <tools>/make_roms.sh
Locate the line: ROM_INCLUDE=
Below this line, add your application in the format: ROM_INCLUDE+="${MZBPATH}/<YOUR APPLICATION>.${SECTORSIZE}.bin"
ie. ROM_INCLUDE+="${MZB_PATH}/A-BASIC_SA-5510.${SECTORSIZE}.bin:"
Save the file and run the commands above to build the MonitorROM and USERROMs.
Diskettenformate
Wie ich herausgefunden habe, gibt es Hunderte von CP/M-Diskettenformaten und allein die Sharp-Serie implementiert 2-3 pro Maschine. Bei der Entscheidung, welches Format ich fuer diese Implementierung von CP/M verwenden sollte, habe ich mir die bestehenden Formate angesehen. Da ich keinen Zugriff auf originale Sharp-MZ80A-Disketten hatte und diese ohnehin in invertiertem Nicht-Standard-Format vorliegen, der MZ80B dem MZ80A aehnlich ist, aber eine etwas hoehere Kapazitaet hat, der MZ800 ein Hybrid ist und der MZ80K eine geringe Kapazitaet hat, entschied ich mich, Standardformate fuer 1.44MB-, 720K-3.5”-Disketten zu verwenden, das gleiche physische Format wie die Sharp-MZ80A-Disketten und das ROM-basierte 240K-Rom-Laufwerk.
Die Formate, die ich verwende, koennen von cpmtools mit den folgenden diskdefs-Definitionen manipuliert werden, platzieren Sie das Obige in die diskdefs-Datei, die sich bei den cpmtools oder CPMToolsGUI befindet, um sie zu verwenden:
# 320K Disk for the MZ80A - Same format as the MZ800
# but implements a cylinder in uniform manner (ie. 1 cyl
# = 1 track x 2(heads) where as the MZ800 implements as
# 160 tracks, 80 x Head 1 0->79 then 80 x Head 2 80->159.
diskdef MZ80A-A
seclen 256
tracks 40
sectrk 32
blocksize 2048
maxdir 64
skew 0
boottrk 1
os 2.2
end
# A standard format 1.44Mb Floppy format for the MZ80A
diskdef MZ80A-1440
seclen 512
tracks 80
sectrk 36
blocksize 2048
maxdir 128
skew 0
boottrk 0
os 2.2
end
# A standard format 720K Floppy format for the MZ80A.
diskdef MZ80A-720
seclen 256
tracks 80
sectrk 36
blocksize 2048
maxdir 128
skew 0
boottrk 0
os 2.2
end
# A 240K Rom Filing System ROM Drive image.
diskdef mz80a-rfs
seclen 128
tracks 15
sectrk 128
blocksize 1024
maxdir 32
skew 0
boottrk 0
os 2.2
end
# A 16Mb fixed disk SD Card Image.
diskdef MZ80A-SDC16M
seclen 512
tracks 1024
sectrk 32
blocksize 8192
maxdir 512
skew 0
boottrk 0
os 2.2
end
| Definition | MZ80A 320K | Rom Filing System | 1.44MB 3.5” | 720K 3.5” | 16MB SD Card Image |
| SPT | 64 | 128 | 144 | 72 | 128 |
| BSH | 4 | 3 | 4 | 4 | 6 |
| BLM | 15 | 7 | 15 | 15 | 63 |
| EXM | 1 | 0 | 0 | 0 | 3 |
| DSM | 155 | 240 | 719 | 359 | 2047 |
| DRM | 63 | 31 | 127 | 127 | 511 |
| AL0 | 128 | 128 | 192 | 192 | 192 |
| AL1 | 0 | 0 | 0 | 0 | 0 |
| CKS | 16 | 8 | 32 | 32 | 0 |
| OFF | 1 | 0 | 0 | 0 | 0 |
Erstellen einer CPM-Diskette
Um eine CP/M-Diskette zu erstellen, die auf dem Sharp MZ80A mit dieser Implementierung von CP/M verwendet werden kann, muessen Sie die obigen Definitionen zu Ihrer cpmtools-diskdefs-Datei hinzufuegen. Sobald hinzugefuegt, kopieren Sie entweder eines der leeren Images in \<CPM\>/BLANKFD unter einem neuen Namen und verwenden es als Zieldiskette oder erstellen eines innerhalb von CPMTools mit der Disk-Definition. Anschliessend fuegen Sie der neuen Diskette die erforderlichen Programme hinzu, was in CPMToolsGUI einfach ein Drag-and-Drop-Vorgang ist.
Um das neue Raw-CP/M-Image im Floppy Emulator oder einem echten Diskettenlaufwerk zu verwenden, ist es notwendig, das Raw-Image in ein Format zu konvertieren, das die meisten Diskettenwerkzeuge lesen und auf eine Diskette schreiben koennen. Im Falle des Lotharek Floppy Emulator wird mit ihrem Werkzeug HxCFloppyEmulator v2.2.2.1 ueber Load und Export to HFE ein geeignetes SD-Image generiert, um eine echte Diskette nachzubilden.
Um das Image zu konvertieren, verwenden Sie eines der folgenden:
For 1.44MB Drives use:
./samdisk copy <RAW IMAGE FILE, ie. CPM00_SYSTEM.RAW> <DSK IMAGE FILE, ie.CPM00_SYSTEM.DSK> --cyls=80 --head=2 --gap3=78 --sectors=36 --interleave=4
Samdisk will automatically recognise the format from the size of the file, ie. 1474560 bytes
For 720K Drives use:
./samdisk copy <RAW IMAGE FILE, ie. CPM00_SYSTEM.RAW> <DSK IMAGE FILE, ie.CPM00_SYSTEM.DSK> --cyls=80 --head=2 --gap3=78 --sectors=36 --size=2 --interleave=4
Samdisk will automatically recognise the format from the size of the file, ie. 737280 bytes
For the MZ80A 320K Drives use:
./samdisk copy CPM00_320K_SYSTEM.RAW CPM00_320K_SYSTEM.DSK --cyls=40 --gap3=78 --head=2 --sectors=16
Samdisk will automatically recognise the format from the size of the file, ie. 327680 bytes
The RFS ROM Drive does not need conversion, the RFS functionality assumes a raw image.
NB. Don't use Samdisk v4, it has a bug where it will place a random sector at the start of the disk. Many hours debugging were lost due to this bug. Best to use
samdisk v3.8.8
Die obigen samdisk-Befehle erstellen ein Amstrad-CPC-Extended-DSK-Format-Image, das von Lotharek HxCFloppyEmulator oder Werkzeugen zum Beschreiben physischer Disketten gelesen und verarbeitet werden kann.
MZ80A-CP/M-Disketten extrahieren
Die meisten online verfuegbaren MZ-80A-CP/M-Diskettenimages liegen im EDSK-Format (Amstrad CPC Extended DSK) vor. Die Diskettengeometrie ist 40 Zylinder, 2 Koepfe, 16 Sektoren pro Spur, 256 Bytes pro Sektor (320KB insgesamt).
Verwenden Sie samdisk, um das EDSK-Image in ein flaches RAW-Image zu konvertieren:
samdisk copy <MZ80A DISK NAME>.DSK <MZ80A DISK NAME>.RAW --cyls=40 --head=2 --sectors=16 --size=256
Fuehren Sie den folgenden Befehl aus, um jedes Byte im RAW-Image zu invertieren und so das invertierte MZ-80A-Format in Standarddaten umzuwandeln, die CPMTools verarbeiten kann:
python3 -c "import sys; sys.stdout.buffer.write(bytes(~b & 0xFF for b in open('<MZ80A DISK NAME>.RAW','rb').read()))" > <MZ80A DISK NAME>_normal.RAW
Verwenden Sie das MZ80A-A-diskdef (im obigen Abschnitt zu den Disk-Definitionen definiert) mit CPMTools, um Dateien aus dem verarbeiteten Image aufzulisten und zu extrahieren:
# List files on the disk
cpmls -f MZ80A-A <MZ80A DISK NAME>_normal.RAW
# Copy all files to a local directory
cpmcp -f MZ80A-A <MZ80A DISK NAME>_normal.RAW 0:*.* /output/directory/
MZ80K-CP/M-Disketten extrahieren
01h gefolgt von der ASCII-Zeichenkette IPLPRO am Anfang des ersten Sektors identifiziert.
MZ-80K-CP/M-Diskettenimages sind typischerweise im EDSK- oder Raw-Format verfuegbar. Die Diskettengeometrie ist 40 Zylinder, 1 Kopf, 18 Sektoren pro Spur, 128 Bytes pro Sektor (etwa 90KB).
Verwenden Sie samdisk, um das Raw-Image aus einer EDSK-Quelle zu extrahieren:
samdisk copy <MZ80K DISK NAME>.DSK <MZ80K DISK NAME>.RAW --cyls=40 --head=1 --sectors=18 --size=128
# List files (adjust diskdef name to match your MZ-80K diskdef entry)
cpmls -f mz80k <MZ80K DISK NAME>.RAW
# Extract all files
cpmcp -f mz80k <MZ80K DISK NAME>.RAW 0:*.* /output/directory/
MZ80B-CP/M-Disketten extrahieren
03h gefolgt von IPLPRO am Anfang des ersten Sektors identifiziert, was ihn von den MZ-80A- (01h) und MZ-80K- (01h) Varianten unterscheidet.
Der MZ-80B hat eine etwas hoehere Diskettenkapazitaet als der MZ-80A und verwendet 40 Zylinder, 2 Koepfe, 18 Sektoren pro Spur, 256 Bytes pro Sektor (etwa 368KB). Die meisten verfuegbaren Diskettenimages liegen im EDSK-Format vor.
Verwenden Sie samdisk, um das EDSK-Image in ein flaches RAW-Image zu konvertieren:
samdisk copy <MZ80B DISK NAME>.DSK <MZ80B DISK NAME>.RAW --cyls=40 --head=2 --sectors=18 --size=256
Wenden Sie dieselbe Byte-Invertierung wie beim MZ-80A an, um die invertierten Daten in das Standardformat umzuwandeln:
python3 -c "import sys; sys.stdout.buffer.write(bytes(~b & 0xFF for b in open('<MZ80B DISK NAME>.RAW','rb').read()))" > <MZ80B DISK NAME>_normal.RAW
# List files (adjust diskdef name to match your MZ-80B diskdef entry)
cpmls -f mz80b <MZ80B DISK NAME>_normal.RAW
# Extract all files
cpmcp -f mz80b <MZ80B DISK NAME>_normal.RAW 0:*.* /output/directory/
MZ800-CP/M-Disketten extrahieren
Verwenden Sie samdisk, um das EDSK (Extended DSK Format, das fuer die Amstrad-CPC-Maschine erstellt wurde, die meisten MZ800-Disketten scheinen in diesem Format zu sein) in ein RAW-Image zu konvertieren.
samdisk copy <MZ800 DISK NAME>.DSK <MZ800 DISK NAME>.RAW --cyls=40 --head=2 --sectors=8 --size=256
Fuehren Sie die folgenden Bash-Befehle aus, um die oben erhaltene RAW-Format-Diskette in etwas umzuwandeln, das von CPMTools gelesen werden kann.
mv <MZ800 DISK NAME>.RAW workingfile.raw
> total
dd if=workingfile.raw of=total count=8192 bs=1
for i in $(seq 8192 8192 327680); do
dd if=workingfile.raw of=blob skip=$i bs=1 count=4096
cat blob >> total
echo $i
done
for i in $(seq 12288 8192 327680); do
dd if=workingfile.raw of=blob skip=$i bs=1 count=4096
cat blob >> total
echo $i
done
mv total <MZ800 DISK NAME>.RAW
Sie benoetigen die folgende diskdefs-Definition, um die Daten aus dem verarbeiteten RAW-Image zu lesen.
# Definition for the MZ800 CP/M Boot Disk. The reserved
# track is in inverted data format but this is skipped in
# CPM Tools.
diskdef mz800-BOOT
seclen 256
tracks 80
sectrk 16
blocksize 2048
maxdir 64
skew 0
boottrk 1
os 2.2
end
# Definition for the MZ800 CP/M Data disk. No reserved tracks.
diskdef mz800-DATA
seclen 256
tracks 80
sectrk 16
blocksize 2048
maxdir 64
skew 0
boottrk 0
os 2.2
end
CP/M-Archive
Ich habe die CP/M-Archive aus Gitea entfernt, da es nicht der Ort ist, um Dateien zu speichern/archivieren. Bitte laden Sie die Zip-Datei herunter, falls Sie sie benoetigen, und entpacken Sie sie in
Ihrem
Die Dateien im Archiv sind ausgewaehlte Programme und stammen aus verschiedenen CP/M-Archiven und sind in Verzeichnissen mit der Namenskonvention CPM[0-9[0-9]_
Um die Archive in einen Satz von 1.4MB-Diskettenimages zu bauen, die zur Verwendung in einem 3.5”-Laufwerk oder Floppy Emulator geeignet sind, fuehren Sie den Befehl aus:
cd <software>
tools/make_cpmdisks.sh
Die Disketten werden im Verzeichnis erstellt: <CPM>/1M44/DSK.
Dieses Skript baut auch die 16-MB-SD-Karten-Laufwerks-Images unter Verwendung einer Kombination der Archive. Die Kombination ist innerhalb des Skripts fest kodiert.
CP/M-Handbuecher
| Handbuch | Beschreibung |
|---|---|
| User Manual | CP/M v2.2 Benutzerhandbuch. |
| SID | Symbolic Instruction Debugger Benutzerhandbuch. |
| ED | EDitor Benutzerhandbuch. |
| MAC | Macro Assembler Benutzerhandbuch. |
| ASM | Z80/8080 Assembler Benutzerhandbuch. |
| DDT | Dynamic Debugging Tool Benutzerhandbuch. |
Entwicklerhandbuch
Danksagungen
Lizenzen
Dieses Design, Hardware und Software, ist unter der GNU Public Licence v3 lizenziert.
Die GNU General Public License v3
Die Quell- und Binaerdateien in diesem Projekt, die als GPL v3 gekennzeichnet sind, sind freie Software: Sie koennen sie unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veroeffentlicht, weitergeben und/oder modifizieren, entweder Version 3 der Lizenz oder (nach Ihrer Wahl) jede spaetere Version.
Die Quelldateien werden in der Hoffnung verteilt, dass sie nuetzlich sind, jedoch OHNE JEDE GEWAEHRLEISTUNG; auch ohne die implizite Gewaehrleistung der MARKTFAEHIGKEIT oder EIGNUNG FUER EINEN BESTIMMTEN ZWECK. Siehe die GNU General Public License fuer weitere Details.
Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, siehe http://www.gnu.org/licenses/.