Tachibana

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

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.

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

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äger­steuerung, verdrahteter IRQ. Gegen das zeitgenössische OTRM-Terminal validiert.

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.

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.

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.

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.

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.

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

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.

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.

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.

Deterministische Aufzeichnung / Wiedergabe („TAS movie“)

Tastatureingaben aufzeichnen und bit-deterministisch wiedergeben: tool-assisted Runs, Bug-Reproduktion, CI-Regressionen. Kein anderer Oric-Emulator bietet das.

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.

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.

9. Anzeige & Aufnahme

Skalierung

Ganzzahlige Skalierung ×1 (240×224) bis ×4 (960×896), Nearest-Neighbour (pixelgenau, ohne Unschärfe), live per F3 umschaltbar.

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.

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.

11. Trace, Profiling, ROM-Analyse

CPU-Befehls-Trace

Protokolliert jeden Befehl mit Disassemblierung und Registerzustand (TAKTE PC BYTES DISASM A= X= Y= SP= P=).

Performance-Profiler

Zählungen pro Adresse und Takte über die 64 KB, Histogramm aller 256 Opcodes, Top-20-Hotspot-Bericht.

ROM-Analyse

Extraktion von Vektoren (RESET, NMI, IRQ), Subroutinenkarte (JSR/JMP-Ziele mit Referenzzählern), ASCII-String-Erkennung, Nutzungsstatistiken (Code / Daten / Füllung), Mustersuche.

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.

SystemWieHinweise
Linuxnativer 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 WSLgVollständiger Linux-Build, alle Funktionen.
macOSnativer SDL2-BuildHost-MIDI über CoreMIDI.
BrowserWebAssembly (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 / ServerHeadless-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).

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):

OptionChipAdresseEchte Hardware
--serialACIA 6551 (MOS)$031C ($0380 unter --loci)Oric-V23-Modem, Telestrat
--dtl2000PIA 6821 + ACIA 6850$03F8Digitelec-DTL-2000-Karte
--magecoACIA 6850$03FEMageco-MIDI-Schnittstelle (31250 Baud)
--oriconACIA 6850 + Taktgen.$031CORICON-MIDI (LOCI-kompatibel)
--lociLOCI MIA$03A0-$03BFLOCI-Schnittstelle (sodiumlb)

Transporte (wohin die Bytes gehen). Transparent = rohe Byte-Pipe; Protokoll = fügt eine eigene Befehls-/UART-Schicht ein:

TransportArtHinweise
loopbacktransparentTX zurück zu RX (Tests)
tcp:H:PtransparentBBS / Minitel / telnet / MIDI-Router über TCP
ptytransparentPOSIX-Pseudoterminal (minicom, screen)
com:B,D,P,S,DEVtransparentechtes serielles Gerät (termios)
file:IN[:OUT]transparentdeterministische Wiedergabe (RX) / Aufnahme (TX); MIDI-Aufnahme
midi[:ZIEL]transparentLive-Host-MIDI-Port (MIDI=1)
smf:DATEI[:loop]transparentStandard-MIDI-Datei → getaktetes MIDI IN
modem[:H:P]ProtokollHayes-AT-Interpreter (nur --serial)
digitelec:H:PProtokollVeraltet--dtl2000 verwenden
picowifi[:…]ProtokollPicoWiFiModemUSB-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

TasteFunktion
F2Schnellspeichern des Zustands
F3Anzeigeskalierung wechseln (×1→×2→×3→×4)
F4Schnellladen des Zustands
F5Warm-Reset
F6OSD — Kassette/Diskette im Betrieb wechseln
F7Speicherdump (64 KB RAM in eine zeitgestempelte .bin)
F8LOCI-Aktionstaste — kurz: Snapshot + Menü; ≥ 2 s: Diagnose-ROM
F9Debugger öffnen
F10Beenden
F11Vollbild
F12PNG-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.

← Zurück zu Phosphoric · Technische Dokumentation →