Phosphoric — fonctionnalités détaillées
Émulateur ORIC-1 / Atmos cycle-exact · écrit en C11 · licence MIT
Cette page recense l'intégralité des fonctionnalités de Phosphoric, avec une explication de chacune et les options de ligne de commande correspondantes. Le dépôt GitHub reste la référence à jour ; la documentation technique détaille chaque sous-système.
Sommaire
- 1. Cœur d'émulation
- 2. Périphériques & cartes
- 3. Modèles ORIC-1 & Atmos
- 4. Manette, imprimante, traceur
- 5. États sauvegardés
- 6. Débogueur interactif
- 7. Pilotage & automatisation
- 8. Diffusion Chromecast / Google Cast
- 9. Affichage & captures
- 10. ULA-NG (nouvelle génération)
- 11. Trace, profilage, analyse ROM
- 12. Systèmes d'exploitation
- 13. Confort & portage
- 14. Série : puces × transports
- 15. Raccourcis clavier
- 16. Compilation
1. Cœur d'émulation
Le cœur reproduit la machine cycle à cycle : chaque puce avance au même rythme que le silicium d'origine, condition indispensable pour faire tourner les démos et le code sensible au balayage vidéo.
CPU MOS 6502
Émulation cycle-exact des 151 opcodes officiels, 13 modes d'adressage, arithmétique décimale (BCD) et interruptions IRQ à déclenchement par niveau. La suite de tests couvre aussi les opcodes illégaux NMOS.
Mémoire 64 Ko
RAM $0000-$BFFF, ROM $C000-$FFFF, gestion des bancs et
routage des entrées/sorties fidèle à l'organisation mémoire de l'Oric.
VIA 6522
16 registres, Timers 1 et 2, interruptions IFR/IER, matrice clavier, registre à décalage (8 modes), comptage d'impulsions sur T2, modes PCR CA2/CB2 complets (fronts d'entrée, interruptions indépendantes, handshake — CB2 en écriture seule comme le silicium —, impulsion d'un cycle, mode manuel) et verrouillage des entrées IRA/IRB (bits 0-1 de l'ACR).
Vidéo ULA
Mode texte (40×28) et HIRES (240×200), attributs série, timing PAL (312 lignes × 64 cycles).
PSG AY-3-8910
3 canaux de ton, bruit, 16 formes d'enveloppe, sortie audio SDL2.
2. Périphériques & cartes
Microdisc (contrôleur WD1793)
FDC WD1793, 4 lecteurs (A-D), ROM d'overlay, boot Sedoric. Timing mécanique réel par défaut (vitesses de pas 6/12/20/30 ms, latence rotationnelle à 300 tr/min, Record-Not-Found après 5 impulsions d'index, impulsion d'index Type I en direct). Injection de secteurs défectueux pour tester la robustesse : le défaut suit le média au fil des changements de lecteur et est persisté dans les états sauvegardés.
- --disk-rom FICHIER · --disk / --disk1/2/3 lecteurs A à D
- --fdc-timing real (défaut) | fast · --disk-writeback · --bad-sector [D:]S:T:N
Cassette (format TAP)
CLOAD/CSAVE via patch de la ROM, chargement rapide, multi-blocs, ré-enchaînement
après CLOAD, et lecture au niveau signal (--tape-signal :
vraie onde VIA CB1 lue par la ROM, pour les chargeurs personnalisés ou protégés).
- --tape FICHIER · --fast-load · --tape-signal
ACIA 6551 (série)
Contrôleur série à $031C-$031F ($0380 sous LOCI). Transports
loopback / TCP / PTY / port COM / fichier, et backends protocolaires (modem AT,
PicoWiFiModemUSB), mode V23 (Minitel / Digitelec). Voir la
matrice puces × transports.
Digitelec DTL 2000
Carte modem fidèle PIA 6821 + ACIA 6850 à $03F8-$03FD (registres
vérifiés par OCR sur la documentation d'époque), V23 75/1200 et 1200 symétrique,
contrôle ligne/porteuse, IRQ câblée. Validée face au terminal OTRM d'époque.
- --dtl2000 TRANSPORT · --dtl2000-addr XXXX
MIDI Mageco / ORICON
ACIA MC6850 pilotant les prises DIN MIDI (31250 baud, 8-N-1). Deux modèles issus du
forum Oric : la carte Mageco d'origine à $03FE-$03FF
(--mageco) et la refonte moderne ORICON à
$031C-$031D + générateur d'horloge, compatible LOCI (--oricon).
Capture/rejeu du flux MIDI brut, lecture d'un fichier Standard MIDI dans l'Oric
(au tempo), ou — en build MIDI=1 — port MIDI hôte en direct (ALSA / CoreMIDI /
WinMM) pour piloter FluidSynth ou un séquenceur.
- --mageco file:in[:out] | smf:FICHIER[:loop] | midi[:CIBLE] | loopback | tcp | pty · --oricon TRANSPORT
PicoWiFiModemUSB
Émulation du modem WiFi de sodiumlb (Pico W, USB CDC ↔ WiFi) exposé par LOCI comme
ACIA à $0380. Jeu de commandes AT v0.1.0 complet ; WiFi simulé, connexions
de données en TCP réel.
- --serial picowifi[:SSID[:PASS]]
LOCI — Lovely Oric Computer Interface
Interface de sodiumlb (2024) : bus MIA $03A0-$03BF, 36/36 opérations d'API
(ABI conforme au firmware), USB HID, WD1793 cycle-exact, image SD FAT16/32, échange de
ROM à chaud. Bouton Action (F8) : appui court → snapshot de session +
menu LOCI ; appui long (≥ 2 s) → ROM de diagnostic de Mike Brown. Sert de vraies clés USB
de l'hôte à l'Oric, timing du bus MIA réglable. Boote un master Sedoric V4 complet via le
firmware LOCI.
- --loci · --loci-flash DIR · --loci-sdimg CHEMIN · --loci-usb DIR|none
- --loci-mia-window LO-HI · --loci-irq-latency US
3. Modèles ORIC-1 & Atmos
Détection automatique du modèle
Distingue le BASIC 1.0 (ORIC-1) du 1.1 (Atmos) d'après l'en-tête de la ROM, avec les bonnes adresses de patch cassette pour chaque version. Le modèle peut aussi être forcé.
- --model oric1 | atmos | 1.0 | 1.1
4. Manette, imprimante, traceur
Joystick IJK
Interface IJK (l'adaptateur le plus répandu, actif à l'état bas sur le port A du PSG), en mode clavier (flèches + RCtrl/RAlt = tir) ou manette SDL2 (croix, stick analogique, boutons A/B/X), branchement à chaud. Les signaux manette et clavier se combinent sur le port A.
- --joystick keys | gamepad
Imprimante Centronics & traceur MCP-40
Capture LPRINT/LLIST vers un fichier texte, ou émulation du traceur 4 couleurs MCP-40 (commandes H/D/M/J/P/L, framebuffer 480×400, tracé de lignes de Bresenham, police 5×7, export BMP). Protocole Centronics via le port A de la VIA + front CA2 (STROBE).
- --printer FICHIER · --printer-type text (défaut) | mcp40
5. États sauvegardés
Format .ost
État binaire complet avec contrôle d'intégrité CRC32, réparti en 13 sections (CPU, MEM, VIA, PSG, VID, KBD, FDC, MDC, DSK, BAD, TAP, SER, META). Les sections inconnues sont ignorées : le format est rétro- et avant-compatible.
- --save-state FICHIER · --load-state FICHIER · touches F2 (sauver) / F4 (recharger)
6. Débogueur interactif
Points d'arrêt & observation
Jusqu'à 16 points d'arrêt PC, conditionnels (b ADDR if EXPR), 8 points
d'arrêt sur ligne raster, 8 watchpoints sur écriture mémoire.
Exécution & inspection
step, next, step-out, continue, undo (rembobinage de
16 instantanés CPU+RAM), registres, désassemblage paginé avec opérandes résolus par
symboles, dump/édition mémoire, assembleur en ligne
(a ADDR MNEMO [opérande]), recherche mémoire
(find octets ou texte), pile. Inspection en direct des périphériques
(via, psg, disk, acia, tape,
loci).
Symboles, TUI & GDB
Chargement de tables de symboles (.sym/.lab/EQU/VICE), interface
TUI ncurses à 6 panneaux (build TUI=1), et surtout un
stub GDB distant pour déboguer le 6502 depuis gdb, lldb ou un
IDE (VS Code, CLion) via le protocole RSP — aucun autre émulateur Oric ne le propose.
- --debug · --break ADDR · --symbols FICHIER · --tui · --gdb[=PORT]
7. Pilotage & automatisation
Mode contrôle IPC OricForge
Avec --control, Phosphoric parle un protocole texte sur stdin/stdout (logs
sur stderr) : 30 commandes (hello, regs, read,
write, peek, break, step,
load-tap, load-rom, load-disk…) et 3 types
d'événements. Pause asynchrone pendant l'exécution, négociation de capacités. Pensé pour
l'intégration à l'IDE OricForge.
API HTTP (REST)
Le même jeu de commandes exposé en HTTP/JSON (build HTTPAPI=1, port 8888 par
défaut) pour le scripting, les tableaux de bord navigateur et les tests bout-en-bout.
Endpoints GET /hello /regs /mem /peek/… et POST /reset /mem /keys /tape
/disk /exec/…. On peut taper au clavier à distance
(POST /keys avec text=…). Lié à 127.0.0.1 par défaut,
opérations fichier bornées à un répertoire sandbox.
- --http-api[=PORT] · --http-api-bind ADRESSE · --http-api-root DIR
Enregistrement / rejeu déterministe (« TAS movie »)
Enregistrement des entrées clavier et rejeu bit-déterministe : runs assistés (tool-assisted), reproduction de bugs, régressions en CI. Aucun autre émulateur Oric ne le propose.
- --record FICHIER · --replay FICHIER
Auto-frappe clavier
Simulation de frappe avec échappements (\n Return, \e Esc,
flèches, \Cx Ctrl+x, \Fx Funct+x…). Le rythme est
synchronisé sur le vrai scanner clavier (balayage matrice VIA PB3) : aucune
touche perdue. Peut être armée sur un état mémoire plutôt que sur un cycle deviné.
- --type-keys N:TEXTE · --type-keys-when A:V:TEXTE
8. Diffusion Chromecast / Google Cast
Streaming vers un téléviseur Google Cast
Phosphoric peut diffuser l'écran et le son de l'Oric vers un appareil
Chromecast / Google Cast. Serveur MJPEG HTTP (flux vidéo
/stream, 720×672, agrandissement ×3), audio WAV temps réel du
PSG (/audio), contrôle CASTV2 natif (protocole Google Cast)
et découverte mDNS des appareils du réseau. Nécessite un build
CAST=1.
- --cast-server[=PORT] serveur MJPEG (8080 par défaut)
- --cast-to[=APPAREIL] diffuser vers un Chromecast · --cast-discover lister les appareils
9. Affichage & captures
Mise à l'échelle
Agrandissement entier ×1 (240×224) à ×4 (960×896), rendu au plus proche voisin (pixel-perfect, sans flou), commutable à chaud par F3.
- --scale 1 | 2 | 3 (défaut) | 4 · --keyboard qwerty | azerty · --fullscreen (F11)
Captures d'écran & vidéo
Captures PPM / BMP / PNG, à la sortie, à un cycle donné, ou déclenchées par un état
mémoire (RAM[A]==V). Dump texte de l'écran (ASCII) ou du framebuffer en
ANSI couleur. Enregistrement vidéo Motion-JPEG AVI (piste audio incluse en
mode GUI). Capture audio PSG en WAV, testable en CI sans affichage.
- --screenshot[-at/-text/-ansi/-when] · --dump-ram-when A:V:FICHIER
- --video FICHIER · --video-fps N · --video-quality N · --audio-wav FICHIER
10. ULA-NG (nouvelle génération)
Référence logicielle pour une ULA FPGA
Modèle de référence pour une future ULA en Verilog/FPGA (Sipeed Tang Primer 20K /
GW2A-18). Fenêtre de registres $0340-$035F, verrouillée au reset
→ strictement identique bit à bit à une HCS 10017 d'origine tant qu'un programme ne la
déverrouille pas ('N','G' sur $0340). 8 fonctions :
indirection de palette (LUT 16×12 bits), IRQ raster, adresse de départ (double buffer /
scroll), copper par scanline, scroll fin X/Y, attributs parallèles
(ink+paper par cellule, sans color clash), 16 sprites matériels
16×16 avec priorité et collision, et modes chunky 4bpp (320×224, 16 couleurs)
/ texte 80 colonnes. Une démo par fonction est fournie.
- --ula-ng-poke "340=4E,340=47,341=05,…" (injection au démarrage)
11. Trace, profilage, analyse ROM
Trace d'instructions CPU
Journalise chaque instruction avec désassemblage et état des registres
(CYCLES PC OCTETS DÉSASM A= X= Y= SP= P=).
- --trace FICHIER · --trace-max N
Profileur de performance
Comptage par adresse et cycles sur les 64 Ko, histogramme des 256 opcodes, rapport des 20 points chauds.
- --profile FICHIER
Analyse de ROM
Extraction des vecteurs (RESET, NMI, IRQ), carte des sous-routines (cibles JSR/JMP avec compteur de références), détection de chaînes ASCII, statistiques d'usage (code / données / remplissage), recherche de motifs.
- --rom-info [FICHIER]
12. Systèmes d'exploitation supportés
Phosphoric fonctionne en natif sur les trois grands systèmes de bureau, dans le navigateur, et en mode headless pour l'automatisation. Le même code produit une sortie identique partout.
| Système | Comment | Notes |
|---|---|---|
| Linux | build natif SDL2 (make SDL2=1) | Plateforme de développement principale. Toutes les fonctions : MIDI ALSA, Cast, stub GDB, série TCP/PTY/COM. |
| Windows 11 (natif) | .exe (CI ou MinGW-w64, make WIN=1 SDL2=1) | Limites v1 : série tcp/pty/modem/com/picowifi, --gdb, --control (pause async), Cast et MIDI hôte sont Linux uniquement. |
| Windows 11 (WSL2) | build Linux sous WSLg | Build Linux complet, toutes fonctionnalités. |
| macOS | build natif SDL2 | MIDI hôte via CoreMIDI. |
| Navigateur | WebAssembly (make wasm) | Multi-plateforme (Chrome, Firefox, Safari, Edge), zéro installation. Sockets/threads natifs en no-op ; cœur, vidéo, audio, clavier, cassette et disque fonctionnent. Voir le guide navigateur. |
| CI / serveur | mode headless (make SDL2=0, --headless) | Sans affichage : tests, automatisation, captures, audio WAV testable. |
13. Confort & portage
Multi-plateforme
Build natif SDL2 sous Linux, Windows et macOS ; sous Windows 11 : build navigateur (WebAssembly, zéro installation), .exe natif (CI ou MinGW-w64) ou WSL2 (build Linux complet sous WSLg). Détail dans la section Systèmes d'exploitation ci-dessus.
Build WebAssembly
La machine complète tourne dans un onglet sur un <canvas> (Web Audio,
glisser-déposer .tap/.dsk, sélecteur de ROM, filtre CRT, save states
.ost, LED d'activité cassette/disque, clavier ORIC-1/Atmos à l'écran). Sortie
octet-pour-octet identique au natif. C'est ce build qui alimente le bouton
« Exécuter en ligne » du site.
Outils de conversion & divers
Outils bas2tap, bin2tap, tap2sedoric (injection de
fichiers Sedoric), sedoric-info (inspecteur de disquette). Dispositions clavier
QWERTY/AZERTY, mode headless (CI/automatisation), partage du système de
fichiers hôte (--hostfs).
- --headless · --hostfs DIR · --cycles N · make tools
14. Communication série : puces × transports
Phosphoric sépare l'UART que le programme Oric pilote (une puce mappée en mémoire) du transport qui achemine les octets côté hôte. On choisit une puce et on lui donne un transport.
Puces (là où le programme lit/écrit) :
| Option | Puce | Adresse | Matériel réel |
|---|---|---|---|
--serial | ACIA 6551 (MOS) | $031C ($0380 sous --loci) | Modem V23 Oric, Telestrat |
--dtl2000 | PIA 6821 + ACIA 6850 | $03F8 | Carte Digitelec DTL 2000 |
--mageco | ACIA 6850 | $03FE | Interface MIDI Mageco (31250 baud) |
--oricon | ACIA 6850 + gén. horloge | $031C | MIDI ORICON (compatible LOCI) |
--loci | LOCI MIA | $03A0-$03BF | Interface LOCI (sodiumlb) |
Transports (là où vont les octets). Transparent = tuyau d'octets brut ; protocole = injecte sa propre couche de commandes/UART :
| Transport | Type | Notes |
|---|---|---|
loopback | transparent | TX rebouclé sur RX (tests) |
tcp:H:P | transparent | BBS / Minitel / telnet / routeur MIDI sur TCP |
pty | transparent | pseudo-terminal POSIX (minicom, screen) |
com:B,D,P,S,DEV | transparent | vrai port série (termios) |
file:IN[:OUT] | transparent | rejeu (RX) / capture (TX) déterministe ; capture MIDI |
midi[:CIBLE] | transparent | port MIDI hôte en direct (MIDI=1) |
smf:FICHIER[:loop] | transparent | fichier Standard MIDI → MIDI IN au tempo |
modem[:H:P] | protocole | interpréteur Hayes AT (--serial uniquement) |
digitelec:H:P | protocole | Déprécié → utiliser --dtl2000 |
picowifi[:…] | protocole | modem WiFi PicoWiFiModemUSB (--serial uniquement) |
Options de réglage --serial : --serial-v23 (mode
asymétrique 1200/75 Minitel), --serial-buffer N, --serial-baud N,
--serial-irq-on-rdrf (mode IRQ WDC 65C51), --serial-trace,
--serial-tcp-backpressure, --acia-addr.
15. Raccourcis clavier
| Touche | Fonction |
|---|---|
| F2 | Sauvegarde rapide de l'état |
| F3 | Changer l'échelle d'affichage (×1→×2→×3→×4) |
| F4 | Chargement rapide de l'état |
| F5 | Reset à chaud |
| F6 | OSD — changer la cassette/disquette à chaud |
| F7 | Dump mémoire (64 Ko RAM vers un .bin horodaté) |
| F8 | Bouton Action LOCI — appui court : snapshot + menu ; ≥ 2 s : ROM de diagnostic |
| F9 | Entrer dans le débogueur |
| F10 | Quitter |
| F11 | Plein écran |
| F12 | Capture PNG (horodatée si déjà présente) |
16. Compilation
make # build standard avec SDL2 (défaut)
make SDL2=0 # build headless (sans SDL2, pour CI/automatisation)
make DEBUG=1 # build debug (-g -O0)
make CAST=1 # avec support Chromecast / Google Cast
make MIDI=1 # avec MIDI hôte temps réel (ALSA/CoreMIDI/WinMM)
make wasm # build WebAssembly / navigateur (nécessite Emscripten)
make tools # outils de conversion (bas2tap, bin2tap, tap2sedoric, sedoric-info)
sudo make install # installe dans /usr/local
Prérequis (Debian/Ubuntu) : sudo apt install build-essential libsdl2-dev
(et libssl-dev pour le Chromecast). Voir la
documentation pour le détail par plateforme.