Le plan des registres (v0.1)
Le contrat entre le logiciel 65816 et les trois circuits programmables : ce que chaque registre fait. Version 0.1, encore une proposition à valider.
Dans cette page
Les conventions communes
- Chaque bloc expose 32 registres de 8 bits, de
$00à$1F, répétés huit fois dans sa page de 256 octets. - Les valeurs sur 16 ou 24 bits rangent l’octet de poids faible à l’adresse la plus basse (suffixes
_L,_M,_H). Une écriture n’agit qu’à l’écriture de l’octet_H; une lecture de_Lfige les autres. - Le registre
$1F(ID) donne l’identifiant du bloc et la version de son plan : 9K = 1, vidéo = 2, Pico = 3 ; une carte d’extension est invitée à répondre F. - Chaque bloc a un masque d’interruptions (
IRQ_EN) et un registre d’état (IRQ_STAT) que le gestionnaire d’interruption lit pour trouver la source.
La 9K, contrôleur système ($00:9C00)
| Registres | Rôle |
|---|---|
SYS_CLK, SYS_STATUS | vitesse de PHI2 (valeurs à définir après mesure), état des PSRAM, du codec et du démarrage |
IRQ_EN, IRQ_STAT, TMR_* | interruptions et minuterie |
FM_*, PSG_* | accès aux cœurs sonores FM (YM2151) et PSG (AY-3-8910), à revoir si un autre timbre est choisi |
PCM_*, MIX_* | canal d’échantillons et mélangeur (volumes FM, PSG, PCM) |
DMA_* | enregistrement par DMA : adresse en PSRAM, longueur, format |
I2C_CTRL, I2C_DATA | commande du codec audio, sur son I²C en 1,8 V |
MEM_PTR_*, MEM_DATA | port mémoire : lire ou écrire un octet de PSRAM à une adresse sur 24 bits, avec avance automatique |
La vidéo, Tang Nano 20K ($00:9D00)
| Registres | Rôle |
|---|---|
VADDR0_*, VINC0, VDATA0 | port 0 : adresse vidéo, pas d’avance, donnée |
VADDR1_*, VINC1, VDATA1 | port 1, identique |
VCTRL, VMODE | affichage actif, réinitialisation ; numéro de mode (liste à définir) |
IRQ_EN, IRQ_STAT, IRQ_LINE_* | interruptions : retour vertical, ligne choisie, collision de lutins (si retenue) |
SCAN_*, BORDER | ligne en cours d’affichage ; couleur de la bordure |
La résolution, les modes, les couches et les sprites ne sont pas encore définis : ils viendront avec un plan de la mémoire vidéo.
Le Pico, entrées-sorties ($00:9E00)
| Registres | Rôle |
|---|---|
CMD, STATUS, ERROR, ARG0 à ARG7 | boîte aux lettres : arguments, code de commande, état et erreur |
DATA, DATA_CNT_* | port de données de la commande en cours, et nombre d’octets en attente |
IRQ_EN, IRQ_STAT | fin de commande, clavier, souris, console série, réseau |
KBD_*, MOUSE_*, JOY0, JOY1 | clavier, souris et deux manettes, lus directement |
UART_DATA, UART_STATUS | console série |
Premières commandes : version, fichiers (ouvrir, lire, écrire, fermer, se placer, lister, supprimer), horloge (lire, régler) et état du réseau. Le temps de réponse du Pico, qui travaille en logiciel, reste à mesurer ; s’il ne suffit pas, la 9K pourra prolonger l’horloge pendant ses accès.
Le chargement du démarrage (proposition)
Pendant le démarrage, le processeur est tenu hors du bus. Le Pico prend alors sa place sur une partie du bus et écrit, par le port mémoire de la 9K, les vecteurs puis le code de démarrage dans la PSRAM. Un registre de fin de démarrage reste à ajouter. Le mécanisme ne demande aucune broche de plus ; le rythme des accès côté Pico reste à vérifier.
Ce qui reste à valider
- Les cœurs sonores, et donc les registres FM et PSG.
- Les formules de la vitesse de PHI2, de la fréquence PCM et du prédiviseur de la minuterie.
- Le chargement du démarrage par le Pico et son registre de fin.
- Les modes vidéo, la résolution et le plan de la mémoire vidéo.
- Les formats du clavier et des manettes, et le branchement des prises DE-9.
- Le temps de réponse du Pico sur le bus.
Le plan complet, registre par registre, est dans le dépôt : docs/registers.md, vérifié par
tools/check_registers.py.