Pico-puter : Cheap 8 Mk II
Cheap 8 ?
Pico-puter est un nom par défaut. Ce doit être un ordinateur simple, voire simpliste, facile à comprendre et peu cher. Le mot anglais/étasunien « Cheap » convient tout à fait. Allons-y donc pour Cheap.
Et le « 8 » ? Pour cela il faut en revenir à la genèse du Pico-puter « Mk I ». L’AT Tiny qui l’accueille ne comporte que 512 octets de mémoire vive. Après réflexion, j’ai décidé d’en utiliser la moitié comme la RAM du pico-puter, le reste servant à l’émulation du microprocesseur. Il suffit d’une adresse sur huit bits pour adresser deux cent cinquante six octets. Huit bits d’adresses, huit bits de données, allez, va pour Cheap 8.
Plateforme cible
L’AT Tiny 85 reste ma cible, pour résumer :
- 8 ko de mémoire programme
- 512 octets de mémoire RAM
- 512 octets de mémoire EEPROM
- 5 pins pour les entrées et sorties
- Possibilité de lien série, USB, I2C, I2S, etc via son USART programmable.
Pour l’exercice, cela m’oblige à appliquer les mêmes principes de programmation que pour le Mk I :
- éviter l’héritage
- utiliser la composition et la délégation
- limiter au strict nécessaire l’utilisation de variables de travail, tant globales qu’internes aux classes
- limiter le nombre de paramètres passés aux fonctions/méthodes
- limiter la profondeur d’appel des fonctions/méthodes
- ordonner les valeurs testées dans les clauses « switch »
- diminuer la complexité tant matérielle que logicielle – le fameux « KISS principle »
Avant d’en arriver là, je me contente d’une …
Plateforme de prototypage
Il s’agit d’un Arduino Uno associé à un clavier à seize touches et un affichage à huit chiffres de sept segments. Clavier et affichage sont pilotés par l’intermédiaire d’un contrôleur TM 1638 très bien documenté et plutôt simple d’utilisation une fois qu’on en a compris le fonctionnement.
L’Arduino Uno et son micro contrôleur ATmega 328 est bien mieux doté en espace de travail qu’un AT Tiny : 8 ko de mémoire vive, 2 ko de mémoire EEProm, et 32 ko de mémoire programme (Flash). L’avantage est de pouvoir tester mon code avant d’en optimiser l’utilisation mémoire.
Et Cheap 8, dans tout ça ?
Les Arduino et les microcontrôleur AT Mega et Tiny peuvent se programmer en C++. C’est assez loin d’être « Cheap », tout ça. Il faut un ordinateur, un compilateur, un éditeur de texte, non ?
Comme pour le Mk I, je me suis inspiré de CHIP-8, qui est un ordinateur virtuel tournant à l’origine sur un ordinateur à base de microprocesseur RCA 1802, mais ensuite porté sur un peu tout ce qui peut se programmer, entre autres les ordinateurs huit bits, les PC et compatibles, les systèmes Windows, Linux et autres *NIXes, et les calculatrices HP 48 et suivantes.
Chip-8 exécute des instructions codées sur deux octets dans un espace mémoire de quatre kilo octets. Cheap 8, lui, exécute des instructions codées sur un octet dans un espace mémoire de deux cent cinquante six octets. Exit donc les graphismes et, pour le moment du moins, le son et les timers.
Organisation mémoire
Seize registres V0 à VF sont mappés sur les seize premiers octets de mémoire. V0 est l’accumulateur, VF le registre de flags. Par la suite, le registre VE sera utilisable comme registre d’index pour adresser facilement la mémoire disponible. Ce sera pour l’itération suivante.
Les seize derniers octets de la mémoire (adresses F0 à FF en hexadécimal) contiennent des adresses sous programmes (CALL) ou saut (JUMP), au choix du programmeur.
Le reste de la mémoire est occupé par le programme. Plus tard, il pourra contenir également des variables, une fois le registre d’index implémenté.
Registres
Seize registres, donc, notés V0 à VF. Des instructions permettent de copier ou d’échanger les valeurs entre V0 et les autres registres. Le registre VF, ou FLAG, est modifié par les opérations arithmétiques ou logiques, et est utilisé par les instructions de saut conditionnel.
Opérations arithmétiques et logiques
Ces opérations utilisent une pile d’évaluation, à la manière des langages de type Forth et plus généralement de type RPN.
Cette pile se trouve en dehors de la mémoire de Cheap 8, et n’est pas directement accessible. Seul le haut de la pile (TOS) est directement accessible via le registre V0. Le reste est utilisable pas les instructions de calcul arithmétiques et logiques.
Pile d’évaluation et pile de retour
La pile de retour permet de « revenir » à un fil d’exécution à la fin d’un sous programme (CALL).
Pile d’évaluation et de retour partagent seize octets situés en dehors de la mémoire Cheap 8. La pile d’évaluation grandit vers le haut, celle de retour vers le bas. Que les deux se croisent, le Cheap 8 arrête l’exécution du programme et passe en mode panique.
Les entrées et sorties
Un CPU, fut-il virtuel comme Cheap 8 a besoin qu’on lui fournisse des informations, et qu’il puisse nous en retourner. C’est essentiel pour lire un clavier, une ligne série ou afficher une valeur, des pixels ou des caractères.
CHIP-8 est doté des deux instructions IN et OUT pour interagir avec les périphériques. Pour le moment, huit ports d’entrée et huit ports de sortie suffiront largement
Clavier et affichage
Je me suis, pour cette partie, inspiré du Digirule 2A. J’ai bien tenté d’en acheter un, mais c’est comme pour les billets pour la Hell Fest, il faut s’accrocher pour obtenir le Graal.
Le Digirule 2A comprend :
- un affichage d’une adresse mémoire en binaire sur huit leds
- un affichage de la donnée pointée par cette adresse en binaire via huit leds
- huit boutons pour modifier la donnée affichée
- une série de boutons pour naviguer, lire et écrire dans la mémoire,
- un bouton pour lancer ou arrêter l’exécution du programme

