Aller au contenu
Phosphoricwiki
Sommaire

La page 3 et les cartes d'extension

Sur l’Oric, tout ce qui se branche passe par 256 adresses : la page 3. Phosphoric y émule une douzaine de cartes, d’époque ou nouvelles, chacune dans son propre module.

Dans cette page

Qui répond où

La page 3 : qui répond à quelle adresseLes 256 adresses de $0300 à $03FF sont réservées aux entrées-sorties. Le VIA occupe $0300-$030F et répond aussi sur le reste de la page quand aucune carte ne la prend. Les cartes émulées se partagent le reste : Microdisc en $0310-$031F, ACIA 6551 en $031C (ou $0380 avec le LOCI), ULA-NG en $0340-$035F, LOCI en $03A0-$03BF, synthèse vocale SP0256 en $03F1, Jasmin en $03F4-$03FF, DTL 2000 en $03F8-$03FD, MIDI Mageco ou synthèse MEA 8000 en $03FE-$03FF. Les cartes qui se recouvrent sont exclusives.Page 3 · $0300-$03FF : les fenêtres des cartes$0300$0340$0380$03C0$03FFVIA 6522$0300-$030FMicrodisc$0310-$031FACIA 6551$031C-$031FULA-NG$0340-$035FACIA (LOCI)$0380-$0383LOCI$03A0-$03BFSP0256$03F1Jasmin$03F4-$03FFDTL 2000$03F8-$03FDMageco · MEA 8000$03FE-$03FFSans carte, le VIA répond sur toute la page 3 (ses 16 registres répétés).Les cartes qui se recouvrent ne peuvent pas être branchées ensemble : le menu F1 le signale.
Les fenêtres des cartes dans la page 3. Le VIA répond partout où aucune carte ne répond.

Le VIA est câblé en $0300-$030F, mais il répond aussi, en miroir, sur tout le reste de la page 3 quand aucune carte ne prend l’adresse. C’est un piège pour qui veut détecter une carte : lire une adresse vide renvoie un registre du VIA, pas zéro. L’ULA-NG en tient compte dans sa poignée de main.

Le contrat d’un périphérique

Avant l’architecture actuelle, main.c aiguillait chaque accès de la page 3 par une cascade de conditions, avec des priorités croisées. Désormais, chaque périphérique du bus est décrit par une structure io_device_t (include/io/io_device.h) :

ChampRôle
claimscette adresse est-elle à moi ?
read, writeservir un accès ; write peut décliner et laisser l’écriture retomber sur le VIA
claims_writefacultatif, quand la carte écoute en écriture une zone plus large qu’en lecture
peeklire sans effet de bord (pour le débogueur)
save, loadsa section dans les sauvegardes d’état
tickavancer d’un cycle

Ce contrat reçoit tout l’émulateur, et pas seulement la carte, parce que les priorités sont réelles : le Microdisc doit savoir si l’ACIA est présente, et l’ACIA du LOCI doit consulter la fiabilité du bus de la cartouche.

Une carte, un fichier, une ligne

Ajouter une carte d'extension : un fichier et une ligneUne carte d'extension s'écrit dans un seul fichier, src/cards/card_<id>.c, et s'ajoute par une ligne X(<id>, <tick>) dans include/cards_list.h. Le cœur en dérive tout le reste : les options de lancement, l'aide, le menu F1, le fichier phosphoric.cfg, la table du bus d'entrées-sorties, les ticks par cycle, les sauvegardes d'état et le mixage audio.Une carte = un fichier + une ligne (ADR 0006)src/cards/card_<id>.cle descripteur de la carteX(<id>, <tick>)dans include/cards_list.hrien d'autre à toucherle cœurdérive tout le resteoptions de lancementtexte de --helppage du menu F1phosphoric.cfgtable du bus (page 3)tick à chaque cyclesection de sauvegarde .ostsource audio mixée au PSGProuvé par make test-card-template : la carte d'exemple est ajoutée à une copie de l'arbre.Les ticks sont des appels directs générés depuis la liste : une table de pointeurs coûtait 5 %.
Ajouter une carte : un fichier dans src/cards/, une ligne dans include/cards_list.h.

Depuis la série 2.13 à 2.19, chaque carte est un module : un fichier src/cards/card_<id>.c décrit ses fiches pour le menu, ses options, sa configuration, sa mise en route, son contrat de bus, ses sauvegardes et son son. Une ligne dans include/cards_list.h l’ajoute. Le cœur en dérive tout : les options de lancement, l’aide, le menu F1, phosphoric.cfg, la table du bus, les ticks, les sauvegardes et le mixage audio.

