Domanda:
Come produrre un Do centrale su Intel 8080?
Ayatana
2018-10-22 08:28:14 UTC
view on stackexchange narkive permalink

Questo è un problema di esempio nel mio libro. Supponendo che il pin 5 della porta 4 sia collegato a un amplificatore che pilota un altoparlante, la soluzione è data come,

La frequenza del Do centrale è $$ f = 261.63 \ \ text {Hz} $$ Quindi, il periodo di tempo è, $$ T = \ frac1 {f} = 3822 \ \ mu s $$

Il programma per produrre un'onda quadra con quel periodo è,

  LOOP1: OUT 4H; Invia bit all'altoparlante
          MVI C, 86H; Imposta il conteggio su 134
LOOP2: DCR C; Conto alla rovescia
          JNZ LOOP2; Conteggio test
          CMA; Resetta bit 5
          NOP; Sintonia fine
          NOP; Sintonia fine
          JMP LOOP1; Vai al prossimo mezzo ciclo
 

Il numero di stati T è dato come, OUT (10), MVI (7), DCR (4), JNZ (10 se vero, altrimenti 7), CMA (4), NOP (4), JMP (10 ).

Con una frequenza di clock di 1 MHz, LOOP2 (per mezzi cicli) funziona per 1912 microsecondi, che è abbastanza vicino. LOOP1 dovrebbe essere eseguito di nuovo inviando il complemento di ciò che era precedentemente nel bit 5 della porta 4. Ma penso che non sia così.

Quando LOOP2 termina, l'accumulatore ha 00H rimasto dal registro C. CMA cambia l'accumulatore in FFH. NOP e JMP non cambiano l'accumulatore. Quindi il LOOP1 itera per il semiciclo successivo, OUT invia il contenuto dell'accumulatore alla porta 4, cioè FFH il cui bit 5 è 1, ogni volta. Quindi non c'è un'onda quadra, è solo un segnale alto. Allora come produce un Do centrale?

Nessuno qui usa più l'8080, quindi potresti avere più fortuna se la tua domanda migrasse al retrocomputing
Il codice è corretto e produrrà il risultato desiderato su qualsiasi cavo collegato alle linee dati a 8 bit della porta 4. Anche se non si cura del valore iniziale di A. Che cos'è "Con una frequenza di clock di 1 Hz" - fai il clock 8080con orologio da 1 Hz?E quale problema hai esattamente?Puoi leggere la scheda tecnica 8080, in particolare la descrizione e il funzionamento dei suoi comandi?
Non capisco perché pensi che l'accumulatore contenga 0 al termine del ciclo di temporizzazione;C è usato come contatore, non come accumulatore.
"Con una frequenza di clock di 1 Hz" - sembra piuttosto lento.Volevi dire "1 MHz"?
Spiacenti, doveva essere 1 MHz.@Jules Penso che contenga zero al termine del tempo "LOOP2" perché "DCR C" copia il contenuto da C all'accumulatore, lo decrementa e quindi memorizza i dati da ALU a C. Quindi l'accumulatore ha il valore residuo da "DCR C"istruzione.
@Ayatana, semplicemente non è il caso.Leggi http://www.righto.com/2013/07/reverse-engineering-8085s-alu-and-its.html?m=1
Una risposta:
Russell Borogove
2018-10-22 08:45:14 UTC
view on stackexchange narkive permalink

DCR C decrementa il registro C e imposta i flag; non influisce sull'accumulatore (noto anche come registro A). L'unica istruzione in questa sequenza che influenza l'accumulatore è il CMA . Pertanto, ad ogni passaggio attraverso LOOP1 , l'accumulatore verrà completato: bit 5 alto in un ciclo e basso nel successivo.

Molte fonti inclusa la scheda tecnica 8085 descrivono l'8080/8085 ALU come operante direttamente sull'accumulatore, ma questa è una semplificazione eccessiva. Come descritto in questo articolo di Ken Shirriff, l'ALU ha due registri temporanei:

L'ALU utilizza due registri temporanei che non sono direttamente visibili al programmatore. Il registro temporaneo dell'accumulatore (ACT) conserva il valore dell'accumulatore mentre viene eseguita un'operazione ALU. Ciò consente all'accumulatore di essere aggiornato con il nuovo valore senza causare una condizione di competizione. Il secondo registro temporaneo (TMP) contiene l'altro argomento per l'operazione ALU. Il registro TMP in genere contiene un valore dalla memoria o da un altro registro.

...

