CP/M v2.23

Uebersicht

Linux und Windows sind heute die gaengigen Betriebssysteme auf Mikrocomputern, doch vor Jahren begann alles damit, dass Digital Research das Control Program/Monitor (CP/M) entwickelte. CP/M war eines der ersten echten Betriebssysteme fuer Mikrocomputer und bot eine gemeinsame Moeglichkeit, Anwendungen auf unterschiedlicher Hardware auszufuehren. Jede Maschine, die CP/M ausfuehrt, hat Zugriff auf Tausende von Programmen, und so begann das Bestreben, 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 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:

  1. 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
  2. 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).
Zu diesem Zweck disassemblierte ich das MZ80A-AFI-ROM (das im Repository zu finden ist), um zu verstehen, welche Aktionen es ausfuehrte. Der anfaengliche Ladevorgang prueft, ob die Diskette unter dem MZ80A eine bootfaehige Diskette ist. Beim MZ80K war die Kennung fuer eine bootfaehige Diskette (abgesehen davon, dass das Format sehr unterschiedlich ist und die Daten nicht invertiert werden) 01 + IPLPRO in den Anfangsbytes des ersten Sektors. Beim MZ80B war dies 03 + IPLPRO.

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.


Aktualisierung — direkte Unterstuetzung von MZ-80K-Disketten: Der RFS-CP/M-Bootloader und das CBIOS erkennen das originale MZ-80K-Diskettenformat nun automatisch und direkt, sodass es nicht mehr noetig ist, MZ-80K-Disketten zuerst in das MZ-80A-Format zu konvertieren. Beim Booten ueber die MZ80AFI-Karte meldet der Controller die auf der Diskette vorhandene Sektorgroesse (128 Bytes bei einer MZ-80K-Diskette, 256 Bytes bei einer MZ-80A-Diskette). Eine nicht invertierte Diskette mit 128-Byte-Sektoren, die die Kennung 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

CP/M besteht aus 3 verschiedenen Modulen, CCP (Console Command Processor), BDOS (Basic Disk Operating System) und CBIOS (Custom Basic Input Output System). Im Allgemeinen sind CCP + BDOS standardisiert und das CBIOS wird entsprechend der zugrunde liegenden Hardware angepasst.

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.
Sieht nach einer einfachen Anforderung aus, aber dann muss man bedenken, dass eine Maschine wie der MZ80A kein eigenes BIOS hat und die Firmware in seinem ROM beim Betrieb unter CP/M nach 0xC000 verschoben wird und somit unbrauchbar ist. Auch die Disketten- Steuer-Firmware ist sehr einfach und befasst sich nur mit dem Booten einer Diskette.

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.
Da ich zuvor den Sharp SA-1510 Monitor disassembliert hatte, hatte ich eine gute Ausgangsposition, um die grundlegenden Bildschirm- und Tastaturfunktionen bereitzustellen, das Disassemblieren der Disketten-AFI-Firmware bot einen Einblick in den Code, der erforderlich ist, um eine Diskette zu lesen, insbesondere die Schwachstellen. Der MZ80A ist ein 2-MHz-Computer und verfuegt nicht ueber die Geschwindigkeit, um den Disketten-Ein-/-Ausgabestrom zu bedienen, er muss sich auf ein Stueck Hardware verlassen, das eine ROM-Bank basierend auf dem Data-Request/Ready- Signal des FDC einblendet. Daher erforderten die FDC-Komponenten erhebliche Arbeit. Fuer das Advanced Screen I/O entschied ich mich, den ANSI-Standard zu verwenden, und bezog Ewen McNeills Amstrad CPC Terminal Emulator. Ich dachte zunaechst, es wuerde ein einfaches Extrahieren und Einsetzen seines ANSI-Parsers sein, aber dies stellte sich als groesserer Arbeitsaufwand heraus. Manchmal ist die einfachste Option die schwerste!!

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

Da diese Implementierung von CPM und Custom BIOS 3 verschiedene Diskettenlaufwerk-Controller verwendet, von denen einige zu einem bestimmten Zeitpunkt moeglicherweise nicht vorhanden sind, werden die Laufwerke waehrend des Kaltstarts dynamisch innerhalb von CPM erstellt.

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      
Die Begrenzung der Anzahl der Laufwerke liegt bei CPM (Begrenzung von 16 Laufwerken) und der Menge an RAM, die den Laufwerken zugewiesen wird, gesteuert durch die Variable 'CSVALVEND - CSVALVMEM', die in der Datei CPM_Definitions.asm im Repository festgelegt wird. Die Laufwerks- zuweisung ist dynamisch, sodass bei mehr zugewiesenem Speicher mehr Laufwerke verfuegbar sind. Die SD-Karte kann Hunderte von 16-MB-SD-Diskettenlaufwerken enthalten, das Problem ist also rein der fuer ihre Nutzung zugewiesene RAM.

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)