Il n’y a pas de chargement dynamique : la liste est explicite, pour rester portable entre GCC, MinGW, clang sur macOS et Emscripten. La carte d’exemple docs/examples/card_demo.c sert de modèle, et make test-card-template l’ajoute à une copie de l’arbre pour vérifier qu’elle marche de bout en bout.

Les cartes émulées

CarteAdresseCe qu’elle fait
Microdisc$0310-$031Fcontrôleur de disquette WD1793, quatre lecteurs, ROM en $E000
Jasmin$03F4-$03FFcontrôleur WD177x, ROM d’amorçage en $F800, disquettes TDOS
LOCI$03A0-$03BFcartouche moderne : stockage, USB, ROM échangeable ; voir Le LOCI
ACIA 6551$031C-$031F ($0380 avec le LOCI)port série : modem V23, Telestrat
DTL 2000$03F8-$03FDmodem Digitelec : PIA 6821 et ACIA 6850, V23 pour le Minitel
Mageco MIDI$03FE-$03FFACIA 6850 vers les prises MIDI, 31 250 bauds
ORICON$031C-$031Fréédition moderne de l’interface MIDI, compatible avec le LOCI
SP0256$03F1synthèse vocale par allophones (carte de Mageco)
MEA 8000$03FE-$03FFsynthèse vocale par formants (carte TMPI)
hostfs—un dossier de l’hôte partagé avec l’Oric
ULA-NG$0340-$035Fl’ULA étendue, toujours présente, verrouillée au démarrage

Les cartes qui se recouvrent sont exclusives : une seule carte disque (Microdisc, Jasmin ou LOCI), une seule carte MIDI (Mageco ou ORICON). Le menu F1 signale les conflits d’adresses.

Le port série : des puces et des transports

Phosphoric sépare la puce que le programme de l’Oric pilote du transport qui porte les octets sur l’hôte. On choisit une puce, puis on lui donne un transport.

TransportGenreUsage
loopbacktransparentce qui est émis revient (tests)
tcp:hôte:porttransparentun BBS, un serveur Minitel, telnet, un routeur MIDI
ptytransparentun pseudo-terminal POSIX (minicom, screen)
com:...transparentun vrai port série de l’hôte
file:entrée[:sortie]transparentrejeu déterministe et capture, sans réseau
midi[:cible]transparentun port MIDI de l’hôte (ALSA, CoreMIDI, WinMM)
smf:morceau.midtransparentun fichier MIDI joué dans l’Oric, au tempo du morceau
modem[:hôte:port]protocoleun interpréteur de commandes Hayes AT
picowifi[:...]protocolele modem Wi-Fi PicoWiFiModemUSB, commandes AT

Les transports à protocole ne vont qu’avec --serial (l’ACIA 6551), par choix : le DTL 2000 se compose par son PIA (un bit de ligne), pas par des commandes AT, et les mettre derrière la carte fidèle la rendrait infidèle.

file: est précieux pour les tests de protocole : on rejoue un flux de serveur enregistré et on capture les réponses du programme, sans réseau ni correspondant.

Le MIDI

La carte Mageco d’origine (--mageco) et sa réédition ORICON (--oricon) mettent un ACIA 6850 derrière les prises MIDI, à 31 250 bauds. Phosphoric peut :

  • capturer le flux MIDI de l’Oric dans un fichier (file::sortie.mid) ;
  • jouer un fichier MIDI standard dans l’Oric, au tempo du morceau (smf:morceau.mid[:loop]) ;
  • dans une construction MIDI=1, ouvrir un vrai port MIDI de l’hôte (« Phosphoric MIDI » sous ALSA) : l’Oric pilote FluidSynth ou un logiciel de musique, et un clavier MIDI joue dans l’Oric.

Ce qui se branche sur les ports

Certains périphériques ne prennent pas d’adresse dans la page 3 : ils se branchent sur les ports du VIA ou du PSG.

  • La manette IJK, l’adaptateur le plus courant, sur le port A du PSG (actif à l’état bas) : au clavier (flèches, Ctrl et Alt droits pour tirer, -j keys) ou sur une vraie manette (-j gamepad, branchement à chaud).
  • L’imprimante Centronics : données sur le port A du VIA, impulsion de validation sur CA2. LPRINT et LLIST sont capturés dans un fichier texte (-p sortie.txt).
  • La table traçante MCP-40 (--printer-type mcp40) : quatre stylos, les commandes de tracé (origine, tracer, déplacer, couleur, texte, type de trait), une feuille de 480 × 400 points exportée en BMP.
  • La cassette, sur l’entrée CB1 du VIA (voir Cassettes, disquettes et sauvegardes).

Sources dans le dépôt : README.md, docs/architecture/io-bus.md, docs/CARTES.md, docs/adr/0006-cartes-en-modules.md, docs/COMPATIBILITY.md.