vendredi 30 octobre 2026

COSMAC elf+, partie 4

COSMAC ELF+, partie 4

Variation sur un thème

Le programme suivant génère une tonalité dont la fréquence est contrôlée par la valeur des toggles switches.

tone3.asm


                            ; Cette version de TONE lit les toggle switches 
                            ; comme paramètre de délais pour la sous-routine 
                            ; DELAY 
                            ; R0  compteur ordinal routine MAIN 
                            ; R3  compteur ordinal sous-routine DELAY  
                            ; RF  compteur de délais  

INIT:
00  F8 FF       LDI FF      ; initialise R2 comme pointeur de pile
02  A2          PLO R2      ; à la fin de la mémoire RAM
03  B2          PHI R2      ; R2 = $FFFF
04  E2          SEX R2      ; R2 devient le pointeur de pile 
05  F8 00       LDI DELAY.1 ; initialisation de R3 
07  B3          PHI R3      ; à l'adresse de DELAY 
08  F8 13       LDI DELAY.0  
0A  A3          PLO R3      ; R3 <- adresse de DELAY $000D

TONE:                       ; génération d'une tonalité sur Q 
0B  7B 7B       SEQ SEQ     ; Q = 1 
0D  D3          SEP R3      ; appel sous-routine DELAY 
0E  7A          REQ         ; Q = 0 
0F  D3          SEP R3      ; appel sous-routine DELAY
10  30 0B       BR  TONE    ;boucle à TONE 

EXIT:                       ; sortie de la sous-routine 
12  D0          SEP R0      ; retourne au programme MAIN  
DELAY:                      ; entrée sous-routine DELAY 
13  6C          IN  TOGGLES ; initialise le compteur de délais, D=toggles 
14  64          OUT DISPLAY ; par la lectures des toogles switches
15  22          DEC R2      ; R2=R2-1
16  AF          PLO  RF.0   ; RF.0=D
17  F8 00       LDI  0      ; D = 0
19  BF          PHI  RF     ; RF.1 = 0 
LOOP:                       ; décrémente RF tant que RF.1==0 
1A  2F          DEC RF      ; RF = RF-1 
1B  9F          GHI RF      ; D = RF.1 
1C  32 1A       BZ LOOP     ; SI D=0 retourne à LOOP 
1E  30 12       BR EXIT     ; délais terminé
20


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.