Domanda

Come si interrompe il lavoro sul processore Intel 8080?Ho cercato su Google e Intel documentazione ufficiale (197X), e ho trovato solo un po ' di descrizione di questo.Ho bisogno di una spiegazione dettagliata su di esso, per emulare la CPU.

È stato utile?

Soluzione 4

ho finalmente trovarlo!

I creare una variabile chiamata autobus dove l'interruzione codice operativo va. Poi, ho chiamato una funzione per gestire l'interruzione:

void i8080::interruption()
{
    // only for RST
    cycles -= cycles_table[bus];
    instruction[bus]();
    INT = false;
}

INT è vero quando ha bisogno di un'interruzione. istruzioni EI e DI gestire INTE.

Quando INT e INTE è vero viene eseguito interruzione.

Altri suggerimenti

La 8080 è una linea di Interrupt (pin 14).Tutte le periferiche sono collegate a questo pin, di solito in un "filo" O di configurazione (nel senso di richiesta di interrupt uscite open-collector e il pin di interrupt viene tirato in alto con una resistenza).Internamente, il processore ha un Interrupt Enable bit.Due istruzioni, EI e DI azzerare questo bit.L'intero sistema di interruzione è così acceso o spento, singole interruzioni non possono essere mascherati sul "nudo" la 8080.Quando un dispositivo che genera un interrupt, il processore risponde con un "Interrupt Acknowledge" (~INTA) del segnale.Questo segnale è la stessa tempistica, in quanto la "Lettura della Memoria" (~MEMR) segnale ed è destinato ad innescare il dispositivo periferico al posto di un "Riavvio" istruzione sul bus dati.Il segnale di Interrupt Acknowledge è fondamentalmente un'istruzione fetch ciclo, si verifica solo in risposta ad un interrupt.

Ci sono otto Riavviare istruzioni, PRIMO 0 - PRIMI 7.PRIMI 7 è opcode "0xFF".Il Riavvio istruzioni causare il processore a spingere il contatore di programma sullo stack e iniziare l'esecuzione di un riavvio del vettore posizione.PRIMO 0 vettori a 0x0000, PRIMA 1 vettori per 0x0008, PRIMA 2 vettori a 0x0010 e così via.Riavviare 7 vettori di 0x0038.Questi vettoriale indirizzi sono destinate a contenere codice eseguibile, generalmente una istruzione di salto ad una routine di servizio di interrupt.La Routine di Servizio di Interrupt sarà stack tutti i registri utilizzati, eseguire le necessarie funzioni di I/O, unstack tutti i registri e tornare al programma principale, tramite la stessa istruzione return che termina sottoprogrammi (RET, opcode 0xC9).

Riavviare istruzioni sono dei veri e propri codici operativi, nel senso che farà la stessa cosa se questi vengono recuperati dalla memoria durante l'esecuzione del programma.Era comodo per utilizzare Riavviare 7 come "warm restart" per una tastiera monitor / debugger perché i primi Eprom generalmente contenuta 0xFF in ogni posizione in bianco.Se siete stati in esecuzione EPROM vuota, il che significava che qualcosa era andato storto, e probabilmente voleva tornare al monitor comunque.

Nota che il PRIMO 0 vettori per la stessa posizione di memoria RESET, sia per l'avvio dell'esecuzione a 0x0000.Ma il PRIMO 0 lascia un indirizzo di ritorno sullo stack.In un certo senso, RESET può essere pensato come l'unico non-maskable interrupt la 8080 avuto.

Un segnale di interrupt cancella anche l'Interrupt po ' così in una Routine di Servizio di Interrupt sarà necessario eseguire un EI istruzione, generalmente immediatamente prima della RET.In caso contrario, il sistema risponderà a un solo evento di interrupt.

CP/M riservati i primi 256 byte di memoria per l'uso del sistema e che il vettore di interrupt mappa i primi 64 byte (8 byte per Riavviare l'istruzione).CP/M sistemi di RAM iniziato a 0x0000 e qualsiasi ROM vissuto alla fine della memoria.Questi sistemi una qualche forma di intelligente banca di commutazione per passare in una EPROM o qualcosa di immediatamente dopo un RESET per fornire un'istruzione di SALTO per la ROM di sistema, così potrebbe iniziare la sequenza di avvio.I sistemi di ROM alla fine bassa della mappa di memoria programmato istruzioni di SALTO di vettori trova nella RAM nei primi 64 byte.Questi sistemi hanno dovuto inizializzare quelle RAM vettori all'avvio.

