Versione C: registri generici

Nella terza versione della CPU dimostrativa, vengono aggiunti due registri che per il momento non hanno alcuno scopo particolare: A e B. Tali registri sono realizzati nello stesso modo di I, MDR, MAR e IR.

Figura u136.1. Il bus della CPU nella sua terza fase realizzativa.

scpu sub c bus

Nel codice che descrive i campi del bus di controllo, si aggiungono quelli seguenti, i quali servono specificatamente a gestire i registri A e B:

field a_br[17];         // A <-- bus
field a_bw[18];         // A --> bus
field b_br[27];         // B <-- bus
field b_bw[28];         // B --> bus

Nell'elenco dei codici operativi si aggiungono istruzioni nuove e lo stesso poi nella descrizione del microcodice:

op move_mdr_a {
  map move_mdr_a : 5;                   // move MDR to A
  +0[7:0]=5;
  operands op_0;
};
op move_a_mdr {
  map move_a_mdr : 6;                   // move A to MDR
  +0[7:0]=6;
  operands op_0;
};
op move_mdr_b {
  map move_mdr_b : 7;                   // move MDR to B
  +0[7:0]=7;
  operands op_0;
};
op move_b_mdr {
  map move_b_mdr : 8;                   // move B to MDR
  +0[7:0]=8;
  operands op_0;
};
begin microcode @ 0
...
move_mdr_a:
    a_br mdr_bw;                // A <-- MDR
    ctrl_start ctrl_load;       // CNT <-- 0
//
move_a_mdr:
    mdr_br a_bw;                // MDR <-- A
    ctrl_start ctrl_load;       // CNT <-- 0
//
move_mdr_b:
    b_br mdr_bw;                // B <-- MDR
    ctrl_start ctrl_load;       // CNT <-- 0
//
move_b_mdr:
    mdr_br b_bw;                // MDR <-- B
    ctrl_start ctrl_load;       // CNT <-- 0
...
end

Figura u136.5. Corrispondenza con il contenuto della memoria che rappresenta il microcodice (la coppia m1 e m2 dell'unità di controllo).

scpu sub c mc

Tabella u136.6. Elenco delle macroistruzioni aggiunte in questa versione della CPU dimostrativa.

Sintassi Descrizione
move_mdr_a
Copia il contenuto del registro MDR nel registro A.
move_a_mdr
Copia il contenuto del registro A nel registro MDR.
move_mdr_b
Copia il contenuto del registro MDR nel registro B.
move_b_mdr
Copia il contenuto del registro B nel registro MDR.

Come esempio viene proposto il macrocodice seguente:

begin macrocode @ 0
start:
        load_imm #data_1
        move_mdr_a
        load_imm #data_2
        move_mdr_b
stop:
        stop
data_1:
       .byte 17
data_2:
       .byte 11
end

In pratica, viene caricato nel registro MDR il valore corrispondente all'indirizzo in cui si trova l'etichetta data_1: (facendo i conti si tratta dell'indirizzo 7); successivamente, il valore di MDR viene copiato nel registro A; quindi viene caricato nel registro MDR quanto contenuto nell'indirizzo di memoria corrispondente all'etichetta data_2: (indirizzo 8) e poi copiato nel registro B. Il file completo che descrive le memorie per Tkgate dovrebbe essere disponibile all'indirizzo allegati/circuiti-logici/scpu-sub-c.gm

Figura u136.8. Contenuto della memoria RAM. Le celle indicate con «xx» hanno un valore indifferente.

scpu sub c ram

Figura u136.9. Situazione conclusiva del bus dati, dopo l'esecuzione delle istruzioni copia nei registri A e B. Video: ogv http://www.youtube.com/watch?v=9qVsCKmxcdk

tkgate2-scpu-sub-c-move

Dalle istruzioni introdotte in questa versione della CPU dimostrativa, si può intendere che i dati contenuti nei registri possano essere copiati soltanto con la mediazione del registro MDR; pertanto non esiste un'istruzione move_a_b. Questa è una semplificazione per evitare di dover dichiarare tante istruzioni nel macrocodice, ma in condizioni normali, tale scelta non sarebbe utile.

«a2» 2013.11.11 --- Copyright © Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net