Aller au contenu
Phosphoricwiki
Sommaire

Le LOCI

Le LOCI est une cartouche moderne pour l’Oric, bâtie sur un RP2040. Phosphoric l’émule de trois façons : par un modèle intégré, en faisant tourner son vrai firmware, ou en parlant à une vraie carte par l’USB.

Dans cette page

Ce qu’est le LOCI

Le LOCI (Lovely Oric Computer Interface, 2024) est une cartouche qui se branche sur le port d’extension de l’Oric. Son cœur est un microcontrôleur RP2040, qui lit le bus du 6502 par ses PIO et répond à sa place. Il apporte :

  • du stockage de masse : sa flash interne, une clé USB, une carte SD ;
  • des périphériques USB : clavier, souris, manettes ;
  • un modem Wi-Fi (PicoWiFiModemUSB), vu par l’Oric comme un ACIA en $0380 ;
  • un menu intégré, et l’échange de la ROM de l’Oric à chaud ;
  • l’émulation d’un contrôleur de disquette, pour démarrer Sedoric sans Microdisc.

L’émulation suit le code source du firmware (version de référence 0.3.1) et a été vérifiée sur une vraie carte. Les écarts connus sont listés en fin de page.

Trois modes

ModeOptionCe qui tourne
intégré--lociun modèle écrit dans Phosphoric
firmware--loci-emu ELFle vrai firmware du LOCI, exécuté par un émulateur de RP2040
usb--loci-hw PORTune vraie LOCI-USB branchée sur l’hôte

Un même binaire contient les trois, et le menu F1 ne propose que ceux qui étaient disponibles à la compilation.

La LOCI-USB

Une LOCI-USB est une LOCI sans interface Oric, avec un second port USB. Aujourd’hui, c’est une carte Adafruit Feather RP2040 USB Host qui fait tourner le firmware du LOCI. Ce n’est pas un pont vers une cartouche LOCI : c’est la LOCI elle-même. Phosphoric joue l’Oric : son 6502 émulé envoie ses accès à la page 3 et à la ROM par l’USB, et le firmware les rejoue dans son chemin de bus habituel. Le port USB-A de la carte sert de ports USB de la LOCI (clé, clavier, modem).

Lancé sans carte disque, Phosphoric prend d’office une LOCI-USB branchée, après trois vérifications :

  1. le matériel : un produit USB dont le nom commence par « LOCI-USB » (lu dans /sys, sans ouvrir le port) ;
  2. le protocole : la carte répond à PING ;
  3. le firmware : l’adresse $0319 se lit 'L'.

Le port n’est pas pris s’il est déjà ouvert par un autre programme. Jamais sans affichage, ni sous make tests. --no-auto-loci désactive cette prise d’office.

La carte de la mémoire

FenêtreContenu
$0310-$031Fcontrôleur de disquette WD1793 du LOCI ; $0319 se lit 'L'
$0315-$0317protocole cassette de bas niveau
$0380-$0383l’ACIA 6551 du modem Wi-Fi
$03A0-$03BFla MIA : console, registres de l’API, pile d’échange ($03AC), opération ($03AF), boucle d’attente ($03B0)

L’API compte 36 opérations sur 36 : système, horloge, fichiers, répertoires, montage, cassette, démarrage et réglage du bus. Ses conventions sont celles du firmware, vérifiées sur sa source : les erreurs de fichier valent 32 + FRESULT de FatFS, les descripteurs de fichier vont de 3 à 18 et ceux de répertoire à partir de 64, la pile d’échange fait 512 octets.

Le stockage

Sur la vraie carteDans Phosphoric
la flash interneun dossier : --loci-flash DOSSIER (par défaut, le dossier courant)
une clé USB--loci-usb DOSSIER (jusqu’à 4), ou les médias montés dans /media/$USER, détectés au lancement
une carte SDune image FAT16 ou FAT32 brute : --loci-sdimg IMAGE

Le sélecteur du menu du LOCI liste les périphériques comme le vrai firmware : « 0: Internal storage », puis une ligne par périphérique USB.

Le bouton Action (F8)

  • Appui court : la session est sauvegardée, puis le menu du LOCI démarre. Comme le vrai firmware, Phosphoric écrit la version du firmware et les réglages du bus dans la ROM du menu. L’entrée resume du menu remet la ROM d’avant et restaure la session.
  • Appui long (2 secondes ou plus) : une ROM de diagnostic démarre et teste pas à pas le processeur, l’ULA, la mémoire, le VIA et le PSG.
  • Sur un clavier où F8 est une touche multimédia, Ctrl+Alt+M et Ctrl+Alt+D font l’appui court et l’appui long.

