tranZPUter-Dateisystem (TZFS) -- Entwicklerhandbuch

TZFS Entwicklerhandbuch

Dieses Handbuch ist eine detaillierte Durchgehung des TZFS-Quellcodes (tranZPUter Filing System) und der Entwicklungsumgebung. Es erklaert Z80-Assembler-Konzepte fuer Entwickler, die moeglicherweise nicht mit der Sprache vertraut sind, fuehrt durch jedes Quellmodul, dokumentiert die TZMM-Bank-Switching-Architektur und zeigt, wie neue Befehle hinzugefuegt, vorhandene Module geaendert und TZFS auf neue Hardwareplattformen portiert werden koennen.
Fuer Hardwarearchitektur und Build-System-Details siehe den Technischen Leitfaden. Fuer die benutzerorientierte Bedienung siehe das Benutzerhandbuch.

Einfuehrung in Z80-Assembler fuer Nicht-Assembler-Programmierer

Register
Der Z80 hat keine "Variablen" -- stattdessen hat er einen kleinen Satz von Registern (schnelle Speicherorte innerhalb der CPU):
Register Groesse Rolle
A 8-Bit Akkumulator – das primaere Register fuer Arithmetik, Logik und I/O-Operationen.
B, C 8-Bit Allgemein. BC zusammen bildet ein 16-Bit-Paar, haeufig als Schleifenzaehler verwendet.
D, E 8-Bit Allgemein. DE zusammen ist ein 16-Bit-Paar, haeufig als Quell- oder Zielzeiger.
H, L 8-Bit Allgemein. HL zusammen ist der Haupt-16-Bit-Speicherzeiger.
IX, IY 16-Bit Indexregister – fuer Basis+Offset-Speicheradressierung.
SP 16-Bit Stack Pointer – zeigt auf die Spitze des Aufrufstapels.
PC 16-Bit Program Counter – die Adresse des aktuellen Befehls.
F 8-Bit Flags-Register – Z (Zero), C (Carry), S (Sign), P/V (Parity/Overflow).

Wichtige Befehle
  • LD dest, src -- Laden (kopieren) von Daten.
  • CALL addr -- Unterprogramm aufrufen.
  • RET -- Aus Unterprogramm zurueckkehren.
  • JP addr -- Unbedingter Sprung.
  • DJNZ offset -- B dekrementieren und springen wenn nicht Null.
  • IN A, (port) / OUT (port), A -- I/O-Port lesen/schreiben.
  • PUSH rr / POP rr -- 16-Bit-Registerpaar auf dem Stack speichern/wiederherstellen.

GLASS-Assembler-Syntax
  • Kommentare beginnen mit ;.
  • EQU definiert eine Konstante: MMCFG EQU 060H.
  • DB (Define Byte) fuegt Rohbytes ein.
  • DW (Define Word) fuegt 16-Bit Little-Endian-Werte ein.
  • ORG addr setzt den Assemblierungsursprung.
  • IF / ENDIF bedingte Assemblierung.

Quellbaum

Pfad Inhalt
asm/tzfs.asm Bank 0: Einstiegspunkt, Initialisierung, Befehlsdispatcher, Sprungtabellen
asm/tzfs_bank2.asm Bank 1: Nachrichten, Hilfebildschirm, Druckroutinen, Sharp/ASCII-Konvertierung
asm/tzfs_bank3.asm Bank 2: Speicher-Utilities, I/O-Port R/W, Tape-Kompensation, CPU/Emulationsbefehle
asm/tzfs_bank4.asm Bank 3: Vollstaendiger Z80-Assembler und -Disassembler (belegt 52 KB)
asm/include/ Gemeinsame Definitionen und Konfigurationsdateien
asm/include/tzfs_definitions.asm Alle Konfigurationskonstanten und I/O-Port-Definitionen
asm/include/tzfs_svcstruct.asm K64F-Servicebefehl- und Strukturdefinitionen
build.sh Top-Level-Build-Skript
tools/ Build-Werkzeuge einschliesslich glass.jar

Konfiguration: tzfs_definitions.asm

Build-Ziel-Flags
BUILD_FUSIONX EQU 0    ; 1 = running on tranZPUter FusionX hardware
BUILD_PICOZ80 EQU 1    ; 1 = running on picoZ80 board
ENADEBUG      EQU 0    ; 1 = enable additional diagnostic output

