Lavorare con i cicli della CPU in Gameboy Advance

4

Sto lavorando su un emulatore GBA e sono bloccato durante l'implementazione dei cicli della CPU. Conosco solo le conoscenze di base su di esso, ogni istruzione di ARM e Modalità THUMB come ogni differente serie di cicli per ciascuna istruzione. Attualmente sto dicendo semplicemente che ogni istruzione ARM costa 4 cicli e Le istruzioni THUMB costano 2 cicli. Ma come lo si implementa come il La documentazione della CPU dice? I cicli di istruzione variano a seconda di quale sezione della memoria a cui sta attualmente accedendo? link Secondo le specifiche di cui sopra, dice che diverse aree di memoria hanno differenti waitstate ma non so cosa significhi esattamente. Inoltre, cosa sono per Ciclo non sequenziale, Ciclo sequenziale, Ciclo interno, Ciclo coprocessore? Ho visto in qualche codice sorgente GBA che stanno usando il PC per capire quanti cicli ciascuno l'istruzione impiega per completare, ma come stanno facendo?

    
posta Preston Sexton 04.11.2013 - 04:39
fonte

1 risposta

3

Questa è solo una risposta parziale, quindi potrebbe non essere consentita:

Currently I am simply saying every ARM instructions cost 4 cycles and THUMB instructions cost 2 cycles.

In realtà, se ricordo correttamente ARM, ciò che sta effettivamente accadendo è che, in un singolo ciclo di memoria, è possibile recuperare una singola istruzione ARM a 32 bit o due istruzioni THUMB a 16 bit. Il tempo di esecuzione è, ovviamente, dipendente dalle istruzioni.

Does instruction cycles vary depending on which section of the memory it's currently accessing to? http://nocash.emubase.de/gbatek.htm#cpuinstructioncycletimes According to the above specification, it says different memory areas have different waitstates but I don't know what it exactly mean.

Diverse regioni di memoria possono avere più client di dati che solo la CPU. Ciò è particolarmente vero nella memoria grafica / video in cui i pixel devono essere estratti dalla RAM per essere inviati al display. A meno che non si usi una memoria più veloce (leggi: più costosa), la CPU e l'hardware grafico dovranno fare a turno l'accesso alla RAM. Quindi, a seconda di quanti altri client RAM ci sono, potrebbero passare diversi cicli prima che arrivi il turno della CPU nella RAM.

Potrebbe non essere nemmeno così nobile - il produttore potrebbe aver semplicemente deciso di liberarsi della RAM più lenta (leggi: meno) per la maggior parte del programma e dello spazio dati e utilizzare un blocco più piccolo di memoria veloce solo per quelli cose che assolutamente ne avevano bisogno.

Furthermore, what are Non-sequential cycle, Sequential cycle, Internal Cycle, Coprocessor Cycle for?

Sequenziale rispetto a non sequenziale si riferisce alla lettura di posizioni di memoria in ordine rispetto a out-of-order. La RAM è organizzata come una matrice bidimensionale di celle di memoria indicizzate per indirizzo di riga e colonna. Se si accede a posizioni di memoria in ordine crescente di indirizzi (ad es. 0, 1, 2, 3, 4, 5, ecc.), Tutto ciò che è necessario modificare (la maggior parte del tempo) è l'indirizzo della colonna e ogni successiva lettura può essere soddisfatto più rapidamente rispetto a quando si accede agli indirizzi in modo non sequenziale. A giudicare dal documento a cui sei collegato, sembra che ottieni un incremento CAS gratuito, ma un RAS + CAS completo costa un ciclo in più.

Ciclo interno significa che la CPU sta andando, "Wow, questo è complicato, dammi un po 'di tempo in più per capirlo." (Le istruzioni MUL sono esempi nitidi di questo.)

Ciclo di coprocessore si riferisce al tempo richiesto per parlare con un coprocessore ARM. Non so quali, se del caso, i coprocessori ARM sono nel GBA.

Per quanto riguarda l'implementazione: ciò non si presta a una singola risposta. Se fossi in me, modellerei i tempi di accesso alla RAM indipendentemente dai tempi di esecuzione delle istruzioni. Quando la CPU legge / scrive memoria, confronta l'indirizzo di memoria a cui si accede con l'indirizzo di memoria precedente a cui la CPU ha avuto accesso. Se sono adiacenti (M (corrente) == M (precedente) + 4), allora è gratuito; altrimenti aggiungi una penalità di un ciclo. Quindi aggiungi i ritardi imposti dalla regione di memoria a cui stai accedendo.

    
risposta data 15.11.2013 - 01:46
fonte

Leggi altre domande sui tag