Tachibana

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

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.

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

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

9. Weergave & opname

Schaling

Gehele schaling ×1 (240×224) tot ×4 (960×896), nearest-neighbour (pixel-perfect, geen vervaging), live geschakeld met F3.

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.

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.

11. Trace, profilering, ROM-analyse

CPU-instructietrace

Logt elke instructie met disassembly en registerstaat (CYCLI PC BYTES DISASM A= X= Y= SP= P=).

Prestatieprofiler

Tellingen per adres en cycli over de 64 KB, histogram van alle 256 opcodes, top-20-hotspotrapport.

ROM-analyse

Haalt vectoren (RESET, NMI, IRQ) eruit, subroutinekaart (JSR/JMP-doelen met referentietellingen), ASCII-string-detectie, gebruiksstatistieken (code / data / opvulling), patroonzoeken.

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.

SysteemHoeOpmerkingen
Linuxnative 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 WSLgVolledige Linux-build, alle functies.
macOSnative SDL2-buildHost-MIDI via CoreMIDI.
BrowserWebAssembly (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 / serverheadless-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).

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

OptieChipAdresEchte hardware
--serialACIA 6551 (MOS)$031C ($0380 onder --loci)Oric V23-modem, Telestrat
--dtl2000PIA 6821 + ACIA 6850$03F8Digitelec DTL 2000-kaart
--magecoACIA 6850$03FEMageco MIDI-interface (31250 baud)
--oriconACIA 6850 + klokgen.$031CORICON MIDI (LOCI-compatibel)
--lociLOCI MIA$03A0-$03BFLOCI-interface (sodiumlb)

Transporten (waar de bytes heen gaan). Transparant = ruwe byte-pipe; protocol = injecteert een eigen commando-/UART-laag:

TransportSoortOpmerkingen
loopbacktransparantTX terug naar RX (tests)
tcp:H:PtransparantBBS / Minitel / telnet / MIDI-router over TCP
ptytransparantPOSIX-pseudoterminal (minicom, screen)
com:B,D,P,S,DEVtransparantecht serieel apparaat (termios)
file:IN[:OUT]transparantdeterministische weergave (RX) / opname (TX); MIDI-opname
midi[:DOEL]transparantlive host-MIDI-poort (MIDI=1)
smf:BESTAND[:loop]transparantStandard MIDI File → getimede MIDI IN
modem[:H:P]protocolHayes AT-interpreter (alleen --serial)
digitelec:H:PprotocolVerouderd → gebruik --dtl2000
picowifi[:…]protocolPicoWiFiModemUSB 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

ToetsFunctie
F2Snel opslaan van staat
F3Weergaveschaal wisselen (×1→×2→×3→×4)
F4Snel laden van staat
F5Warme reset
F6OSD — cassette/schijf hot-swappen
F7Geheugendump (64 KB RAM naar een getimestampte .bin)
F8LOCI-actieknop — kort: snapshot + menu; ≥ 2 s vasthouden: diagnose-ROM
F9Debugger openen
F10Afsluiten
F11Volledig scherm
F12PNG-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.

← Terug naar Phosphoric · Technische documentatie →