Adresskonstanten
UROMADDR    EQU 0E800H   ; Base address of the TZFS entry point
TZVARMEM    EQU 0EC80H   ; TZFS variable block
TZSVCMEM    EQU 0ED80H   ; K64F service communication block
BANKRAMADDR EQU 02000H   ; Base address for bank4 assembler/disassembler tables

TZMM-Modus-Konstanten
MMCFG       EQU 060H     ; I/O port for memory management config register
TZMM_TZFS   EQU 022H     ; Mode 0x22: bank 0 — main TZFS code
TZMM_TZFS2  EQU 023H     ; Mode 0x23: bank 1 — tzfs_bank2
TZMM_TZFS3  EQU 024H     ; Mode 0x24: bank 2 — tzfs_bank3
TZMM_TZFS4  EQU 025H     ; Mode 0x25: bank 3 — tzfs_bank4

Bank-Switching im Detail

Bank-Switching ist der zentrale Architekturmechanismus von TZFS. Das native Monitor-ROM belegt 0x0000-0xDFFF. Das User-ROM-Fenster bei 0xE800-0xEFFF gibt TZFS nur 2 KB permanent sichtbaren Adressraum -- viel zu klein fuer das gesamte System. Banking ermoeglicht es TZFS, verschiedene Code-Module im selben Adressbereich bei Bedarf darzustellen.
TZMM-Modus Wert 0xE800-0xEFFF 0xF000-0xFFFF Verwendet von
TZMM_TZFS 0x22 TZFS-Kern (Bank 0) TZFS-Kern (Bank 0) Normalbetrieb
TZMM_TZFS2 0x23 TZFS-Kern (Bank 0) tzfs_bank2 (Bank 1) Hilfe, Nachrichten
TZMM_TZFS3 0x24 TZFS-Kern (Bank 0) tzfs_bank3 (Bank 2) Speicher-Utilities, Emulation
TZMM_TZFS4 0x25 – tzfs_bank4 (Bank 3) Assembler/Disassembler

Befehlstabellenformat (tzfs.asm)
; One TZFS command table entry:
;   DB  FLAGS          ; 1 byte: END|MATCH|BANK[5:3]|SIZE[2:0]
;   DB  "COMMAND"      ; SIZE bytes: the command string
;   DW  HANDLER_ADDR   ; 2 bytes: handler routine address

Sprungtabellen

Externe Sprungtabelle bei 0xE880 (TZFSJMPTABLE)
CMT_RDINF  EQU UROMADDR+80H  ; 0xE880
CMT_RDDATA EQU UROMADDR+83H  ; 0xE883
CMT_WRINF  EQU UROMADDR+86H  ; 0xE886
CMT_WRDATA EQU UROMADDR+89H  ; 0xE889
CMT_VERIFY EQU UROMADDR+8CH  ; 0xE88C
CMT_DIR    EQU UROMADDR+8FH  ; 0xE88F
CMT_CD     EQU UROMADDR+92H  ; 0xE892
SET_FREQ   EQU UROMADDR+95H  ; 0xE895

Inter-Bank-Funktions-Stubs (?-Praefix)
Jede Funktion, die von einer anderen Bank als der, in der sie sich befindet, aufgerufen werden muss, hat einen entsprechenden ?-praefixierten Stub in tzfs.asm. Der Aufrufer schreibt einfach CALL ?PRINTMSG und der Bank-Switch wird transparent gehandhabt.

Modul-Durchgaenge

tzfs.asm -- Befehlsdispatcher (Bank 0, TZMM_TZFS)
Der Einstiegspunkt fuer alle TZFS-Funktionalitaet. Enthaelt die externe Sprungtabelle, Inter-Bank-Stub-Tabelle, Befehlstabelle (CMDTABLE), Hauptdispatcher-Schleife und Variablenspeicher.

tzfs_bank2.asm -- Nachrichten und Hilfe (Bank 1, TZMM_TZFS2)
Alle benutzerorientierten Textausgaben: Zeichensatzkonvertierung (PRINTASCII), formatierter Nachrichtendruck (PRINTMSG), Dateinamensanzeige (PRTFN) und der Hilfebildschirm (HELPSCR).

tzfs_bank3.asm -- Utilities (Bank 2, TZMM_TZFS3)
Speicherbearbeitung, Hex-Dump, Blockkopie, Fuellen, I/O-Portzugriff, Tape-Kompensation, Hardwareemulationssteuerung, CPU-Umschaltung und Videomodus-Steuerung.

