Comment construire un ordinateur 8 bits à partir de fichiers d'en-têtes C
Imaginez que vous avez décidé d'écrire un émulateur pour le Commodore 64 ou le ZX Spectrum. Habituellement, cela se transforme en une longue plongée dans les manuels des processeurs Z80 ou MOS 6502, en implémentant les timings, et en essayant de faire fonctionner le tout avec la sortie graphique. Mais il existe un projet qui propose une approche différente — le traiter comme l'assemblage d'un kit sur une platine d'expérimentation.
Nous parlons du dépôt chips du développeur floooh. C'est une collection d'émulateurs de puces 8 bits et de systèmes complets écrits en C pur. Le point fort principal est que tout est packagé dans des fichiers d'en-têtes (header-only), et l'interaction entre les composants imite de vraies broches physiques.
Quel est le cœur de ce projet
Quand nous écrivons du code, nous sommes habitués aux objets, méthodes et callbacks. Dans chips, tout fonctionne différemment. L'auteur a introduit le concept de masques de bits pour les broches. Chaque puce a une fonction tick qui prend un nombre 64 bits. Chaque bit de ce nombre représente l'état d'une « patte » spécifique de la puce : bus d'adresses, bus de données, signaux lecture/écriture ou interruptions.
Vous fournissez un masque en entrée, la fonction calcule un cycle d'horloge de la puce et retourne un masque mis à jour. Pour construire un ordinateur, vous « tirez littéralement des fils » dans le code, en copiant les bits du masque de sortie d'une puce vers le masque d'entrée d'une autre puce. C'est incroyablement logique si vous avez déjà tenu un fer à souder ou étudié d'anciens schémas de matériel.
Ce qu'il y a dans la boîte
Le dépôt contient une belle collection de matériel de l'ère dorée des ordinateurs familiaux.
Pour commencer — les processeurs. Il y a les classiques : Z80, 6502 et 8080. Avec eux viennent les puces périphériques sans lesquelles un ordinateur ne démarrera pas. Par exemple, le contrôleur d'interruptions i8259, le temporisateur i8253, ou le contrôleur vidéo MC6845.
En plus des composants individuels, l'auteur a inclus des assemblages prêts à l'emploi dans le projet. Vous pouvez exécuter l'émulation de :
- Amstrad CPC 464/6128
- Commodore 64
- ZX Spectrum 48/128
- Acorn Atom
- Et même le soviétique RK-86 (ou plutôt, son proche parent basé sur le 8080)
Tout cela est écrit dans un sous-ensemble C99 que GCC, Clang et même MSVC gèrent sans problème. Aucune dépendance externe — il suffit d'inclure le fichier .h approprié et vous êtes prêt.
Comment ça fonctionne techniquement
Malgré la quête de « pureté » dans la simulation des broches, l'auteur a fait des compromis raisonnables pour les performances. Si nous simulions honnêtement chaque porte logique, l'émulateur ramperait même sur du matériel haut de gamme. C'est pourquoi le décodage d'adresses dans les émulateurs de systèmes est souvent simplifié.
C'est intéressant de voir comment les tests sont gérés. Il n'y a pas de tests dans le dépôt principal — ils sont dans un projet séparé chips-test. Les exemples d'utilisation s'y trouvent aussi. Et si vous voulez voir ce que ça peut faire dans un navigateur, l'auteur a des démos compilées en WebAssembly. Elles s'exécutent très rapidement, ce qui confirme la viabilité de l'approche header-only.
Avantages pratiques
Pourquoi un développeur moderne aurait-il besoin de cela quand il existe des dizaines d'émulateurs prêts à l'emploi ?
Premièrement, c'est une base idéale pour créer vos propres outils spécialisés. Si vous avez besoin de déboguer du code pour un ancien processeur ou d'écrire un débogueur personnalisé, chips fournit une base prête, testée et très compacte.
Deuxièmement, c'est un excellent manuel pratique sur l'architecture des ordinateurs. Au lieu de lire une théorie aride, vous pouvez voir exactement comment les données circulent du processeur vers la mémoire via le bus, simplement en plaçant des points d'arrêt dans le code.
Troisièmement, le projet est utile pour les passionnés de systèmes embarqués. Grâce à l'absence de dépendances et aux faibles besoins en ressources, ces émulateurs peuvent fonctionner sur un microcontrôleur, créant un « ordinateur dans un ordinateur ».
Cela vaut-il la peine d'essayer
Si vous êtes un passionné de informatique rétro ou si vous aimez simplement le code C beau et concis, ça vaut definitely le détour de consulter le dépôt. L'architecture par masques de bits est une approche fraîche de l'ancien problème de l'émulation.
Le projet est vivant, activement mis à jour et maintenu. Bien sûr, la documentation dans le README lui-même est assez brève, mais le code est écrit de manière si propre qu'on peut facilement comprendre par soi-même. Pour ceux qui veulent creuser encore plus profond, l'auteur a même compilé une collection de schémas et de manuels dans un dépôt compagnon emu-info.
Une mise en garde — ce n'est pas une bibliothèque « plug and play » pour l'utilisateur moyen. Pour obtenir une image à l'écran, vous devrez attacher un backend graphique (comme Sokol ou SDL) et comprendre comment convertir les données de la mémoire vidéo émulée en pixels. Mais pour ceux qui aiment fouiller dans les « entrailles » des logiciels système, c'est plus un avantage qu'un inconvénients.
Projets similaires