logo

Objectif
A première vue
Le schéma
L'alimentation
Le microcontrôleur
Le synthétiseur
Les ROMs
Code et memory map
Cartouche AVR
Cartouche CPLD
Convertir les sons
Créer le ROM
Circuits imprimés
Le microcontrôleur

tms1000Le microcontrôleur utilisé dans la dictée magique est un TMC0270, dérivé du TMS1000, un microcontrôleur 4 bits assez en vogue à l'époque, à en voir tous les appareils qui l'utilisent (notamment dans les calculatrices, l’usage pour lequel il a été conçu). Il possède suffisamment d'entrées pour lire un clavier, et suffisamment de sorties pour piloter des afficheurs à LED ou directement des VFD grâce aux broches "O" supportant la tension négative des segments. Les broches "K" sont les entrées et les broches "R" les sorties logiques.

Son programme est en mask ROM interne, et s'étale sur 2048 mots de 9 bits, repartis en 16 pages de 128 instructions. Chacune de ces instructions prend un mot et 6 cycles pour s'exécuter.
La fréquence nominale à laquelle il fonctionne dans la dictée est 320kHz, bien que ma version est capable de descendre sous 1kHz et de dépasser les 500kHz sans planter.

L'instruction set du TMS1000 (identique) est trouvable ici.

Sa RAM intégrée est formée de 8+1 pages de 16 mots de 4 bits (la page 8 est un peu spéciale, voir plus loin...).

Il possède 3 registres : un registre de travail A sur 4 bits, et 2 registres d'adressage X sur 4 bits également.
Il n'y a pas d'instruction pour fixer la valeur de A ! Pour cela, il faut le mettre à zéro (instruction CLA) puis y ajouter une valeur (instruction ACAAC #).

L'adressage en RAM se fait avec les registres X pour la page (0 à 8), et Y pour l'index dans cette page (0 a 15).
La page 8 de la RAM, aussi appelée DAM (Direct Access Memory, ne me demandez pas pourquoi) est accessible grâce à l'instruction spéciale COMX8 qui permet d'y entrer et d'en sortir en inversant le "4ème bit" du registre X. Il n'y a pas à proprement parler de 4ème bit à X, c'est un flag séparé.

En parlant de flags, il n'y a qu'un seul flag d'état : le status bit. Qui est par défaut à 1 et passe à 0 quand une condition n'est pas validée. Il repasse à 1 automatiquement après une instruction.

Le registre PA (Page Address) contient le numéro de la page de ROM actuelle, sur 4 bits. On ne peut pas y accéder directement.
Le registre PB (Page Buffer) est aussi sur 4 bits et contient le numéro de la page à laquelle il faudra sauter après une instruction CALL ou BRANCH (PA devient PB).
On le charge avec l'instruction LDP.
Le registre PC (Program Counter) est l'adresse dans la page courante sur 7 bits.

Après un reset, PC est fixe à 0 et PA à 15 (première instruction de la dernière page).
PC wrap à 0 sans incrémenter PA (reste sur la même page).

Le stack d'appel n'est pas des plus profonds : on ne dispose que d'un étage constitué de 11 bits (7 de PC et 4 pour la page).
On ne peut donc pas appeler de fonction dans une fonction appelée. Si on fait deux CALLs sans RETURN, le second CALL agit comme un BRANCH (saut).

Un PLA (Programmable Logic Array) permet de pouvoir convertir une valeur numérique en un ensemble d'états sur les sorties "O", ceci permet de faire la conversion en hardware d'une valeur alphanumérique vers celle nécessaire pour allumer les bons segments de l'afficheur. Le TMS1000 avait un PLA 4 bits vers 8 bits car il ne fallait afficher que des chiffres sur un afficheur a 8 segments. Par exemple en mettant la valeur 7 en entrée du PLA, les sorties O correspondant aux segments A, B et C passent à -12V, allumant les bons segments pour afficher un "7".

La modification apportée au TMS1000 consiste principalement en l'augmentation du nombre d'entrées (5 au lieu de 4, pour pouvoir lire 8x5 = 40 touches), et de sorties du PLA qui accepte maintenant 6 bits en entrée et 16 bits en sortie (16 segments du VFD). Afin de pouvoir fixer cette valeur avec des registres 4 bits, un "hack" a été arrangé pour écrire dans le PLA avec toujours une seule instruction ("TDO") : on écrit les 4 LSB avec le status bit à 0, puis les 2 MSB avec le status bit à 1. Sachant que le status bit repasse à 1 automatiquement, il suffit de le forcer à 0 puis de faire deux TDO.

Les codes des caractères pour le PLA sont les suivants :

  -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F
0- A B C D E F G H I J K L M N O P
1- Q R S T U V W X Y Z ' (apo) 0 1 2 3 4
2- 5 6 7 8 9                      
footer
symbol symbol symbol symbol symbol