C64 Bedtime Coding (ITA) – Modalità di Indirizzamento (#04)

(Articolo di Phaze101)

Modalità di Indirizzamento

Questa sezione contiene una panoramica di tutto quello che dovete sapere riguardo la CPU. I prossimi articoli entreranno più nel dettaglio.

Prima di iniziare con le modalità di indirizzamento è necessario ripassare alcuni concetti base propedeutici alla comprensione.

Pagine di Memoria

Per la comprensione di quanto stiamo per dire è necessario aver letto il primo articolo di questa serie.

Come prima cosa, chiariamo cos’è una pagina quando si parla di memoria. E’ un indirizzo di memoria tra $00 e $FF, con ogni pagina grande 256 byte. Come sapete il C64 ha 64K, e cioè ha una memoria che parte dall’indirizzo $0000 fino all’indirizzo $FFFF. Per cui la pagina zero e da $0000 e finisce a$00FF, Pagina uno parte da $0100 e finisce a $01FF. Pagina due è da $0200 a $02FF e così via.

Notate come il primo bye indica sempre il numero di pagina, per cui l’indirizzo $0310 ci dice che sia sulla terza pagina.

Questo vuole anche dire che il C64 ha 256 pagine di memoria.

Pagine speciali

Le pagine 0 e 1 sono molto importanti e speciali.

La Pagina Zero è molto usata dal Sistema e molto importante. Ci permette di utilizzare un indirizzamento a 16-bit. La CPU ha una modalità di indirizzamento che si chiama indirizzamento pagina zero che spiegheremo più Avanti.

La Pagina Uno invece l’abbiamo incontrata quando abbiamo parlato dello Stack ed anche lei è speciale. Questa pagina non può essere usata perché deve essere lasciata alla CPU per la gestione dello stack, appunto.

In teoria dalla pagina 2 in poi ($0200 – $FFFF) siamo liberi di farne uso, ma in pratica parti di questa memoria sono mappate o sovrapposte ( “shadowed”) dal Kernel del C64, dall’interprete basic e da altri component hardware come lo schermo e la memoria per I colori. Per ora è sufficiente sapere che non tutta la memoria dalla pagina due in poi è disponibile. Approfondiremo più avanti.

Come è memorizzato un indirizzo

Un indirizzo è lungo due byte, cioè 16 bit, ma una locazione di memoria può contenere solo un byte, per cui ne serviranno due consecutive.

Nel linguaggio assembly del 6502 gli indirizzi sono memorizzati con il byte basso (low order) nella prima locazione, e quello alto (high order) in quella seguente, e cioè così: $LLHH (vedi tabella). Ricordatevelo bene perché è molto importante.

Notazioni

Alcune notazioni che useremo e sono comuni quando si parla di assembly.

Panoramica delle Modalità di Indirizzamento

 

Cosa sono le modalità di indirizzamento

Le modalità di indirizzamento sono il modo in cui si usa un’istruzione con operandi diversi. Gli operandi (o il formato del parametro) che segue un’istruzione può avere formati diversi.

Questi formati sono chiamati modalità di indirizzamento.

Le modalità di indirizzamento del 6502

Vediamo un elenco delle modalità di indirizzamento.

Per semplicità mi limito alla lettura di valori, ma in molti casi vale anche per la scrittura.

Riflessione

Prima di iniziare a spiegare le modalità di indirizzamento, ero in dubbio se parlare prima delle istruzioni, ma ho deciso di andare direttamente alle modalità in quanto parlare delle istruzioni prima confonderebbe chi si avvicina per la prima volta all’assembly.

Non cercate di imparare a memoria le modalità di indirizzamento, non serve a niente. Semplicemente ritornate a queste pagine ogni volta che vi servirà e col tempo vi verrà naturale, perché sono in realtà cose più semplici da usare che da spiegare.

Inoltre, non cercate di capire le istruzioni che useremo come esempio a tutti I corsi. Dove serve sarà spiegato il funzionamento, e più avanti vedremo tutte le istruzioni che sono a nostra disposizione. Vi ritroverete a tornare su queste pagine più volte, ed è normale che sia così.

Considero la comprensione delle modalità di indirizzamento un prerequisito per i principianti. Padroneggiateli e la vostra vita di programmatore assembly sarà molto più semplice.

Le modalità di indirizzamento in dettaglio

 

Indirizzamento implicito

E’ il più semplice delle modalità di indirizzamento. Sostanzialmente fa tutto la CPU. Queste istruzioni non prevedono un operando.

Per chi se lo fosse dimenticato, una istruzione della CPU può essere seguita da qualche tipo di parametro, ma non in questo caso.

Indirizzamento relativo

In questa modalità l’esecuzione del programma salta ad una posizione relativa rispetto l’indirizzo attuale. In alter parole quello che succede è che il Program Counter (PC) invece di eseguire l’istruzione successive salta fino ad una posizione che è relativa rispetto la corrente.

Il salto può essere 128 byte prima o 127 byte dopo l’istruzione corrente.

Questo succede nelle istruzioni di salto condizionato (branch). Solitamente non si usa direttamente l’indicazione numerica del salto ma una label.

Indirizzamento con accumulatore

Anche questa modalità è molto semplice da comprendere anche se può sembrare che non sia così. Sono istruzioni che non prevedono operando, come quelle ad indirizzamento implicito, ma che in qualche modo modificano il contenuto dell’accumulatore.

LSL ruota verso sinistra i bit dell’accumulatore

Indirizzamento immediato

Un’altra modalità molto semplice. L’istruzione ha come parametro un numero che specifichiamo direttamente, utilizzando il simbolo hash (#).

I valori possono essere decimali, esadecimali o binary.

In questi esempi memorizziamo un numero che specifichiamo esplicitamente nell’accumulatore.

Indirizzamento assoluto

Ancora una volta una modalità semplice da comprendere.

L’istruzione è seguita da un indirizzo di memoria a 16 bit, permettendoci di indirizzare tutti i 64K di ram. Possiamo anche usare una label.

Modalità assoluta con indice

Questa è una modalità molto potente che useremo spesso.

E’ usate per leggere e scrivere usando più di un indirizzo. Funziona coma la modalità assoluta, ma al valore indicato aggiunge il valore del registro X o Y.

La locazione da usare è indicata con $nnnn,X or $nnnn,Y. La variante con Y può essere usata con molti comandi, ma quella con X ha più opzioni. Modificando il valore di X e Y si può modificare l’indirizzo di memoria che sarà usato. Il valore contenuto in X o Y sarà aggiunto alla locazione a 16 bit indicata come parametro dell’istruzione.

Indirizzamento Pagina Zero

E’ una modalità che permette l’utilizzo solo della Pagina Zero, e quindi dalla locazione $0000 alla $00FF.

Questa modalità richiede meno memoria perché il byte alto è sempre zero e quindi può essere ignorato. Cioè invece di scrivere $00FF per indicare la locazione 256 possiamo scrivere direttamente $FF.

Questa è anche un’operazione che può fare in maniera trasparente l’assembler per noi. Quindi se non scriviamo $00FF l’assembler sa che deve modificarlo in $FF.

Il vantaggio di questa modalità è che usa 2 byte invece di 3 rendendo anche l’esecuzione più veloce.

Sottolineiamo che il valore $80 non ha un hash (#) quindi non stiamo specificando un valore esplicito ma una locazione di memoria.

Indirizzamento Pagina Zero con indice.

Questa modalità si comporta come la modalità assoluta con indice, solo che l’indirizzo da sommare ai registri X o Y è limitato alla pagina zero. Il registro Y può essere usato solo con le istruzioni LDX e STX mentre il registro X non ha questi limiti.

Importante: se il valore risultante dalla somma di un registro e del valore in pagina zero indicato è maggiore di $FF, il byte alto della locazione risultante verrà perso. Questo vuol dire che gli indirizzamenti risultanti saranno sempre in pagina zero.

Fate sempre attenzione a quando viene usato l’hash (#) e quando non viene usato.

Indirizzamento indiretto

Possiamo leggere un valore 16 bit da un altro indirizzo 16 bit ed usare questo come indirizzo per un JMP (GOTO).

L’istruzione JMP è l’unica che può usare questa modalità. Questo vuol dire che se la locazione $0200 contiene $00 e la locazione $0202 contiene $C0, l’istruzione JMP ($0200) eseguirà un salto all’istruzione alla locazione $C000.

Notate la notazione ($LLHH) usata in questo contesto, con il byte alto nella seconda locazione.

Indirizzamento pre indiretto con indice

Solo il registro X può essere usato per questa modalità, dove un indirizzo in Page Zero viene aggiunto al valore in X. La locazione a 16 bit risultante viene usata per leggervi il valore memorizzato.

Considerate l’esempio LDA ($20,X), e poniamo che X contenga $04 e che la locazione $24 contenga $80 e la locazione $25 contenga $C0. Prima di tutto il valore in X viene aggiunto a $20, per ottenere $24, e vengono presi i valore in $24 e $25 e quindi $C080. Il valore contenuto in $C080 sarà salvato nell’accumulatore.

Fate anche qui attenziona alla notazione con byte alto in seconda posizione per esprimere la locazione a 16 bit.

Istruzioni di questo tipo sono lunghe 2 byte, dove il secondo è l’indirizzo di pagina zero. Ovviamente, anche l’indirizzo letto deve essere memorizzato in pagina zero.

Indirizzamento post indiretto con indice

Questa modalità funziona solo col registro Y ed è anche la modalità con indice più usata con i processori 6502.

Differisce dal precedente dall’ordine con cui Y è aggiunto all’indirizzo indicato.

Prindiamo l’esempio LDA ($80),Y

Per calcolare l’indirizzo finale, la CPU prima legge l’indirizzo memorizzato alla locazione $80 e poi vi aggiunge Y. Se ad esempio in $80 vi fosse $C028 (e cioè $28 in 80 e $c0 in 81) ed il registro Y contiene $10, la locazione finale sarà $C038.

La prossima settimana

Ok. È stata una cavalcata vedere tutte le modalità di indirizzamento del 6502. Come abbiamo detto comprenderle tutto sarà fondamentale per renderci facile la vita programmando in assembly.

La prossima settimana inizieremo finalmente a vedere le istruzioni del 6502. E subito dopo basta con la teoria della CPU, passeremo alla teoria di come si programmano i giochi, e finalmente ci sporcheremo le mani.

Come sempre, per qualunque problema sapete dove trovarmi. Per questa settimana è tutto.

Coding is Fun 😊

Tutti Gli Articoli

Italian

Articolo 4

https://sys64738.org/2019/03/c64-bedtime-coding-ita-modalita-di-indirizzamento-04/

Articolo 3
https://sys64738.org/2019/03/c64-bedtime-coding-ita-i-registri-della-cpu-03/

Articolo 2
https://sys64738.org/2019/03/c64-bedtime-coding-ita-linguaggio-macchina-02/

Articolo 1
https://sys64738.org/2019/03/c64-bedtime-coding-introduzione-e-basi-01/

English

Article 4
https://sys64738.org/2019/03/c64-bedtime-coding-eng-addressing-modes-04/

Article 3
https://sys64738.org/2019/03/c64-bedtime-coding-eng-the-cpu-registers-03/

Article 2
https://sys64738.org/2019/03/c64-bedtime-coding-eng-machine-language-02/

Article 1
https://sys64738.org/2019/03/c64-bedtime-coding-introduction-basics-01/

Have your say