tzfs_bank4.asm -- Assembler / Disassembler (Bank 3, TZMM_TZFS4)
Vollstaendiger interaktiver Z80-Assembler und -Disassembler. Diese Bank ist architektonisch einzigartig: TZMM_TZFS4 bildet Bank 3 ueber den gesamten User-RAM-Bereich (0x1200-0xCFFF) sowie 0xF000-0xFFFF ab, was 52 KB Arbeitsplatz ergibt.

K64F-Serviceaufrufe

; Step 1 — Set command and parameters
LD   A, TZSVC_CMD_LOADFILE
LD   (TZSVCCMD), A

; Step 2 — Signal request to K64F
LD   A, TZSVC_STATUS_REQUEST
LD   (TZSVCRESULT), A
OUT  (SVCREQ), A

; Step 3 — Poll result
WAIT:
    LD   A, (TZSVCRESULT)
    CP   TZSVC_STATUS_REQUEST
    JR   Z, WAIT

; Step 4 — Check result
LD   A, (TZSVCRESULT)
OR   A
JR   NZ, ERROR

Diskettenboot aus TZFS (GETBOOTDSK)

Ab TZFS v1.8.3 kann TZFS eine MZ-80A- / MZ-700- / MZ-800-Diskette — einschliesslich MZ-800 CP/M — direkt aus dem Dateisystem heraus booten und nach dem Lauf des von Diskette gebooteten OS ueber den Hardware-RESET-Schalter zu TZFS zurueckkehren. Die Routine, die das leistet, ist GETBOOTDSK. Sie bildet im User-ROM-Fenster das Verhalten des maschineneigenen IPL (des nativen 9Z-504M-Disketten-IPL) so genau nach, dass ein Second-Stage-Bootloader auf der Diskette nicht erkennen kann, dass er unter TZFS statt unter dem werkseitigen Monitor laeuft. Dieser Abschnitt dokumentiert die Details dieser Routine auf Entwicklerebene sowie die Speichermodi, die sie unterstuetzen.

Maschinen-ID-Akzeptanz und IPLPRO-Erkennung
Der erste Sektor einer bootfaehigen Sharp-Diskette traegt eine Maschinenkennung und die ASCII-Signatur "IPLPRO". Frueheres TZFS akzeptierte nur eine einzige fest verdrahtete Maschinen-ID; GETBOOTDSK akzeptiert nun jede gueltige Sharp-Maschinen-ID — 01 (MZ-2000), 02 (MZ-80A/MZ-80K) und 03 (MZ-700/MZ-800) — und validiert den Bootsektor durch Abgleich der "IPLPRO"-Signatur, statt eine feste Maschine anzunehmen. Genau das ermoeglicht es einem einzigen TZFS-Build, die Diskettensaetze aller drei Maschinen zu booten: Das Maschinen-ID-Byte waehlt das Lade-/Laufverhalten, und der Signaturabgleich ist der Ja/Nein-Test fuer "das ist eine bootfaehige Diskette". Ein Sektor, der weder eine erkannte ID noch die Signatur traegt, wird abgelehnt, und die Steuerung kehrt zur TZFS-Eingabeaufforderung zurueck.

Block-7-Pre-Paging fuer OSe, die unterhalb von 1000H laden
Einige Disketten-OSe — insbesondere MZ-800 CP/M — laden ihre erste Stufe unterhalb der Adresse 1000H, in den Bereich, der normalerweise den Arbeitsbereich des Monitors und das untere DRAM enthaelt. Vor der Uebergabe blendet GETBOOTDSK vorab Block 7 des DRAM in 0000H-0FFFH ein, damit das geladene Programm dort natives Lese-/Schreib-DRAM statt des Monitor-Images sieht. Dies spiegelt das maschineneigene IPL wider, das das Boot-ROM ausblendet und DRAM freilegt, bevor das geladene Programm mit der Ausfuehrung beginnt, und es ist derselbe Low-RAM-Aliasing-Fix, der auf dem picoZ80 generell angewandt wird (Abbildung von 0000H-0FFFH aus Bank 7 unter TZFS), damit ein Programm, das per LDIR Code in den unteren RAM kopiert und dann den Videomodus umschaltet, auf dem nativen wie auf dem TZFS-Pfad denselben Speicher sieht.

