lundi 26 octobre 2026

COSMAC elf+, partie 3

COSMAC ELF+, partie 3

Ajout de petite carte avec un haut-parleur pour produire des tonalités en commutant la sortie Q du MCU.

Comme on le voie sur le schéma du côté droit, j'ai ajouté un haut-parleur contrôlé par un transistor MOSFET 2N7000, lui-même étant contrôlé par la sortie Q du MCU. Comme il n'y avait pas d'espace sur la carte du elf+ j'ai fait le montage sur une petite carte qui se branche sur la carte mère du elf+.

démonstration

code du programme


                        ; R0  compteur ordinal routine MAIN 
                        ; R3  compteur ordinal sous-routine DELAY  
                        ; RF  compteur de délais  
MAIN:
0   F8 00   LDI DELAY.1 ; initialisation de R3 
2   B3      PHI R3      ; à l'adresse de DELAY 
3   F8 0D   LDI DELAY.0  
5   A3      PLO R3      ; R3 <- adresse de DELAY $000D

TONE:                   ; génération d'une tonalité sur Q 
6   7B      SEQ         ; Q <- 1 
7   D3      SEP 3       ; appel sous-routine DELAY 
8   7A      REQ         ; Q <- 0 
9   D3      SEP 3       ; appel sous-routine DELAY
A   30 06   BR  06      ;boucle à TONE 

EXIT:                   ; sortie de la sous-routine 
C   D0      SEP 0       ; retourne au programme MAIN  
DELAY:                  ; entrée sous-routine DELAY 
D   F8 4F   LDI  4F     ; initialise le compteur de délais 
F   AF      PLO  RF.0   ; RF.0 <- 4F
10  F8 00   LDI  0      ; D <- 0
12  BF      PHI  RF     ; RF.1 <- 0 
LOOP:                   ; décrémente RF tant que RF.1==0 
13  2F      DEC RF      ; RF <- RF-1 
14  9F      GHI RF      ; D <- RF.1 
15  32 13   BZ LOOP     ; SI D=0 retourne à LOOP 
17  30 0C   BR EXIT     ; délais terminé


Calcul du compteur de DELAY

Pour calculer le délais à mettre dans le registre RF
compte=Freq_osc/(Freq_audio*8*6*2) -1 -16/6

  • compte est la valeur d'initialisation du registre RF
  • Freq_audio est la fréquence audio à générer
  • Freq_osc est la fréquence du cristal utilisé pour le CDP1802
  • 8 parce qu'un cycle machine est 8 périodes de Freq_osc
  • 6 parce que la boucle LOOP s'exécute en 6 cycles machines
  • 2 parce que la sous-routine DELAY est appellée 2 fois par cycle audio.
  • -1 parce que la boucle de délais s'exécute 1 fois même si compte=0
  • -16/6 parce qu'il y a 16 cycles machines qui s'exécutent en dehors de la boucle LOOP par demi-cycle audio et qu'on doit soustraire ces cycles du nombre de répétions de LOOP
Donc pour générer une fréquence audio de 500 hertz avec un cristal de 4Mhz
compte=4e6/(500*8*6*2) -1 -16/6 = 79.6666, tronqué à 79, ce qui correspond à 4F en hexadécimal. La fréquence réelle mesurée à l'oscilloscope est de 502.9 hertz.

vidéo

dimanche 25 octobre 2026

COSMAC ELF+, partie 2

COSMAC ELF+, partie 2

Entrées et sorties

Mine de rien ce petit ordinateur simple a 2 périphériques d'entré et 2 de sortie. Examinons le schéma.

L'affichage hexadécimal ne sert pas seulement lors de la programmation il peut aussi servir à l'intérieur d'un programme pour afficher une donnée. Sur le schéma en haut à gauche se trouve l'affichage hexadécimal constitué de 2 digits IC1 et IC4. Le bus de donnée D7-D0 est connecté à l'affichage via des CD4050 qui servent de tampons. Le signal STROBE sert à lire la donnée de bus dans l'affichage. En regardant la 2ième partie du schéma on voie que le signal STROBE provient de la porte NAND à droite dont une entrée est étiquettée N2/LOAD. La commande OUT place la valeur pointée par le registre R2 sur le bus de donné donc c'est cette valeur qui est affichée. Pour afficher l'état des commutateurs D7-D0 le programme doit exécuter la commande IN 4 activant les transmission gates CD4016 qui a pour effet de connecter les commutateurs au bus de données. Cette valeur est enregistrée dans la mémoire RAM à l'adresse pointée par R2, M(R2) <- bus . Donc il suffit de faire IN 4 suivit de OUT 4 pour afficher l'état des commutateurs en hexadécimal. C'est ce que fait le petit programme suivant:

0   F8 7F           LDI 7F   ; D <- 7F
2   B2              PHI R2.1 ; R2.1 <- D
3   F8 FF           LDI FF   ; D <- FF
5   A2              PLO R2   ; R2.0 <- D   R2 pointeur vers $7FFF
6   E2              SEX R2   ; R2 est le pointeur de données 
LOOP:
7   6C              IN  4    ; D <- DATA, M(RX) <- DATA , lecture des switch data  
8   64              OUT 4    ; DISPLAY <- M(RX) , affichage de la valeur
9   22              DEC R2   ; R2 <- R2-1 , OUT incrémente R2 donc on 
                             ; le décrémente pour qu'il pointe vers $7FFF
A   30 07           BR  LOOP ; saut vers boucle

Les commutateurs ne servent pas seulement lors de la programmation ils peuvent aussi être lu par un programme.

L'état du bouton IN peut aussi être lu par un programme par l'instruction IN 4 et la sortie Q du micropresseur est une sortie 1 bit qui peut-être contrôllée par un programme avec les instructions SEQ et RESQ.

vidéo de démonstration

Dans le vidéo suivant la valeur binaire des commutateurs est lue par le programme et affichée en hexadécimal.

samedi 24 octobre 2026

COSMAC ELF+, partie 1

COSMAC ELF+, partie 1

image générée par Nano Banana

En 1976 RCA en mis en marché le premier microprocesseur en technologie CMOS. À cette époque les micropresseurs étaient en technologie NMOS. Mais maintenant c'est la technologie CMOS qui est utilisée pour les circuits intégrés logiques. L'avantage de cette technologie est la réduction de consommation électrique et une meilleure immunité aux interférences (noise margin). Ce microprocesseur de RCA s'appellait CDP1802. Il ne s'agissait pas seulement d'un microprocesseur mais d'une famille de composants appellée COSMAC (Complementary Symmetry Monolithic Array Computer). À cause de sa faible consommation électrique et sa meilleure immunité aux interférences la NASA l'a utilisé dans plusieurs sondes spatiales dont la sonde Galileo lancée en 1989 vers Jupiter.

architecture

Il n'y a pas que la technologie utilisée qui était différence des autres microproceseurs des années 197x. Sont architecture interne aussi. Il possédait 16 registres interne de 16 bits. Il n'y avait pas de compteur ordinal, ni de pointeur de pile dédiés. N'importe quel des 16 registres pouvait être désigné comme compteur ordinal. Au lieu d'un pointeur de pile il y avait un registre appelé data pointer qui pouvait-être utilisé à cet effet. Comme pour le compteur ordinal, le pointeur de donnée pouvait-être n'importe quel des 16 registres. Deux registres de 4 bits chacun permettaient de choisir lequel des 16 registres était utilisé. Le registre P sélectionnait le compteur ordinal et le registre X sélectionnait le pointeur de donnée.

Autre particularité du CDP1802 est qu'il y avait un mécanisme DMA (Direct Memory Access) intégré au MCU, deux broches sur le boitier du MCU DMA IN et DMA OUT permettaient un accès direct à la mémoire en interrompant l'exécution du programme. Le registre R0 était utilisé comme pointeur pour ces opérations. L'implication de cette fonctionalité est qu'il n'est pas nécessaire d'avoir un chargeur de programme en ROM. Lorsque les lignes CLEAR et WAIT sont à zéro le MCU se met en pause pour attendre une opération de DMA IN.

COSMAC ELF

En 1976 Popular electronics publiait dans son édition du mois d'août un projet de fabrication d'un petit ordinateur utilisant le CDP1802, bâptisé COSMAC ELF.

Ce petit ordinateur n'avait pas de mémoire ROM contenant un chargeur ou moniteur. Il ne possédait que 256 octets de mémoire RAM. L'utilisateur devait entrer son programme avec 8 switches de data en bas. Puisqu'il n'y avait pas de mémoire persistante le programme était perdu lorsque l'ordinateur était éteint et devait être rechargé à la main à chaque fois. Plutôt malcomode mais il s'agissait simplement d'un projet peu couteux permettant de se familiariser avec cette nouvelle techonologie des microprocesseurs.

COSMAC ELF+

À partir de l'article de Popular electronics j'ai fabriqué ma propre version du COSMAC ELF avec quelques modifications. Mon COSMAC ELF+ possède une mémoire EEPROM AT28C64B de 8 KO ainsi qu'une mémoire RAM AS6C62256 de 32 KO. J'ai choisi cette mémoire EEPROM parce qu'elle peut-être programmée octet par octet en circuit et ainsi mon programme n'est pas perdu lorsque je ferme le COSMAC ELF+

schématique du COSMAC ELF+

photo du COSMAC ELF+

vidéos

Je créé une liste de lecture sur Youtube pour ce projet.