Puntatori a funzione per i gestori di interrupt vengono memorizzati nella memoria bassa.32 del primo indirizzi di interrupt hardware:hardware attivato.

La prossima 32 o così di indirizzo sono utente triggerable, questi sono chiamati interrupt software.Esse sono originate da un INT istruzione.

Il parametro di tipo INT è l'interrupt software numero del vettore, che sarà l'interrupt chiamato.

Sarà necessario utilizzare il IRET istruzioni per il ritorno da interrupt.

È probabile che si dovrebbe anche disabilitare gli interrupt come la prima cosa da fare quando si entra in un interrupt.

Per ulteriori dettagli, consultare la documentazione per il vostro specifico modello di processore, tende a variare ampiamente.

Il 8080 era dipendente hardware esterno per controllare la sua gestione di interrupt, quindi è impossibile generalizzare. Cercare informazioni sulle Intel 8214 o 8259 controller di interrupt.

Un interrupt è un modo di interrompere la CPU con una notifica alla maniglia qualcos'altro, non sono certo del 8080 di chip Intel, ma dalla mia esperienza, il modo migliore per descrivere un interrupt è questo:

Il CS:IP (Codice Segmento: puntatore all'istruzione) è in questa istruzione a indirizzo di memoria 0x0000: 0020, ad esempio per il bene di spiegarlo utilizzando le istruzioni Intel 8086, l'assemblatore è senza senso e non ha alcun significato reale ... le istruzioni sono fantasiosi

0x0000:001C   MOV AH, 07
0x0000:001D   CMP AH, 0
0x0000:001E   JNZ 0x0020
0x0000:001F   MOV BX, 20
0x0000:0020   MOV CH, 10   ; CS:IP is pointing here
0x0000:0021   INT 0x15

Quando il CS: punti IP alla riga successiva ed un INTerrupt 15 esadecimale viene rilasciato, questo è ciò che accade, la CPU spinge i registri e le bandiere nello stack e quindi eseguire codice a 0x1000: 0100, che assiste l'INT 15 come esempio

0x1000:0100   PUSH AX
0x1000:0101   PUSH BX
0x1000:0102   PUSH CX
0x1000:0103   PUSH DX
0x1000:0104   PUSHF
0x1000:0105   MOV ES, CS
0x1000:0106   INC AX
0x1000:0107   ....
0x1000:014B   IRET

Poi, quando le CS: colpi IP sulla istruzioni 0x1000: 014B, un IRET (Interrupt ritorno), che salta fuori registra tutti e ripristinare lo stato, viene rilasciato e quando viene eseguito CS della CPU: punti IP Torna qui , dopo l'istruzione a 0x0000:. 0021

0x0000:0022   CMP AX, 0
0x0000:0023   ....

Come la CPU sa dove per passare a un offset è basato sulla tabella vettore di interrupt, questa tabella vettore di interruzione è impostato dal BIOS in una posizione particolare nel BIOS particolare, sarebbe simile a questa:

INT    BIOS's LOCATION OF INSTRUCTION POINTER
---    --------------------------------------
0      0x3000
1      0x2000
..      ....
15     0x1000    <--- THIS IS HOW THE CPU KNOWS WHERE TO JUMP TO

Questa tabella è memorizzato nel BIOS e quando viene eseguito il INT 15, il BIOS, sarà reindirizzare il CS:. IP per la posizione nel BIOS per eseguire il codice servizio che gestisce l'interrupt

Torna ai vecchi tempi, sotto Turbo C, c'era un mezzo per ignorare l'interrupt routine tavolo vettore con le proprie funzioni di gestione interrupt utilizzando il setvect funzioni e getvect in cui i gestori di interrupt effettivi sono stati ri-indirizzati al tuo codice .

Spero di aver spiegato abbastanza bene, ok, non è Intel 8080, ma questa è la mia comprensione, e sarei sicuro che il concetto è lo stesso per quel chip come la famiglia Intel x86 di chip è venuto da questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top