CP/M v2.23

English

Uebersicht

Linux und Windows sind heute die gaengigen Betriebssysteme, aber vor Jahren begann alles damit, dass Digital Research das Control Program/Monitor (CP/M) erstellte. CP/M war eines der ersten echten Betriebssysteme fuer Mikrocomputer und bot gemeinsame Mittel zum Ausfuehren von Anwendungen auf verschiedener Hardware. Jede Maschine mit CP/M hat Zugang zu Tausenden von Programmen, und so begann die Suche, CP/M auf dem Sharp MZ80A zum Laufen zu bringen.

Eine Version von CP/M wurde von Micro Technology fuer den Sharp MZ80A erstellt, aber da er keinen 80-Spalten-Bildschirm hatte, war er ohne Upgrade nicht sehr nuetzlich. Ich habe das 80-Spalten-Farb-Upgrade-Board und das Rom Filing System mit dem primaeren Ziel entwickelt, CP/M auf dem MZ80A zu realisieren. Die meisten Upgrades der Vergangenheit erfordern Schnitte und Verbindungen an der Original-PCB, was ich ausdruecklich vermeiden wollte -- ich moechte die Original-Hardware so erhalten, wie Sharp sie gebaut hat!

So begann ich, CP/M zum Laufen zu bringen, und entschied mich schliesslich, meine eigene ROM-basierte Version des CBIOS zu schreiben und sie mit dem BDOS+CCP von CP/M v2.23 zu kombinieren.

CP/M-Bootprozess

Der CP/M-Start erfolgt in zwei Phasen:

  1. Mit der originalen AFI-Floppydisk-Steuersoftware einen invertierten Bootsektor einlesen, pruefen, ob er an 0x0000 den Steuercode 0x02 + “IPLPRO” enthaelt, dann die Kontrolle an den eingebetteten Bootloader uebergeben
  2. Ab 0x9C00 CCP, BDOS und CBIOS laden. Das CBIOS uebernimmt die Kontrolle und wendet ein anderes Diskettenformat an.

CBIOS

CP/M besteht aus 3 unterschiedlichen Modulen: CCP (Console Command Processor), BDOS (Basic Disk Operating System) und CBIOS (Custom Basic Input Output System). Generell sind CCP + BDOS Standard, und das CBIOS wird gemaess der zugrunde liegenden Hardware angepasst.

Die folgenden API-Methoden muessen bereitgestellt werden:

API-Methode Beschreibung
BOOT Kaltstart, alle Hardware initialisieren.
WBOOT Warmstart, CCP+BDOS neu laden.
CONST Konsolenstatus – pruefen, ob eine Tastatureingabe wartet.
CONIN Konsoleneingabe – Taste von der Tastatur holen.
CONOUT Konsolenausgabe – ein Zeichen auf den Bildschirm ausgeben.
LIST Listengeraet-Ausgabe (Drucker).
HOME Kopf der aktuellen Disk auf Spur 0 bewegen.
SELDSK Eine Disk auswaehlen/aktivieren.
SETTRK Diskspur fuer die naechste Lese-/Schreiboperation setzen.
SETSEC Disksektor setzen.
SETDMA Disk-Speicheradresse setzen.
READ Einen Disksektor lesen.
WRITE Einen Disksektor schreiben.
SECTRN Sektoruebersetzung (logisch zu physisch).
Die Funktionalitaet wurde wie folgt aufgeteilt:
ROM Adresse Beschreibung
4K MROM 0xC000 - 0xCFFF CBIOS mit CP/M-API, Initialisierungsroutinen, ROM-Disk-Controller.
2K Paged ROM 0xE800 - 0xEFFF, Bank 8 Sound, RTC, Tastatur und Hilfsfunktionen.
2K Paged ROM 0xE800 - 0xEFFF, Bank 9 Bildschirm-I/O und ANSI-Terminal-Parser.
2K Paged ROM 0xE800 - 0xEFFF, Bank 10 SD-Karten-Controller-Funktionalitaet.
2K Paged ROM 0xE800 - 0xEFFF, Bank 11 Floppy-Disk-Controller-Funktionalitaet.

*CPM-Laufwerke*

Da diese CP/M-Implementierung und das Custom-BIOS 3 verschiedene Laufwerkscontroller verwenden, werden die Laufwerke waehrend des Kaltstarts dynamisch in CP/M erstellt.

*Funktionen*

  • Real Time Clock mit 50ms-Granularitaet
  • Interrupt-gesteuerte Tastatur mit Puffer und automatischer Wiederholung
  • Drei-Modus-Tastatursperre: Normal, Caps Lock, Shift Lock
  • ANSI-Terminal-Funktionalitaet
  • Umadressierbare Floppy-Disk-Laufwerke (1.44M, 720K, 320K)
  • Umadressierbare ROM-Laufwerke (240K)
  • Umadressierbare SD-Karten-16MB-Festplatten
  • Verlassen zum Monitor ueber SHIFT+GRAPH+BREAK

