Aller au contenu
Phosphoricwiki
Sommaire

L'ULA-NG

Et si l’ULA de l’Oric avait eu une suite ? L’ULA-NG est la référence logicielle d’une puce vidéo étendue, pensée pour être refaite un jour sur FPGA. Au démarrage, rien ne la distingue de l’originale.

Dans cette page

Une puce dormante

L’ULA-NG (next generation) est une couche ajoutée à l’ULA de Phosphoric. Au démarrage, elle est verrouillée : elle se comporte exactement, bit pour bit, comme l’ULA d’origine (HCS 10017). Sa fenêtre de registres, $0340-$035F, retombe alors sur le VIA. Aucun programme existant ne voit de différence, et il n’y a aucune option à passer.

Elle est la référence logicielle d’une future puce sur FPGA (une Sipeed Tang Primer 20K, avec un Gowin GW2A-18). Chaque choix doit donc pouvoir se câbler : pas de calcul flottant dans le chemin vidéo, des structures qui ont un équivalent matériel évident (registre, petite RAM, table, FIFO), et des registres échantillonnés de façon déterministe.

Déverrouiller

On écrit 'N' ($4E) puis 'G' ($47) en $0340, sans autre écriture dans la fenêtre entre les deux. Un reset reverrouille tout.

        LDA #$4E : STA $0340        ; 'N'
        LDA #$47 : STA $0340        ; 'G'
        LDA $0340 : CMP #$1E : BNE pas_de_ng            ; NG_ID = version 1.0 ?
        LDA $034F : EOR $0340 : CMP #$FF : BNE pas_de_ng ; NG_IDCHK = complément ?

En BASIC : POKE#340,78:POKE#340,71.

Huit fonctions

FonctionCe qu’elle faitRegistres
Paletteles couleurs deviennent des index dans une table de 16 entrées de 12 bits (4 096 teintes)$0348-$034A
IRQ rasterune interruption à une ligne choisie (0 à 255)$0346, $0347
Adresse de départl’écran se lit à partir d’une autre adresse : double tampon, défilement grossier$0342-$0343
Copperune liste de 64 changements de palette, appliqués ligne par ligne$034B, $034C
Défilement fin0 à 5 pixels en X, 0 à 7 en Y$0344, $0345
Attributs parallèlesencre et fond par cellule, dans un plan à part : fini le color clash$034D, $034E
Sprites16 sprites de 16 × 16 pixels, priorité par numéro, collisions$0350-$0356
Chunky et 80 colonnes320 × 224 en 16 couleurs ; ou du texte sur 480 pixels$0341

NG_MODE ($0341) porte l’essentiel : le bit 0 active les extensions, le bit 1 les attributs parallèles, les bits 2 et 3 le mode vidéo (00 standard, 01 chunky, 10 texte 80 colonnes). Les sprites ont leur propre interrupteur ($0350). Écrire 0 dans NG_MODE et dans $0350 revient à l’image normale sans reset.

Mosaïque de cellules de couleur en dégradé diagonal
Attributs parallèles : chaque cellule a son propre fond, sans cellule perdue.
Barres horizontales colorées derrière un texte répété
Copper : la palette change à chaque ligne.

Quand un registre agit

Règle générale : un registre qui change l’image agit à la ligne suivante, pris en compte pendant le retour de ligne. C’est ce qui permet le split raster par la palette. Exceptions immédiates : le déverrouillage et l’acquittement d’interruption. L’adresse de départ, elle, agit à la trame suivante, pour un double tampon propre ; les modes chunky et 80 colonnes sont figés pour toute une trame.

La mémoire de l’ULA-NG

Le plan d’attributs (8 Ko), les motifs des sprites et l’image du VDU ne sont pas dans les 64 Ko du 6502. Ils vivent dans une mémoire portée par l’ULA-NG, qu’on remplit par des ports à auto-incrément. Sur le futur FPGA, cette mémoire sera la DDR3 de la carte ; la mémoire interne du FPGA, plus petite, gardera les tampons de ligne, la palette et le jeu de caractères.

Le VDU intégré

Plutôt que d’écrire les registres un à un, on peut envoyer un flux de commandes dans NG_VDU ($0357), à la manière du VDU du BBC Micro. L’interpréteur vit dans l’ULA-NG : le 6502 ne porte aucun pilote, il envoie des octets.

CommandeEffet
20réinitialiser
22 nmode : 0 standard, 1 chunky, 2 80 colonnes
19 l r g brégler une couleur de la palette
18 afond de couleur par cellule
31 col row acolorer une cellule, sans color clash
CLG, DRAW (v0.2)effacer et tracer des droites dans l’image portée par l’ULA-NG
23, 24 (v0.3)définir un sprite par un flux de 256 octets, puis le placer

Les versions 0.1 à 0.3 du VDU sont faites et vérifiées. Sur FPGA, cet interpréteur tournerait en logiciel sur un petit processeur intégré, pendant que le chemin vidéo temps réel resterait câblé.

Rayons de couleur partant d'un point
Un soleil tracé par CLG et DRAW, sans une ligne de pilote 6502.

Essayer

Il n’y a pas de mot-clé BASIC : le BASIC est figé en ROM depuis 1983. On pilote l’ULA-NG par POKE, par STA en code machine, ou depuis l’émulateur :

# Palette : la couleur 7 (blanc) devient verte
oric1-emu -r roms/basic11b.rom --ula-ng-poke "340=4E,340=47,341=01,348=07,349=00,34A=F0"

# Texte 80 colonnes
oric1-emu -r roms/basic11b.rom --ula-ng-poke "340=4E,340=47,341=09"

# Les démonstrations, avec leur menu
demos/ula-ng/menu.sh

Toutes les démonstrations sont dans la galerie.

Ce qui reste à faire

  • La priorité des sprites par rapport au fond : ils sont pour l’instant toujours au premier plan.
  • Le stockage compact des sprites (3 bits par pixel) et la palette étendue, prévus côté FPGA.
  • Des jeux de caractères et des images envoyés au VDU, et un PLOT étendu.

Sources dans le dépôt : docs/ula-ng/README-ULA-NG.md, docs/ula-ng/ULA-NG-SPEC.md, docs/ula-ng/VDU.md, docs/ula-ng/AUDIT.md.