Autore Topic: Istruzioni Superflue nelle IRQ Raster Interrupt Routine  (Letto 5149 volte)

Attila

  • Neo-iscritto
  • *
  • Post: 5
  • Gioco Preferito: Wizard of Wor
Istruzioni Superflue nelle IRQ Raster Interrupt Routine
« il: 03 Novembre 2020, 00:02:11 »
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!
« Ultima modifica: 03 Novembre 2020, 00:05:13 da Attila »

0scur0

  • Neo-iscritto
  • *
  • Post: 34
  • Gioco Preferito: -
Re:Istruzioni Superflue nelle IRQ Raster Interrupt Routine
« Risposta #1 il: 03 Novembre 2020, 16:22:12 »
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!
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.
In altre parole, bisognerebbe capire che fine fa il contenuto dell'accumulatore dopo quella LDA $DD0D.

eregil

  • Administrator
  • Utente
  • *****
  • Post: 706
  • Gioco Preferito: Impossible Mission
Re:Istruzioni Superflue nelle IRQ Raster Interrupt Routine
« Risposta #2 il: 03 Novembre 2020, 21:05:58 »
@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.
Non rispondo a richieste private, di qualunque genere esse siano.
Per domande tecniche leggete le FAQ e usate l'apposito forum.
Per questioni amministrative contattate lo staff tramite il form Contatti sul sito.

Attila

  • Neo-iscritto
  • *
  • Post: 5
  • Gioco Preferito: Wizard of Wor
Re:Istruzioni Superflue nelle IRQ Raster Interrupt Routine
« Risposta #3 il: 04 Novembre 2020, 13:18:20 »
@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.
« Ultima modifica: 04 Novembre 2020, 13:32:35 da Attila »

0scur0

  • Neo-iscritto
  • *
  • Post: 34
  • Gioco Preferito: -
Re:Istruzioni Superflue nelle IRQ Raster Interrupt Routine
« Risposta #4 il: 06 Novembre 2020, 13:21:46 »
Io mi riferivo a istruzioni inserite in una Routine di Servizio di un IRQ Raster Interrupt
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.

Attila

  • Neo-iscritto
  • *
  • Post: 5
  • Gioco Preferito: Wizard of Wor
Re:Istruzioni Superflue nelle IRQ Raster Interrupt Routine
« Risposta #5 il: 06 Novembre 2020, 15:14:51 »
Io mi riferivo a istruzioni inserite in una Routine di Servizio di un IRQ Raster Interrupt
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.
@0scur0
Mi riferivo proprio alle istruzioni inserite nel Setup di una Routine di gestione dell'IRQ Raster Interrupt.
A ogni modo, dopo vari e opportuni confronti, sono giunto alla conclusione che le suddette operazioni vanno effettuate in modo da essere strettamente sicuri che la propria Routine possa correttamente funzionare in qualsiasi contesto e configurazione.
Grazie e saluti.