Versione E: indicatori

Nella quinta versione della CPU dimostrativa, viene aggiunto un registro per annotare lo stato degli indicatori, relativi all'esito di alcune operazioni svolte dalla ALU: riporto, segno, zero e straripamento.

Figura u138.1. Il bus della CPU con l'aggiunta del registro FL per la gestione degli indicatori.

scpu sub e bus

Come si può comprendere dagli ingressi e dalle uscite che possiede, il registro FL può immettere dati nel bus e può essere modificato leggendo dati dal bus; inoltre, può leggere direttamente dalla ALU (ingresso Fi), e per questo esiste un ingresso di abilitazione ulteriore, denominato ar (ALU read), mentre fornisce in ogni istante il proprio valore memorizzato alla ALU stessa (uscita Fo).

Figura u138.2. La struttura interna del registro FL: gli otto moduli che si vedono sono flip-flop D.

scpu sub e fl

Nel codice che descrive i campi del bus di controllo, si aggiungono quelli seguenti (a parte fl_ar già apparso nella sezione precedente), i quali servono specificatamente a gestire il registro FL:

field fl_ar[24];        // FL <-- ALU
field fl_br[25];        // FL <-- bus
field fl_bw[26];        // FL --> bus

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

op move_mdr_fl {
  map move_mdr_fl : 9;          // move MDR to FL
  +0[7:0]=9;
  operands op_0;
};
op move_fl_mdr {
  map move_fl_mdr : 10;         // move FL to MDR
  +0[7:0]=10;
  operands op_0;
};
op rotcl {
  map rotcl : 42;               // A = A rotate carry left
  +0[7:0]=42;
  operands op_0;
};
op rotcr {
  map rotcr : 43;               // A = A rotate carry right
  +0[7:0]=43;
  operands op_0;
};
op add_carry {
  map add_carry : 44;           // A = A + B + carry
  +0[7:0]=44;
  operands op_0;
};
op sub_borrow {
  map sub_borrow : 45;          // A = A - B - borrow
  +0[7:0]=45;
  operands op_0;
};
begin microcode @ 0
...
//
move_mdr_fl:
    fl_br mdr_bw;               // FL <-- MDR
    ctrl_start ctrl_load;       // CNT <-- 0
//
move_fl_mdr:
    mdr_br fl_bw;               // MDR <-- FL
    ctrl_start ctrl_load;       // CNT <-- 0
//
rotcl:
    a_br alu_f=rotate_carry_left alu_bw fl_ar; // A <-- A rot. carry l
    ctrl_start ctrl_load;                      // CNT <-- 0
//
rotcr:
    a_br alu_f=rotate_carry_right alu_bw fl_ar; // A <-- A rot. carry r
    ctrl_start ctrl_load;                       // CNT <-- 0
//
add_carry:
    a_br alu_f=a_plus_b_carry alu_bw fl_ar; // A <-- A + B + carry
    ctrl_start ctrl_load;                   // CNT <-- 0
//
sub_borrow:
    a_br alu_f=a_minus_b_borrow alu_bw fl_ar; // A <-- A - B - borrow
    ctrl_start ctrl_load;                     // CNT <-- 0
...
end

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

scpu sub e mc

Tabella u138.7. Elenco delle macroistruzioni aggiunte in questa versione della CPU dimostrativa.

Sintassi Descrizione
move_mdr_fl
Copia il contenuto del registro MDR nel registro FL.
move_fl_mdr
Copia il contenuto del registro FL nel registro MDR.
rotcl
Esegue la rotazione a sinistra del contenuto del registro A, utilizzando anche l'indicatore di riporto.
rotcr
Esegue la rotazione a destra del contenuto del registro A, utilizzando anche l'indicatore di riporto.
add_carry
Esegue la somma dei registri A e B, tenendo conto del riporto precedente, aggiornando di conseguenza lo stesso registro A.
sub_carry
Esegue la sottrazione A-B, tenendo conto di un'eventuale richiesta di prestito precedente, aggiornando di conseguenza lo stesso registro A.

Nelle sezioni successive, vengono proposti alcuni esempi, nei quali si sperimentano tutte le istruzioni nuove introdotte.

Istruzione «rotcl» e «rotcr»

Listato u138.8. Macrocodice per sperimentare le istruzioni rotcl e rotcr: si carica in memoria il valore da assegnare al registro A, si eseguono cinque scorrimenti a sinistra, con l'uso del riporto e il risultato viene copiato nel registro B; poi, con il valore presente in quel momento nel registro A, si eseguono altri cinque rotazioni a destra, sempre con l'uso del riporto. Il file completo che descrive le memorie per Tkgate dovrebbe essere disponibile presso allegati/circuiti-logici/scpu-sub-d-rotc.gm.

