La machine : la Neo6502kbd
Une vraie 6502, mais aucune puce de mémoire autour : tout ce que la 6502 voit, c’est le RP2040 qui le lui montre. Ce que nous savons de la carte, appris dans les schémas puis vérifié au banc.
Dans cette page
Les composants
La Neo6502kbd (révision A) est la version « clavier intégré » de la Neo6502 d’Olimex. Ses pièces principales, d’après la nomenclature et le schéma KiCad publiés par Olimex :
| Composant | Rôle |
|---|---|
| W65C02S (TQFP44) | le processeur 6502, version CMOS moderne de WDC |
| RP2040 | le microcontrôleur à deux cœurs ARM Cortex-M0+ qui fait tout le reste |
| P25Q16 (2 Mo) | la mémoire flash du RP2040, où réside le firmware |
| 3 × 74LVC245 | des tampons de bus : les aiguillages entre la 6502 et le RP2040 |
| FE1.1s | un hub USB à 4 ports |
| CH217K | l’interrupteur d’alimentation des ports USB, avec limitation de courant |
| Prise HDMI | la sortie vidéo, pilotée directement par le RP2040 |
| Haut-parleur (transducteur), connecteur UEXT | le son, et des extensions I2C, SPI et série |
Le clavier du boîtier est un clavier USB ordinaire, branché sur un des ports du hub. La carte n’a aucun contrôleur de clavier dédié.
Une 6502 sans mémoire
Sur la plupart des ordinateurs à 6502, le processeur est entouré de ROM et de RAM. Ici, rien de tel. La 6502 est reliée à trois 74LVC245, et ces trois tampons sont reliés aux mêmes huit broches du RP2040 (GPIO 0 à 7). Le RP2040 ouvre un tampon à la fois :
- le premier laisse passer l’adresse basse (A0 à A7) ;
- le deuxième, l’adresse haute (A8 à A15) ;
- le troisième, la donnée (D0 à D7), dans un sens ou dans l’autre.
Les deux premiers ne fonctionnent que dans un sens (de la 6502 vers le RP2040). Pour le troisième, c’est la 6502 qui choisit le sens, par sa broche R/W# : le RP2040 ne doit donc envoyer une donnée que quand la 6502 lit.
Le RP2040 produit aussi l’horloge de la 6502 (PHI2, sur GPIO 21) et tient ses broches de RESET, d’IRQ et de NMI. Il contrôle donc entièrement le processeur : il peut le démarrer, l’interrompre, et même le geler en ne répondant pas à un cycle.
Ce qui n’est pas relié
Quatre broches de la 6502 (SYNC, RDY, BE, SOB) ne vont pas au RP2040. La plus regrettable est SYNC, qui signale la lecture d’une instruction : sans elle, le RP2040 ne peut pas distinguer une instruction d’une donnée lue en mémoire.
Les broches IRQ, RESET et NMI sont partagées avec le SPI du connecteur UEXT, par des résistances de 0 Ω sur la Neo6502kbd. Les 30 broches du RP2040 sont toutes occupées : bus, sélection des tampons, R/W#, HDMI, son, horloge, UEXT.
La 6502 en 3,3 volts
La 6502 de la carte est une W65C02S6TQG-14. Le « 14 » désigne 14 MHz garantis sous 5 V. Or la carte n’a qu’un seul rail logique, en 3,3 V, et à cette tension WDC ne garantit que 8 MHz. La fiche précise que le cœur est statique : il n’a pas de fréquence minimale et supporte qu’on arrête son horloge aussi longtemps qu’on veut. Eliott65 s’en sert sans cesse.
Notre banc de mesure a montré que cette puce tient au moins 10,5 MHz en 3,3 V, au-delà de la garantie. Ce chiffre vaut pour notre exemplaire ; voir Le bus.
L’USB : un hub, et une prise qui change tout
L’unique port USB du RP2040 va au hub FE1.1s, qui le répartit sur les quatre prises USB-A. Le RP2040 est alors l’hôte : c’est lui qui interroge le clavier et la clé.
La même liaison va aussi à la prise PGM. Quand un câble y est branché, la tension du PC met le hub en pause (reset), et le RP2040 devient un périphérique du PC. Conséquence pratique : avec un câble sur PGM, plus de clavier.
Le hub est relié en Full Speed ; le clavier est un appareil Low Speed. Pour lui parler à travers le hub, chaque échange doit être précédé d’un paquet spécial, le PRE. Le pilote d’Eliott65 le gère.
La sortie HDMI
Il n’y a pas de puce vidéo : les quatre paires différentielles de la prise HDMI (trois couleurs et l’horloge) sont reliées directement aux broches 12 à 19 du RP2040, à travers des résistances de 270 Ω. C’est au logiciel de fabriquer le signal, bit par bit. Voir La vidéo.
Les autres broches de la prise (DDC, CEC, HPD) ne vont qu’à des pastilles de test : le RP2040 ne peut pas lire l’EDID de l’écran, la liste des modes qu’il accepte.
Le haut-parleur
Un petit transducteur magnétique (QMB-09B-03), commandé par GPIO20 à travers un transistor. Il faut lui fournir un signal carré ; il sonne le plus fort vers 2,7 kHz. Voir Le son.
La flash et la sonde
La flash est une Puya P25Q16 de 2 Mo. Détail qui a compté : l’OpenOCD 0.12.0 des distributions ne la reconnaît pas, seule la version de développement sait la programmer. Le connecteur SWD1 donne accès au port de débogage du RP2040 ; c’est par lui que passent le flashage et presque tous nos outils. Voir Les outils du banc.
Le firmware présent sur la carte avant Eliott65 a été sauvegardé en entier (2 Mo, avec son empreinte SHA-256) avant tout essai : il peut être restauré par la sonde.