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
| Fonction | Ce qu’elle fait | Registres |
|---|---|---|
| Palette | les couleurs deviennent des index dans une table de 16 entrées de 12 bits (4 096 teintes) | $0348-$034A |
| IRQ raster | une interruption à une ligne choisie (0 à 255) | $0346, $0347 |
| Adresse de départ | l’écran se lit à partir d’une autre adresse : double tampon, défilement grossier | $0342-$0343 |
| Copper | une liste de 64 changements de palette, appliqués ligne par ligne | $034B, $034C |
| Défilement fin | 0 à 5 pixels en X, 0 à 7 en Y | $0344, $0345 |
| Attributs parallèles | encre et fond par cellule, dans un plan à part : fini le color clash | $034D, $034E |
| Sprites | 16 sprites de 16 × 16 pixels, priorité par numéro, collisions | $0350-$0356 |
| Chunky et 80 colonnes | 320 × 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.


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.
| Commande | Effet |
|---|---|
20 | réinitialiser |
22 n | mode : 0 standard, 1 chunky, 2 80 colonnes |
19 l r g b | régler une couleur de la palette |
18 a | fond de couleur par cellule |
31 col row a | colorer 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é.

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.