BC = 0200H-Uebergabe
Das native 9Z-504M-IPL uebergibt dem geladenen Programm die Steuerung mit dem Registerpaar BC = 0200H — ein Second-Stage-Loader verlaesst sich auf diesen Wert (eine 512-Byte-Sektorenanzahl / ein Verzeichnis-Leseparameter), um sein eigenes Verzeichnislesen zu steuern. GETBOOTDSK reproduziert die Uebergabe exakt: Es setzt BC = 0200H unmittelbar vor dem JP (HL), das die Steuerung an die frisch geladene erste Stufe uebergibt, sodass ein Loader, der sein Verzeichnis anhand des in BC vorgefundenen Werts liest, sich unter TZFS identisch verhaelt. Wird dies falsch gemacht, ist das der Unterschied zwischen einer Diskette, die bootet, und einer, die bei "no system file" haengen bleibt, weil ihr Loader die falsche Anzahl Sektoren gelesen hat.

Baendigung des 8253-Takts (SORES) vor JP (HL)
Der 8253-Programmierbare-Intervalltimer des Sharp erzeugt einen periodischen Interrupt. Ein Disketten-Loader aktiviert typischerweise frueh in seinem eigenen Start Interrupts (EI), und wenn der 8253 noch mit seiner nativen Rate frei laeuft, kann der resultierende Strom von RST 38H-Interrupts den Z80 ueberfluten und den Loader abbrechen, bevor er fertig ist. Das native IPL vermeidet dies in seiner SORES-Routine (sound reset); GETBOOTDSK spiegelt dies. Unmittelbar vor der JP (HL)-Uebergabe:
  • programmiert es 8253-Counter 2 auf etwa 1 Hz um, sodass die Interruptquelle langsam statt mit ihrer nativen Frequenz tickt, und
  • maskiert es 8255-Port-C-Bit 2 (PC2), das Gate, das den Counter-Ausgang zur Interruptleitung durchlaesst.
Mit verlangsamtem Counter und maskiertem Gate kann ein Loader, der Interrupts frueh aktiviert, nicht ueberflutet werden. Das ist der spezifische Fix fuer den Fehler "P-CP/M80 → No system file", bei dem ein frueher EI im CP/M-Loader zuvor einen schnell laufenden Counter ihn zu Tode interrupten liess, bevor er seine Systemdatei lesen konnte.

Das OS ausfuehren: TZMM_DSKLOAD / TZMM_DSKRUN
Zwei dedizierte Speicherverwaltungsmodi tragen den Bootvorgang bis zu einem laufenden OS. Unter der picoZ80-Firmware laden und starten TZMM_DSKLOAD und TZMM_DSKRUN ein von Diskette gebootetes OS im nativen Block-0-DRAM der Maschine — genau das Speicherlayout, das das maschineneigene IPL verwenden wuerde — statt in einer TZFS-SRAM-Bank. TZFS DSKREAD streamt die Bootsektoren in dieses DRAM; auf der MZ-800 wird dies durch den MZ-1E05-MZ1E05_IO_A10Toggle-FDC-Hardwarebeschleunigungs-Fetch-Handler unterstuetzt, der die FDC-DRQ-Leitung bei 0xF3FE / 0xF7FE per OR mit Adressbit A10 verknuepft, sodass DSKREAD einen Bootsektor auf der MZ-800 genauso streamen kann, wie es das bereits auf der MZ-80A tut. Sobald sich die Sektoren im nativen DRAM befinden, wird TZMM_DSKRUN gewaehlt und die Steuerung uebergeben, sodass das OS gegen echten Block-0-Speicher laeuft, mit Monitor und TZFS-User-ROM aus dem Weg.

