Aller au contenu
Phosphoricwiki
Sommaire

L'Oric émulé

Avant de voir comment Phosphoric émule l’Oric, voyons ce qu’il émule : quatre puces principales sur un bus, 64 Ko d’adresses, et une façon bien à elle de mettre de la couleur à l’écran.

Dans cette page

Deux modèles, une même carte

Phosphoric émule les deux machines de Tangerine :

Oric-1 (1983)Oric Atmos (1984)
ROMBASIC 1.0 (basic10.rom)BASIC 1.1 (basic11b.rom)
Vecteur de RESET$EA59$ECCC
Au démarrage47870 BYTES FREE37631 BYTES FREE
Choixdétecté d’après la ROM, ou -m oric1 / -m atmos

Les deux ROM font 16 Ko. Phosphoric reconnaît la version d’après la ROM chargée et adapte ses corrections de la ROM (chargement rapide de cassette, notamment) à chacune.

Écran de démarrage de l'Oric-1 : ORIC EXTENDED BASIC V1.0, © 1983 TANGERINE, 47870 BYTES FREE, Ready
L’Oric-1 au démarrage, ROM BASIC 1.0. Comparer avec celui de l’Atmos.

Les puces

La machine que Phosphoric émule, et ce qui l'entoureUn processeur MOS 6502 à 1 MHz et 64 Ko de mémoire (48 Ko de RAM, 16 Ko de ROM BASIC) partagent un bus. Sur ce bus : le VIA 6522 (clavier, cassette, imprimante, interruptions), l'ULA (l'image), le PSG AY-3-8912 (le son, et une partie du clavier) et la page 3, où se branchent les cartes d'extension. À droite, l'hôte : fenêtre SDL2, navigateur, ou aucun affichage. En bas, l'horloge maître fait avancer toute la machine d'un cycle à la fois.6502MOS 6502 NMOS · 1 MHzMémoire 64 KoRAM 48 Ko · ROM 16 Kobus d'adresses et de donnéesVIA 6522ports et minuteriesclavier (matrice 8 × 8)cassette, imprimanteinterruptionsULAHCS 10017 · l'imagetexte 40 × 28HIRES 240 × 2008 couleurs, PALPSGAY-3-8912 · le son3 voix et un bruit16 enveloppesport A : clavierPage 3$0300-$03FFMicrodisc, Jasmin, LOCIACIA, DTL 2000, MIDIsynthèse vocale, ULA-NGHôteSDL2 : image, son,clavier, manetteWebAssemblysans affichagecaptures, AVI, WAVAPI HTTP, --controlserveur GDBHorloge maître : emu_cycle() fait avancer toute la machine d'un cycle (CPU, puis φ2, puis ULA)
Le 6502 et la mémoire sur un bus, avec le VIA, l’ULA, le PSG et la page 3 des cartes.
  • Le processeur, un 6502 NMOS à 1 MHz. Il fait un accès au bus par cycle. Sa version NMOS a des particularités que Phosphoric reproduit : des accès factices (lectures ou écritures sans but apparent, au milieu de certaines instructions), 105 opcodes « illégaux » en plus des 151 officiels, et un mode décimal.
  • L’ULA (HCS 10017) fabrique l’image. Elle partage la mémoire avec le processeur : dans chaque microseconde, le 6502 accède d’abord, puis l’ULA lit un octet de l’écran. Il n’y a donc jamais de conflit ni de cycle volé.
  • Le VIA 6522 a deux ports de 8 bits et deux minuteries. Il sélectionne la colonne du clavier, reçoit le signal de la cassette, pilote l’imprimante, et déclenche les interruptions du système.
  • Le PSG AY-3-8912 fait le son : trois voix carrées, un générateur de bruit, seize formes d’enveloppe. Son port A sert aussi au clavier et à la manette IJK.

La mémoire

La mémoire de l'Oric, de $0000 à $FFFFDe bas en haut : page zéro, pile et variables du système ($0000-$02FF) ; la page 3, réservée aux entrées-sorties ($0300-$03FF, le VIA en $0300) ; la RAM libre pour les programmes ; les jeux de caractères du mode HIRES ($9800) ; la zone vidéo ($A000-$BFFF : écran HIRES en $A000, jeux de caractères du mode texte en $B400 et $B800, écran texte 40 × 28 en $BB80) ; la ROM BASIC de 16 Ko ($C000-$FFFF). Avec le Microdisc, cette ROM laisse place à de la RAM et à la ROM du contrôleur en $E000. Schéma pas à l'échelle.Carte de la mémoire (pas à l'échelle)$C000-$FFFFROM BASIC 1.0 ou 1.116 KoMicrodisc : RAM en $C000, ROM du contrôleur en $E000$A000-$BFFFzone vidéoécran HIRES ou écran textetexte : caractères en $B400 et $B800, écran 40 × 28 en $BB80HIRES : 8 000 octets en $A000, 40 octets par ligne$9800-$9FFFjeux de caractèresdu mode HIRESHIRES : caractères en $9800 et $9C00$0400-$97FFRAM libreprogrammes BASIC et code machine$0300-$03FFpage 3 : entrées-sortieslire la page 3 interroge une puce, pas la RAM$0000-$02FFpage zéro, pile, système
La carte de la mémoire de l’Oric. La page 3 n’est pas de la RAM : la lire interroge une puce.

Quelques adresses reviennent sans cesse :

AdresseContenu
$0300-$03FFla page 3 : entrées-sorties. Le VIA en $0300, les cartes d’extension au-dessus.
$A000-$BF3Fl’écran HIRES : 200 lignes de 40 octets.
$B400 et $B800les jeux de caractères du mode texte (standard et secondaire).
$BB80-$BFDFl’écran texte : 28 rangées de 40 caractères.
$C000-$FFFFla ROM BASIC, ou, avec le Microdisc, de la RAM et la ROM du contrôleur en $E000.

En mode HIRES, les jeux de caractères se déplacent en $9800 et $9C00, puisque l’écran graphique occupe leur place.

La couleur par attributs série

L’ULA n’a pas de mémoire de couleur. La couleur se règle dans l’écran lui-même : un octet dont les bits 5 et 6 sont à zéro n’est pas un caractère mais un attribut, qui change l’état de la suite de la ligne :

ValeurEffet
0 à 7couleur d’encre (INK)
8 à 15style du texte : jeu secondaire, double hauteur, clignotement
16 à 23couleur de fond (PAPER)
24 à 31mode vidéo : texte ou HIRES, 50 ou 60 Hz

Un attribut occupe sa place à l’écran : il s’affiche comme une cellule de la couleur de fond. Le bit 7 d’un octet inverse sa cellule. Chaque ligne repart en encre blanche sur fond noir, puis la ROM pose ses propres attributs en début de ligne. C’est pourquoi l’écran de démarrage de l’Atmos est noir sur blanc.

Le clavier

Le clavier est une matrice de 8 colonnes sur 8 rangées. Le VIA choisit une colonne (bits 0 à 2 de son port B, par un décodeur 74LS138), le PSG choisit les rangées à tester (son registre 14), et le bit 3 du port B du VIA dit si une touche est enfoncée. La ROM balaie ainsi tout le clavier, colonne par colonne.

Phosphoric reproduit cette matrice, propose les dispositions QWERTY et AZERTY, et synchronise sa frappe automatique (--type-keys) sur ce balayage : aucune touche n’est perdue, même si un programme lit le clavier lentement.

L’image, en chiffres

MesureValeur
Texte40 colonnes × 28 rangées, caractères de 6 × 8 pixels
HIRES240 × 200 pixels, puis 3 rangées de texte
Couleurs8 (noir, rouge, vert, jaune, bleu, magenta, cyan, blanc)
Ligne64 cycles, dont 40 de cellules visibles
Trame312 lignes PAL, dont 224 visibles, 50 par seconde

Le détail du balayage est dans L’image et l’ULA.

Sources dans le dépôt : README.md, docs/COMPATIBILITY.md, docs/architecture/master-clock.md, docs/ula-ng/ULA-NG-SPEC.md.