Tachibana

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

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.

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

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.

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.

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.

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.

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

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.

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

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.

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.

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.

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.

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

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.

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.

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.

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.

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

Profileur de performance

Comptage par adresse et cycles sur les 64 Ko, histogramme des 256 opcodes, rapport des 20 points chauds.

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.

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èmeCommentNotes
Linuxbuild 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 WSLgBuild Linux complet, toutes fonctionnalités.
macOSbuild natif SDL2MIDI hôte via CoreMIDI.
NavigateurWebAssembly (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 / serveurmode 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).

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

OptionPuceAdresseMatériel réel
--serialACIA 6551 (MOS)$031C ($0380 sous --loci)Modem V23 Oric, Telestrat
--dtl2000PIA 6821 + ACIA 6850$03F8Carte Digitelec DTL 2000
--magecoACIA 6850$03FEInterface MIDI Mageco (31250 baud)
--oriconACIA 6850 + gén. horloge$031CMIDI ORICON (compatible LOCI)
--lociLOCI MIA$03A0-$03BFInterface LOCI (sodiumlb)

Transports (là où vont les octets). Transparent = tuyau d'octets brut ; protocole = injecte sa propre couche de commandes/UART :

TransportTypeNotes
loopbacktransparentTX rebouclé sur RX (tests)
tcp:H:PtransparentBBS / Minitel / telnet / routeur MIDI sur TCP
ptytransparentpseudo-terminal POSIX (minicom, screen)
com:B,D,P,S,DEVtransparentvrai port série (termios)
file:IN[:OUT]transparentrejeu (RX) / capture (TX) déterministe ; capture MIDI
midi[:CIBLE]transparentport MIDI hôte en direct (MIDI=1)
smf:FICHIER[:loop]transparentfichier Standard MIDI → MIDI IN au tempo
modem[:H:P]protocoleinterpréteur Hayes AT (--serial uniquement)
digitelec:H:PprotocoleDéprécié → utiliser --dtl2000
picowifi[:…]protocolemodem 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

ToucheFonction
F2Sauvegarde rapide de l'état
F3Changer l'échelle d'affichage (×1→×2→×3→×4)
F4Chargement rapide de l'état
F5Reset à chaud
F6OSD — changer la cassette/disquette à chaud
F7Dump mémoire (64 Ko RAM vers un .bin horodaté)
F8Bouton Action LOCI — appui court : snapshot + menu ; ≥ 2 s : ROM de diagnostic
F9Entrer dans le débogueur
F10Quitter
F11Plein écran
F12Capture 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.

← Retour à Phosphoric · Documentation technique →