Rueckkehr zu TZFS beim Hardware-Reset
Da Block-0-ROM und -RAM auf dem picoZ80 dasselbe PSRAM aliasieren, ueberschreibt ein unter TZMM_DSKRUN laufendes OS die Block-0-Monitor- und TZFS-User-ROM-Images, waehrend es den unteren Speicher nutzt. Wird der Hardware-/RESET-Schalter gedrueckt, laedt der Reset-Restore-Pfad der Firmware den unversehrten Block-0-Monitor plus das TZFS-UROM neu und startet TZFS dann kalt, sodass der Reset-Schalter den Benutzer zur TZFS-Eingabeaufforderung zurueckbringt, statt in den blanken 1Z-013A-Monitor zu fallen. Zwei picoZ80-Details halten das Video ueber diesen Uebergang hinweg korrekt: Das MZ-800-cgWindow-Tracking ermoeglicht es einem OS im MZ-800-Modus, das einen PCG-Font laedt (via IN 0xE0), das echte CG-ROM / CG-RAM unter TZFS zu erreichen — wodurch verstuemmelter Disketten-BASIC-Text behoben wird, waehrend native Spiele wie Flappy unbeeintraechtigt bleiben — und der Reset-Pfad fuehrt initVideoText erneut aus, sobald /RESET loslaesst (nach einer Einschwingverzoegerung von ~10 ms, damit der onboard-GDG / 8255 seinen Hardware-Reset abschliesst), sodass der GDG neu scannt und die HBLK-Synchronisierung des Monitors sauber abgeschlossen wird.

Einen neuen Monitorbefehl hinzufuegen

  1. Handler in der passenden Bank-Datei schreiben. Fuer einen Utility-Befehl in tzfs_bank3.asm eine Routine hinzufuegen.
  2. ?-Praefix-Stub in tzfs.asm hinzufuegen im TZFSJMPTABLE-Abschnitt.
  3. Eintrag zu CMDTABLE in tzfs.asm hinzufuegen mit Bank-Index und Handler-Adresse.
  4. Hilfetext zu HELPSCR in tzfs_bank2.asm hinzufuegen.
  5. ./build.sh ausfuehren.

Eine neue Hardwareplattform hinzufuegen

  1. Build-Flag in tzfs_definitions.asm hinzufuegen.
  2. I/O-Port- und TZMM-Modus-Konstanten hinzufuegen.
  3. Bedingte Assemblierungsbloecke im Quellcode hinzufuegen.
  4. K64F-Service-API auf der neuen Plattform implementieren.
  5. build.sh aktualisieren.

Debugging-Tipps

Debug-Ausgabe aktivieren: ENADEBUG EQU 1 in tzfs_definitions.asm setzen.
I/O-Ports direkt mit RIO/WIO pruefen: RIO port liest jeden I/O-Port. WIO port,value schreibt einen Wert.
TZFS-Variablenblock inspizieren: D EC80 fuer den TZVARMEM-Bereich.
K64F-Serviceblock inspizieren: D ED80 fuer den TZSVCMEM-Bereich.
Assemblierten Code mit DASM verifizieren: Nach dem ASM-Befehl sofort DASM addr,endaddr verwenden.

Build-Umgebung

Der TZFS-Build verwendet den GLASS-Z80-Assembler (im Repository enthalten) und das globale FusionX-Build-Skript. Zum Bauen der Z80-Assembler-Komponenten werden nur eine Java-Laufzeitumgebung und git benoetigt. Der empfohlene Weg zum Bauen ist das automatisierte Setup-Skript fuer Ihre Plattform (siehe Automatisiertes Setup und Build unten); die nachfolgenden manuellen und FusionX-Build-Schritte sind fuer fortgeschrittene Benutzer und Teil-Builds gedacht.

Automatisiertes Setup und Build (empfohlen)
Der empfohlene Weg, TZFS zu bauen, ist das in sich geschlossene Setup-Skript fuer Ihre Plattform. Es installiert die Voraussetzungen (Java fuer den GLASS-Z80-Assembler sowie git/perl/coreutils; unter Windows Git Bash + Java), klont das Repository, holt das Inhaltspaket und kann die ROM-Images bauen — alles interaktiv, mit sinnvollen Standardwerten, die Sie durch Druecken von Enter uebernehmen koennen. Kopieren Sie einfach die einzelne Datei fuer Ihre Plattform und fuehren Sie sie aus.

macOS / Linux / WSL — setup_TZFS.sh

chmod +x setup_TZFS.sh
./setup_TZFS.sh
Das Skript installiert Java (das den GLASS-Assembler tools/glass-0.5.1.jar ausfuehrt), eine C-Toolchain + make (um das cpmtools-Submodul zu bauen), perl und git; unter macOS installiert es zusaetzlich GNU coreutils und bash 4 und fuegt sie ueber ein generiertes tzfs_env.sh zum PATH hinzu. Falls nicht vorhanden, holt es das Inhaltspaket TZFS_Files.zip (~110 MB MZF/DSK/CPM/CAS/BAS/BASIC-Inhalte).