La ROM de diagnostic attend un appui sur le bouton NMI pour continuer : c’est Maj+F5 depuis la version 2.29.

La course contre le 6502

La course de la cartouche LOCI contre le 6502, en nanosecondesSur l'Oric, PHI2 n'est haut que pendant le dernier tiers du cycle d'une microseconde. Une lecture servie par la cartouche LOCI doit poser sa donnée avant l'instant où le 6502 la saisit : 900 ns après le début du cycle (période moins 100 ns de préparation). Avec les réglages par défaut, la donnée est sur le bus à 708 ns tant que le firmware répond en moins de 58 cycles ; sur la vraie cartouche, 23 cycles ont été mesurés, soit une marge d'environ 190 ns.Une lecture servie par le LOCI, dans un cycle de 1 µsPHI2PHI2 bas : deux tiers du cyclePHI2 haut0 ns250 ns500 ns750 ns1000 nsdonnée sur le bus708 ns (réglages par défaut)le 6502 la saisit900 ns = période − 100 nsmargeMesuré sur la vraie cartouche : le firmware répond en 23 cycles, marge d'environ 190 ns.Au-delà de 81 cycles, la donnée arriverait trop tard : le 6502 lirait un bus que personne ne pilote.C'est le seul endroit de Phosphoric modélisé sous le cycle (niveau N4 partiel).
Une lecture servie par le LOCI : la donnée doit être sur le bus avant que le 6502 la saisisse.

Le port d’extension de l’Oric n’a pas de ligne RDY : un périphérique ne peut pas demander au 6502 d’attendre. Le LOCI doit lire l’adresse par ses PIO, la traiter en logiciel, puis poser la donnée, le tout avant l’instant où le 6502 la saisit. S’il est en retard, personne ne pilote le bus, et le 6502 lit n’importe quoi.

À l’échelle du cycle entier, ce phénomène est invisible. Phosphoric a donc, pour ce seul endroit, une base de temps en nanosecondes (include/io/bus_timing.h) :

ÉtapeInstant
PHI2 de l’Oricbas pendant les deux premiers tiers du cycle, haut pendant le dernier
donnée sur le bus708 ns avec les réglages par défaut, tant que le firmware répond en 58 cycles au plus
le 6502 la saisit900 ns : la période moins 100 ns de préparation
la limite81 à 82 cycles de réponse du firmware

Mesuré sur la carte Feather : le firmware répond en 23 cycles, la donnée est sur le bus vers 708 ns, la marge est d’environ 190 ns.

Deux modèles de fiabilité coexistent : WINDOW (le défaut), où une lecture est fiable si le réglage tior du firmware tombe dans une plage, comme la calibration carte par carte du vrai firmware ; et PHASE (--loci-serve-timing), qui suit la chronologie ci-dessus, avec une gigue en option. C’est le seul endroit de Phosphoric qui atteint, en partie, le niveau N4.

Par l’USB, plus vite

Avec une LOCI-USB, chaque accès à la page 3 est un aller-retour USB pendant lequel le 6502 émulé est figé. La version 2.29.3 regroupe les écritures (par paquets de 256), la 2.30.0 lit d’avance par blocs de 256 octets quand le firmware le permet. Mesuré sur la carte : la sauvegarde puis le retour au menu passent d’une ou deux minutes à environ 4 secondes, et le retour au BASIC de 12 à 4 secondes.

Dans le navigateur

La version web sait démarrer le menu du LOCI (?loci=1, ou le bouton LOCI), avec une flash interne gardée dans le navigateur (IndexedDB). Le modem Wi-Fi, les clés USB et les images SD n’y sont pas. Voir Dans le navigateur.

Les écarts connus

  • La flash interne de la vraie carte (un système LittleFS) n’est pas émulée telle quelle : un dossier joue ce rôle, avec la logique d’un système FAT.
  • Les clés USB sont détectées au lancement seulement : pas de branchement à chaud.
  • Le contrôleur de disquette du LOCI garde des délais courts. C’est fidèle : sur la vraie carte, son « lecteur » est le RP2040 et une carte SD, sans mécanique.

Sources dans le dépôt : docs/loci.md, docs/architecture/phi2-bus-timing.md, docs/architecture/loci-glue.md, docs/ACCURACY.md.