begin macrocode @ 0
start:
        load_imm #data_1
        move_mdr_a
        rotcl
        rotcl
        rotcl
        rotcl
        rotcl
        move_a_mdr
        move_mdr_b
        rotcr
        rotcr
        rotcr
        rotcr
        rotcr
stop:
        stop
data_1:
        .byte 160
end

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

scpu sub e ram rotc

Figura u138.10. Situazione conclusiva del bus dati, dopo l'esecuzione delle istruzioni di rotazione con riporto. Video: ogv http://www.youtube.com/watch?v=Zl3d-Tg5C1Q

tkgate2-scpu-sub-e-rotc

Istruzione «add_carry»

Listato u138.11. Macrocodice per sperimentare l'istruzione add_carry: si vogliono sommare due numeri 12FF16 e 11EE16, necessariamente in due passaggi. Prima viene sommata la coppia FF16 e EE16, con l'istruzione add, la quale produce il risultato ED16 con riporto, quindi viene sommata la coppia 1216 e 1116, assieme al riporto precedente, ottenendo 2416. In pratica, il risultato completo sarebbe 24ED16 che viene collocato in memoria dividendolo in due byte distinti. Il file completo che descrive le memorie per Tkgate dovrebbe essere disponibile presso allegati/circuiti-logici/scpu-sub-d-add_carry.gm.

begin macrocode @ 0
start:
        load_imm #data_0
        move_mdr_a
        load_imm #data_2
        move_mdr_b
        add
        move_a_mdr
        store_imm #data_4
        load_imm #data_1
        move_mdr_a
        load_imm #data_3
        move_mdr_b
        add_carry
        move_a_mdr
        store_imm #data_5
stop:
        stop
// 0x12FF = 4863
data_0:
        .byte 0xFF
data_1:
        .byte 0x12
// 0x11EE = 4590
data_2:
        .byte 0xEE
data_3:
        .byte 0x11
data_4:
        .byte 0
data_5:
        .byte 0
end

Figura u138.12. Contenuto della memoria RAM prima dell'esecuzione. Le celle indicate con «xx» hanno un valore indifferente.

scpu sub e ram add_carry

Figura u138.13. Al termine dell'esecuzione, le celle di memoria che devono contenere il risultato riportano il contenuto che si può vedere evidenziato qui.

scpu sub e ram add_carry

Figura u138.14. Situazione conclusiva del bus dati. Video: ogv http://www.youtube.com/watch?v=1Xu4MxWBwW4

tkgate2-scpu-sub-e-add_carry

Istruzione «sub_borrow»

Listato u138.15. Macrocodice per sperimentare l'istruzione sub_borrow: si vuole eseguire la sottrazione 12EE16-11FF16 e la si deve svolgere necessariamente in due passaggi. Prima viene sottratta la coppia EE16 e FF16, con l'istruzione sub, la quale produce il risultato EF16 con richiesta di un prestito, quindi viene sottratta la coppia 1216 e 1116, tenendo conto della richiesta del prestito dalle cifre precedenti, ottenendo 0016. In pratica, il risultato completo sarebbe 00EF16 che viene collocato in memoria dividendolo in due byte distinti. Il file completo che descrive le memorie per Tkgate dovrebbe essere disponibile presso allegati/circuiti-logici/scpu-sub-d-sub_borrow.gm.

begin macrocode @ 0
start:
        load_imm #data_0
        move_mdr_a
        load_imm #data_2
        move_mdr_b
        sub
        move_a_mdr
        store_imm #data_4
        load_imm #data_1
        move_mdr_a
        load_imm #data_3
        move_mdr_b
        sub_borrow
        move_a_mdr
        store_imm #data_5
stop:
        stop
// 0x12EE = 4846
data_0:
        .byte 0xEE
data_1:
        .byte 0x12
// 0x11FF = 4607
data_2:
        .byte 0xFF
data_3:
        .byte 0x11
data_4:
        .byte 0
data_5:
        .byte 0
end

Figura u138.16. Contenuto della memoria RAM prima dell'esecuzione. Le celle indicate con «xx» hanno un valore indifferente.

scpu sub e ram sub_borrow

Figura u138.17. Al termine dell'esecuzione, le celle di memoria che devono contenere il risultato riportano il contenuto che si può vedere evidenziato qui.

scpu sub e ram sub_borrow

Figura u138.18. Situazione conclusiva del bus dati. Video: ogv http://www.youtube.com/watch?v=ofPUzdIids8

tkgate2-scpu-sub-e-sub_borrow

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