picoZ80 Benutzerhandbuch
picoZ80 Benutzerhandbuch
Der
picoZ80 ist ein direkter Ersatz für eine Z80 CPU in jedem Computer mit DIP-40-Sockel. Er wird direkt in den Z80-Sockel Ihres Vintage-Computers eingesteckt und bietet — ohne jegliche Modifikation am Host-Board — erweiterten Speicher, virtuelle Peripheriegeräte, Floppy- und QuickDisk-Emulation, Dateisysteme und eine browserbasierte Verwaltungsoberfläche über WiFi.
Dieses Handbuch behandelt das physische Board, die Ersteinrichtung, den Anschluss an einen Host-Computer und die Nutzung der Web-Oberfläche. Für Architekturdetails, Konfigurationsreferenz und Entwicklungsinformationen siehe den
picoZ80 Technischen Leitfaden.
Board-Übersicht
Die picoZ80-Platine ist so konzipiert, dass sie in die Grundfläche eines Standard-DIP-40-Gehäuses passt. Alle 40 DIP-Pins ragen von der Unterseite der Platine heraus und entsprechen exakt der Pinbelegung einer echten Z80, sodass sie direkt in jeden Z80-Sockel passt, ohne Pins biegen oder adaptieren zu müssen.
Die Oberseite der Platine trägt alle aktiven Bauteile. Die Platine ist schmaler als die internen Freiräume der meisten Z80-Computer, und die Höhe über dem Sockel liegt innerhalb des Hüllmaßes eines Standard-ICs mit einem darunter montierten DIP-40-Sockel.
Anschlüsse und Anzeigen
Das picoZ80-Board stellt folgende Anschlüsse und Anzeigen bereit:
| Element |
Beschreibung |
| 6-Pin Debug-Header |
Befindet sich an der Platinenkante. Bietet SWD (Serial Wire Debug) Zugang zum RP2350, BOOTSEL- und Reset-Leitungen für die Erstprogrammierung sowie Reset für den ESP32. Siehe Debug-Header Pinbelegung unten. |
| USB-Port (Mini-B) |
USB-Konnektivität für Firmware-Flashing über USB-Massenspeichermodus (Erstprogrammierung) und für USB-UART-Brücke zum ESP32. Bei Board-Revisionen ab v2.3a kann ein zweiter dedizierter USB-Port für den ESP32 vorhanden sein. |
| SD-Kartenslot |
Vollgroßer SD-Kartenslot, verwaltet vom ESP32. Enthält config.json, ROM-Images, Disk-Images und Dateisystem-Verzeichnisse. |
Der 6-Pin-Header ist die primäre Hardware-Schnittstelle für die Erstprogrammierung und quellebenes Debugging. Die Pins sind ab Pin 1 am Ende nächst der Platinenkantenmarkierung nummeriert.
| Pin |
Signal |
Funktion |
| 1 |
SWCLK |
Serial Wire Debug Takt (ARM SWD) |
| 2 |
SWDIO |
Serial Wire Debug Daten (ARM SWD) |
| 3 |
Reset RP2350 |
Active-Low Reset für den RP2350. Auf Low ziehen, um den RP2350 zurückzusetzen. |
| 4 |
Reset ESP32 |
Active-Low Reset für den ESP32. Auf Low ziehen, um den ESP32 im Reset zu halten. |
| 5 |
GND |
Massebezug |
| 6 |
BOOTSEL |
RP2350 Boot-Modus-Auswahl. Beim Einschalten/Reset auf Low halten, um den USB-Massenspeichermodus zu aktivieren. |
Hinweis: Pins 1, 2 und 5 werden für SWD-Debugging verwendet (SWCLK, SWDIO, GND). Pins 3 und 6 werden nur für die Erstprogrammierung benötigt. Pin 4 wird verwendet, wenn der ESP32 während des RP2350-Boots nicht starten soll (z.B. während der ersten ESP32-Firmware-Programmierung).
Erste Schritte
Befolgen Sie diese Schritte in der angegebenen Reihenfolge, wenn Sie ein picoZ80-Board zum ersten Mal einrichten:
- Flashen Sie den RP2350-Bootloader über den USB-Massenspeichermodus (BOOTSEL).
- Flashen Sie die ESP32-Firmware über
esptool.
- Bereiten Sie eine SD-Karte mit
config.json und eventuell benötigten ROM-/Disk-Images vor.
- Installieren Sie den picoZ80 im Z80-Sockel Ihres Host-Computers.
- Schalten Sie ein, verbinden Sie sich mit der picoZ80 Web-Oberfläche und konfigurieren Sie nach Bedarf.
Schritt 1 — RP2350-Bootloader flashen
Der RP2350 hat keine physischen BOOTSEL- oder Reset-Taster. Beide Signale sind über den 6-Pin Debug-Header verfügbar. Um den USB-Massenspeicher-Bootloader zu aktivieren:
- Stecken Sie den picoZ80 noch nicht in einen Host-Computer — verbinden Sie ihn nur per USB-Kabel mit einem PC.
- Halten Sie mit einem Jumper oder einer Messspitze Pin 6 (BOOTSEL) auf Low.
- Legen Sie Spannung an den USB-Port an — der RP2350 beginnt zu booten.
- Lassen Sie BOOTSEL sofort los, nachdem das Board als USB-Massenspeichergerät erkannt wurde. (Wenn Sie BOOTSEL zu lange nach dem Reset gehalten halten, kann der RP2350 nicht auf den Flash-Chip zugreifen.)
- Der PC wird ein Laufwerk mit der Bezeichnung RPI-RP2 (oder ähnlich) einbinden.
- Kopieren Sie
Bootloader_<version>.uf2 auf das eingebundene Laufwerk. Der RP2350 flasht sich selbst und startet automatisch neu.
Nach dem Flashen des Bootloaders können alle weiteren RP2350-Firmware-Updates drahtlos über die Web-OTA-Seite durchgeführt werden — Sie müssen den Debug-Header für normale Firmware-Updates nicht erneut berühren.
Schritt 2 — ESP32-Firmware flashen
Die ESP32-Firmware wird mit
esptool geflasht. Bei Board-Revisionen ab v2.3a hat der ESP32 einen eigenen USB-Port und erscheint unabhängig am Host-PC. Bei älteren Revisionen (v2.0 – v2.2) wird der ESP32 über den RP2350 als USB-UART-Brücke angesprochen.
Python-Umgebung einrichten (nur einmalig):
python3 -m venv ./venv/
source ./venv/bin/activate
cd $HOME/esptool
Flashen Sie dann alle vier ESP32-Firmware-Komponenten. Passen Sie PORT an den von Ihrem Betriebssystem zugewiesenen Geräteknoten an:
PORT=/dev/ttyUSB0 # Linux — bei Bedarf anpassen
# PORT=/dev/tty.usbmodem141403 # macOS
BINPATH=/path/to/esp32/build
python3 ./esptool.py \
-p ${PORT} -b 115200 \
--before default_reset --after hard_reset \
--chip esp32s3 \
write_flash \
--flash_mode dio --flash_size 4MB --flash_freq 80m \
0x0 ${BINPATH}/bootloader.bin \
0x8000 ${BINPATH}/partition-table.bin \
0x9000 ${BINPATH}/ota_data_initial.bin \
0x10000 ${BINPATH}/sd_card.bin
Hinweis: Alle weiteren ESP32-Firmware-Updates können über die OTA-Webseite (ota-esp32.htm) durchgeführt werden, sobald der erste Flash-Vorgang abgeschlossen ist.
Schritt 3 — SD-Karte vorbereiten
Die SD-Karte ist das primäre Speichermedium des picoZ80. Sie enthält die Konfigurationsdatei, ROM-Images, Disk-Images und Dateisystem-Verzeichnisse.
Formatierungsanforderungen:
- FAT32-Dateisystem.
- Jede von FAT32 unterstützte Kapazität (typischerweise werden bis zu 32GB für zuverlässige Formatierung empfohlen).
Minimal erforderliche Dateien:
config.json im SD-Karten-Stammverzeichnis — die Hauptkonfigurationsdatei. Siehe Grundkonfiguration für ein minimales Beispiel.
webfs/-Verzeichnis — die ESP32 Web-Oberflächen-Assets. Kopieren Sie den Inhalt des webfs/-Verzeichnisses aus dem Projekt-Repository auf das SD-Karten-Stammverzeichnis.
Optionale, aber empfohlene Verzeichnisse:
| Verzeichnis |
Inhalt |
MZF/ |
MZF-Format-Programmdateien zum Laden über das Dateisystem |
ROM/ |
ROM-Images, referenziert durch config.json |
DSK/ |
Floppy-Disk-Images (DSK-Format) für WD1773-Emulation |
QD/ |
QuickDisk-Images für QuickDisk-Emulation |
TZFS/ |
TranZPUter Filing System-Verzeichnisse |
RFS/ |
ROM Filing System-Programmverzeichnisse |
Die SD-Karte kann vollständig über den Web-Dateimanager verwaltet werden, sobald der picoZ80 läuft — Sie können ROM-Images hochladen,
config.json bearbeiten und Verzeichnisse vom Browser aus erstellen, ohne die Karte physisch zu entnehmen.
Schritt 4 — Installation im Host-Computer
Sicherheit zuerst: Schalten Sie den Host-Computer immer aus und ziehen Sie den Netzstecker, bevor Sie den picoZ80 einsetzen oder entfernen. Das Board arbeitet intern mit 3,3V; die DIP-40-Pins sind über geeignete Schnittstellenschaltungen mit dem 5V-Hostbus verbunden, aber das Board darf niemals im laufenden Betrieb eingesetzt oder entfernt werden.
Installationsvorgang:
- Schalten Sie den Host-Computer aus und entladen Sie eventuelle statische Aufladung.
- Entfernen Sie den vorhandenen Z80-CPU-Chip aus seinem DIP-40-Sockel. Ein Chip-Extraktionswerkzeug wird empfohlen, um das Verbiegen von Pins zu vermeiden.
- Setzen Sie die SD-Karte in den picoZ80 SD-Kartenslot ein.
- Richten Sie den picoZ80 am Z80-Sockel aus und stellen Sie sicher, dass Pin 1 des picoZ80 (markiert mit einem Punkt oder einer Kerbe) mit Pin 1 des Sockels übereinstimmt (ebenfalls markiert und typischerweise neben der Kerbe auf der IC-Umriss-Siebdruckmarkierung).
- Drücken Sie den picoZ80 sanft und gleichmäßig in den Sockel. Stellen Sie sicher, dass alle 40 Pins sitzen. Nicht mit Gewalt drücken — falls Widerstand spürbar ist, entfernen Sie das Board und überprüfen Sie die Pin-Ausrichtung.
- Schalten Sie den Host-Computer ein.
Beim ersten Einschalten nach einer frischen Firmware-Installation startet der ESP32 im
Access-Point-Modus und sendet ein WiFi-Netzwerk mit dem Namen
picoZ80. Verbinden Sie sich mit diesem Netzwerk, um auf die Web-Oberfläche zuzugreifen und die WiFi-Erstkonfiguration abzuschließen.
Hinweis: Der picoZ80 bezieht seine Stromversorgung über den 5V-Anschluss am Z80-Sockel VCC-Pin. Der integrierte Abwärtswandler liefert 3,3V an alle Board-Komponenten. Stellen Sie sicher, dass die 5V-Versorgung Ihres Host-Computers mindestens 500mA liefern kann — der picoZ80 kann unter Spitzenlast bis zu 400mA aufnehmen (RP2350 bei 300MHz mit aktivem WiFi).
WiFi-Einrichtung
WiFi-Konnektivität erfordert, dass das Antennen-Anpassungsnetzwerk auf der Platine bestückt ist und die ESP32-Firmware mit aktiviertem WiFi gebaut wurde. Siehe den
Regulatorischen Hinweis unten. Wenn Sie NCM-only-Firmware verwenden, überspringen Sie diesen Abschnitt und nutzen Sie stattdessen die
USB NCM-Verbindung.
Der ESP32-Co-Prozessor des picoZ80 bietet WiFi-Konnektivität. Beim ersten Start (oder wenn keine WiFi-Zugangsdaten gespeichert sind) startet der ESP32 im
Access-Point-Modus (AP-Modus), damit Sie sich von jedem Gerät mit einem Browser verbinden und Ihre Heimnetzwerk-Einstellungen konfigurieren können.
Verbindung im Access-Point-Modus
- Öffnen Sie auf Ihrem Smartphone, Tablet oder Laptop die WiFi-Einstellungen und suchen Sie nach einem Netzwerk namens picoZ80 (oder wie im Feld
esp32.wifi.ssid Ihrer config.json für den AP-Modus konfiguriert).
- Verbinden Sie sich mit dem picoZ80-Netzwerk. Das Standard-AP-Passwort ist pZ80pZ80 (prüfen Sie die Release-Notes Ihrer Firmware, falls sich dies geändert hat).
- Öffnen Sie einen Browser und navigieren Sie zu http://192.168.4.1 — dies ist die Standard-IP-Adresse im AP-Modus. Die picoZ80 Web-Oberfläche erscheint.
- Navigieren Sie zur WiFi-Manager-Seite, um SSID und Passwort Ihres Heimnetzwerks einzugeben.
- Klicken Sie auf Save & Connect. Der ESP32 startet neu und verbindet sich als Client mit Ihrem Heimnetzwerk.
Client-Modus (Station-Modus)
Sobald der Client-Modus konfiguriert ist, tritt der ESP32 Ihrem Heim-WiFi-Netzwerk bei und ist unter der auf der Dashboard-Seite angezeigten IP-Adresse erreichbar. Wenn Sie eine feste IP in `config.json` eingestellt haben (empfohlen für einfachen Zugriff), navigieren Sie direkt zu:
http://192.168.1.192
Ersetzen Sie die IP-Adresse durch die von Ihnen konfigurierte. Wenn Sie DHCP verwenden, finden Sie die zugewiesene Adresse in der DHCP-Client-Liste Ihres Routers.
Die Web-Oberfläche läuft vollständig in Ihrem Browser. Es wird keine zusätzliche Software benötigt. Der picoZ80-Webserver läuft auf Port 80.
USB NCM-Verbindung (kein WiFi erforderlich)
Wenn das Board mit der NCM-Firmware gebaut wurde (
sdkconfig.mode_ncm_only oder
sdkconfig.mode_wifi_and_ncm), erscheint ein virtueller Ethernet-Adapter auf dem Host-Computer, wenn der ESP32 USB-Port angeschlossen wird. Der integrierte DHCP-Server des picoZ80 weist dem Host automatisch eine IP-Adresse zu — es ist keine manuelle Netzwerkkonfiguration erforderlich.
- Verbinden Sie ein USB-Kabel vom Host-Computer mit dem ESP32 USB-Port des picoZ80.
- Warten Sie einige Sekunden, bis das Host-Betriebssystem den neuen Netzwerkadapter erkennt.
- Öffnen Sie einen Webbrowser und navigieren Sie zu
http://192.168.7.1.
- Die picoZ80 Dashboard-Seite sollte erscheinen.
Dieser Modus bietet vollen Zugriff auf alle Funktionen der Web-Oberfläche: Konfigurationsbearbeitung, Firmware-Updates, Dateiverwaltung und Persona-Auswahl. Es werden keine WiFi-Antenne oder Funkkomponenten benötigt.
Web-Oberfläche
Die picoZ80 Web-Oberfläche ist eine achtseitige Bootstrap 4-Anwendung, die vom ESP32 bereitgestellt wird. Alle Seiten — einschließlich des neuen GUI-Konfigurationseditors — sind über die Navigationsleiste am oberen Rand jeder Seite zugänglich. Die Web-Assets werden im Verzeichnis webfs/ auf der SD-Karte gespeichert und können unabhängig von der Firmware aktualisiert werden.
Dashboard (index.htm)
Das Dashboard ist die Startseite der Web-Oberfläche. Es zeigt Echtzeit-Systeminformationen an und bietet einen schnellen Überblick über den picoZ80-Status.
Auf dem Dashboard angezeigte Informationen umfassen:
- Firmware-Version — die aktuell laufende RP2350-Firmware-Version und das Build-Datum.
- ESP32-Version — die ESP32 Co-Prozessor-Firmware-Version.
- Aktive Partition — welcher der beiden Firmware-Slots (1 oder 2) derzeit aktiv ist.
- Aktive Persona — die derzeit geladene Maschinenpersönlichkeit (z.B. MZ-700, MZ-80A).
- RP2350 Taktfrequenz — aktuelle CPU-Frequenz in MHz.
- PSRAM Taktfrequenz — aktuelle PSRAM SPI-Taktfrequenz.
- WiFi-Status / Netzwerkstatus — in WiFi-Modi: Modus (AP oder Client), SSID und zugewiesene IP-Adresse. Im NCM-Only-Modus: dieses Feld trägt den Titel Netzwerkkonfiguration und zeigt den USB NCM-Netzwerkstatus (IP-Adresse, Netzmaske) — es gibt keine WiFi-bezogenen Felder.
- WiFi RSSI (nur WiFi-Modi) — Live-Empfangssignalstärke-Anzeige (dBm), die alle drei Sekunden automatisch aktualisiert wird. Farbcodiert: grün (≥ −50 dBm, ausgezeichnet), blau (≥ −70 dBm, gut), orange (≥ −80 dBm, mäßig) oder rot (< −80 dBm, schlecht). Wird im NCM-Only-Modus nicht angezeigt.
- WiFi TX Power (nur WiFi-Modi) — aktuelle Sendeleistung in dBm, ebenfalls live aktualisiert. Wird im NCM-Only-Modus nicht angezeigt.
- SD-Karte — ob eine SD-Karte eingelegt ist und der Dateisystem-Mount-Status.
- Betriebszeit — Zeit seit dem letzten Neustart.
Das Dashboard bietet außerdem Schaltflächen zum Neustart des RP2350 und zum Auslösen eines Konfigurations-Neuladens von der SD-Karte ohne vollständigen Neustart.
Zwei Dropdown-Menüs oben rechts in der Navigationsleiste sind auf jeder Seite verfügbar:
- Aktionsmenü
- Floppy Disk 1 / 2 wechseln — wählen Sie eine neue DSK-Image-Datei von der SD-Karte und binden Sie sie ohne Neustart in den virtuellen WD1773-Floppy-Controller Slot 1 oder Slot 2 ein. Der Dateiname des aktuell geladenen Disk-Images wird neben jedem Eintrag angezeigt (oder "none", wenn kein Image geladen ist). Wenn der aktive Floppy-Controller mehr als zwei Laufwerke unterstützt, erscheinen zusätzlich Floppy Disk 3 wechseln und 4 (andernfalls sind sie ausgeblendet).
- QD-Disk wechseln — tauschen Sie das aktive QuickDisk-Image im laufenden Betrieb aus. Der Dateiname des aktuell geladenen QD-Images wird neben dem Eintrag angezeigt.
- RP2350-Konfiguration neu laden — senden Sie einen Reload-Befehl an den RP2350 über die ESP32–RP2350 UART; der RP2350 analysiert config.json erneut und wendet die Speicherkarte und Treiberkonfiguration ohne vollständigen Power-Cycle neu an.
- Neustart-Menü
- ESP32 — Soft-Neustart des ESP32 Co-Prozessors (startet den Webserver und WiFi-Stack neu, RP2350 bleibt unberührt).
- RP2350B — Zurücksetzen des RP2350-Prozessors (führt den Bootloader erneut aus und lädt den aktiven Firmware-Slot neu, Host-CPU wird während des Resets pausiert).
- Host — aktiviert die Reset-Leitung des Host-Computers und startet den alten Computer im Z80-Sockel neu, ohne das picoZ80-Board selbst zu beeinflussen.
- IPL-Reset — führt einen IPL-Reset (Initial Program Load) durch Umschalten von 8255 PPI Port C Bit 3 durch und versetzt die Maschine in den Boot-Modus (BST). Verfügbar für MZ-80B, MZ-2000, MZ-2200 und MZ-2500 Personas — entspricht dem Drücken der IPL-Taste an der Originalhardware.
- RP2350 UF2 Boot / RP2350 UF2 Boot (App) — startet den RP2350 in seinen USB-Bootloader (BOOTSEL) neu, sodass eine Firmware-.uf2 per Drag-and-Drop auf das eingebundene Laufwerk gezogen werden kann. Die einfache Variante ruft den Bootloader direkt auf; die (App)-Variante ruft ihn erneut aus dem laufenden Anwendungs-Slot auf.
Konfigurationseditor (config.htm)
Die Konfigurationseditor-Seite bietet einen browserbasierten Editor für die auf der SD-Karte gespeicherte
config.json-Datei. Der Editor verfügt über Syntax-Hervorhebung und grundlegende JSON-Validierung.
So bearbeiten Sie die Konfiguration:
- Navigieren Sie zur Konfigurationseditor-Seite.
- Die aktuelle
config.json wird automatisch in den Editor geladen.
- Nehmen Sie Ihre Änderungen vor. Der Editor hebt Syntaxfehler rot hervor.
- Klicken Sie auf Save, um die aktualisierte Datei zurück auf die SD-Karte zu schreiben.
- Klicken Sie auf Apply (oder starten Sie neu), um die neue Konfiguration anzuwenden. Der RP2350 liest die Konfiguration beim Booten, minimiert sie und speichert sie im Flash — nachfolgende Boots verwenden die Flash-Kopie, wenn keine SD-Karte vorhanden ist.
Änderungen an der Speicherkarte, ROM-Images und I/O-Map werden beim nächsten RP2350-Reset wirksam. Änderungen an WiFi-Einstellungen im
esp32.wifi-Block werden beim nächsten ESP32-Neustart wirksam.
Hinweis: Der Konfigurationseditor arbeitet direkt mit der Datei auf der SD-Karte. Es ist empfehlenswert, vor wesentlichen Änderungen eine Sicherungskopie einer funktionierenden config.json auf Ihrem PC aufzubewahren.
GUI-Konfiguration (configgui.htm)
Die GUI-Konfigurationsseite bietet eine grafische Alternative zum reinen JSON-Konfigurationseditor. Alle Konfigurationseinstellungen werden als beschriftete Eingabefelder, Dropdown-Menüs und editierbare Tabellen dargestellt, organisiert in vier Tabs:
- RP2350 Global — globale Kernspannungs-, CPU-Frequenz- und PSRAM-Frequenz-Einstellungen, die für beide Partitionen gelten.
- Partition 1 / Partition 2 — partitionsbezogene Speicherkarte (Adresse, Größe, Typ, Wait-States, Bank, ROM-Datei), I/O-Port-Map (Adresse, Größe, Typ, Handler) und Treiberkonfiguration (z.B. MZ80AFI, RFS, MZ-1E30, Celestite, PCW9512) mit Aktivieren/Deaktivieren-Schaltern und einer Add Driver-Schaltfläche für den vollständigen Satz verfügbarer Schnittstellen-Treiber. Jeder Abschnitt hat Hinzufügen/Entfernen-Schaltflächen für Zeilen. Die Kerneinstellungen umfassen auch GPIO-Bus-Treibstärke- und Slew-Rate-Steuerungen (
addrDrive/addrSlew, dataDrive/dataSlew, ctrlDrive/ctrlSlew) zur Abstimmung der elektrischen Bus-Eigenschaften pro Host-Maschine — Standard ist 2mA langsamer Slew (niedrigste EMI).
- ESP32 — ESP32-Gerätetyp, Netzwerk-Schnittstellensteuerungen (WiFi Enable, NCM Enable, NCM Retries, NCM Retry Period) und WiFi-Konfiguration (SSID, Passwort, IP-Adresse, Netzmaske, Modus AP/Client, DHCP, TX Power). Zusätzlich zu den WiFi-Feldern können Sie die USB-NCM-IP-Adresse und Netzmaske sowie einen benutzerdefinierten USB-Produktnamen festlegen — nützlich zur Unterscheidung mehrerer am selben Host angeschlossener Boards.
GPIO-Bus-Abstimmung. Die partitionsbezogenen Kerneinstellungen erlauben es, die elektrischen Eigenschaften des Z80-Busses unabhängig für jede der drei Bus-Gruppen abzustimmen —
Adresse,
Daten und
Steuerung. Für jede Gruppe können Sie die Treibstärke (2 / 4 / 8 / 12 mA), die Flankensteilheit (langsam = niedrige EMI, oder schnell), den Schmitt-Trigger-Eingang (ein / aus) und den Pull-Widerstand (float / hoch / runter) festlegen. Eine optionale
Pin-bezogene Überschreibung-Tabelle erlaubt es, jede dieser Einstellungen für einzelne GPIO-Pins zu überschreiben, wo eine bestimmte Host-Maschine dies benötigt. Standard ist 2 mA Treibstärke mit langsamem Slew (niedrigste EMI). Die Kerneinstellungen legen auch den
Z80-Refresh-Wert offen:
0 deaktiviert den DRAM-Refresh,
1 löst bei jedem Opcode-Fetch einen Refresh aus, und
N löst einen Refresh alle
N Fetches aus — sodass die Refresh-Aktivität gegen das Peripherie-Timing abgewogen werden kann.
Klicken Sie auf
Save Configuration, um Änderungen in
config.json zu schreiben (die vorherige Version wird gesichert) und die RP2350-Konfiguration automatisch neu zu laden. Klicken Sie auf
Reload, um die aktuelle
config.json von der SD-Karte erneut einzulesen und alle nicht gespeicherten Änderungen zu verwerfen. Für erweiterte Bearbeitung über das hinaus, was die GUI bietet, verwenden Sie den
Konfigurationseditor, um das rohe JSON direkt zu bearbeiten.
Datei-Browser. ROM- und Disk-Image-Felder bieten eine
Browse-Schaltfläche, die einen SD-Karten-Dateiauswähler öffnet, sodass Sie eine Datei auswählen können, ohne ihren Pfad einzutippen. Der gewählte Pfad wird relativ zum SD-Karten-Stammverzeichnis gespeichert.
Serienkarten-Port. Die RS-232C-Schnittstellen MZ-8BIO3 und MZ-1E24 nehmen einen
port-Parameter entgegen — die Basis-I/O-Adresse der Karte (Standard
0xB0) —, der in der Treiberzeile editierbar ist.
Treiber-Serie und Basis-I/O-Port. Das
Add Driver-Dropdown bietet nur die für die laufende Firmware gültigen Treiber an — die Seite erkennt, ob die Firmware ein Sharp-, Amstrad-, Tatung- oder
Open-Build (Experimentierer) ist. Für die verschiebbaren Schnittstellenkarten — MZ-1R12, MZ-1R18, MZ-1R23, MZ-1R37, PIO-3034, MZ-8BIO3, MZ-1E24, MZ-1E05 und Celestite — wird ein einzelnes
Base I/O Port-Feld angezeigt, vorbelegt mit der authentischen Basis der Karte. Ändern Sie es, um die Ports der Karte zu verschieben, wenn der picoZ80 auf einem Board Ihres eigenen Designs verwendet wird; die GUI schreibt die korrekte Zuordnung automatisch. Jeder Treiber kann außerdem seine eigenen
System ROM-Images laden, die die ROMs des Hosts überschreiben, wenn der Treiber aktiviert ist.
Demo-Modus. Ein optionaler Präsentationshelfer, der sensible Felder — WiFi-SSID und -Passwort sowie IP-/Gateway-Adressen — aus den Webseiten ausblendet, sodass die Oberfläche sicher in Screenshots oder Bildschirmaufzeichnungen gezeigt werden kann, ohne Ihre Netzwerkdetails preiszugeben.
Dateimanager (filemanager.htm)
Der Dateimanager bietet eine browserbasierte Ansicht des SD-Karten-Inhalts. Sie können Verzeichnisse navigieren, neue Dateien hochladen (ROM-Images, Disk-Images, MZF-Programmdateien), vorhandene Dateien auf Ihren PC herunterladen, neue Verzeichnisse erstellen sowie Dateien und Verzeichnisse löschen.
Häufige Aufgaben im Dateimanager:
- ROM-Image hochladen — navigieren Sie zum
ROM/-Verzeichnis und verwenden Sie die Upload-Schaltfläche, um die ROM-Datei von Ihrem PC zu übertragen.
- Disk-Image hochladen — navigieren Sie zu
DSK/ (Floppy) oder QD/ (QuickDisk) und laden Sie die Image-Datei hoch. Nach dem Laden wird der Dateiname des aktuellen Disk-Images im Aktionsmenü neben jedem Floppy- und QD-Slot zur schnellen Referenz angezeigt.
- MZF-Programme hochladen — navigieren Sie zu
MZF/ oder dem entsprechenden Dateisystem-Verzeichnis und laden Sie Ihre MZF-Dateien hoch.
- config.json sichern — klicken Sie auf das Download-Symbol neben
config.json, um eine Kopie auf Ihrem PC zu speichern.
- SD-Karte sichern — klicken Sie auf die Schaltfläche Backup SD, um den gesamten SD-Karten-Inhalt als einzelnes Archiv auf Ihren lokalen Computer herunterzuladen. Dies ist besonders nützlich, wenn der picoZ80 in einem Host-Computer installiert ist und das physische Entnehmen der SD-Karte unpraktisch ist. Das Backup erfasst alle Konfigurationsdateien, ROM-Images, Disk-Images und Dateisystem-Daten in einem Vorgang.
Dateioperationen werden direkt auf der SD-Karte über den ESP32 ausgeführt. Große Datei-Uploads können je nach Dateigröße und WiFi-Signalqualität einige Sekunden dauern.
Persona-Auswahl (personality.htm)
Die Persona-Auswahl-Seite ermöglicht es Ihnen, zu wählen, welche Maschinenpersönlichkeit (Persona) der picoZ80 dem Host-Computer präsentiert. Verschiedene Personas laden unterschiedliche Speicherkarten, ROM-Images und virtuelle Treiberzuordnungen aus der Konfiguration.
Derzeit unterstützte Personas:
- MZ-700 — vollständige MZ-700 Persona mit Bank-Switching, virtuellem Video, Tastatur-I/O, WD1773 Floppy-Emulation, QuickDisk-Emulation und ROM Filing System. Enthält CP/M v2.23 (48K), SA-1510 BASIC und Microsoft BASIC v4.7, alle mit SD-Karten Lese-/Schreibzugriff.
- MZ-80K — Sharp MZ-80K Persona mit SP-1002-Monitor, 8255 PPI, 8253 PIT und LS367-Tastatur. Zwei Floppy-Schnittstellen stehen zur Verfügung: die native MZ80FIO (Toshiba T3444M) — die ursprüngliche MZ-80FD-Disk-Schnittstelle, die alle MZ-80K-Disks bootet und liest (Spiele, Anwendungen, BASIC und CP/M); und die MZ80AFI-Karte (der MZ-80A-FDC) — verwendet für CP/M, die MZ-80K-CP/M booten und ursprüngliche MZ-80K-CP/M-Disks aus CP/M heraus als Laufwerke C:/D: lesen kann. Die Persona kann zusätzlich die anderen MZ-80A-Schnittstellenkarten binden (RFS, MZ-1E14/E19, MZ-1R12/R18/R37, PIO-3034). CP/M erfordert den virtuellen Persona-Modus.
- MZ-80A — MZ-80A Persona (in Entwicklung).
- MZ-80B — MZ-80B Persona (in Entwicklung).
- MZ-800 — Sharp MZ-800 Persona — Dual-Modus-Maschine, die im MZ-700-Kompatibilitätsmodus oder im nativen MZ-800-Modus läuft (320×200- / 640×200-Grafik, 4/16-Farben-Palette über den GDG), SN76489-PSG-Sound, WD1773-Floppy und QuickDisk. Schaltet die Modi zur Laufzeit um. Kann den vollständigen MZ-80A/MZ-700-Schnittstellenkartensatz sowie die RS-232C-Serienkarten MZ-8BIO3 / MZ-1E24 binden.
- PCW-9512 — Amstrad PCW-9512 Persona mit Gate Array, uPD765 FDC, 512KB Paged RAM und Typenrad-Drucker-Controller.
- Basic CPU — eine nackte Z80 im Sockel ohne maschinenspezifische Treiber, für einen einfachen Drop-in-Ersatz oder generische Z80-Entwicklung.
- OpenZ80 — die Experimentierer-Persona für ein Board Ihres eigenen Designs oder eine nicht unterstützte Maschine (siehe Weitere Maschinen). Anders als die obigen Personas ist sie ein dedizierter Firmware-Build statt einer Auswahl auf dieser Seite: Flashen Sie die
OpenZ80-Firmware mit den Firmware-Updates-Seiten in eine Partition, fügen Sie dann ihre Schnittstellenkarten hinzu und legen Sie deren Basis-I/O-Ports auf der GUI-Konfigurationsseite fest.
Das Wechseln der Persona ändert die aktive Speicherkarte und die geladenen ROM-Images, ohne den Host neu zu starten. Der picoZ80 reinitialisiert sein Speicher-Banking auf die Konfiguration der neuen Persona und der Host sieht das neue Speicherlayout bei der nächsten Z80-Bus-Transaktion.
Firmware-Updates (OTA)
Firmware für sowohl den RP2350 als auch den ESP32 kann Over-the-Air (OTA) über die Web-Oberfläche aktualisiert werden, ohne physischen Zugang zum Debug-Header.
RP2350 OTA-Update (ota-rp2350.htm)
- Erstellen Sie die RP2350-Firmware mit den Build-Skripten — die Ausgabedatei befindet sich in
fw/bin/ mit einem versionierten Dateinamen (z.B. BaseZ80_v3.009.bin).
- Navigieren Sie zu http://<geraete-ip>/ota-rp2350.htm.
- Wählen Sie, welchen Partitions-Slot Sie aktualisieren möchten (Slot 1 oder Slot 2). Der derzeit aktive Slot wird auf dem Dashboard angezeigt — es ist empfehlenswert, den inaktiven Slot zu aktualisieren, damit die vorhandene Firmware verfügbar bleibt, falls das Update fehlschlägt. Zwei optionale Kontrollkästchen sind verfügbar: Clear App Config löscht die ROM-Images und Konfigurationsdaten für den Ziel-Slot, und Clear Flash Header setzt die Partitionstabelle auf Werkseinstellungen zurück — verwenden Sie diese beim Upgrade auf eine Firmware-Version mit inkompatiblem Konfigurationsschema.
- Klicken Sie auf Choose File, wählen Sie die
.bin-Datei und klicken Sie dann auf Upload.
- Warten Sie, bis Upload und Verifizierung abgeschlossen sind. Die Seite bestätigt den Erfolg und zeigt die neue Partition als verfügbar an.
- Um die neue Firmware zu aktivieren, navigieren Sie zum Partitionsauswahl-Bereich derselben Seite, wählen Sie den neu aktualisierten Slot und klicken Sie auf Set Active & Reboot. Der RP2350 startet mit der neuen Firmware neu.
Anwendungspartitionen verwenden das reine Binärformat (nicht UF2), da sie sich an nicht standardmäßigen Flash-Adressen befinden. Der Bootloader verifiziert die Image-Prüfsumme vor der Aktivierung der neuen Partition — falls die Verifizierung fehlschlägt, bleibt der vorhandene aktive Slot in Verwendung.
ESP32 OTA-Update (ota-esp32.htm)
- Erstellen Sie die ESP32-Firmware — die Ausgabedatei ist
esp32/build/tzpuPico_esp32.bin.
- Navigieren Sie zu http://<geraete-ip>/ota-esp32.htm.
- Klicken Sie auf Choose File, wählen Sie die
.bin-Datei und klicken Sie dann auf Upload.
- Der ESP32 startet nach einem erfolgreichen Upload automatisch mit der neuen Firmware neu.
Die OTA-Seite akzeptiert auch ein
FilePack-Archiv zur Aktualisierung der Web-Oberflächen-Assets im Verzeichnis
webfs/ auf der SD-Karte. Dies ermöglicht die Aktualisierung der Web-UI unabhängig von der ESP32-Firmware-Binärdatei.
WiFi-Manager (wifimanager.htm)
Hinweis: Die WiFi-Manager-Seite ist nur verfügbar, wenn die ESP32-Firmware mit aktiviertem WiFi gebaut wurde (
sdkconfig.mode_wifi_only oder
sdkconfig.mode_wifi_and_ncm). Im NCM-Only-Modus ist diese Seite nicht vorhanden — die Netzwerkkonnektivität wird automatisch über USB NCM bereitgestellt, ohne dass eine Benutzerkonfiguration erforderlich ist.
Die WiFi-Manager-Seite konfiguriert die drahtlosen Netzwerkeinstellungen des ESP32. Hier vorgenommene Änderungen werden im ESP32 NVS (nichtflüchtiger Speicher) gespeichert und werden beim nächsten Neustart wirksam.
Verfügbare Einstellungen:
- WiFi-Modus — Access Point (der picoZ80 erstellt sein eigenes Netzwerk) oder Client (der picoZ80 tritt einem vorhandenen Netzwerk bei).
- SSID — der Netzwerkname zum Erstellen (AP-Modus) oder Beitreten (Client-Modus).
- Passwort — das WiFi-Passwort.
- IP-Adresse / Netzmaske / Gateway — feste IP-Einstellungen für den Client-Modus (empfohlen für konsistenten Zugriff).
- DHCP — aktivieren, um automatisch eine Adresse von Ihrem Router zu beziehen; deaktivieren, um die oben genannten festen IP-Einstellungen zu verwenden.
- TX Power — WiFi-Sendeleistung in 0,25 dBm-Einheiten (Bereich 8–84, d.h. 2–21 dBm). Auf 0 setzen, um den regionsspezifischen Standardwert zu verwenden. Die picoZ80-Platine ist auf minimale HF-Abstrahlung ausgelegt, sodass bei Installation des Boards in einem Metallcomputergehäuse das Signal zum Router schwach sein kann. Eine Erhöhung der TX Power kann die Konnektivität auf Kosten eines leicht höheren Stromverbrauchs verbessern; eine Verringerung kann Interferenzen in Umgebungen mit vielen WiFi-Geräten reduzieren. Die aktuelle RSSI und die effektive TX Power werden auf dem Dashboard und auf dieser Seite angezeigt und alle drei Sekunden live aktualisiert.
Klicken Sie nach dem Speichern auf
Reboot ESP32, um die neuen Einstellungen anzuwenden. Der ESP32 startet neu und verbindet sich mit der neuen Konfiguration. Wenn die Client-Modus-Verbindung fehlschlägt (falsche SSID oder falsches Passwort), fällt der ESP32 nach einem Timeout in den Access-Point-Modus zurück, sodass Sie sich erneut verbinden und die Einstellungen korrigieren können.
Grundkonfiguration
Das gesamte Verhalten des picoZ80 wird durch
config.json auf der SD-Karte gesteuert. Das Folgende ist eine minimale funktionsfähige Konfiguration für einen Sharp MZ-700. Eine vollständige Beschreibung aller Optionen finden Sie im
Technischen Leitfaden — Konfigurationsreferenz.
{
"esp32": {
"core": {
"device": "Z80",
"mode": 0
},
"wifi": {
"override": 1,
"wifimode": "client",
"ssid": "YourNetwork",
"password": "YourPassword",
"ip": "192.168.1.192",
"netmask": "255.255.255.0",
"gateway": "192.168.1.1",
"dhcp": 0,
"webfs": "webfs",
"persist": 0
}
},
"rp2350": {
"core": {
"cpufreq": 300000000,
"psramfreq": 133000000,
"voltage": 1.10
},
"z80": [
{
"memory": [
{
"enable": 1,
"addr": "0x0000",
"size": "0x1000",
"type": "ROM",
"bank": 0,
"tcycwait": 0,
"tcycsync": 0,
"task": "",
"file": "/ROM/mz700.rom",
"fileofs": 0
},
{
"enable": 1,
"addr": "0x1000",
"size": "0xCFFF",
"type": "RAM",
"bank": 0,
"tcycwait": 0,
"tcycsync": 0,
"task": "",
"file": "",
"fileofs": 0
},
{
"enable": 1,
"addr": "0xD000",
"size": "0x3000",
"type": "PHYSICAL_VRAM",
"bank": 0,
"tcycwait": 2,
"tcycsync": 1,
"task": "",
"file": "",
"fileofs": 0
}
],
"io": [],
"drivers": []
}
]
}
}
Dieses Beispiel bildet folgende Bereiche ab:
0x0000 – 0x0FFF — 4KB ROM, geladen aus /ROM/mz700.rom von der SD-Karte in PSRAM Bank 0.
0x1000 – 0xCFFF — 48KB RAM in PSRAM Bank 0 (Lesen/Schreiben, null Wait-States).
0xD000 – 0xFFFF — 12KB Durchleitung an die physische Host-Hardware (VRAM und I/O-Register), mit 2 Wait-States und aktivierter T1-Synchronisation.
Netzwerk-Dateiserver-Einrichtung
Der picoZ80 kann BASIC-Programme über das Netzwerk laden, speichern und auflisten, indem das NETx:-Gerätepräfix in Sharp MZ BASIC verwendet wird. Dies erfordert drei Komponenten: die virtuelle Celestite-Schnittstelle (konfiguriert im JSON der Persona), den picoZ80 im selben Netzwerk wie der PC (über WiFi oder USB NCM) und den netfs.py Python-Dateiserver auf dem PC.
Voraussetzungen
- Python 3.6 oder neuer muss auf dem PC installiert sein.
- Die picoZ80-Persona muss die Celestite-Schnittstelle in ihrer
config.json-Treiberkonfiguration enthalten.
- Die Celestite-Schnittstelle muss den Parameter
ip auf die IP-Adresse des PCs und den netfs.py-Port in config.json gesetzt haben.
- Der picoZ80 und der PC müssen sich im selben Netzwerk befinden (WiFi Client-Modus oder USB NCM).
- Ein Verzeichnis auf dem PC mit MZF-Programmdateien zum Bereitstellen.
Dateiserver starten
Der Dateiserver befindet sich in tools/NetFileServer/netfs.py im picoZ80-Repository. Starten Sie ihn von einem Terminal:
# Dateien aus dem aktuellen Verzeichnis auf dem Standardport 6800 bereitstellen:
python3 netfs.py --dir ./mzf_files
# Dateien auf einem benutzerdefinierten Port mit mehreren Unit-Verzeichnissen bereitstellen:
python3 netfs.py --port 6800 --dir ./games --dir2 ./utilities --dir3 ./basic_programs
# Jedes --dirN wird auf NETx: in BASIC abgebildet (--dir = NET1:, --dir2 = NET2:, usw.)
Der Server unterstützt Units 1–7 (
NET1: bis
NET7:), die jeweils einem separaten Verzeichnis auf dem PC zugeordnet sind. Er wartet auf TCP-Verbindungen auf Port 6800 (konfigurierbar mit
--port). Der Server ist multithreaded und verarbeitet MZF-Header automatisch.
Unterstützte Dateiformate: .mzf,
.mzt,
.m12 (Sharp MZ Bandformat mit 128-Byte-Header) und rohe Binärdateien (
.bin,
.rom,
.dat).
NETx: in BASIC verwenden
Sobald der Dateiserver auf dem PC läuft, verwenden Sie das NETx:-Gerätepräfix in BASIC-Befehlen. Der Celestite W5100-Treiber des picoZ80 verbindet sich automatisch mit dem PC:
DIR NET1: Dateien auf Netzwerk-Unit 1 auflisten (PC-Verzeichnis)
LOAD "NET1:MYPROG" Ein Programm vom PC laden
SAVE "NET1:MYPROG" Ein Programm auf dem PC speichern
LOAD "NET3:GAME" Von Unit 3 laden (zugeordnet zu --dir3)
Fehlerbehebung: Wenn die Verbindung fehlschlägt, überprüfen Sie, ob die IP-Adresse des picoZ80 den PC erreichen kann (prüfen Sie die Dashboard-Statusseite für die zugewiesene IP), stellen Sie sicher, dass keine Firewall Port 6800 blockiert, und bestätigen Sie, dass der Dateiserver läuft. Der Server gibt Verbindungsinformationen im Terminal aus, wenn sich ein Client verbindet.
Treiber und Schnittstellen
Der picoZ80 verwendet eine modulare Treiberarchitektur. Jeder Host-Computer wird als Persona-Treiber implementiert, der die Speicherkarte, I/O-Handler und unterstützte Peripheriegeräte definiert. Erweiterungshardware wird als Schnittstellen-Treiber implementiert, die in eine Persona eingebunden werden. Alle Treiber werden über JSON in config.json auf der SD-Karte konfiguriert. Persona-Treiber sind unten nach Hersteller gruppiert.
Sharp MZ / X1 Serie
Die Sharp MZ- und X1-Serienmaschinen sind die primären Zielplattformen des picoZ80-Projekts. Jedes Maschinenmodell hat einen dedizierten Persona-Treiber mit Unterstützung für seinen spezifischen Peripheriesatz.
Maschinen-Persona-Treiber
Jeder Persona-Treiber emuliert einen vollständigen Sharp MZ-Computer. Die Persona wird über die Webseite
Persona-Auswahl oder durch Bearbeiten des
"name"-Felds im
"drivers"-Array der
config.json ausgewählt.
| Persona |
Treiber |
Beschreibung |
| MZ-700 |
MZ700 |
Sharp MZ-700 mit Bank-Switched-Speicher, VRAM, Tastatur, 8253 PIT. Die Standard-Persona. |
| MZ-1500 |
MZ1500 |
MZ-700-Obermenge mit integriertem Quick Disk, PCG, Stereo-PSG (SN76489AN), Z80 PIO-Drucker. |
| MZ-80K |
MZ80K |
Sharp MZ-80K mit SP-1002-Monitor, 8253 PIT, 8255 PPI, LS367-Tastatur, nativer MZ-80FD (T3444M) Floppy und MEMSW für CP/M. Kann den vollständigen Satz der MZ-80A-Schnittstellenkarten nutzen. CP/M erfordert den virtuellen Modus. |
| MZ-800 |
MZ800 |
Sharp MZ-800. Dual-Modus (MZ-700-kompatibel + native 320/640 Pixel breite GDG-Grafik, 4/16 Farben), SN76489-PSG, WD1773-FDC + QuickDisk. Führt MZ-700-Software und CP/M aus. |
| MZ-80A |
MZ80A |
Sharp MZ-80A mit SA-1510-Monitor, 8253 PIT, 8255 PPI, MEMSW für CP/M. |
| MZ-2000 |
MZ2000 |
Sharp MZ-2000 mit IPL-ROM, BST/NST-Modusumschaltung, VRAM-Overlay, MB8866 FDC. |
| MZ-2200 |
MZ2200 |
Sharp MZ-2200, MZ-2000-Variante mit gleicher Architektur. |
| MZ-80B |
MZ80B |
Sharp MZ-80B. 2K IPL-ROM, BST/NST-Modi, monochrom mit doppelten GRPH-Seiten, 8253 PIT, 8255 PPI, Z80 PIO. |
| MZ-2500 |
MZ2500 |
Sharp MZ-2500 (SuperMZ). 8-Seiten-MMU, MZ-2000/MZ-80B-Kompatibilitätsmodi, YM2203 FM+PSG, G-CRTC, MB8876 FDC. Virtueller Modus unterstützt Interrupt-gesteuerte Software, D88 natives Diskformat und One-Shot-Interrupt-Unterdrückung. |
Schnittstellen-Treiber
Schnittstellen-Treiber werden einer Persona über das "if"-Array in der JSON-Konfiguration des Treibers hinzugefügt. Jede Schnittstelle kann unabhängig aktiviert oder deaktiviert werden und hat ihre eigene ROM-, Disk-Image- und I/O-Konfiguration.
| Schnittstelle |
JSON-Name |
I/O-Ports |
Beschreibung |
| ROM Filing System |
RFS |
0x51–0x53, 0xC1–0xC8, 0xEFF8–0xEFFF |
Erweiterter Monitor mit SD-Karten-Speicher, CP/M-Boot, ROM-Banking. |
| TranZPUter Filing System |
TZFS |
0x60 (Speichermodi), 0x68 (Service-Prozessor) |
Multi-Bank-Monitor + CP/M-Dateisystem für die MZ-700-Persona (schließt sich mit RFS gegenseitig aus). Bootet CP/M; Laufwerks-Images pro Laufwerk über param-Dateifelder festgelegt. |
| Floppy-Controller (MZ-700) |
MZ-1E05 |
0xD8–0xDE |
WD1773-basierter FDC. Bis zu 4 Laufwerke. DSK/RAW/D88-Images. |
| Floppy-Controller (MZ-80K) |
MZ80FIO |
0xF8–0xFB, 0xF000–0xF3FF |
Native MZ-80FD/MZ-80FIO-Schnittstelle, die einen Toshiba T3444M FDC ansteuert. 128-Byte-FM-Sektoren, bis zu 4 Laufwerke, CPC-Extended-DSK-Images. |
| Floppy-Controller (MZ-80A) |
MZ80AFI |
0xD8–0xDE, 0xF3FE–0xF3FF |
MZ-80A AFI mit DRQ-basiertem A10-Toggle für 2 MHz-Betrieb. |
| Floppy-Controller (MZ-2000) |
MZ-8BFI oder E0054PA |
0xD8–0xDE |
MB8866 FDC ohne Treiber-ROM (Code im IPL). D88-Unterstützung. |
| QuickDisk (mit ROM) |
MZ-1E14 |
0xF4–0xF7 |
QD-Controller mit BIOS-ROM für MZ-700/MZ-800. |
| QuickDisk (ROM-los) |
MZ-1E19 |
0xF4–0xF7 |
QD-Controller für MZ-800/MZ-2000/MZ-2200/MZ-2500. |
| 32KB Battery RAM |
MZ-1R12 |
0xF8–0xFA |
Batteriegepuffertes CMOS SRAM, auf SD-Karte persistiert. Bis zu 2 Instanzen. |
| 64KB RAM Board |
MZ-1R18 |
0xEA–0xEB |
RAM-Erweiterung, verwendet als RAMFILE-Disk. |
| Kanji ROM |
MZ-1R23 |
0xB8–0xB9 |
128KB Kanji-ROM (16x16 JIS) + optionales 256KB Wörterbuch-ROM. |
| 640KB EMM |
MZ-1R37 |
0xAC–0xAD |
Expanded Memory Manager mit 20-Bit-Adressraum. |
| 320KB EMM |
PIO-3034 |
konfigurierbar |
IO DATA EMM mit automatisch inkrementierendem Datenport. |
| Celestite LAN |
Celestite |
0x60–0x6F |
W5100 Ethernet, Interrupt-Controller, UFM, integriertes MZ-1R12/MZ-1R37. Konfigurierbare Server-IP über JSON ip-Parameter. |
| SASI-Festplatte |
MZ-1E30 |
0xA4–0xA5, 0xA8–0xA9 |
MZ-1E30 SASI-Festplattencontroller (MZ-2500/MZ-80B). Bis zu 4 Festplatten (~21,4 MB jeweils). 32KB IPL-ROM. Disk-Images auf SD-Karte. |
| RS-232C Seriell (BI) |
MZ-8BIO3 |
0xB0–0xB3 (konfigurierbar) |
Zweikanal-RS-232C-Karte (emulierter Z80 SIO). Kanäle A/B brücken auf USB-CDC-Serienports 2 und 3. “BI”-Steckverbinderverdrahtung. |
| RS-232C Seriell (ST) |
MZ-1E24 |
0xB0–0xB3 (konfigurierbar) |
Wie MZ-8BIO3, jedoch mit Sharp-“ST”-Steckverbinderverdrahtung. |
TZFS und CP/M (MZ-700-Persona)
TZFS ist ein Low-Level-Monitor und Dateisystem, das als auswählbare Schnittstelle auf der
MZ-700-Persona angeboten wird (in der Praxis anstelle von RFS verwendet — aktivieren Sie das eine oder das andere). Über den Monitor hinaus bootet und betreibt es
CP/M. TZFS wird in der MZ-700-Konfiguration ausgeliefert, ist jedoch
standardmäßig deaktiviert: Aktivieren Sie es, indem Sie
"enable": 1 im
TZFS-Schnittstellenblock in
config.json setzen oder es über die Konfigurationsseite der Web-GUI einschalten. Sein ROM (
roms/tzfs.bin) muss auf der SD-Karte vorhanden sein.
CP/M-Disk-Images werden
pro Laufwerk über das
param-Array der Schnittstelle konfiguriert — jeder
param[].file-Eintrag gibt den Pfad einer vollständigen Image-Datei auf der SD-Karte für dieses Laufwerk an. Wenn ein Laufwerk keinen expliziten
file-Eintrag hat, wird die Fallback-Pfadvorlage
CPM/SDC16M/RAW/CPMDSK<nn>.RAW verwendet. Der picoZ80 hat keinen direkten SD-Zugriff, daher werden diese Sektoren über den ESP32 gelesen und geschrieben.
Persona–Schnittstellen-Kompatibilität
Nicht jeder Schnittstellen-Treiber ist für jede Persona verfügbar. Die folgende Tabelle zeigt, welche Schnittstellen mit jeder Maschinen-Persona über das "if"-Array verwendet werden können.
| Schnittstelle |
MZ-700 |
MZ-1500 |
MZ-80K |
MZ-800 |
MZ-80A |
MZ-2000 |
MZ-2200 |
MZ-80B |
MZ-2500 |
| RFS |
Ja |
Ja |
Ja |
Ja |
Ja |
Ja |
— |
— |
— |
| TZFS |
Ja |
— |
— |
— |
— |
— |
— |
— |
— |
| MZ-1E05 |
Ja |
Ja |
— |
Ja |
— |
— |
— |
— |
— |
| MZ80FIO |
— |
— |
Ja |
Ja |
— |
— |
— |
— |
— |
| MZ80AFI |
— |
— |
Ja |
Ja |
Ja |
— |
— |
— |
— |
| MZ-8BFI / E0054PA |
— |
— |
— |
Ja |
— |
Ja |
Ja |
Ja |
Ja |
| MZ-1E14 |
Ja |
Ja |
Ja |
Ja |
— |
— |
— |
Ja |
Ja |
| MZ-1E19 |
Ja |
Ja |
Ja |
Ja |
— |
Ja |
Ja |
Ja |
Ja |
| MZ-1R12 |
Ja |
Ja |
Ja |
Ja |
Ja |
Ja |
Ja |
Ja |
Ja |
| MZ-1R18 |
Ja |
Ja |
Ja |
Ja |
Ja |
Ja |
Ja |
Ja |
Ja |
| MZ-1R23 |
— |
Ja |
— |
Ja |
— |
— |
— |
Ja |
Ja |
| MZ-1R37 |
— |
Ja |
Ja |
Ja |
— |
— |
— |
Ja |
Ja |
| PIO-3034 |
— |
Ja |
Ja |
Ja |
— |
— |
— |
Ja |
Ja |
| Celestite |
— |
Ja |
— |
Ja |
— |
— |
— |
Ja |
Ja |
| MZ-1E30 |
— |
— |
— |
— |
— |
— |
— |
Ja |
Ja |
| MZ-8BIO3 |
Ja |
Ja |
— |
Ja |
— |
— |
— |
Ja |
— |
| MZ-1E24 |
Ja |
Ja |
— |
Ja |
— |
— |
— |
Ja |
— |
JSON-Konfigurationsbeispiel
Das folgende Beispiel zeigt, wie eine MZ-700 Persona mit RFS, einem Floppy-Controller und einem QuickDisk-Laufwerk konfiguriert wird. Dies wird im "drivers"-Array innerhalb des z80-Blocks der Partition in config.json platziert:
"drivers": [
{
"name": "MZ700",
"enable": 1,
"type": "VIRTUAL",
"if": [
{
"name": "RFS",
"type": "VIRTUAL",
"enable": 1,
"rom": [
{
"file": "roms/MROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [
{ "enable": 1, "position": "0x0", "addr": "0x0",
"bank": 32, "size": "0x80000", "tcycwait": 0, "tcycsync": 0 }
]
},
{
"file": "roms/USER_ROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [
{ "enable": 1, "position": "0x0", "addr": "0x0",
"bank": 40, "size": "0x80000", "tcycwait": 0, "tcycsync": 0 }
]
}
]
},
{
"name": "MZ-1E05",
"type": "VIRTUAL",
"enable": 1,
"param": [
{ "file": "dsk/MZ-2Z009-RFS.dsk", "enable": 1 }
]
},
{
"name": "MZ-1E19",
"type": "VIRTUAL",
"enable": 1,
"param": [
{ "file": "qd/BASIC_5Z008A_RFS.qd", "enable": 1 },
{ "file": "qd/BASIC_5Z008B.qd", "enable": 1 }
]
},
{
"name": "Celestite",
"type": "VIRTUAL",
"enable": 1,
"param": [
{ "file": "ram/celestite_r12.ram", "enable": 1 },
{ "file": "ram/celestite_r37.ram", "enable": 1 },
{ "ip": "192.168.1.210:6800", "enable": 1 }
]
}
]
}
]
Dateiserver-Adresse konfigurieren: Fügen Sie einen
ip-Eintrag zum
param-Array der Celestite-Schnittstelle in
config.json hinzu und geben Sie die IP-Adresse des PCs und den netfs.py-Port an:
{ "ip": "192.168.1.210:6800", "enable": 1 }
MZ-1E30 SASI-Festplattenkonfiguration: Fügen Sie eine MZ-1E30-Schnittstelle zum
"if"-Array der Persona hinzu. Der
rom-Eintrag stellt das 32KB IPL-ROM bereit, und
param-Einträge spezifizieren Festplatten-Images (bis zu 4):
{
"name": "MZ-1E30",
"type": "VIRTUAL",
"enable": 1,
"rom": [{ "file": "roms/MZ-1E30.ROM", "enable": 1 }],
"param": [
{ "file": "hdd/boot.hdd", "enable": 1 },
{ "file": "hdd/data.hdd", "enable": 1 }
]
}
Wichtige JSON-Felder:
- name — Persona- oder Schnittstellenname (muss einem kompilierten Treiber entsprechen).
- enable — auf 1 setzen zum Aktivieren, 0 zum Überspringen.
- type —
"VIRTUAL" (in PSRAM emuliert) oder "PHYSICAL" (Durchleitung an echte Hardware).
- rom — Array von ROM-Images zum Laden. Jeder Eintrag hat einen
file-Pfad (relativ zum SD-Karten-Stammverzeichnis) und ein loadaddr-Array, das angibt, wo die Daten platziert werden (Z80-Adresse, PSRAM-Bank, Größe).
- param — Array von Disk-/RAM-Image-Dateien.
param[0].file ist die erste Disk, param[1].file die zweite usw.
- addrmap — optionale Adressumbildung (Quelle → Ziel).
- iomap — optionale I/O-Port-Umbildung.
Alle Dateipfade sind relativ zum SD-Karten-Stammverzeichnis (z.B.
"roms/MROM_PICOZ80_256.bin").
Amstrad PCW Serie
Der picoZ80 unterstützt den Amstrad PCW-9512 und den Tatung Einstein TC-01 zusätzlich zur Sharp MZ-Serie.
Maschinen-Persona-Treiber
Jeder Amstrad-Persona-Treiber emuliert eine vollständige Amstrad-Maschine. Die Persona wird über die Webseite
Persona-Auswahl oder durch Bearbeiten des
"name"-Felds im
"drivers"-Array der
config.json ausgewählt.
| Persona |
Treiber |
Beschreibung |
| PCW-9512 |
PCW9512 |
Amstrad PCW-9512. Z80A @ 4MHz, 512KB RAM mit 4-Bank 16KB Page-Switching (Ports F0-F3), Gate Array (ASIC) für Video/Systemtakt/FDC-Routing/Motorsteuerung, NEC uPD765 FDC mit CPC DSK-Format-Unterstützung, 8041 Typenrad-Drucker-Controller. Virtueller und physischer Modus unterstützt. |
| Einstein TC-01 |
EinsteinTC01 |
Tatung Einstein TC-01. Z80A @ 4MHz, 64KB RAM + 8KB umschaltbares ROM, WD1770 FDC, TMS9129 VDP, AY-3-8910 PSG, Z80 CTC, Z80 PIO. Virtueller und physischer Modus unterstützt. |
Die PCW-9512-Persona beinhaltet eine vollständige Bootstrap-Sequenz-Emulation: der Gate-Array-Bytestrom lädt das BIOS, das dann CP/M von der Disk lädt. Gate-Array-Befehle umfassen Bootstrap beenden, Neustart, FDC-Interrupt-Routing (NMI/INT/ignorieren), Terminal Count und Motor ein/aus.
Disk-Imaging: Der picoZ80 kann physische Floppy-Disks abbilden, wenn er in der PCW-9512-Persona läuft. Der
dskimage ICE-Befehl injiziert Z80-Code, der alle Spuren über den Host-FDC liest und das Ergebnis als CPC DSK-Datei auf der SD-Karte speichert. Siehe die
ICE-Befehlsreferenz für Nutzungsdetails.
Tatung Einstein Serie
Der picoZ80 unterstützt den Tatung Einstein TC-01 — einen Z80A-basierten Heimcomputer mit integriertem Diskettenlaufwerk.
Maschinen-Persona-Treiber
Jeder Tatung-Persona-Treiber emuliert eine vollständige Tatung-Maschine. Die Persona wird über die Webseite
Persona-Auswahl oder durch Bearbeiten des
"name"-Felds im
"drivers"-Array der
config.json ausgewählt.
| Persona |
Treiber |
Beschreibung |
| Einstein TC-01 |
EinsteinTC01 |
Tatung Einstein TC-01. Z80A @ 4MHz, 64KB RAM + 8KB umschaltbares ROM (X-TAL MOS), ROM/RAM-Umschaltung über Port 0x24 (jeder Zugriff schaltet um; Schreibzugriffe gehen immer an RAM), WD1770 FDC mit virtueller Disk-Unterstützung (40 Spuren, 1 Kopf, 10 Sektoren, 512 Bytes — 200KB Disks), TMS9129 VDP (Video Display Processor) mit Inter-Access-Timing-Durchsetzung (~2us Abstand), AY-3-8910 PSG (3-Kanal-Sound) an Ports 0x02-0x03, Z80 CTC (4 Kanäle) an Ports 0x28-0x2B, Z80 PIO an Ports 0x30-0x33, Tastaturschnittstelle an Port 0x20. Physisches Disk-Imaging: physische Floppy zu DSK lesen, DSK auf physische Floppy schreiben. Virtueller und physischer Modus unterstützt. |
Disk-Imaging: Die Einstein TC-01-Persona unterstützt physisches Disk-Imaging über den
dskimage ICE-Befehl mit den Unterbefehlen
read und
write.
dskimage read erstellt ein Image einer physischen Floppy als DSK-Datei auf der SD-Karte, während
dskimage write eine DSK-Datei von der SD-Karte auf eine physische Floppy schreibt.
Weitere Maschinen
Die Unterstützung weiterer Z80-basierter Maschinen ist geplant. Jede neue Maschine folgt der gleichen Persona-Treiberarchitektur — ein dedizierter Persona-Treiber, der die Speicherkarte, I/O und Peripheriegeräte der Maschine implementiert, mit Schnittstellen-Treibern für Erweiterungshardware. Prüfen Sie das Projekt-Repository für die aktuelle Liste unterstützter Maschinen.
OpenZ80 — für Ihr eigenes Board oder eine nicht unterstützte Maschine. Wenn Sie Ihr eigenes Z80-Board bauen oder einen Z80-Computer besitzen, der noch keine dedizierte picoZ80-Persona hat, verwenden Sie den
OpenZ80-Firmware-Build. Sein Hauptreiz besteht darin, dass Sie
virtuelle Schnittstellenkarten, die von anderen Sharp-, Amstrad- und Tatung-Maschinen entlehnt sind, auf Ihrem maßgeschneiderten oder unbekannten Z80-Computer hinzufügen können, sodass Sie neue Software für diese Karten schreiben — oder bestehende Software für den Betrieb auf Ihrer Maschine anpassen können. OpenZ80 verhält sich wie eine einfache Z80: im
physischen Modus leitet es den gesamten 64K-Speicher und I/O-Raum an Ihr Board durch, und im
virtuellen Modus stellt es ein flaches 64K-RAM bereit, in das Sie Ihre eigenen ROM-Images laden können. Es stellt nur die maschinenunabhängigen Schnittstellenkarten bereit (die Speicherkarten MZ-1R12/1R18/1R23/1R37, die PIO-3034-Parallelkarte, die RS-232C-Serienkarten MZ-8BIO3 / MZ-1E24, die MZ-1E05-Floppy-Schnittstelle und das Celestite-LAN-Board), und bei jeder von diesen kann der
Base I/O Port auf der GUI-Konfigurationsseite verschoben werden, um zu Ihrem Board zu passen. Um eine der vorhandenen Maschinen anzupassen, können Entwickler einen beliebigen der mitgelieferten Treiber und dessen Monitor- / IPL- / BIOS-ROM-Quellcode (als Z80-Assembler in den
asm/-Verzeichnissen der RFS- und TZFS-Projekte mitgeliefert) als Ausgangspunkt nehmen — siehe den
Entwicklerleitfaden.
ICE (Debug-Shell)
Der picoZ80 enthält eine integrierte interaktive Debug-Shell (ICE — In-Circuit Emulator) für die Echtzeit-Inspektion und -Steuerung der Z80-CPU-Emulation.
Die ICE Debug-Shell ist in der DBGSH-Firmware-Variante enthalten. Bei Verwendung der Standard-Firmware ist die Debug-Shell nicht verfügbar. Flashen Sie die DBGSH-Variante, um die ICE-Funktionalität zu aktivieren.
Verbindung herstellen: Die Debug-Shell ist über den zweiten USB-Seriell-Port verfügbar. Wenn der picoZ80 per USB verbunden ist, erscheinen zwei serielle Ports am Host-Computer — der erste ist die Standard-Debug-Log-Ausgabe, der zweite die Debug-Shell. Öffnen Sie sie mit einem beliebigen Terminal-Emulator bei 115200 Baud, 8N1. Der Prompt
dbg> erscheint bei Verbindung.
Hauptfunktionen:
- Registerinspektion —
regs zeigt alle Z80-Register, Flags und den Zykluszähler an.
- Speicherauszug —
dm p 0000 100 gibt 256 Bytes ab Adresse 0x0000 über den physischen Bus aus; dm v 0000 100 liest virtuelles PSRAM direkt.
- Breakpoints —
bp E800 setzt einen Breakpoint bei 0xE800. Bis zu 8 Breakpoints. bl listet sie auf, bc * löscht alle.
- Einzelschritt —
hold pausiert die CPU, dann führt step eine Instruktion aus und zeigt den Registerzustand vorher/nachher an.
- Ausführungstrace —
trace on zeichnet jede ausgeführte Instruktion auf. trace dump 20 zeigt die letzten 20 mit Disassemblierung an.
- Disassemblierung —
dis v E800 20 disassembliert 32 Instruktionen ab 0xE800.
- I/O-Zugriff —
in D8 liest Port 0xD8; out D8 03 schreibt 0x03 auf Port 0xD8.
- Systeminformationen —
status zeigt CPU-Frequenz, PSRAM-Takt, Emulationsgeschwindigkeit und Betriebszeit an. drivers listet aktive Treiber auf.
Geben Sie
help am Prompt für eine Kurzübersicht ein.
Befehlsreferenz
Der vollständige ICE-Befehlssatz ist unten aufgeführt. Alle Adress- und Datenwerte werden hexadezimal ohne 0x-Präfix eingegeben.
| Befehl |
Parameter |
Beschreibung |
| help |
— |
Zeigt eine Zusammenfassung aller verfügbaren Befehle an. |
| regs |
— |
Gibt den vollständigen Z80-Registersatz aus: Hauptregister (AF, BC, DE, HL), Alternativregister (AF’, BC’, DE’, HL’), Indexregister (IX, IY), Stack- und Programmzähler (SP, PC), Interrupt-Zustand (I, R, IM, IFF1, IFF2), dekodierte Flags (S, Z, H, P/V, N, C), HALT-Leitungszustand, MEMPTR und den kumulativen T-Zyklus-Zähler. |
| dm |
<p|f|v|r> <addr> [len] |
Speicherauszug in Hex und ASCII. Vier Modi: p (physisch) liest über den Z80-Bus und löst echte Hardware aus; f (fetch) liest mittels M1-Fetch-Zyklen; v (virtuell) liest PSRAM direkt ohne Busaktivität; r (RP2350) liest den eigenen Adressraum des Mikrocontrollers (Flash, SRAM, Peripherie). addr ist die Startadresse, len ist die Anzahl der Bytes (Standard 256). |
| search |
[p|v] <start> <end> <hex..>|"text" |
Durchsucht den Speicher nach einem Byte-Muster oder ASCII-Text. p = physischer Bus, v = virtuelles PSRAM, ohne Angabe = gemappt (folgt der Speicherkarte). Das Muster als Hex-Bytes (z.B. ED 4D 00) oder als ASCII-String in Anführungszeichen (z.B. "HELLO") angeben. Treffer werden mit 8 Bytes Kontext davor und danach angezeigt. Hält CPU automatisch für physischen/gemappten Zugriff an. Musterlänge bis zu 32 Bytes. |
| cmp |
[f] <phys> <virt> <len> |
Vergleicht physischen Bus-Speicher mit virtuellem PSRAM. Optionales f verwendet Fetch-Zyklen (M1) statt Lesezyklen. Meldet Abweichungen mit Adressen und Werten. |
| dis |
[p|v] [addr] [count] |
Disassembliert Z80-Maschinencode. p liest Opcodes vom physischen Bus, v vom virtuellen PSRAM (Standard). addr ist standardmäßig der aktuelle PC. count ist die Anzahl der Instruktionen (Standard 16). Der aktuelle PC wird mit > markiert. |
| asm |
[addr] |
Startet den interaktiven Z80-Assembler an addr (Standard: aktueller PC). Geben Sie Z80-Mnemonics einzeln pro Zeile ein; assemblierte Bytes werden ins virtuelle PSRAM geschrieben und die Adresse rückt vor. Unterstützt db und dw/defw-Direktiven. Leere Zeile oder . eingeben zum Beenden. |
| memmap |
[block] |
Zeigt die SRAM-Speicherblock-Zeigertabelle an. Jeder Eintrag zeigt Blocknummer, Z80-Adressbereich, Speichertyp (PHYSICAL, RAM, ROM, FUNC), Banknummer und PSRAM-Offset. Bei Angabe von block wird nur dieser 512-Byte-Block angezeigt. |
| memptr |
[addr] |
Zeigt die PSRAM memPtr/memioPtr-Tabellen für die angegebene Adresse, einschließlich Handler-Funktionszeiger und Attribute. |
| iomap |
[port] |
Zeigt die I/O-Port-Handler-Tabelle an. Jeder Eintrag zeigt Port-Adresse, Handler-Funktion und Richtung (Lesen/Schreiben/beides). Bei Angabe von port wird nur dieser Port angezeigt. |
| status |
— |
Systemstatusübersicht: RP2350 CPU-Frequenz, PSRAM SPI-Takt, Host-Z80-Takt, Emulationsgeschwindigkeitsverhältnis, freies SRAM und Betriebszeit. |
| ver |
— |
Zeigt Firmware-Version, Build-Datum, Flash-Partitionslayout (Adresse, Größe, Prüfsumme, Aktiv-Flag), Autor und Lizenz an. |
| drivers |
— |
Listet alle aktiven Maschinen-Persona-Treiber und ihre Unterschnittstellen auf, mit Initialisierungsstatus. |
| hold |
— |
Pausiert die Z80-CPU-Emulation. Core 1 beendet die aktuelle Instruktion und stoppt das Fetching. Die Shell wartet auf die Bestätigung des Hold, bevor sie zurückkehrt. Erforderlich vor der Verwendung von out oder anderen Befehlen, die den laufenden Zustand ändern. |
| release |
— |
Setzt die Z80-CPU-Emulation von dem Punkt fort, an dem sie angehalten wurde. Breakpoints bleiben aktiv. |
| go |
— |
Setzt die Ausführung fort (identisch mit release). Wenn anschließend ein Breakpoint erreicht wird, hält die CPU automatisch erneut an. |
| cont |
— |
Alias für go. Setzt die Ausführung vom aktuellen Haltepunkt fort. Breakpoints bleiben aktiv. |
| step |
[n] |
Einzelschritt einer Instruktion (oder n Instruktionen). Für jeden Schritt zeigt die Shell den Registerzustand vor der Ausführung, die disassemblierte Instruktion mit Hex-Bytes und den Registerzustand nach der Ausführung an. Die CPU muss zuvor angehalten sein. Bei Erreichen eines Breakpoints während eines Mehrfachschritts wird die Ausführung vorzeitig beendet. |
| bp |
<addr> |
Setzt einen Breakpoint an der angegebenen Z80-Adresse. Bis zu 8 Breakpoints können gleichzeitig aktiv sein. Wenn der PC während des Opcode-Fetchs mit einer Breakpoint-Adresse übereinstimmt, wird die CPU automatisch angehalten und der Treffer gemeldet. Doppelte Adressen werden abgelehnt. |
| bc |
<n|*> |
Löscht Breakpoint-Slot n (0–7) oder alle Breakpoints (*). |
| bl |
— |
Listet alle aktiven Breakpoints mit Slotnummer und Adresse auf. |
| wm |
[p|v] <addr> <byte> [byte]... |
Schreibt ein oder mehrere Bytes in den Speicher. p = physischer Z80-Bus, v = virtuelles PSRAM, ohne Angabe = automatisch (folgt der Speicherkarte). Mehrere Bytes können durch Leerzeichen getrennt angegeben werden. Hält CPU automatisch für physische/gemappte Schreibzugriffe an. |
| fill |
[p|v] <addr> <len> [w|d] <val> |
Füllt einen Speicherbereich mit einem konstanten Wert. p = physisch, v = virtuell, ohne Angabe = automatisch. Standard 8-Bit; w = 16-Bit, d = 32-Bit (Little-Endian). Hält CPU bei Bedarf automatisch an. |
| copy |
<pv|fp|vp> <src> <len> <dst> |
Kopiert Speicher zwischen physisch und virtuell. pv = physisch lesen nach virtuell, fp = physisch fetchen nach virtuell, vp = virtuell nach physisch schreiben. Hält CPU automatisch an. |
| memtest |
<addr> <len> [pattern] |
Testet physischen Speicher mit drei Durchläufen: Schreiben+Lesen, Schreiben+Fetch, verschränkt. Standardmuster: aufsteigende Bytes. Meldet Fehler pro Durchlauf. |
| in |
<port> |
Liest einen Z80 I/O-Port. Führt einen echten IORQ+RD Buszyklus durch und zeigt das gelesene Byte an. |
| out |
<port> <byte> |
Schreibt ein Byte auf einen Z80 I/O-Port. Die CPU muss zuvor angehalten sein. Führt einen echten IORQ+WR Buszyklus durch. |
| trace |
<on|off|dump [n]|clear|rt|byte ...> |
Steuert den Ausführungstrace. on aktiviert die Aufzeichnung jeder ausgeführten Instruktion in einen 512-Eintrags-Ringpuffer (PC, Opcode, Flags). off deaktiviert die Aufzeichnung. dump zeigt die letzten n Einträge (Standard: alle) mit Disassemblierung und dekodierten Flags an. clear setzt den Puffer zurück. rt aktiviert Echtzeit-Trace-Ausgabe auf der Debug-Konsole während der Ausführung. byte aktiviert Byte-Level-Tracing von Speicher/IO-Transaktionen. |
| verify |
<on|off> |
Schaltet die vollständige Opcode-Fetch-Verifizierung um. Bei Aktivierung wird jeder Fetch gegen readPhysicalMem verifiziert (50% Geschwindigkeitsreduktion). Bei Deaktivierung (Standard) werden nur 0x00/0xFF Opcodes überprüft. |
| fwait |
<0-4> |
Erzwingt zusätzliche Wait-States bei M1 (Opcode-Fetch) Zyklen. <n> ist 0–4 zusätzliche T-States (0 = aus, Standard). Nützlich zum Debuggen von Code, der sich mit Wait-States anders verhält — einige Peripheriegeräte oder Speicherbausteine erfordern bestimmte Timing-Margen. Ohne Parameter wird die aktuelle Einstellung angezeigt. |
| iowait |
<0-8> |
Erzwingt zusätzliche Wait-States bei I/O-Lese- und -Schreibzyklen. <n> ist 0–8 zusätzliche T-States (0 = aus, Standard). Dehnt I/O-Zyklen zur Diagnose von Peripheriegeräten mit langsamen Antwortzeiten. Ohne Parameter wird die aktuelle Einstellung angezeigt. |
| corrupt |
[clear] |
Zeigt erkannte Fetch-Korruptionen an (PC, geholter Opcode, verifizierter Opcode). clear setzt das Protokoll zurück. |
| fdctrace |
<on|off|dump> |
Aktiviert, deaktiviert oder gibt den FDC I/O-Trace aus. on/off steuert die Aufzeichnung von WD1773 FDC-Registerzugriffen in einen 64-Eintrags-Ringpuffer. dump zeigt die letzten 64 Operationen, einschließlich Registername (Status/Command, Track, Sector, Data, DriveSel, SideSel, DDEN), Lese- oder Schreibrichtung, Bytewert und FDC-Status. |
| qdtrace |
<on|off|dump> |
Aktiviert, deaktiviert oder gibt den Quick Disk I/O-Trace aus. on/off steuert die Aufzeichnung von QD SIO-Registerzugriffen in einen 64-Eintrags-Ringpuffer. dump zeigt die letzten 64 Operationen, einschließlich Port, Richtung, Bytewert und Bandposition (Byte-Offset). |
| piodbg |
[clear] |
Zeigt RP2350 PIO-Hardware-Diagnosen für alle drei PIO-Blöcke (PIO 0, PIO 1, PIO 2) an. Zeigt FDEBUG Sticky-Error-Flags (Stall, RX-Unterlauf, TX-Überlauf), FSTAT-Status, FIFO-Füllstände, Programmzähler pro State-Machine, GPIO Output-Enable-Maske und GPIO-Pin-Pegel. clear setzt die FDEBUG Sticky-Flags zurück. Nützlich zur Diagnose von PIO-State-Machine-Hängern oder Bus-Kontention. |
| load |
<p|v> <file> <addr> [len] [ofs] |
Lädt eine Datei von der ESP32 SD-Karte in den Z80-Speicher. p = auf physischen Bus schreiben, v = in virtuelles PSRAM Bank 0 schreiben. file ist relativ zu /sdcard/ auf dem ESP32. addr ist die Z80-Startadresse. Ohne len wird die gesamte Datei geladen (bis zu 64KB); bei Angabe werden so viele Bytes geladen (max. 1MB). Optionales ofs ist der Datei-Offset zum Beginn des Lesens. Hält CPU automatisch für physische Schreibzugriffe an. Verwendet PSRAM Bank 63 als Zwischenpuffer. |
| save |
<p|pf|v> <file> <addr> <len> |
Speichert Z80-Speicher in eine Datei auf der ESP32 SD-Karte. p = über physischen Bus lesen, pf = über physischen Fetch (M1-Zyklen) lesen, v = aus virtuellem PSRAM Bank 0 lesen. file ist relativ zu /sdcard/. addr ist die Z80-Startadresse, len ist die Anzahl der zu speichernden Bytes (max. 64KB). Hält CPU automatisch für physische Lesezugriffe an. Führt periodisches DRAM-Refresh während physischer Lesezugriffe durch. |
| dir |
[path] |
Listet Dateien auf der ESP32 SD-Karte auf. Optionaler Pfad ist relativ zu /sdcard/. Zeigt Dateinamen und Größen an. |
| echo |
[on|off] |
Schaltet das Zeichenecho um oder setzt es. Bei Aktivierung (Standard) werden eingegebene Zeichen zum Terminal zurückgesendet. |
| reset |
— |
Erzwingt einen sofortigen Z80-CPU-Reset. Die Emulation startet vom Reset-Vektor (typischerweise 0x0000) neu. |
| set |
<reg|flags|memmap|memptr|iomap> <idx> <val> |
Ändert ein Z80-Register, Flags, die Speicherkarte, PSRAM memPtr oder einen I/O-Port-Karteneintrag zur Laufzeit. reg setzt ein Z80-Register, flags setzt das Flags-Register, memmap/memptr/iomap ändern die Speicher- oder I/O-Konfiguration. idx ist der Registername oder Tabellenindex (dezimal oder hex), val ist der neue Wert. Dies ermöglicht Hot-Patching von Registern und Speicher/IO-Konfiguration ohne Neuladen der config.json. |
| hist |
[n] |
Zeigt den Befehlsverlaufspuffer an. Zeigt die letzten n Befehle (Standard: alle Einträge, bis zu 16). Der Verlauf bleibt über Stromzyklen hinweg erhalten, da er im ESP32 NVS gespeichert wird. |
| savehst |
— |
Erzwingt das sofortige Speichern des aktuellen Befehlsverlaufs im ESP32 NVS. Der Verlauf wird normalerweise beim ordnungsgemäßen Herunterfahren automatisch gespeichert; dieser Befehl erzwingt eine sofortige Speicherung. |
| ipl |
— |
Führt einen IPL-Reset (BST-Modus) durch Umschalten von 8255 PPI Port C Bit 3 durch. Setzt die Maschine in den Boot-Modus zurück, ohne einen vollständigen Z80-Reset. Nützlich für MZ-80B, MZ-2000 und MZ-2500 Maschinen, die zwischen BST (Boot) und NST (Normal) Modi unterscheiden. |
| mmutrace |
— |
Gibt maschinenspezifische Trace-Informationen wie MMU-Zustand und I/O-Register-Snapshots aus. Die Ausgabe variiert je nach Persona — jeder Treiber registriert seinen eigenen Trace-Handler, sodass die angezeigten Informationen von der aktiven Maschinen-Persona abhängen. |
| intcount |
— |
Zeigt den Interrupt-Acknowledge-Zähler und den aktuellen Interrupt-Zustand an. Nützlich zum Debuggen von Interrupt-gesteuerter Software — zeigt an, wie viele Interrupt-Acknowledge-Zyklen stattgefunden haben und ob Interrupts derzeit anstehen oder aktiviert sind. |
| psync |
[start end] |
Synchronisiert physischen Speicher mit PSRAM durch Lesen des physischen Busses und Schreiben in den virtuellen Speicher. Optionale start- und end-Parameter geben einen Adressbereich an; ohne Angabe wird der gesamte Adressraum synchronisiert. Nützlich für Diagnosen nach DMA-Operationen oder wenn physischer und virtueller Speicher voneinander abgewichen sein könnten. |
| dskimage |
read <filename> [cylinders] [heads] / write <filename> |
Erstellt ein Image einer physischen Floppy-Disk als DSK-Datei auf der SD-Karte (read) oder schreibt eine DSK-Datei von der SD-Karte auf eine physische Floppy (write). dskimage <filename> führt standardmäßig einen Read durch (rückwärtskompatibel). filename ist der DSK-Dateipfad relativ zu /sdcard/. Wenn cylinders und heads beim Lesen weggelassen werden, wird die Geometrie automatisch erkannt. Die CPU muss zuvor angehalten sein. Der Fortschritt wird während des Imagings angezeigt. |
| busdiag |
— |
Zeigt Bus-Diagnosen einschließlich PIO-Zustand, Signalpegeln und Bus-Kontentionsstatus an. Nützlich zur Diagnose elektrischer Probleme mit der Host-Bus-Verbindung. |
| fdcimage |
— |
Zeigt FDC-Imaging-Status und -Fortschritt an. |
| fdcdiag |
— |
Zeigt FDC-Diagnoseinformationen an (Controller-Zustand, Register-Dump). |
| gadiag |
— |
Zeigt Gate-Array-Diagnoseinformationen an (Befehlszustand, Interrupt-Routing). |
Typischer Debugging-Workflow:
- Verbinden Sie ein Terminal mit dem zweiten USB-Seriell-Port (115200, 8N1).
hold — CPU pausieren.
regs — aktuellen Registerzustand inspizieren.
dis v — Code am aktuellen PC disassemblieren.
bp E800 — einen Breakpoint setzen.
go — fortsetzen. Die CPU stoppt, wenn sie 0xE800 erreicht.
step 5 — 5 Instruktionen vom Breakpoint aus einzeln ausführen.
dm v D000 80 — VRAM-Inhalt inspizieren.
trace on / go / trace dump 50 — Ausführungsverlauf aufzeichnen und überprüfen.
Fehlerbehebung
Host-Computer startet nicht
- Ausrichtung prüfen — stellen Sie sicher, dass Pin 1 des picoZ80 mit Pin 1 des Sockels übereinstimmt. Das Einsetzen des Boards in falscher Richtung beschädigt sowohl den picoZ80 als auch den Host-Computer.
- Sitz prüfen — entfernen Sie den picoZ80 und setzen Sie ihn erneut ein, wobei Sie sicherstellen, dass alle 40 Pins vollständig sitzen und keiner unter dem Board verbogen ist.
- SD-Karte prüfen — wenn
config.json fehlt oder fehlerhaft ist, versucht die Firmware die zuvor zwischengespeicherte Flash-Konfiguration zu verwenden. Wenn keine gültige Konfiguration existiert, initialisiert der RP2350 die Speicherkarte nicht und der Host sieht einen offenen Bus.
- Firmware-Flash bestätigen — versuchen Sie, den picoZ80 per USB zu verbinden (ohne ihn in den Host einzusetzen) und überprüfen Sie, ob das Board am PC erkannt wird.
- Host-Stromversorgung prüfen — der picoZ80 kann bis zu 400mA von der 5V-Leitung aufnehmen. Einige Vintage-Computer haben knappe Netzteile; prüfen Sie die 5V-Spannung unter Last mit einem Multimeter.
Verbindung zur Web-Oberfläche nicht möglich
- WiFi-Modus prüfen — beim ersten Start oder nach einem Werksreset startet der ESP32 im AP-Modus. Verbinden Sie sich zuerst mit dem
picoZ80-WiFi-Netzwerk und navigieren Sie dann zu http://192.168.4.1.
- Konfigurierte IP-Adresse prüfen — wenn der Client-Modus mit einer festen IP konfiguriert ist, überprüfen Sie, ob die IP zu Ihrem Netzwerk-Subnetz passt.
- SD-Karte vorhanden prüfen — die Web-Assets im
webfs/-Verzeichnis auf der SD-Karte werden benötigt. Ohne SD-Karte kann der Webserver keine Seiten ausliefern.
- webfs-Verzeichnis prüfen — bestätigen Sie, dass das
webfs/-Verzeichnis auf der SD-Karte existiert und die HTML/CSS/JS-Dateien aus dem Projekt-Repository enthält.
- WiFi-Werksreset — wenn Zugangsdaten verloren gegangen sind, flashen Sie die ESP32-Firmware erneut, um die NVS-Einstellungen zu löschen und von vorn zu beginnen.
SD-Karte wird nicht erkannt
- Stellen Sie sicher, dass die SD-Karte als FAT32 formatiert ist. NTFS, exFAT und FAT16 werden nicht unterstützt.
- Versuchen Sie eine andere SD-Karte — einige Karten mit hoher Kapazität oder hoher Geschwindigkeit können Kompatibilitätsprobleme mit der ESP32 SPI SD-Schnittstelle haben.
- Karten bis 32GB werden gut unterstützt. Sehr große Karten (>32GB) erfordern möglicherweise eine spezielle Formatierung.
- SD-Karte neu einsetzen — entfernen und erneut einsetzen, um guten Kontakt sicherzustellen.
ROM-Images werden nicht geladen
- Überprüfen Sie, ob der Dateipfad in
config.json genau mit dem Speicherort auf der SD-Karte übereinstimmt (Pfade sind case-sensitiv).
- Bestätigen Sie, dass die ROM-Image-Datei auf der SD-Karte vorhanden ist — verwenden Sie den Dateimanager, um zum erwarteten Speicherort zu navigieren.
- Prüfen Sie den
fileofs-Wert — ein falscher Offset lädt ungültige Daten in die ROM-Bank.
- Überprüfen Sie, ob das
size-Feld im Speicherkarteneintrag nicht größer als die ROM-Image-Datei ist. Übergroße Zuordnungen werden mit undefinierten Daten aufgefüllt.
Board setzt sich unerwartet zurück oder startet neu
- Der picoZ80 hat einen Hardware-Watchdog-Timer, der den RP2350 automatisch zurücksetzt, wenn die Firmware während des Boots oder des normalen Betriebs hängt. Wenn das Board wiederholt neu startet, löst der Watchdog aus, weil ein Boot-Schritt nicht rechtzeitig abgeschlossen wird.
- SD-Karte prüfen — eine fehlende oder beschädigte
config.json kann dazu führen, dass die Boot-Sequenz während der Konfigurationsanalyse stehen bleibt.
- WiFi-Einstellungen prüfen — wenn der ESP32 keine Verbindung herstellen kann, kann der SPI-Handshake zwischen RP2350 und ESP32 ein Timeout auslösen, das den Watchdog aktiviert.
- SWD-Debugging verwenden — verbinden Sie eine Debug-Sonde und inspizieren Sie die Watchdog-Scratch-Register (
watchdog_hw->scratch[5] bis scratch[7]). Der Boot-Fortschrittscode in scratch[6] zeigt an, welche Stufe die Firmware vor dem Watchdog-Auslösen erreicht hat, und scratch[0–3] enthalten eine Historie der letzten vier Reset-Versuche.
- Persistentes Protokoll prüfen — die Firmware schreibt boot-kritische Meldungen in die letzten 4KB des PSRAM mittels
plogf(). Diese Meldungen überleben den Watchdog-Reset und werden beim nächsten erfolgreichen Boot auf der Debug-Konsole ausgegeben, um zu zeigen, was vor dem Reset passiert ist.
OTA-Update schlägt fehl
- Stellen Sie sicher, dass Sie eine
.bin-Datei (nicht eine .uf2) für RP2350 OTA-Updates hochladen.
- Stellen Sie sicher, dass Sie auf den inaktiven Slot hochladen, um die funktionierende Firmware zu erhalten.
- Wenn das OTA-Update fehlschlägt oder zu einer nicht bootfähigen Partition führt, behält der Bootloader den vorherigen aktiven Slot bei — wiederholen Sie den Upload-Vorgang.
- Bei ESP32 OTA-Fehlern flashen Sie erneut über
esptool mit der Debug-Header-USB-Verbindung.
Referenzseiten
FCC / RED Regulatorischer Hinweis
Das picoZ80-Board wurde nicht zur FCC (USA) oder RED (EU) Zertifizierung als absichtlicher Strahler eingereicht. Im Auslieferungszustand müssen die WiFi-Antennen-Anpassungskomponenten unbestückt sein und die ESP32-Firmware muss mit der
NCM Only-Konfiguration gebaut sein. In diesem Zustand wird keine Hochfrequenzenergie emittiert und das Board fällt nicht unter die Vorschriften für absichtliche Strahler.
Endbenutzer, die WiFi nutzen möchten, können das Antennen-Anpassungsnetzwerk bestücken, die WiFi-Firmware-Variante bauen und unter der Hobbyist-/Experimentalausnahme betreiben, die in ihrer Rechtsordnung gilt. Jede Partei, die das Board kommerziell mit aktiviertem WiFi verkaufen möchte, muss zunächst die FCC- und/oder RED-Zertifizierung für die vollständige Baugruppe erhalten.