Commodore 64 > Programmazione, Grafica e Musica
Istruzioni Superflue nelle IRQ Raster Interrupt Routine
Attila:
Salve,
mi domando il perché in Rete, nel Setup delle IRQ Raster Interrupt Routine, spesso vengono inserite le segg. istruzioni:
lda #$7f
sta $dd0d
lda $dd0d
L'unica sorgente che, a seguito del power up del C64, può generare un Interrupt (di tipo IRQ) è il Timer A del CIA 1 che triggera un IRQ Interrupt ogni 1/60 secondo.
Il suddetto Timer A è controllato dal bit 0 del Registro $dc0d (ICR del CIA 1).
Dunque, al fine di disabilitare il Timer A, è sufficiente inserire nel Setup della nostra Raster Interrupt Routine:
lda #$01
sta $dc0d
Il Registro $dd0d è invece legato al CIA 2 e agli Interrupt di tipo NMI.
L'unica sorgente, del suddetto Registro, che potrebbe triggerare un NMI Interrupt è la Porta RS-232 del C64 SE e SOLO SE alla predetta porta è collegata fisicamente una periferica!
L'altra possibile sorgente di un NMI Interrupt è il tasto RESTORE che NON è gestito dal CIA 2 ma è collegato DIRETTAMENTE alla NMI line del 6510.
In definitiva, nell'ottica della costante ricerca di un'ottimizzazione spinta, assillo continuo dei democoder, risulta davvero un controsenso utilizzare delle istruzioni superflue che sprecano cicli macchina e byte!
0scur0:
--- Citazione da: Attila - 03 Novembre 2020, 00:02:11 ---In definitiva, nell'ottica della costante ricerca di un'ottimizzazione spinta, assillo continuo dei democoder, risulta davvero un controsenso utilizzare delle istruzioni superflue che sprecano cicli macchina e byte!
--- Termina citazione ---
Una possibile risposta potrebbe essere in questo breve estratto di "Mapping The C64" (è riferito a CIA1 mappato a $dc0d, ma vale anche per CIA2 mappato a $dd0d)
--- Citazione ---You should note, however, that reading this register clears it, so you should preserve its contents in RAM if you want to test more than one bit.
--- Termina citazione ---
In altre parole, bisognerebbe capire che fine fa il contenuto dell'accumulatore dopo quella LDA $DD0D.
eregil:
@Attila
Dal momento che menzioni esempi trovati "in Rete", qualche link non sarebbe stato male, tanto per essere sicuri di parlare della stessa cosa e magari spiegarti il codice specifico che hai letto.
Comunque, non sono il massimo esperto di raster, ma cercherò di chiarire qualche concetto.
In primo luogo, nei limiti del possibile, il buon programmatore scrive i programmi in modo che funzionino sempre, non in base ad assunzioni su quello che l'utente ha fatto o non ha fatto prima con il computer. Quindi, nello specifico: essendovi la possibilità di inizializzare IRQ, NMI, ecc. come si desidera, è corretto farlo, piuttosto che sperare che l'utente lanci il programma appena acceso il computer, senza aver fatto nient'altro in mezzo.
In secondo luogo, operando sui registri dei chip I/O piuttosto che in RAM, istruzioni come la LDA $dd0d, o magari delle istruzioni BIT, possono avere effetti diversi (o ulteriori) rispetto al semplice caricamento dell'accumulatore. Nello specifico: quando si accede in lettura a $dd0d, si ha l'effetto di un "acknowledgement" di un avvenuto NMI; questo sblocca la possibilità che ne sia gestito un altro. Non leggendo $dd0d nei punti giusti del codice, si può causare un blocco dell'esecuzione delle nostre routine, o altri effetti indesiderati. Puoi leggere maggiori dettagli ad esempio su:
https://the-dreams.de/articles/nmi-lock.txt
Le istruzioni LDA #$7f e STA $dd0d servono invece a disabilitare tutti gli NMI gestiti dal CIA 2. Questo è utile prima di reimpostare il puntatore alla routine di gestione degli NMI oppure, ad esempio, per assicurarsi che successivamente siano abilitati solo quelli che desideriamo, a causa del funzionamento particolare di questo registro (consulta ad esempio Commodore 64 memory map).
Ti consiglio di effettuare una ricerca e spulciare quello che trovi sul forum riguardo la programmazione del raster, in particolare ti segnalo:
https://ready64.org/smf/index.php?topic=1837
https://ready64.org/smf/index.php?topic=3646
Spero di essere stato utile.
Attila:
@eregil
Intanto grazie per l'esaustiva risposta.
Io mi riferivo a istruzioni inserite in una Routine di Servizio di un IRQ Raster Interrupt (che conoscono), i cui esempi sono rintracciabili anche in questo stesso Forum, e mi domandavo il motivo di tante "azioni cautelative", come la disabilitazione di tutte e 5 le sorgenti di NMI Interrupt del CIA 2 (lda #$7f; sta $dd0d) o ancora il riconoscimento (in gergo "acknowledgement" o più semplicemente "ACK") degli NMI Interrupt del CIA 2 effettuato attraverso la lettura del Registro $dd0d azzerandone, di conseguenza, il contenuto.
Nello specifico si dovrebbero prevedere periferiche collegate fisicamente alla Porta Seriale o al limite alla User Port (la Porta Parallela) di un C64 reale, su cui far girare la nostra Routine, che potrebbero provocare un NMI Interrupt e che ne giustificherebbero una disabilitazione preventiva agendo, come dettto, sul Registro $dd0d, ossia l'ICR (Interrupt Control Register) del CIA 2.
Nel caso della pressione del tasto RESTORE o di una Cartuccia ROM inserita nella Expansion Port (o Cartridge Port), agire sul suddetto Registro $dd0d NON è sufficiente in quanto bisogna crearsi una propria Routine di Servizio NMI che gestisca, o meglio, disabiliti opportunamente gli eventi di cui prima (Pressione Tasto RESTORE, ecc.).
Indipendentemente dai dettagli specifici di quali tecniche di programmazione adottare per la gestione degli Interrupt (IRQ o NMI), diciamo che il principio di base (soprattutto caro ai democoders) è quello di creare le condizioni opportune per far girare la propria routine in qualsiasi condizione.
Saluti.
0scur0:
--- Citazione da: Attila - 04 Novembre 2020, 13:18:20 ---Io mi riferivo a istruzioni inserite in una Routine di Servizio di un IRQ Raster Interrupt
--- Termina citazione ---
Però nel tuo primo post mi era sembrato che tu parlassi della routine di setup, non della routine di servizio.
Ad ogni modo, con riferimento al tuo primo post dove si parlava di prestazioni, va detto che tutti i precalcoli, i precaricamenti e le istruzioni di profilassi "superflue" vengono eseguite praticamente sempre nella routine di setup, che a differenza della routine di servizio viene eseguita una sola volta.
Navigazione
[0] Indice dei post
Vai alla versione completa