Le format de mon clavier et de mon afficheur est différent :

Exemple d’affichage d’une valeur en décimal.
Les huit boutons du haut du clavier figureront les « Data Buttons » du Digirule. Ceux du bas ont des fonctions analogues aux boutons « Run/Stop », « Goto », etc du Digirule.
L’affichage numérique sera détourné pour figurer des leds.
Le code de Cheap 8
Le code compile sans erreur ni warning, et comprend le fonctionnement en mode programmation et exécution. En mode programmation, l’équivalent des Data Buttons fonctionne correctement, ainsi que les boutons de navigation, de lecture et de modification de la mémoire Cheap 8.
Reste à tester l’exécution correcte des instructions Cheap 8. Un affichage vers le port « série » de l’Arduino permet de suivre l’évolution des registres, de la mémoire, des boutons, et de l’afficheur, mais un vrai moniteur serait préférable.
Une fois le code stabilisé, le tout sera disponible sur Framagit, ce qui m’amène à …
Mon utilisation de Git via Framagit
Git est, entre autres, un gestionnaire de version de code source. J’ai choisi d’utiliser Git en ligne de commande, mais également via Framagit, qui est une interface pour utiliser Git, hébergée par l’association Framasoft.
Pour ce premier cycle, le dépot reste en mode privé. Mon code n’est pas encore très propre. J’ouvrirai l’accès quand je serai satisfait de mon travail.
Mon utilisation de Git, et de FramaGit, n’est pas très orthodoxe, notamment en ce qui concerne la gestion des bugs, ou « issues » en étatsunien, que j’utilise pour le moment comme une todo list.
Pour conclure …
… temporairement, du moins.
Ce projet a repris un élan qui me plaît bien. J’ai peu de temps à y consacrer, et je n’ai pas pu terminer cette première itération avant le début du NaNoWriMo. Je reprendrai ce travail plus tard – cf. cet article – étape par étape, en faisant taire tant bien que mal cette petite voix et son sempiternel « Et si… »