Windows 10 / 11 — setup_TZFS_windows.ps1 (natives Git Bash, kein WSL). In PowerShell:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_TZFS_windows.ps1
Das Windows-Skript verwendet winget, um Git for Windows (das bash, coreutils, perl und curl bereitstellt) und die Temurin 17 JRE (Java) zu installieren, klont das Repository, holt das Inhaltspaket und fuehrt ./build.sh ueber Git Bash aus. Ein vorgefertigtes tools\cpmcp.exe ist enthalten, sodass unter Windows kein C-Compiler erforderlich ist.

Fragen, die das Setup stellt, und was zu tun ist. Jede Eingabeaufforderung hat einen sicheren Standardwert in Klammern — der Grossbuchstabe ist der Standard, sodass Druecken von Enter ihn uebernimmt.

macOS / Linux / WSL (setup_TZFS.sh):

Eingabeaufforderung Standard Was zu tun ist
Install now? [Y/n] (fuer fehlende Pakete) Ja Enter — installiert die fehlenden Voraussetzungen; fragt evtl. nach Ihrem sudo-Passwort.
Repo URL [https://git.eaw.app/eaw/TZFS.git] oeffentliches Repo Enter fuer das oeffentliche Repo oder eine andere (private) URL einfuegen.
Install directory [~/TZFS] ~/TZFS Enter fuer ~/TZFS oder einen Pfad eingeben.
Download and install them now? [Y/n] (Inhaltspaket) Ja Enter, um die fuer einen vollstaendigen Build benoetigten MZF/DSK/CPM/CAS/BAS/BASIC-Inhalte zu holen.
Run the build now (./build.sh …)? [Y/n] Ja Enter, um sofort zu bauen (verifiziert die Umgebung).

Windows (setup_TZFS_windows.ps1):

Eingabeaufforderung Standard Was zu tun ist
Repo URL [https://git.eaw.app/eaw/TZFS.git] oeffentliches Repo Enter fuer das oeffentliche Repo oder eine andere URL einfuegen.
TZFS checkout directory [%USERPROFILE%\TZFS] %USERPROFILE%\TZFS Enter fuer den Standard oder einen Pfad eingeben.
Download and install them … now? [Y/n] (Inhaltspaket) Ja Enter, um das Inhaltspaket zu holen.
Build the TZFS firmware now (runs ./build.sh via Git Bash)? [Y/n] Ja Enter, um sofort ueber Git Bash zu bauen.
Setzen Sie die Umgebungsvariable TZFS_REPO_URL, um die Standard-Repository-URL zu ueberschreiben, ohne das Skript zu bearbeiten.
Ausgabe und Neu-Bauen. ROM-Images werden nach roms/ geschrieben — zum Beispiel tzfs.rom, die FusionX-Varianten, die Monitor-ROMs und die CP/M-Binaerdateien. Um spaeter neu zu bauen, wechseln Sie in den Checkout (cd ~/TZFS); unter macOS fuehren Sie zuerst source ./tzfs_env.sh aus, um GNU coreutils und bash 4 in den PATH zu legen; dann fuehren Sie ./build.sh aus (oder ./build.sh -m, um auch die MZF-Quellen erneut zu verarbeiten). Unter Windows fuehren Sie ./build.sh aus Git Bash im Checkout aus.

Bauen (manuell / FusionX)
sudo apt install -y default-jre git
git clone https://git.eaw.app/eaw/tzpuFusionX.git
cd tzpuFusionX
git submodule update --init --recursive

./build.sh --tzfs
./build.sh --cpm
./build.sh --all
Ausgabe Beschreibung
software/roms/tzfs_mz80a_fusionx.rom TZFS-Firmware fuer MZ-80A
software/roms/tzfs_mz700_fusionx.rom TZFS-Firmware fuer MZ-700
software/roms/tzfs_mz2000_fusionx.rom TZFS-Firmware fuer MZ-2000
software/roms/cpm223_*.bin CP/M 2.2-Binaerdateien

Referenzseiten

Ressource Link
TZFS-Projektseite /sharpmz-upgrades-tzfs/
TZFS Benutzerhandbuch /sharpmz-upgrades-tzfs-usermanual/
TZFS Technischer Leitfaden /sharpmz-upgrades-tzfs-technicalguide/
FusionX Entwicklerhandbuch /tranzputer-fusionx-developersguide/
GLASS Z80-Assembler Enthalten in tools/glass-0.5.1.jar