0x0fff
, c'est-à-dire 0fff en hexadécimal,
tandis que le registre PMASQ est un masque de pile, qui
contient la constante 0x00ff
23.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
CO | AC | PP | RI | RIT | 0 | +1 | -1 | AMASQ | PMASQ | A | B | C | D | E | F |
|
0 | pas de décalage |
1 | décalage à droite |
2 | décalage à gauche |
3 | inutilisé |
0 | tampon A |
1 | RDO |
0 | pas de saut |
1 | saut si N=1 |
2 | saut si Z=1 |
3 | saut sans condition |
Dans la dernière ligne du tableau, par exemple, les opérations sont
C B A ADDR rad:=co; rd;
0 0 2 0 0 1 1 0 0 0 0 0 00 rd;
0 0 2 0 0 0 1 0 0 0 0 0 00 ri:=rdo;
1 0 2 0 0 0 0 0 1 3 0 0 00 co:=co+1;
0 0 0 0 0 0 0 0 1 0 6 0 00 rad:=ri; rdo:=ac; wr;
0 0 2 0 1 1 0 1 0 0 3 1 00 ual:=rit; if n goto 15;
0 1 2 0 0 0 0 0 0 0 0 4 15 ac:=inv(rdo);
1 0 3 0 0 0 0 0 1 1 0 0 00 rit:=decalg(rit); if n goto 25;
0 1 2 2 0 0 0 0 1 4 0 4 25 ual:=ac; if z goto 25;
0 2 2 0 0 0 0 0 0 0 0 1 22 ac:=bet(ri,amasq); goto 0;
0 3 1 0 0 0 0 0 1 1 8 3 00 pp:=pp-1; rd;
0 0 0 0 0 0 1 0 1 2 2 7 00 rit:=decalg(ri+ri); if n goto 69;
0 1 0 2 0 0 0 0 1 4 3 3 69
Figure 2: Quelques exemples de micro-instructions
rit:=decalg(ri+ri); if n goto 69;La micro-instruction associée comporte donc:
ri+ri
: les valeurs 3 dans les champs A et B commandent
le transfert du contenu du registre RI (de numéro 3) sur
les bus A et B, de façon à positionner ces valeurs en entrée de
l'UAL.
decalg
: la valeur 2 dans le champ DCAL permet d'obtenir
le décalage à gauche.
rit:=
: le bit 1 dans le champ VALC valide le
déchargement du résultat (en sortie du décaleur) situé sur le bus
C dans un des registres généraux (ici RIT.
if n
:la valeur 1 dans le champ COND commande un saut
lorsque N est égal à 1. Si les bits sont numérotés de 0 à 15,
le bit 15 étant celui de poids le plus fort, ceci se produit
lorsque le bit numéro 14, qui est le bit de poids fort du résultat
de l'addition ri+ri
, vaut 1.
goto 69
: la valeur 69 dans le champ ADDR contient
l'adresse du saut (rappelons qu'il s'agit d'une adresse du
micro-programme, donc de la mémoire de commande).
La première colonne de ce tableau contient le code binaire de l'instruction. Remarquons que les instructions sont rangées par ordre croissant suivant leur code. Ce code est en général divisé en deux parties, la première représentant l'opération proprement dite et la seconde une adresse de la mémoire centrale ou une constante. Dans la deuxième colonne figure le symbole correspondant, tandis que la troisième colonne contient le nom de l'instruction et la quatrième une description fonctionnelle de cette instruction dans un langage du type Pascal. Dans cette colonne, le mot de la mémoire centrale d'adresse x est noté m[x].
Binaire Symbole Instruction Opération 0000 xxxx xxxx xxxx LODD Chargement ac:=m[x] mode direct 0001 xxxx xxxx xxxx STOD Rangement m[x]:=ac mode direct 0010 xxxx xxxx xxxx ADDD Addition ac:=ac+m[x] mode direct 0011 xxxx xxxx xxxx SUBD Soustraction ac:=ac−m[x] mode direct 0100 xxxx xxxx xxxx JPOS Saut si >0 if (ac>0) co:=x 0101 xxxx xxxx xxxx JZER Saut si =0 if (ac=0) co:=x 0110 xxxx xxxx xxxx JUMP Saut co:=x 0111 xxxx xxxx xxxx LOCO Chargement ac:=x (0≤ x≤ 4 095) constante 1000 xxxx xxxx xxxx LODL Chargement ac:=m[pp+x] mode local 1001 xxxx xxxx xxxx STOL Rangement m[pp+x]:=ac mode local 1010 xxxx xxxx xxxx ADDL Addition ac:=ac+m[pp+x] mode local 1011 xxxx xxxx xxxx SUBL Addition ac:=ac−m[pp+x] mode local 1100 xxxx xxxx xxxx JNEG Saut si <0 if (ac<0) co:=x 1101 xxxx xxxx xxxx JNZE Saut si ≠ 0 if (ac≠ 0) co:=x 1110 xxxx xxxx xxxx CALL Appel procédure pp:=pp−1; m[pp]:=co; co:=x 1111 0000 0000 0000 PSHI Empilement pp:=pp−1; m[pp]:=m[ac] indirect 1111 0010 0000 0000 POPI Dépilement m[ac]:=m[pp]; pp:=pp+1 indirect 1111 0100 0000 0000 PUSH Empilement pp:=pp−1; m[pp]:=ac 1111 0110 0000 0000 POP Dépilement ac:=m[pp]; pp:=pp+1 indirect 1111 1000 0000 0000 RETN Retour co:=m[pp]; pp:=pp+1 1111 1010 0000 0000 SWAP Échange tmp:=ac; ac:=pp; pp:=tmp AC et pile 1111 1100 yyyy yyyy INSP Incrémentation pp:=pp+y (0≤ y≤ 255) de PP 1111 1110 yyyy yyyy DESP Décrémentation pp:=pp−y (0≤ y≤ 255) de PP
Figure 3: Instructions du langage machine
goto 0;
.ual
est utilisée pour indiquer que la
donnée contenue dans RIT ne fait que transiter par l'UAL sans
être modifiée, pour qu'il soit possible de tester le bit numéro
12. Si ce bit vaut 0, l'instruction en langage machine commence
par 0000, c'est donc un LODD, traité par les micro-instructions
6, 7, et 8. Si au contraire ce bit vaut 1, il s'agit d'un
STOD, traité par les instructions 9 et 10.
rad:=ri;
. On peut supposer que, puisque ce
registre comporte 12 bits, ce sont les bits de poids faible qui y
sont placés. De plus, le contenu de AC est copié dans le
registre de données RDO et le signal wr;
est diffusé,
pour signaler une écriture dans la mémoire centrale.
wr;
continue à être diffusé car
l'écriture n'est pas instantanée et le retour en début de boucle est
exécuté.
0: rad:=co; rd;
programme principal 1: co:=co+1; rd;
incrémentation de CO 2: ri:=rdo; if n goto 28;
analyse et sauvegarde de RDO 3: rit:=decalg(ri+ri); if n goto 19;
00xx ou 01xx? 4: rit:=decalg(rit); if n goto 11;
000x ou 001x? 5: ual:=rit; if n goto 9;
0000 ou 0001? 6: rad:=ri; rd;
0000=LODD 7: rd;
8: ac:=rdo; goto 0;
9: rad:=ri; rdo:=ac; wr;
0001=STOD 10: wr; goto 0;
11: ual:=rit; if n goto 15;
0010 ou 0011? 12: rad:=ri; rd;
0010=ADDD 13: rd;
14: ac:=rdo+ac; goto 0;
15: rad:=ri; rd;
0011=SUBD 16: ac:=ac+1; rd;
17: a:=inv(rdo);
18: ac:=ac+a; goto 0;
19: rit:=decalg(rit); if n goto 25;
010x ou 011x? 20: ual:=rit; if n goto 23;
0100 ou 0101? 21: ual:=ac; if n goto 0;
0100=JPOS 22: co:=bet(ri,amasq); goto 0;
23: ual:=ac; if z goto 0;
0101=JZER 24: goto 0;
25: ual:=rit; if n goto 27;
0110 ou 0111? 26: co:=bet(ri,amasq); goto 0;
0110=JUMP 27: ac:=bet(ri,amasq); goto 0;
0111=LOCO 28: rit:=decalg(ri+ri); if n goto 40;
10xx ou 11xx? 29: rit:=decalg(ri); if n goto 35;
100x ou 101x? 30: ual:=rit; if n goto 33;
1000 ou 1001? 31: a:=ri+pp;
1000=LODL 32: rad:=a; rd; goto 7;
33: a:=ri+pp;
1001=STOL 34: rad:=a; rdo:=ac; wr; goto 10;
Figure 4: Un exemple de micro-programme
35: ual:=rit; if n goto 38;
1010 ou 1011? 36: a:=ri+pp;
1010=ADDL 37: rad:=a; rd; goto 13;
38: a:=ri+pp;
1011=SUBL 39: rad:=a; rd; goto 16;
40: rit:=decalg(rit); if n goto 46;
110x ou 111x? 41: ual:=rit; if n goto 44;
1100 ou 1101? 42: ual:=ac; if n goto 22;
1100=JNEG 43: goto 0;
44: ual:=ac; if z goto 0;
1101=JNZE 45: co:=bet(ri,amasq); goto 0;
46: rit:=decalg(rit); if n goto 50;
47: pp:=pp-1;
1110=CALL 48: rad:=pp; rdo:=co; wr;
49: co:=bet(ri,amasq); wr; goto 0;
50: rit:=decalg(rit); if n goto 65;
1111, adresse? 51: rit:=decalg(rit); if n goto 59;
52: ual:=rit; if n goto 56;
53: rad:=ac; rd;
1111 000=PSHI 54: pp:=pp-1; rd;
55: rad:=pp; wr; goto 10;
56: rad:=pp; pp:=pp+1; rd;
1111 001=POPI 57: rd;
58: rad:=ac: wr: goto 10;
59: ual:=rit; if n goto 62;
60: pp:=pp-1;
1111 010=PUSH 61: rad:=pp; rdo:=ac; wr; goto 10;
62: rad:=pp; pp:=pp+1; rd;
1111 011=POP 63: rd;
64: ac:=rdo; goto 0;
65: rit:=decalg(rit); if n goto 73;
66: ual:=rit; if n goto 70;
67: rad:=pp; pp:=pp+1; rd;
1111 100=RETN 68: rd;
69: co:=rdo; goto 0;
Figure 5: Un exemple de micro-programme (suite)