Il registro ACT ha diverse funzioni importanti. Innanzitutto, contiene l'input per l'ALU. Ciò consente di riscrivere i risultati dell'ALU nell'accumulatore senza disturbare l'ingresso, il che provocherebbe instabilità. In secondo luogo, l'ACT può mantenere valori costanti (ad esempio per l'incremento o il decremento o la regolazione decimale) senza influenzare l'accumulatore. Infine, the ACT consente operazioni ALU che non utilizzano l'accumulatore.

Per le istruzioni DCR , ACT contiene una costante, il TMP riceve il contenuto corrente del registro degli operandi e viene eseguita un'operazione ADD ; per DCR C , l'accumulatore rimane inalterato:

Le linee di controllo consentono di caricare il registro ACT con una varietà di costanti. La linea di controllo 0 / fe_to_act carica 0 o 0xfe nell'ACT; il valore è selezionato dalla linea di controllo sel_0_fe. Il valore 0 ha una varietà di usi. ORing un valore con 0 consente al valore di passare attraverso l'ALU invariato. Se il riporto è impostato, AGGIUNGENDO a 0 esegue un incremento. Il valore 0xfe (con segno -2) viene utilizzato solo per l'istruzione DCR (decremento di 1). Potresti pensare che il valore 0xff (con segno -1) sarebbe più appropriato, ma se il riporto è impostato, AGGIUNGENDO 0xfe diminuisce di 1. Penso che la motivazione sia quindi sia gli incrementi che i decrementi hanno il riporto impostato, e quindi puoi usare lo stesso logica per controllare il trasporto.

Dato che l'8085 ha un circuito di incremento / decremento a 16 bit, ci si potrebbe chiedere perché l'ALU viene utilizzato anche per l'incremento / decremento. Il motivo principale è che l'uso dell'ALU consente di impostare i flag di condizione da INR e DCR. Al contrario, le istruzioni di incremento e decremento a 16 bit (INX e DCX) utilizzano l'incrementatore / decrementatore e di conseguenza i flag non vengono aggiornati.

C'è solo un singolo insieme di flag nell'8080; DCR influenza i flag Zero, Sign, Parity e Aux-carry.

Il `DCR C` prima copia il contenuto del registro C nell'accumulatore, lo decrementa e quindi memorizza i dati nel registro C.Perché l'ALU può funzionare solo su accumulatore.Inoltre, "JNZ" è un flag ALU che controlla solo l'accumulatore.Se "DCR C" non ha influenzato l'accumulatore, l'istruzione "JNZ LOOP2" verrà eseguita per sempre.
Non credo che sia vero - non sono un esperto 8080 in alcun modo, ma le fonti che ho esaminato non indicano che l'accumulatore sia influenzato dal DCR (tranne DCR A, ovviamente).Tuttavia, le bandiere sono interessate.Un registro interno nell'ALU viene modificato ma riscritto in C, non in A.
Ma l'istruzione è "JNZ", non "JNZ C".Se i flag sono interessati, a seconda di quale registro?È l'accumulatore, giusto?I registri interni dell'ALU sono l'accumulatore e il TMP.
C'è solo un set di flag.Credo che l'ALU abbia registri interni separati dall'accumulatore A. Non vedo alcun suggerimento in diversi riferimenti di istruzioni 8080 online diversi che DCR C influenzi il contenuto del registro A.
Prova l'emulatore 8085 online qui: https://www.sim8085.com
Questo articolo descrive in dettaglio l'ALU 8080/8085, mostrando due provvisori oltre al registro A.http://www.righto.com/2013/07/reverse-engineering-8085s-alu-and-its.html?m=1 - “Il registro ACT ha diverse funzioni importanti.Innanzitutto, contiene l'input per l'ALU.Ciò consente di riscrivere i risultati dell'ALU nell'accumulatore senza disturbare l'ingresso ... In secondo luogo, l'ACT può mantenere valori costanti (ad esempio per l'incremento o il decremento o la regolazione decimale) senza influire sull'accumulatore.** Infine, l'ACT consente operazioni ALU che non utilizzano l'accumulatore. ** "
La domanda è: hai o puoi creare un orologio in tempo reale con risoluzione 1us?Qual è il tempo più breve che puoi utilizzare da un ciclo di istruzione a quello successivo?
@Ayatana * I * flag di stato nella CPU memorizzano i risultati dell'ultima * istruzione aritmetica eseguita *;possono essere valutati (ma non modificati) tramite ad es.salti condizionali.Quindi, "JNZ" significa: "salta se l'ultima istruzione aritmetica eseguita non ha dato 0".Nel tuo caso, l'ultima istruzione aritmetica era quindi "DCR C", quindi i flag vengono impostati in base al risultato di tale istruzione.Quando si testano i flag, * nessun * altro registro oltre al registro di stato è coinvolto.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...