Phosphoric — gedetailleerde functies
Cyclusnauwkeurige ORIC-1 / Atmos-emulator · geschreven in C11 · MIT-licentie
Deze pagina somt alle functies van Phosphoric op, met een toelichting bij elk en de bijbehorende opdrachtregelopties. De GitHub-repository is de gezaghebbende, actuele bron; de technische documentatie behandelt elk subsysteem in detail.
Inhoud
- 1. Emulatiekern
- 2. Periferie & kaarten
- 3. ORIC-1- & Atmos-modellen
- 4. Joystick, printer, plotter
- 5. Savestates
- 6. Interactieve debugger
- 7. Besturing & automatisering
- 8. Chromecast / Google Cast-streaming
- 9. Weergave & opname
- 10. ULA-NG (nieuwe generatie)
- 11. Trace, profilering, ROM-analyse
- 12. Besturingssystemen
- 13. Gemak & ports
- 14. Serieel: chips × transporten
- 15. Sneltoetsen
- 16. Bouwen
1. Emulatiekern
De kern reproduceert de machine cyclus per cyclus: elke chip loopt op hetzelfde tempo als het originele silicium — een must voor demo's en rastergevoelige code.
MOS 6502-CPU
Cyclusnauwkeurige emulatie van de 151 officiële opcodes, 13 adresseringsmodi, decimale rekenkunde (BCD) en niveau-getriggerde IRQ's. De testsuite dekt ook de illegale NMOS-opcodes.
64 KB geheugen
RAM $0000-$BFFF, ROM $C000-$FFFF, banking en I/O-routing getrouw aan de
geheugenindeling van de Oric.
VIA 6522
16 registers, Timer 1/2, IFR/IER-interrupts, toetsenbordmatrix, schuifregister (8 modi), T2-pulstelling, volledige CA2/CB2 PCR-modi (invoerflanken, onafhankelijke interrupts, handshake — CB2 alleen schrijven zoals het silicium —, pulse van één cyclus, handmatig) en IRA/IRB-invoervergrendeling (ACR-bits 0-1).
ULA-video
Tekstmodus (40×28) en HIRES (240×200), seriële attributen, PAL-timing (312 lijnen × 64 cycli).
AY-3-8910 PSG
3 toonkanalen, ruis, 16 envelopevormen, SDL2-audiouitvoer.
2. Periferie & kaarten
Microdisc (WD1793-controller)
WD1793-FDC, 4 stations (A-D), overlay-ROM, Sedoric-boot. Echte mechanische timing standaard (stapsnelheden 6/12/20/30 ms, rotatielatentie bij 300 tpm, Record-Not-Found na 5 indexpulsen, live Type I-indexpuls). Injectie van defecte sectoren om robuustheid te testen: de schade volgt het medium bij stationwissels en wordt bewaard in savestates.
- --disk-rom BESTAND · --disk / --disk1/2/3 stations A t/m D
- --fdc-timing real (standaard) | fast · --disk-writeback · --bad-sector [D:]S:T:N
Cassette (TAP-formaat)
CLOAD/CSAVE via ROM-patching, snelladen, multi-block, herketening na CLOAD, en weergave op
signaalniveau (--tape-signal: echte VIA CB1-golfvorm gelezen door de ROM, voor eigen of
beveiligde loaders).
- --tape BESTAND · --fast-load · --tape-signal
ACIA 6551 (serieel)
Seriële controller op $031C-$031F ($0380 onder LOCI). Transporten loopback / TCP /
PTY / COM / bestand, plus protocol-backends (Hayes AT-modem, PicoWiFiModemUSB), V23-modus (Minitel / Digitelec).
Zie de chips × transporten-matrix.
Digitelec DTL 2000
Getrouwe PIA 6821 + ACIA 6850-modemkaart op $03F8-$03FD (OCR-geverifieerde registers uit
tijdperkdocumentatie), V23 75/1200 en symmetrisch 1200, lijn-/dragerbesturing, bedrade IRQ. Gevalideerd tegen de
OTRM-terminal uit het tijdperk.
- --dtl2000 TRANSPORT · --dtl2000-addr XXXX
Mageco / ORICON MIDI
MC6850-ACIA die de MIDI-DIN-aansluitingen aanstuurt (31250 baud, 8-N-1). Twee ontwerpen van het Oric-forum: de
originele Mageco-kaart op $03FE-$03FF (--mageco) en de moderne
ORICON-reboot op $031C-$031D + klokgenerator, LOCI-compatibel (--oricon).
Neem/geef de ruwe MIDI-stroom, speel een Standard MIDI File in de Oric af (op tempo), of — in een
MIDI=1-build — open een live host-MIDI-poort (ALSA / CoreMIDI / WinMM) om FluidSynth of een DAW aan
te sturen.
- --mageco file:in[:out] | smf:BESTAND[:loop] | midi[:DOEL] | loopback | tcp | pty · --oricon TRANSPORT
PicoWiFiModemUSB
Emulatie van de WiFi-modem van sodiumlb (Pico W, USB CDC ↔ WiFi) door LOCI blootgesteld als ACIA op
$0380. Volledige AT-commandoset v0.1.0; gesimuleerde WiFi, echte TCP-dataverbindingen.
- --serial picowifi[:SSID[:PASS]]
LOCI — Lovely Oric Computer Interface
Interface van sodiumlb (2024): MIA-bus $03A0-$03BF, 36/36 API-ops (firmware-conforme ABI), USB
HID, cyclusnauwkeurige WD1793, FAT16/32 SD-image, runtime ROM-wissel. Actieknop (F8): korte druk
→ sessiesnapshot + LOCI-menu; lange druk (≥ 2 s) → diagnose-ROM van Mike Brown. Biedt echte host-USB-sticks aan de
Oric, afstembare MIA-bustiming. Start een volledige Sedoric V4-master via de LOCI-firmware.
- --loci · --loci-flash DIR · --loci-sdimg PAD · --loci-usb DIR|none
- --loci-mia-window LO-HI · --loci-irq-latency US
3. ORIC-1- & Atmos-modellen
Automatische modeldetectie
Herkent BASIC 1.0 (ORIC-1) versus 1.1 (Atmos) aan de ROM-header, met de juiste cassette-patchadressen voor elke versie. Het model kan ook worden geforceerd.
- --model oric1 | atmos | 1.0 | 1.1
4. Joystick, printer, plotter
IJK-joystick
IJK-interface (de meest voorkomende adapter, actief-laag op PSG-poort A), in toetsenbordmodus (pijltjes + RCtrl/RAlt als vuur) of SDL2-gamepad (D-pad, analoge stick, A/B/X-knoppen), met hot-plug. Joystick- en toetsenbordsignalen mengen op poort A.
- --joystick keys | gamepad
Centronics-printer & MCP-40-plotter
LPRINT/LLIST vastleggen naar een tekstbestand, of de 4-kleurige MCP-40-penplotter emuleren (commando's H/D/M/J/P/L, framebuffer 480×400, Bresenham-lijntekening, 5×7-lettertype, BMP-export). Centronics-protocol via VIA-poort A + CA2 (STROBE)-flank.
- --printer BESTAND · --printer-type text (standaard) | mcp40
5. Savestates
.ost-formaat
Volledige binaire staat met CRC32-integriteitscontrole, opgesplitst in 13 secties (CPU, MEM, VIA, PSG, VID, KBD, FDC, MDC, DSK, BAD, TAP, SER, META). Onbekende secties worden genegeerd: het formaat is achterwaarts en voorwaarts compatibel.
- --save-state BESTAND · --load-state BESTAND · toetsen F2 (opslaan) / F4 (laden)
6. Interactieve debugger
Breakpoints & watchpoints
Tot 16 PC-breakpoints, voorwaardelijk (b ADDR if EXPR), 8 rasterlijn-breakpoints, 8
geheugenschrijf-watchpoints.
Uitvoering & inspectie
step, next, step-out, continue, undo (16 CPU+RAM-snapshots terugspoelen),
registers, gepagineerde disassembly met symbool-opgeloste operanden, geheugendump/-bewerking,
inline-assembler (a ADDR MNEMONIC [operand]), geheugen zoeken
(find bytes of tekst), stack. Live periferie-inspectie (via, psg,
disk, acia, tape, loci).
Symbolen, TUI & GDB
Laad symbooltabellen (.sym/.lab/EQU/VICE), een ncurses-TUI met 6
panelen (TUI=1-build), en bovenal een externe GDB-stub om de 6502 te debuggen vanuit
gdb, lldb of een IDE (VS Code, CLion) via het RSP-protocol — geen enkele andere Oric-emulator biedt
dit.
- --debug · --break ADDR · --symbols BESTAND · --tui · --gdb[=POORT]
7. Besturing & automatisering
IPC-besturingsmodus OricForge
Met --control spreekt Phosphoric een tekstprotocol via stdin/stdout (logs op stderr): meer dan 40
commando's (hello, regs, read, write, peek,
break, step, load-tap, load-rom, load-disk…) en 3
gebeurtenistypes. Asynchrone pauze tijdens uitvoering, capaciteitenonderhandeling. Ontworpen voor de OricForge-IDE.
HTTP-API (REST)
Dezelfde commandoset via HTTP/JSON (HTTPAPI=1-build, standaardpoort 8888) voor scripting,
browserdashboards en end-to-end-tests. Endpoints GET /hello /regs /mem /peek/… en POST /reset
/mem /keys /tape /disk /exec/…. Je kunt op afstand op het toetsenbord typen
(POST /keys met text=…). Standaard gebonden aan 127.0.0.1,
bestandsbewerkingen begrensd tot een sandbox-map.
- --http-api[=POORT] · --http-api-bind ADRES · --http-api-root DIR
Deterministische opname / weergave («TAS movie»)
Neem toetsenbordinvoer op en speel deze bit-deterministisch af: tool-assisted runs, bugreproductie, CI-regressies. Geen enkele andere Oric-emulator biedt dit.
- --record BESTAND · --replay BESTAND
Toetsenbordautomatisering
Gesimuleerd typen met escapes (\n Return, \e Esc, pijltjes, \Cx Ctrl+x,
\Fx Funct+x…). Het tempo is gesynchroniseerd op de echte toetsenbordscanner (VIA
PB3-matrixsweep): geen verloren toetsen. Kan worden geactiveerd op een geheugenstaat in plaats van een geraden
cyclus.
- --type-keys N:TEKST · --type-keys-when A:V:TEKST
8. Chromecast / Google Cast-streaming
Streamen naar een Google Cast-tv
Phosphoric kan het scherm en geluid van de Oric naar een Chromecast / Google Cast-apparaat
streamen. Een HTTP-MJPEG-server (videostroom /stream, 720×672, 3× opschaling),
realtime PSG-WAV-audio (/audio), native CASTV2-besturing (het Google
Cast-protocol) en mDNS-detectie van apparaten op het netwerk. Vereist een CAST=1-build.
- --cast-server[=POORT] MJPEG-server (standaard 8080)
- --cast-to[=APPARAAT] casten naar een Chromecast · --cast-discover apparaten oplijsten
9. Weergave & opname
Schaling
Gehele schaling ×1 (240×224) tot ×4 (960×896), nearest-neighbour (pixel-perfect, geen vervaging), live geschakeld met F3.
- --scale 1 | 2 | 3 (standaard) | 4 · --keyboard qwerty | azerty · --fullscreen (F11)
Schermafbeeldingen & video
PPM / BMP / PNG-schermafbeeldingen — bij afsluiten, bij een bepaalde cyclus, of geactiveerd door een
geheugenstaat (RAM[A]==V). Schermtekstdump (ASCII) of ANSI-truecolor-framebuffer.
Motion-JPEG AVI-video-opname (audiotrack inbegrepen in GUI-modus). PSG-WAV-audio-opname, testbaar in
CI zonder scherm.
- --screenshot[-at/-text/-ansi/-when] · --dump-ram-when A:V:BESTAND
- --video BESTAND · --video-fps N · --video-quality N · --audio-wav BESTAND
10. ULA-NG (nieuwe generatie)
Softwarereferentie voor een FPGA-ULA
Een referentiemodel voor een toekomstige Verilog/FPGA-ULA (Sipeed Tang Primer 20K / GW2A-18). Registervenster
$0340-$035F, vergrendeld bij reset → bit-voor-bit identiek aan een standaard HCS 10017
totdat een programma het ontgrendelt ('N','G' op $0340). 8 functies: palet-indirectie (LUT
16×12-bit), raster-IRQ, startadres (double-buffer / scroll), copper per scanline, fijne X/Y-scroll,
parallelle attributen (ink+paper per cel, geen colour clash), 16 hardware-sprites
16×16 met prioriteit + botsing, en chunky 4bpp (320×224, 16 kleuren) / 80-koloms tekst-modi.
Eén demo per functie is inbegrepen.
- --ula-ng-poke "340=4E,340=47,341=05,…" (injectie bij opstart)
11. Trace, profilering, ROM-analyse
CPU-instructietrace
Logt elke instructie met disassembly en registerstaat (CYCLI PC BYTES DISASM A= X= Y= SP= P=).
- --trace BESTAND · --trace-max N
Prestatieprofiler
Tellingen per adres en cycli over de 64 KB, histogram van alle 256 opcodes, top-20-hotspotrapport.
- --profile BESTAND
ROM-analyse
Haalt vectoren (RESET, NMI, IRQ) eruit, subroutinekaart (JSR/JMP-doelen met referentietellingen), ASCII-string-detectie, gebruiksstatistieken (code / data / opvulling), patroonzoeken.
- --rom-info [BESTAND]
12. Ondersteunde besturingssystemen
Phosphoric draait native op de drie grote desktopsystemen, in de browser en in headless-modus voor automatisering. Dezelfde code levert overal identieke uitvoer.
| Systeem | Hoe | Opmerkingen |
|---|---|---|
| Linux | native SDL2-build (make SDL2=1) | Primair ontwikkelplatform. Alle functies: ALSA-MIDI, Cast, GDB-stub, TCP/PTY/COM-serieel. |
| Windows 11 (native) | .exe (CI of MinGW-w64, make WIN=1 SDL2=1) | v1-limieten: serieel tcp/pty/modem/com/picowifi, --gdb, --control (async pauze), Cast en host-MIDI zijn alleen Linux. |
| Windows 11 (WSL2) | Linux-build onder WSLg | Volledige Linux-build, alle functies. |
| macOS | native SDL2-build | Host-MIDI via CoreMIDI. |
| Browser | WebAssembly (make wasm) | Platformonafhankelijk (Chrome, Firefox, Safari, Edge), geen installatie. Native sockets/threads zijn no-ops; kern, video, audio, toetsenbord, cassette en schijf werken. Zie de browsergids. |
| CI / server | headless-modus (make SDL2=0, --headless) | Zonder scherm: tests, automatisering, schermafbeeldingen, CI-testbare WAV-audio. |
13. Gemak & ports
Platformonafhankelijk
Native SDL2-build op Linux, Windows en macOS; op Windows 11: browser (WebAssembly, geen installatie), native .exe (CI of MinGW-w64) of WSL2 (volledige Linux-build onder WSLg). Details in de sectie Besturingssystemen hierboven.
WebAssembly-build
De volledige machine draait in een tabblad op een <canvas> (Web Audio,
.tap/.dsk-drag-drop, ROM-selector, CRT-filter, .ost-savestates, tape-/schijf-LED's,
schermtoetsenbord ORIC-1/Atmos). Byte-voor-byte identieke uitvoer aan native. Dit is de build achter de knop
«Online uitvoeren» van de site.
Conversietools & overig
bas2tap, bin2tap, tap2sedoric (Sedoric-bestandsinjectie), sedoric-info
(schijfinspecteur). QWERTY/AZERTY-indelingen, headless-modus (CI/automatisering), delen van het
host-bestandssysteem (--hostfs).
- --headless · --hostfs DIR · --cycles N · make tools
14. Seriële communicatie: chips × transporten
Phosphoric scheidt de UART die het Oric-programma aanstuurt (een geheugengemapte chip) van het transport dat de bytes op de host draagt. Kies één chip en geef die een transport.
Chips (waar het programma leest/schrijft):
| Optie | Chip | Adres | Echte hardware |
|---|---|---|---|
--serial | ACIA 6551 (MOS) | $031C ($0380 onder --loci) | Oric V23-modem, Telestrat |
--dtl2000 | PIA 6821 + ACIA 6850 | $03F8 | Digitelec DTL 2000-kaart |
--mageco | ACIA 6850 | $03FE | Mageco MIDI-interface (31250 baud) |
--oricon | ACIA 6850 + klokgen. | $031C | ORICON MIDI (LOCI-compatibel) |
--loci | LOCI MIA | $03A0-$03BF | LOCI-interface (sodiumlb) |
Transporten (waar de bytes heen gaan). Transparant = ruwe byte-pipe; protocol = injecteert een eigen commando-/UART-laag:
| Transport | Soort | Opmerkingen |
|---|---|---|
loopback | transparant | TX terug naar RX (tests) |
tcp:H:P | transparant | BBS / Minitel / telnet / MIDI-router over TCP |
pty | transparant | POSIX-pseudoterminal (minicom, screen) |
com:B,D,P,S,DEV | transparant | echt serieel apparaat (termios) |
file:IN[:OUT] | transparant | deterministische weergave (RX) / opname (TX); MIDI-opname |
midi[:DOEL] | transparant | live host-MIDI-poort (MIDI=1) |
smf:BESTAND[:loop] | transparant | Standard MIDI File → getimede MIDI IN |
modem[:H:P] | protocol | Hayes AT-interpreter (alleen --serial) |
digitelec:H:P | protocol | Verouderd → gebruik --dtl2000 |
picowifi[:…] | protocol | PicoWiFiModemUSB WiFi-modem (alleen --serial) |
--serial-afstemopties: --serial-v23 (asymmetrisch 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. Sneltoetsen
| Toets | Functie |
|---|---|
| F2 | Snel opslaan van staat |
| F3 | Weergaveschaal wisselen (×1→×2→×3→×4) |
| F4 | Snel laden van staat |
| F5 | Warme reset |
| F6 | OSD — cassette/schijf hot-swappen |
| F7 | Geheugendump (64 KB RAM naar een getimestampte .bin) |
| F8 | LOCI-actieknop — kort: snapshot + menu; ≥ 2 s vasthouden: diagnose-ROM |
| F9 | Debugger openen |
| F10 | Afsluiten |
| F11 | Volledig scherm |
| F12 | PNG-schermafbeelding (getimestampt indien er al een bestaat) |
16. Bouwen
make # standaardbuild met SDL2 (standaard)
make SDL2=0 # headless-build (zonder SDL2, voor CI/automatisering)
make DEBUG=1 # debug-build (-g -O0)
make CAST=1 # met Chromecast / Google Cast-ondersteuning
make MIDI=1 # met realtime host-MIDI (ALSA/CoreMIDI/WinMM)
make wasm # WebAssembly / browser-build (vereist Emscripten)
make tools # conversietools (bas2tap, bin2tap, tap2sedoric, sedoric-info)
sudo make install # installeert in /usr/local
Vereisten (Debian/Ubuntu): sudo apt install build-essential libsdl2-dev
(en libssl-dev voor Chromecast). Zie de documentatie voor
platformspecifieke details.