C64 Bedtime Coding (ITA) – Il Set di Istruzioni (#05)

(Articolo di Phaze101)

Il Set di Istruzioni

Cercheremo di coprire il maggior numero possibile di istruzioni in questa puntata. Devo ammettere che ho riscritto il testo più volte, perchè non ero mai contento di come terminavo il tutto poichè avrei voluto trovare un modo veloce per spiegarle tutti in una volta. Non sono comunque soddisfatto al 100% ma penso che questa sia la miglior versione possibile.

Come già fatto in molti altri libri ho deciso di dividere il set di istruzioni in categorie, potendo in questo modo spiegare nel dettaglio le categorie stesse e non ogni singola istruzioni. Strada che avrebbe richiesto troppo tempo oltre al fatto che sia su carta che on line è pieno di risorse di riferimento per questo scopo.

Inizierò dapprima elencando tutte le istruzioni della CPU 6502, con una breve spiegazione di cosa fa ogni istruzione.

Ricordate che molte istruzioni supportano differenti modalità di indirizzamento, come abbiamo visto l’ultima volta. Quindi se un’istruzione supporta delle modalità di indirizzamento, non è detto che supporti tutte quelle che abbiamo visto. Questo varia da istruzione ad istruzione.

Osservazione generali

Alcune note per aiutarvi a ricordare più velocemente le varie istruzioni.

La maggior parte delle volte che un’istruzione ha a che fare col registro A, l’istruzione stessa termina con una A. Lo stesso per I registri X e Y.

Se l’istruzione trasferisce un valore dal registro A al registro Y, probabilmente terminerà con AY, ed allo stesso modo con le altre combinazioni.

Le istruzioni di confronto iniziano con una C.

Le istruzioni di branch iniziano con una B.

Le istruzioni che puliscono (clear) qualcosa iniziano con CL.

Le istruzioni che impostano (set) qualcosa, iniziano con SE.

Le istruzioni di salto iniziano con una J.

Le istruzioni che operano con lo stack solitamente iniziano con un P (per push e pull).

Se un’istruzione inizia con DE è un’istruzione di decremento, mentre se inizia con IN è una di incremento.

Quando l’istruzione inizia con LD stiamo caricando (load) un valore da qualche parte, mentre se inizia con ST stiamo memorizando (store) qualcosa da qualche parte.

Infine con RT abbiamo un’istruzione di ritorno.

Il set di istruzione del 6502

Di seguito la tavola di tutte le istruzione del 6502 divisa per categorie. Quando si indica un registro come partenza, in genere si intende il valore che contiene.

Le istruzioni in dettaglio

Istruzioni di Trasferimento Dati

Le istruzioni di questa categoria possono essere divise in tre gruppi.

Le istruzioni che iniziano con LD sono quelle che prendono un valore da una locazione di memoria e lo mettono in un registro.

LDA \$C000    ; Metti il valore 8 bit in \$C000 dentro A
LDX \$C000  ; Metti il valore 8 bit in \$C000 dentro X
LDY \$C000  ; Metti il valore 8 bit in \$C000 dentro Y

Le istruzioni che iniziano con ST sono quelle che prendono il valore in uno dei registri e lo mettono in una locazione di memoria.

STA \$C000    ; Metti in \$C000 il valore 8 bit di A
STX \$C000  ; Metti in \$C000 il valore 8 bit di X
STY \$C000  ; Metti in \$C000 il valore 8 bit di Y

Le istruzioni TAX e TAY trasferiscono il contenuto dell’accumulatore rispettivamente nel registro X e Y. Le istruzioni TXA e TYA fanno l’esatto contrario.

Notato come non ci sono istruzioni di trasferimento tra i registri X e Y.

Modifica del registro di Stato del Processore

Questa dovrebbe essere tra le ultime, ma per comprendere meglio cosa verrà dopo conviene trattarla subito.

Non c’è molto da dire se non che queste istruzioni alzano od abbassano il flag si stato. Se ricordate ne abbiamo parlato in una puntata precedente.

Tra quese le istruzioni più usate sono CLC, CLI, CLV e SEC. Poiché sono auto esplicative non approfondiremo oltre.

Operazioni Aritmetica

Le operazione aritmetiche utilizzano l’accumulatore insieme a locazioni di memoria per sommarne o sottrarne i valori.

Da ricordare che il flag del riporto (carry) è usato per indicare se il risultato vai nel overflow o se è negativo o positivo. Il modo migliore di comprendere queste operazioni è pensarle in binario.

Non spiegheremo in questa sede l’aritmetica binaria, ma è qualcosa di cui avremo bisogno programmando un gioco ad esempio per il punteggio, ed in quel momento l’approfondiremo.

Per ora ricordiamoci che se il risultato di una somma supera 255 il flag del riporto viene alzato, e se il risultato di una sottrazione va sotto zero viene abbassato. Quindi prima di una somma, abbassiamo il flag (CLC) e prima di una sottrazione lo alziamo (SEC).

Per ora ci fermiamo qui, altrimenti avremmo bisogno di una intera puntata solo per questo argomento.

Operazioni logiche

Anche le operazioni logiche lavorano sull’accumulatore, ed anche in questo caso pensare in binario aiuta.

Un AND ritorna 1 se la locazione di memoria e l’accumulatore sono 1.

Un ORA ritornerà 1 se o la locazione di memoria o l’accumulatore sono 1.

Un EOR ritornerà 1 se una delle locazione di memoria o l’accumulatore sono 1, ma ritornerà zero se sono entrambi 1 o 0.

Operazioni di shift e di modifica

Le istruzioni DE decrementano di 1 il contenuto di una locazione di memoria o i registri X e Y a seconda dell’istruzione. Le istruzioni IN invece le incrementeranno di 1.

ROL or ROR / ASL or LSR

Avremo spesso bisogno di muovere singoli bit. Con uno shift di tutti i bit a sinistra, stiamo effettivamente raddoppiando un numero, a destra lo dimezziamo.

Anche se al momento non vedete il motivo per cui ne avrete bisogno così spesso, fidatevi, sarà così.

Un uso importante di ASL e LSR sono le moltiplicazioni e le divisione, poiché la CPU non ha comandi diretti per queste, ma grazie a queste operazioni può velocemente moltiplicare o dividere per 2.

Il 6502 ha due opzioni per lo spostamento dei bit.

Opzione 1 -Shifta i bit dell’accumulatore usando ASL o LSR e i bit che usciranno dal verso dello shift saranno persi, mentri dal lato opposto saranno messi degli 0,

Opzione 2 – Ruotate i bit grazie al flag di riporto con ROL e ROR. In questo caso i nuovi bit in ingresso conterrano il valore del flag di riporto, mentre quelli che escono verranno messi nel flag di riporto.

Anche queste 4 istruzioni fanno parte delle operazioni aritmetiche, e lo vedremo quando affronteremo l’argomento.

Confronto e Test

Il confronto avviene con CMP, CPX e CPY

Con queste istruzioni si confronta un valore diretto a d un valore contenuto in memoria con l’accumulatore, X o Y rispettivamente.

Il risultato del confronto alzerà i flag N, Z o C nel caso – rispettivamente – il risultato sarà positivo, nullo o negativo. Il confronto è sostanzialmente una sottrazione, solo che il risultato non viene memorizzato da nessuna parte.

L’istruzione BIT confronta i singoli bit dell’accumulatore con il contenuto di una locazione di memoria, eseguendo un AND logico tra ognuno di essi. Il risultato del confronto viene indicato nel flag Z.

Il confronto solitamente avviene prima di un’istruzione di branch, sul cui risultato si baserà per decidere se saltare o meno all’istruzione indicata.

Istruzioni di branch

Queste istruzioni vengono normalmente dopo un confronto, ma possono anche apparire dopo altre istruzioni come DEX o DEY. Il nome di queste istruzioni è auto esplicativo, praticamente eseguono un salto se il flag oggetto dell’istruzione è alzato, come indicato nella tabella seguente.

BMI, BPL, BVC e BVS sono istruzioni comunemente non usate che hanno a che fare con il segno delle operazioni aritmetiche o il complemento a due. Per ora ignoratele.

Le altre 4 istruzioni – BCS, BCC, BEQ e BNE – ve le riproponiamo confrontandole con il costrutto IF…THEN del Basic che molti di voi conosceranno.

Istruzioni di salto

JMP è come l’istruzione GOTO del BASIC. La CPU salta ad un’altra locazione di memoria da cui continua l’esecuzione.

Invece l’istruzione JSR o Jump to SubRoutine (salta a subroutine) e la sua controparte RTS equivalgono al costrutto GOSUB…RETURN del BASIC. La CPU salta alla locazione di memoria indicata da cui continua l’esecuzione fino a quando non incontra l’istruzione RTS. A quel punto ritorna alla JSR e procede dall’istruzione successiva.

Quando viene eseguita la JSR, l’attuale valore del Program Counter viene messo nello stack, e quando viene eseguita l’RTS il valore dello stack viene messo nel Program Counter.

Le istruzioni RTI e BRK sono per il momento argomenti avanzati.

Operazione con lo Stack

PHA e PLA sono usati per un push dall’accumulatore od un pull verso l’accumulatore.

PHP e PLP similarmente eseguono un push ed un pull con il registro di stato.

Possiamo anche modificare il puntatore dello stack con X grazie alle istruzioni TXS e TSX.

Non ci sono invece istruzioni per memorizzare il valore di X o Y nello stack. Bisogna usare TXA e TYA per trasferire i loro valori nell’accumulatore e poi da lì metterli nello stack.

Istruzioni nulle

NOP è un’istruzione che non fa nulla se non usare tempo della CPU. La userete quando dovrete creare delle attese.

La prossima settimana

E queste erano le istruzioni per il 6502. Ne abbiamo saltate alcune per non complicare troppo le cose, ed alcuni argomenti – come avrete letto – li approfondiremo più avanti. Per ora quanto detto è più che sufficiente per iniziare.

Con questa puntata abbiamo esaurito gli argomenti principali della CPU 6502. Con la prossima serie affronteremo i concetti base relativi al gioco. Quindi dalla puntata numero 6, inizierete a sporcarvi le mani.

Come sempre, se avete problemi, mandate un messaggio. 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/