Phosphoric — Funktionen im Detail
Taktgenauer ORIC-1- / Atmos-Emulator · in C11 geschrieben · MIT-Lizenz
Diese Seite listet alle Funktionen von Phosphoric auf, mit einer Erläuterung zu jeder und den zugehörigen Befehlszeilenoptionen. Das GitHub-Repository ist die maßgebliche, aktuelle Quelle; die technische Dokumentation behandelt jedes Subsystem im Detail.
Inhalt
- 1. Emulationskern
- 2. Peripherie & Karten
- 3. ORIC-1- & Atmos-Modelle
- 4. Joystick, Drucker, Plotter
- 5. Savestates
- 6. Interaktiver Debugger
- 7. Steuerung & Automatisierung
- 8. Chromecast- / Google-Cast-Streaming
- 9. Anzeige & Aufnahme
- 10. ULA-NG (neue Generation)
- 11. Trace, Profiling, ROM-Analyse
- 12. Betriebssysteme
- 13. Komfort & Ports
- 14. Seriell: Chips × Transporte
- 15. Tastenkürzel
- 16. Kompilierung
1. Emulationskern
Der Kern bildet die Maschine Takt für Takt nach: Jeder Chip läuft im selben Tempo wie das originale Silizium — ein Muss für Demos und rastersensiblen Code.
MOS-6502-CPU
Taktgenaue Emulation der 151 offiziellen Opcodes, 13 Adressierungsarten, Dezimalarithmetik (BCD) und pegelgesteuerte IRQs. Die Testsuite deckt auch die illegalen NMOS-Opcodes ab.
64 KB Speicher
RAM $0000-$BFFF, ROM $C000-$FFFF, Banking und I/O-Routing getreu der Speicheraufteilung
des Oric.
VIA 6522
16 Register, Timer 1/2, IFR/IER-Interrupts, Tastaturmatrix, Schieberegister (8 Modi), T2-Impulszählung, vollständige CA2/CB2-PCR-Modi (Eingangsflanken, unabhängige Interrupts, Handshake — CB2 nur schreiben wie das Silizium —, Ein-Takt-Impuls, manuell) und IRA/IRB-Eingangsverriegelung (ACR-Bits 0-1).
ULA-Video
Textmodus (40×28) und HIRES (240×200), serielle Attribute, PAL-Timing (312 Zeilen × 64 Takte).
AY-3-8910 PSG
3 Tonkanäle, Rauschen, 16 Hüllkurvenformen, SDL2-Audioausgabe.
2. Peripherie & Karten
Microdisc (WD1793-Controller)
WD1793-FDC, 4 Laufwerke (A-D), Overlay-ROM, Sedoric-Boot. Echtes mechanisches Timing standardmäßig (Schrittraten 6/12/20/30 ms, Rotationslatenz bei 300 U/min, Record-Not-Found nach 5 Indeximpulsen, Live-Type-I-Indeximpuls). Injektion defekter Sektoren zum Testen der Robustheit: Der Schaden folgt dem Medium über Laufwerkswechsel und wird in Savestates gespeichert.
- --disk-rom DATEI · --disk / --disk1/2/3 Laufwerke A bis D
- --fdc-timing real (Standard) | fast · --disk-writeback · --bad-sector [D:]S:T:N
Kassette (TAP-Format)
CLOAD/CSAVE per ROM-Patching, Schnellladen, Multi-Block, Neuverkettung nach CLOAD und Wiedergabe auf
Signalebene (--tape-signal: echte VIA-CB1-Wellenform, vom ROM gelesen, für eigene oder geschützte
Lader).
- --tape DATEI · --fast-load · --tape-signal
ACIA 6551 (seriell)
Serieller Controller bei $031C-$031F ($0380 unter LOCI). Transporte loopback / TCP / PTY /
COM / Datei sowie Protokoll-Backends (Hayes-AT-Modem, PicoWiFiModemUSB), V23-Modus (Minitel / Digitelec). Siehe die
Chips-×-Transporte-Matrix.
Digitelec DTL 2000
Getreue PIA-6821- + ACIA-6850-Modemkarte bei $03F8-$03FD (per OCR aus zeitgenössischer Dokumentation
verifizierte Register), V23 75/1200 und symmetrisch 1200, Leitungs-/Trägersteuerung, verdrahteter IRQ. Gegen das
zeitgenössische OTRM-Terminal validiert.
- --dtl2000 TRANSPORT · --dtl2000-addr XXXX
Mageco / ORICON MIDI
MC6850-ACIA, die die MIDI-DIN-Buchsen ansteuert (31250 Baud, 8-N-1). Zwei Designs aus dem Oric-Forum: die originale
Mageco-Karte bei $03FE-$03FF (--mageco) und der moderne
ORICON-Reboot bei $031C-$031D + Taktgenerator, LOCI-kompatibel (--oricon).
Rohe MIDI-Daten aufnehmen/wiedergeben, eine Standard-MIDI-Datei in den Oric abspielen (im Tempo) oder — in
einem MIDI=1-Build — einen Live-Host-MIDI-Port (ALSA / CoreMIDI / WinMM) öffnen, um FluidSynth oder eine
DAW anzusteuern.
- --mageco file:in[:out] | smf:DATEI[:loop] | midi[:ZIEL] | loopback | tcp | pty · --oricon TRANSPORT
PicoWiFiModemUSB
Emulation des WLAN-Modems von sodiumlb (Pico W, USB CDC ↔ WLAN), von LOCI als ACIA bei $0380
bereitgestellt. Vollständiger AT-Befehlssatz v0.1.0; simuliertes WLAN, echte TCP-Datenverbindungen.
- --serial picowifi[:SSID[:PASS]]
LOCI — Lovely Oric Computer Interface
Schnittstelle von sodiumlb (2024): MIA-Bus $03A0-$03BF, 36/36 API-Ops (firmware-konforme ABI), USB HID,
taktgenauer WD1793, FAT16/32-SD-Image, ROM-Wechsel zur Laufzeit. Aktionstaste (F8): kurzer Druck →
Sitzungs-Snapshot + LOCI-Menü; langer Druck (≥ 2 s) → Diagnose-ROM von Mike Brown. Bietet dem Oric echte
Host-USB-Sticks, abstimmbares MIA-Bus-Timing. Bootet einen vollständigen Sedoric-V4-Master über die LOCI-Firmware.
- --loci · --loci-flash DIR · --loci-sdimg PFAD · --loci-usb DIR|none
- --loci-mia-window LO-HI · --loci-irq-latency US
3. ORIC-1- & Atmos-Modelle
Automatische Modellerkennung
Erkennt BASIC 1.0 (ORIC-1) gegenüber 1.1 (Atmos) am ROM-Header, mit den korrekten Kassetten-Patch-Adressen für jede Version. Das Modell kann auch erzwungen werden.
- --model oric1 | atmos | 1.0 | 1.1
4. Joystick, Drucker, Plotter
IJK-Joystick
IJK-Schnittstelle (der häufigste Adapter, aktiv-low an PSG-Port A), im Tastaturmodus (Pfeiltasten + RCtrl/RAlt als Feuer) oder als SDL2-Gamepad (D-Pad, Analogstick, A/B/X-Tasten), mit Hot-Plug. Joystick- und Tastatursignale mischen sich an Port A.
- --joystick keys | gamepad
Centronics-Drucker & MCP-40-Plotter
LPRINT/LLIST in eine Textdatei erfassen oder den 4-farbigen MCP-40-Stiftplotter emulieren (Befehle H/D/M/J/P/L, Framebuffer 480×400, Bresenham-Linienzeichnung, 5×7-Schrift, BMP-Export). Centronics-Protokoll über VIA-Port A + CA2-Flanke (STROBE).
- --printer DATEI · --printer-type text (Standard) | mcp40
5. Savestates
.ost-Format
Vollständiger Binärzustand mit CRC32-Integritätsprüfung, aufgeteilt in 13 Abschnitte (CPU, MEM, VIA, PSG, VID, KBD, FDC, MDC, DSK, BAD, TAP, SER, META). Unbekannte Abschnitte werden ignoriert: Das Format ist abwärts- und aufwärtskompatibel.
- --save-state DATEI · --load-state DATEI · Tasten F2 (speichern) / F4 (laden)
6. Interaktiver Debugger
Haltepunkte & Watchpoints
Bis zu 16 PC-Haltepunkte, bedingt (b ADDR if EXPR), 8 Rasterzeilen-Haltepunkte, 8
Speicherschreib-Watchpoints.
Ausführung & Inspektion
step, next, step-out, continue, Undo (16 CPU+RAM-Snapshots zurückspulen), Register,
paginierte Disassemblierung mit symbolaufgelösten Operanden, Speicher-Dump/-Bearbeitung, Inline-Assembler
(a ADDR MNEMONIC [Operand]), Speichersuche (find Bytes oder Text), Stack.
Live-Peripherie-Inspektion (via, psg, disk, acia, tape,
loci).
Symbole, TUI & GDB
Symboltabellen laden (.sym/.lab/EQU/VICE), eine ncurses-TUI mit 6 Panels
(TUI=1-Build) und vor allem ein entfernter GDB-Stub, um den 6502 aus gdb, lldb
oder einer IDE (VS Code, CLion) über das RSP-Protokoll zu debuggen — kein anderer Oric-Emulator bietet das.
- --debug · --break ADDR · --symbols DATEI · --tui · --gdb[=PORT]
7. Steuerung & Automatisierung
IPC-Steuermodus OricForge
Mit --control spricht Phosphoric ein Textprotokoll über stdin/stdout (Logs auf stderr): mehr als 40
Befehle (hello, regs, read, write, peek,
break, step, load-tap, load-rom, load-disk…) und 3
Ereignistypen. Asynchrone Pause während der Ausführung, Aushandlung von Fähigkeiten. Für die OricForge-IDE konzipiert.
HTTP-API (REST)
Derselbe Befehlssatz über HTTP/JSON (HTTPAPI=1-Build, Standardport 8888) für Scripting,
Browser-Dashboards und End-to-End-Tests. Endpunkte GET /hello /regs /mem /peek/… und POST /reset
/mem /keys /tape /disk /exec/…. Man kann aus der Ferne auf der Tastatur tippen
(POST /keys mit text=…). Standardmäßig an 127.0.0.1 gebunden,
Dateioperationen auf ein Sandbox-Verzeichnis beschränkt.
- --http-api[=PORT] · --http-api-bind ADRESSE · --http-api-root DIR
Deterministische Aufzeichnung / Wiedergabe („TAS movie“)
Tastatureingaben aufzeichnen und bit-deterministisch wiedergeben: tool-assisted Runs, Bug-Reproduktion, CI-Regressionen. Kein anderer Oric-Emulator bietet das.
- --record DATEI · --replay DATEI
Tastaturautomatisierung
Simuliertes Tippen mit Escapes (\n Return, \e Esc, Pfeiltasten, \Cx Strg+x,
\Fx Funct+x…). Das Tempo ist auf den echten Tastaturscanner synchronisiert (VIA-PB3-Matrix-Sweep):
keine verlorenen Tasten. Kann auf einen Speicherzustand statt auf einen geratenen Takt scharfgeschaltet werden.
- --type-keys N:TEXT · --type-keys-when A:V:TEXT
8. Chromecast- / Google-Cast-Streaming
An einen Google-Cast-Fernseher streamen
Phosphoric kann Bild und Ton des Oric an ein Chromecast- / Google-Cast-Gerät streamen. Ein
HTTP-MJPEG-Server (Videostream /stream, 720×672, 3× Hochskalierung), Echtzeit-PSG-WAV-Audio
(/audio), native CASTV2-Steuerung (das Google-Cast-Protokoll) und
mDNS-Erkennung der Geräte im Netzwerk. Erfordert einen CAST=1-Build.
- --cast-server[=PORT] MJPEG-Server (Standard 8080)
- --cast-to[=GERÄT] an einen Chromecast casten · --cast-discover Geräte auflisten
9. Anzeige & Aufnahme
Skalierung
Ganzzahlige Skalierung ×1 (240×224) bis ×4 (960×896), Nearest-Neighbour (pixelgenau, ohne Unschärfe), live per F3 umschaltbar.
- --scale 1 | 2 | 3 (Standard) | 4 · --keyboard qwerty | azerty · --fullscreen (F11)
Screenshots & Video
PPM- / BMP- / PNG-Screenshots — beim Beenden, bei einem bestimmten Takt oder durch einen Speicherzustand
ausgelöst (RAM[A]==V). Bildschirmtext-Dump (ASCII) oder ANSI-Truecolor-Framebuffer.
Motion-JPEG-AVI-Videoaufnahme (Audiospur im GUI-Modus enthalten). PSG-WAV-Audioaufnahme, in CI ohne
Anzeige testbar.
- --screenshot[-at/-text/-ansi/-when] · --dump-ram-when A:V:DATEI
- --video DATEI · --video-fps N · --video-quality N · --audio-wav DATEI
10. ULA-NG (neue Generation)
Software-Referenz für eine FPGA-ULA
Ein Referenzmodell für eine künftige Verilog/FPGA-ULA (Sipeed Tang Primer 20K / GW2A-18). Registerfenster
$0340-$035F, beim Reset gesperrt → Bit für Bit identisch zu einer serienmäßigen HCS 10017,
bis ein Programm sie entsperrt ('N','G' bei $0340). 8 Funktionen: Palettenindirektion (LUT
16×12 Bit), Raster-IRQ, Startadresse (Double-Buffer / Scroll), Copper pro Scanline, feines X/Y-Scrolling,
parallele Attribute (Ink+Paper pro Zelle, kein Colour Clash), 16 Hardware-Sprites
16×16 mit Priorität + Kollision und die Modi Chunky 4bpp (320×224, 16 Farben) / 80-Spalten-Text.
Je eine Demo pro Funktion ist enthalten.
- --ula-ng-poke "340=4E,340=47,341=05,…" (Injektion beim Start)
11. Trace, Profiling, ROM-Analyse
CPU-Befehls-Trace
Protokolliert jeden Befehl mit Disassemblierung und Registerzustand (TAKTE PC BYTES DISASM A= X= Y= SP= P=).
- --trace DATEI · --trace-max N
Performance-Profiler
Zählungen pro Adresse und Takte über die 64 KB, Histogramm aller 256 Opcodes, Top-20-Hotspot-Bericht.
- --profile DATEI
ROM-Analyse
Extraktion von Vektoren (RESET, NMI, IRQ), Subroutinenkarte (JSR/JMP-Ziele mit Referenzzählern), ASCII-String-Erkennung, Nutzungsstatistiken (Code / Daten / Füllung), Mustersuche.
- --rom-info [DATEI]
12. Unterstützte Betriebssysteme
Phosphoric läuft nativ auf den drei großen Desktop-Systemen, im Browser und im Headless-Modus zur Automatisierung. Derselbe Code liefert überall identische Ausgabe.
| System | Wie | Hinweise |
|---|---|---|
| Linux | nativer SDL2-Build (make SDL2=1) | Primäre Entwicklungsplattform. Alle Funktionen: ALSA-MIDI, Cast, GDB-Stub, TCP/PTY/COM-seriell. |
| Windows 11 (nativ) | .exe (CI oder MinGW-w64, make WIN=1 SDL2=1) | v1-Grenzen: seriell tcp/pty/modem/com/picowifi, --gdb, --control (async Pause), Cast und Host-MIDI sind nur Linux. |
| Windows 11 (WSL2) | Linux-Build unter WSLg | Vollständiger Linux-Build, alle Funktionen. |
| macOS | nativer SDL2-Build | Host-MIDI über CoreMIDI. |
| Browser | WebAssembly (make wasm) | Plattformübergreifend (Chrome, Firefox, Safari, Edge), keine Installation. Native Sockets/Threads als No-Ops; Kern, Video, Audio, Tastatur, Kassette und Diskette funktionieren. Siehe die Browser-Anleitung. |
| CI / Server | Headless-Modus (make SDL2=0, --headless) | Ohne Anzeige: Tests, Automatisierung, Screenshots, CI-testbares WAV-Audio. |
13. Komfort & Ports
Plattformübergreifend
Nativer SDL2-Build unter Linux, Windows und macOS; unter Windows 11: Browser (WebAssembly, keine Installation), native .exe (CI oder MinGW-w64) oder WSL2 (vollständiger Linux-Build unter WSLg). Details im Abschnitt Betriebssysteme oben.
WebAssembly-Build
Die vollständige Maschine läuft in einem Tab auf einem <canvas> (Web Audio,
.tap/.dsk-Drag-and-drop, ROM-Auswahl, CRT-Filter, .ost-Savestates,
Band-/Disk-LEDs, ORIC-1/Atmos-Bildschirmtastatur). Byte-für-Byte identische Ausgabe zur nativen. Dieser Build treibt
den Button „Online ausführen“ der Website an.
Konvertierungswerkzeuge & Sonstiges
bas2tap, bin2tap, tap2sedoric (Sedoric-Dateiinjektion), sedoric-info
(Disketteninspektor). QWERTY/AZERTY-Layouts, Headless-Modus (CI/Automatisierung), Freigabe des
Host-Dateisystems (--hostfs).
- --headless · --hostfs DIR · --cycles N · make tools
14. Serielle Kommunikation: Chips × Transporte
Phosphoric trennt den UART, den das Oric-Programm ansteuert (ein speichergemappter Chip), von dem Transport, der die Bytes auf dem Host trägt. Wähle einen Chip und gib ihm einen Transport.
Chips (wo das Programm liest/schreibt):
| Option | Chip | Adresse | Echte Hardware |
|---|---|---|---|
--serial | ACIA 6551 (MOS) | $031C ($0380 unter --loci) | Oric-V23-Modem, Telestrat |
--dtl2000 | PIA 6821 + ACIA 6850 | $03F8 | Digitelec-DTL-2000-Karte |
--mageco | ACIA 6850 | $03FE | Mageco-MIDI-Schnittstelle (31250 Baud) |
--oricon | ACIA 6850 + Taktgen. | $031C | ORICON-MIDI (LOCI-kompatibel) |
--loci | LOCI MIA | $03A0-$03BF | LOCI-Schnittstelle (sodiumlb) |
Transporte (wohin die Bytes gehen). Transparent = rohe Byte-Pipe; Protokoll = fügt eine eigene Befehls-/UART-Schicht ein:
| Transport | Art | Hinweise |
|---|---|---|
loopback | transparent | TX zurück zu RX (Tests) |
tcp:H:P | transparent | BBS / Minitel / telnet / MIDI-Router über TCP |
pty | transparent | POSIX-Pseudoterminal (minicom, screen) |
com:B,D,P,S,DEV | transparent | echtes serielles Gerät (termios) |
file:IN[:OUT] | transparent | deterministische Wiedergabe (RX) / Aufnahme (TX); MIDI-Aufnahme |
midi[:ZIEL] | transparent | Live-Host-MIDI-Port (MIDI=1) |
smf:DATEI[:loop] | transparent | Standard-MIDI-Datei → getaktetes MIDI IN |
modem[:H:P] | Protokoll | Hayes-AT-Interpreter (nur --serial) |
digitelec:H:P | Protokoll | Veraltet → --dtl2000 verwenden |
picowifi[:…] | Protokoll | PicoWiFiModemUSB-WLAN-Modem (nur --serial) |
--serial-Abstimmoptionen: --serial-v23 (asymmetrischer Modus 1200/75 Minitel),
--serial-buffer N, --serial-baud N, --serial-irq-on-rdrf (WDC-65C51-IRQ-Modus),
--serial-trace, --serial-tcp-backpressure, --acia-addr.
15. Tastenkürzel
| Taste | Funktion |
|---|---|
| F2 | Schnellspeichern des Zustands |
| F3 | Anzeigeskalierung wechseln (×1→×2→×3→×4) |
| F4 | Schnellladen des Zustands |
| F5 | Warm-Reset |
| F6 | OSD — Kassette/Diskette im Betrieb wechseln |
| F7 | Speicherdump (64 KB RAM in eine zeitgestempelte .bin) |
| F8 | LOCI-Aktionstaste — kurz: Snapshot + Menü; ≥ 2 s: Diagnose-ROM |
| F9 | Debugger öffnen |
| F10 | Beenden |
| F11 | Vollbild |
| F12 | PNG-Screenshot (zeitgestempelt, falls bereits vorhanden) |
16. Kompilierung
make # Standard-Build mit SDL2 (Standard)
make SDL2=0 # Headless-Build (ohne SDL2, für CI/Automatisierung)
make DEBUG=1 # Debug-Build (-g -O0)
make CAST=1 # mit Chromecast- / Google-Cast-Unterstützung
make MIDI=1 # mit Echtzeit-Host-MIDI (ALSA/CoreMIDI/WinMM)
make wasm # WebAssembly- / Browser-Build (erfordert Emscripten)
make tools # Konvertierungswerkzeuge (bas2tap, bin2tap, tap2sedoric, sedoric-info)
sudo make install # installiert nach /usr/local
Voraussetzungen (Debian/Ubuntu): sudo apt install build-essential libsdl2-dev
(und libssl-dev für Chromecast). Siehe die Dokumentation für
plattformspezifische Details.