CP/M fuer RFS wird als Teil des normalen RFS-Builds assembliert und paketiert, daher ist der einfachste Weg, das CBIOS, die CP/M-MZF-Anwendung und die CP/M-Disk-Images zu erzeugen, das automatisierte 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 RFS-Repository, laedt das ~110 MB grosse Inhaltspaket herunter (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

Das Bauen von CP/M beinhaltet das Assemblieren des Z80-Assembler-Quellcodes in ein Maschinencode-Binary und dann das Erstellen einer Bootdiskette, oder im Fall dieser Implementierung ein ROM-basiertes CBIOS und eine bootfaehige Anwendung im MZF-Format, die im ROM gespeichert wird.

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

Die gesamte Entwicklung wurde unter Linux durchgefuehrt, speziell Debian/Ubuntu. Ich verwende Windows zum Flashen der RAMs und zur Nutzung der GUI-Version der CP/M Tools, habe aber keine Zeit darauf verwendet, das RFS unter Windows zu bauen. Ich werde zu gegebener Zeit ein Docker-Image mit allen notwendigen installierten Werkzeugen erstellen, aber in der Zwischenzeit benoetigen Sie, um den Z80-Code und die C-Programme zu assemblieren und mit der CP/M-Software und CP/M-Diskettenimages zu arbeiten, die folgenden Werkzeuge, die Sie beziehen und installieren muessen.

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   
Innerhalb von CP/M werden diese physischen Diskettenformate im Disk Parameter Block wie folgt dargestellt. Normalerweise muessen Sie sich um diese Einstellungen oder die obigen diskdefs nicht kuemmern, es ist nur nuetzlich zu wissen, falls Sie Ihr eigenes benutzerdefiniertes Format hinzufuegen muessen:
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
Um bestehende Sharp-CP/M-Programme zu verwenden, ist es notwendig, die Programme von der Diskette zu extrahieren und in ein von dieser Implementierung erkanntes Format hinzuzufuegen. Zu diesem Zweck beschreiben die folgenden Abschnitte, wie man Daten von den Disketten der jeweiligen Maschinen extrahiert.

Erstellen einer CPM-Diskette

Bei meiner Entwicklung verwendete ich einen Lotharek HxC Floppy Emulator, der an eine Sharp-MZ80-AFI-Schnittstellenkarte angeschlossen war. Mit dieser Anordnung ist es moeglich, jedes Diskettenlaufwerk zu emulieren, mit dem der Sharp MB8866 Floppy Disk Controller kommunizieren kann. So kam ich zu den 3.5"-Formaten und testete sie, da diese Laufwerke noch erhaeltlich sind und ausreichende Kapazitaet fuer die meisten CP/M-Operationen haben.

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

Der Sharp MZ-80A speichert Diskettendaten im invertierten Format — jedes Byte auf der Diskette ist das bitweise Komplement des tatsaechlichen Datenbytes. Dies ist eine Hardware-Eigenschaft des Diskettencontrollers des MZ-80A und bedeutet, dass Raw-Diskettenimages nicht direkt von CPMTools gelesen werden koennen, ohne zuvor jedes Byte zu invertieren.

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/
Nach dem Extrahieren koennen Programme mit CPMTools auf ein neues Diskettenimage in einem der von dieser CP/M-Implementierung unterstuetzten Formate (MZ80A-1440, MZ80A-720, MZ80A-A oder mz80a-rfs) platziert und dann mit samdisk in ein Floppy-Emulator-Image konvertiert werden, wie im Abschnitt Erstellen einer CP/M-Diskette oben beschrieben. Beachten Sie, dass beim Zurueckschreiben auf eine physische Diskette im MZ-80A-Format die Byte-Invertierung umgekehrt angewendet werden muss.

MZ80K-CP/M-Disketten extrahieren

Der Sharp MZ-80K verwendet Standarddaten (nicht invertiert) auf seinen Disketten, sodass keine Bit-Invertierung erforderlich ist. Das Diskettenformat unterscheidet sich jedoch vom MZ-80A und hat eine geringere Kapazitaet — der MZ-80K wurde um 5.25"-Single-Density-Single-Sided-Laufwerke herum entworfen. Der Bootsektor einer MZ-80K-CP/M-Diskette wird durch die Kennungsbytes 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
Es ist keine Byte-Invertierung erforderlich. Sie koennen das RAW-Image direkt mit CPMTools lesen, indem Sie ein geeignetes diskdef fuer das MZ-80K-Format verwenden. Der hier gezeigte CPMTools-Weg bleibt nuetzlich, um den Disketteninhalt zu archivieren oder Dateien in eines der nativ unterstuetzten MZ-80A-Formate (wie MZ80A-1440 oder MZ80A-720) zu uebertragen. Beachten Sie jedoch, dass das RFS-CP/M-CBIOS nun auch originale MZ-80K-CP/M-Disketten direkt lesen kann, und zwar ueber die MZ80AFI-Karte (siehe CP/M Boot Process weiter oben) — die Diskette wird automatisch anhand ihrer 128-Byte-Sektorgroesse erkannt und als CP/M-Laufwerk (typischerweise C:/D:) eingebunden, sodass die Disketten fuer den taeglichen Gebrauch auf echter Hardware oder dem picoZ80 nicht mehr zuerst konvertiert werden muessen.
  # 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

Der Sharp MZ-80B speichert, wie der MZ-80A, Diskettendaten im invertierten Format — jedes Byte auf der Diskette ist das bitweise Komplement der tatsaechlichen Daten. Der MZ-80B-Bootsektor wird durch die Kennungsbytes 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
Verwenden Sie CPMTools mit einem geeigneten MZ-80B-diskdef, um Dateien aus dem verarbeiteten RAW-Image aufzulisten und zu extrahieren. Nach dem Extrahieren kopieren Sie die Programme auf ein unterstuetztes Diskettenimage im MZ-80A-Format zur Verwendung mit RFS, wie im Abschnitt Erstellen einer CP/M-Diskette beschrieben.
  # 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

Die Computer der MZ800-Serie verwenden eine Diskette mit gemischtem Format, wobei die Bootspuren invertierte Daten und die CP/M-Spuren Standarddaten verwenden. Um es noch schlimmer zu machen, ist die Reihenfolge der Spuren so, dass sie Kopf 0 als Spur 0-39 und Kopf 1 als Spur 40-79 anordnen. Um diese Disketten zu verwenden, ist es am besten, die Daten zu extrahieren und sie in eines der von mir erstellten Formate zu kopieren, da ich keinen Sinn darin sehe, zusaetzlichen Code hinzuzufuegen, um dieses seltsame Format zu beruecksichtigen.

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 /software-Verzeichnis.

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]_ zusammengestellt. Ebenfalls enthalten (und mit gebuehrender Anerkennung und (C) fuer seine Arbeit beim Zusammenstellen des Archivs) ist das von Grant Searles MultiComp-Computer, der mehrere Computer in einem (oder mehrere CPU-Typen) ist und einer seiner Modi CP/M ausfuehrt. Grants Archiv ist hervorragend und eine ideale Basis, um CP/M auf dem MZ80A zu verwenden.

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

Fuer Entwickler, die die interne Architektur von CP/M auf dem Sharp MZ verstehen, das CBIOS modifizieren, neue Diskettenformate hinzufuegen oder aus dem Quellcode bauen moechten, steht ein umfassendes CP/M-Entwicklerhandbuch zur Verfuegung. Es behandelt die CCP/BDOS/CBIOS-Schichtung, Speicherkarten fuer sowohl RFS- als auch TZFS-Plattformen, Disk Parameter Blocks, den ANSI-Terminal-Emulator, Speicher-Controller, das Build-System und die CI/CD-Pipeline.

Danksagungen

Wo ich eine Komponente auf dem Design eines Dritten basiert oder verwendet habe, habe ich den Copyright-Hinweis des Originalautors in den Headern eingefuegt oder entsprechende Anerkennung gegeben. Alle Software von Drittanbietern ist nach meinem Wissen und meiner Recherche Open Source und frei nutzbar. Sollte sich herausstellen, dass eine Komponente Lizenzbeschraenkungen unterliegt, wird sie aus diesem Repository entfernt und ein geeigneter Link/Konfiguration bereitgestellt.

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