L'hibernation : la machine entière dans un fichier
Toute la mémoire de la 6502 vit dans le RP2040 : on peut donc l’écrire dans un fichier et la recharger plus tard. Restait une difficulté, les registres du processeur, que personne ne voit.
L’idée
Un ordinateur classique qui hiberne doit vider sa mémoire sur disque, puis la recharger. Sur la Neo6502kbd, c’est presque gratuit : les 64 Kio de la 6502 sont déjà un tableau dans la mémoire du RP2040. Il suffit de l’écrire dans un fichier, avec l’état de l’écran et du clavier.
La vraie difficulté : les registres
La 6502 a des registres (A, X, Y, l’état P, le pointeur de pile S, le compteur de programme PC). Ils sont dans la puce, pas en mémoire, et ils ne passent jamais sur le bus. Le RP2040 ne peut donc pas les lire.
La solution s’inspire de setjmp et longjmp, bien connus des programmeurs C :
- le programme appelle la routine
e65_hibernerde la bibliothèque ; - la routine range elle-même Y, P et S dans ses propres octets, donc dans la mémoire qui va être sauvegardée ;
- elle appelle le noyau (
SYSTEME HIBERNER) en lui donnant son adresse de reprise.
Le noyau écrit alors un fichier .HIB : un en-tête de 512 octets (signature E65H, adresse de
reprise, état de l’écran, file du clavier, disposition), puis les 64 Kio tels quels, sans copie,
directement depuis la mémoire de la 6502.
La reprise
Pour reprendre, on lance le fichier .HIB comme un programme. Le noyau reconnaît la signature,
gèle la 6502, recharge la mémoire et l’état, puis redémarre la 6502 sur l’adresse de reprise.
Une astuce de plus : la 6502 démarre toujours là où pointe son vecteur RESET. Le noyau fait donc pointer ce vecteur, pour un instant, sur la reprise, puis remet le vrai vecteur 200 µs plus tard.
La routine rétablit S, Y et P, et revient à son appelant. Le programme distingue les deux cas par la valeur de A : $00 juste après l’enregistrement, $FF au retour d’hibernation.
Sur la carte
Le programme de test HIBER.E65 affiche un compteur qui tourne.
- On appuie sur H : le fichier
ETAT.HIBest écrit (66 048 octets : l’en-tête et les 64 Kio). - On quitte vers le shell : le compteur disparaît.
- On tape
etat.hib: le programme reprend, son compteur repart de la valeur sauvegardée (et non de zéro), et il affiche « REPRISE ! ».
Un second cycle, qui remplace le fichier, reprend tout aussi bien.
Dans les tests sur PC, on va plus loin : après l’hibernation, la mémoire et l’état sont entièrement
brouillés, puis la reprise doit tout restaurer à l’identique. Un fichier .HIB invalide est refusé
sans même geler la 6502.
Revivre à côté du shell
Avec le multitâche, une machine hibernée peut être relancée en arrière-plan : ETAT.HIB & dans le
shell, et le programme reprend à côté de lui, avec son propre écran. Voir Plusieurs programmes à la
fois.
Combien de temps ?
Avec les accès à la clé optimisés (plusieurs blocs par commande, FAT différée), écrire un fichier de 64 Kio prend environ 0,24 s et le relire environ 0,36 s sur la clé de test.