Tachibana
Langue : français

Phosphoric — fonctionnalités détaillées

Émulateur ORIC-1 / Atmos cadencé au cycle · version 2.0.4 · écrit en C11 · licence EUPL 1.2

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 Codeberg reste la référence à jour ; la documentation technique détaille chaque sous-système.

Sommaire

1. Cœur d'émulation

Depuis la version 2.0, une horloge maître (emu_cycle()) fait avancer toute la machine d'exactement un cycle, dans un ordre figé et mesuré sur le matériel : accès bus du CPU, puis périphériques, puis fetch de la cellule vidéo du même cycle. Rien n'avance jamais « par paquets ». Ce que cette revendication couvre — et ce qu'elle ne couvre pas — est écrit composant par composant dans docs/ACCURACY.md, avec le test qui ferait tomber chaque ligne. Voir aussi l'article sur Phosphoric 2.0.

CPU MOS 6502 — exact au cycle

Cœur micro-séquencé : chaque instruction est un plan de micro-opérations, une par cycle, chacune faisant exactement son accès bus — y compris les accès factices du NMOS (index page zéro, traversée de page, écriture-retour des RMW, lectures de pile mortes). 100,00 % de séquence bus exacte sur les 2 440 000 cas de l'oracle SingleStepTests/65x02 (make test-cycle), test fonctionnel de Klaus Dormann (make test-dormann). Interruptions échantillonnées au cycle pénultième (drapeau I retardé de CLI/SEI/PLP, détournement d'un BRK par une NMI). 151 opcodes officiels + illégaux NMOS, BCD. L'ancien cœur reste disponible (--cpu-legacy).

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 — au cycle

16 registres, Timers 1 et 2 comptés au cycle avec sous-dépassement exact $0000 → $FFFF (période N+2 conforme — l'ancien modèle donnait N), signal carré PB7, impulsion CA2 d'un cycle, interruptions IFR/IER, matrice clavier, registre à décalage (8 modes), comptage d'impulsions sur T2, modes PCR CA2/CB2 complets et verrouillage des entrées IRA/IRB. Hors modèle : le demi-cycle du one-shot.

Vidéo ULA — une cellule par cycle

Mode texte (40×28) et HIRES (240×200), attributs série, timing PAL (312 lignes × 64 cycles). L'ULA fetche une cellule de 6 pixels par cycle, après l'accès CPU du même cycle — repère et ordre pris sur les mesures de Mike Brown (Unofficial ULA Guide) : une écriture au cycle c est vue par la cellule c. Les splits raster (changement d'encre ou de mode en milieu de ligne) donnent ce que le matériel donne. Repli ligne à ligne : --ula-line.

PSG AY-3-8910 — cadencé au matériel

3 canaux de ton, bruit, 16 formes d'enveloppe. Machine cadencée à horloge/8 (125 kHz), le pas interne réel du chip ; sortie intégrée (un ton au-dessus de Nyquist s'atténue au lieu de replier) ; enveloppe à la bonne vitesse (elle était 2× trop lente) ; étage de sortie relevé sur le schéma officiel (mixage moyenné, continu bloqué). Vérifié par mesure du signal, pas par comparaison d'octets.

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.

Jasmin (contrôleur WD177x)

FDC WD177x, boot TDOS, mapping mémoire propre à Jasmin ($03F8-$03FF), injection de secteurs défectueux. Alternative au Microdisc pour le patrimoine logiciel Jasmin / TDOS ; à n'activer qu'avec un seul contrôleur de disque à la fois.

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 cadencé au cycle, 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.

Point de reprise exact

Depuis la 2.0, un état pris en pleine trame reprend exactement où il s'est arrêté : position du balayage, timers, échantillon d'interruption (14 sections). make test-savestate-determinism exige que les arrêts raster retombent au même cycle — c'est ce test qui a révélé le « cycle fantôme » du branchement non pris avant la 2.0.

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) : plus de 40 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 →