Automatische Einrichtung und Erstellung (empfohlen)

CP/M fuer den tranZPUter wird als Teil des normalen TZFS-Builds assembliert und verpackt, daher ist der einfachste Weg, das CBIOS, die CP/M-MZF-Anwendung und die CP/M-Disk-Images zu erzeugen, das automatische Setup-Skript fuer Ihre Plattform. Jedes Skript ist eigenstaendig -- kopieren Sie einfach die eine Datei fuer Ihr Betriebssystem und fuehren Sie sie aus. Es installiert die Voraussetzungen, klont das TZFS-Repository, laedt das ~110 MB grosse Inhaltspaket (TZFS_Files.zip, das die CP/M-Software enthaelt) herunter und kann den 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_TZFS.sh macOS / Linux / WSL Installiert eine Java-JRE (GLASS-Assembler), eine C-Toolchain + make (zum Kompilieren des mitgelieferten cpmtools-Submoduls), perl, git und (unter macOS) GNU coreutils und bash 4 ueber ein generiertes tzfs_env.sh.
setup_TZFS_windows.ps1 Windows 10 / 11 – natives Git Bash, kein WSL Verwendet winget, um Git for Windows und eine Temurin-17-JRE zu installieren, und baut dann ueber Git Bash. Kein C-Compiler erforderlich – ein vorgefertigtes tools\cpmcp.exe ist enthalten.

macOS / Linux / WSL – setup_TZFS.sh

chmod +x setup_TZFS.sh
./setup_TZFS.sh

Windows 10 / 11 (natives Git Bash) – setup_TZFS_windows.ps1, an einer PowerShell-Eingabeaufforderung:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_TZFS_windows.ps1

Die Skripte beachten die Umgebungsvariablen TZFS_REPO_URL (Standard https://git.eaw.app/eaw/TZFS.git) und TZFS_FILES_URL (Speicherort des Inhaltspakets), um die interaktiven Eingabeaufforderungen zu ueberschreiben. Der Build schreibt das TZFS-ROM, das CP/M-CBIOS/MZF und die CP/M-Disk-Images in das Verzeichnis roms/; kopieren Sie sie mit tools/copytosd.sh auf eine FAT32-formatierte SD-Karte. Fuer die vollstaendige Schritt-fuer-Schritt-Anleitung siehe den TZFS Technischen Leitfaden – Build-System.


CPM erstellen

Der Bau von CP/M umfasst das Assemblieren des Z80-Assembler-Quellcodes in eine Maschinencode-Binaerdatei und das Erstellen eines Boot-Mediums.
cd <software>
tools/assemble_cpm.sh

Diskettenformate

Es gibt Hunderte von CP/M-Diskettenformaten. Die hier verwendeten Formate koennen mit cpmtools unter Verwendung der folgenden diskdefs-Definitionen manipuliert werden:
   diskdef MZ80A-A
     seclen 256
     tracks 40
     sectrk 32
     blocksize 2048
     maxdir 64
     skew 0
     boottrk 1
     os 2.2
   end

   diskdef MZ80A-1440
     seclen 512
     tracks 80
     sectrk 36
     blocksize 2048
     maxdir 128
     skew 0
     boottrk 0
     os 2.2
   end

   diskdef MZ80A-SDC16M
     seclen 512
     tracks 1024
     sectrk 32
     blocksize 8192
     maxdir 512
     skew 0
     boottrk 0
     os 2.2
   end

MZ80A CP/M-Disks extrahieren

Der Sharp MZ-80A speichert Floppydisk-Daten im invertierten Format -- jedes Byte auf der Disk ist das bitweise Komplement des eigentlichen Datenbytes. Die Rohdaten muessen zuerst invertiert werden, bevor CPMTools sie lesen kann.
  samdisk copy <MZ80A DISK NAME>.DSK <MZ80A DISK NAME>.RAW --cyls=40 --head=2 --sectors=16 --size=256

  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

  cpmls -f MZ80A-A <MZ80A DISK NAME>_normal.RAW
  cpmcp -f MZ80A-A <MZ80A DISK NAME>_normal.RAW 0:*.* /output/directory/

MZ80K CP/M-Disks extrahieren

Der Sharp MZ-80K verwendet Standard-Daten (nicht invertiert), daher ist keine Bitinvertierung erforderlich.

MZ80B CP/M-Disks extrahieren

Der Sharp MZ-80B speichert wie der MZ-80A Floppydisk-Daten im invertierten Format. Die gleiche Byteumkehrung wie fuer den MZ-80A muss angewendet werden.

Entwicklerhandbuch

Fuer Entwickler, die die interne Architektur von CP/M auf dem Sharp MZ verstehen, das CBIOS aendern, neue Diskettenformate hinzufuegen oder aus dem Quellcode bauen moechten, steht ein umfassendes CP/M-Entwicklerhandbuch zur Verfuegung.

Lizenzen

Dieses Design, Hardware und Software, ist unter der GNU Public Licence v3 lizenziert.