Hai ragione jumpjack,
allora visto che qualcuno aveva detto di non aver capito bene cosa fossero i FLAGs....
I FLAGs (bandierine) sono dei singoli BIT che hanno uno spcefico significato e che vengono modificati da alcune operazioni e consultati da altre, rappresentano la memoria di stato del processo.
Un esempio?
Prendiamo in esame come il controllore confronta tra loro due numeri (CMP), ebbene semplicemente li sottrae nell'ALU e pone a "1" il FLAG "Z" (flag deputato ad indicare un risultato uguale a zero), se vuoi che in questo caso il processo devi dalla sua linea saltando ad un altro punto del programma allora puoi mettere l'istruzione di salto condizionato BEQ (Branch on EQual) che salta se il FLAG di Z è settato ad indicare una comparazione tra due entità uguali, se vuoi il contrario metti l'istruzione BNE (Branch on Not Equal).
La cosa interessante è che il FLAG "Z" è settato anche da altre istruzioni così se trovi
LDA# 00h
BNE pippo
l'istruzione LDAimmediato zero caricherà in A il valore zero, questo setterà il flag Z che indica pure ugualianza, e quindi NON salterà a "pippo",
se il valore caricato fosse diverso da zero allora salterebbe a "pippo" perchè il flag di Z sarebbe resettato dall'operazione di caricamento.
Hai appena visto come il caricamento di un valore in una variabile porta a cambiare la strada del processo in maniera sintetica (buona programmazione) ma criptica.
Se ho scritto imprecisioni posso dire a parziale scusa che saranno circa 3 lustri che non programmo il 6510....
mi sa che sei "troppo avanti" per il Naufr4g0, non credo che sappia cos'e' l'ALU, che "vuol dire" CMP e BEQ, "chi è" A e che c'entra pippo.
Dobbiamo aspettare che faccia lui le domande... o partire proprio da zero-zero, tipo:
"Un programma in assembly è una sequenza di comandi, detti anche MNEMONICI, perche' sono abbreviazioni (come LDA, STA, BEQ), ognuna delle quali corrisponde a un numero da 1 a 255, numeri che il computer interpreta come istruzioni. Ma siccome per noi umani lavorare coi numeri è difficile, ad ogni numero è stato associato uno "mnemonico".
In assembly, a volte chiamato anche impropriamente Linguaggio Macchina e abbreviato in LM, non esistono istruzioni complicate: puoi lavorare solo su singoli byte, e molto spesso si lavora sui singoli bit, accendendoli, spegnendoli o leggendoli, e agendo di conseguenza. Quindi non esiste l'istruzione VARIABILE1 = VARIABILE2 + 7, anzi, nn esistono proprio le variabili: nel 6502 esistono solo tre "cose" simili a variabili, chiamate RegistroX, RegistroY e Accumulatore (A), e tutte le operazioni devono passare attraverso almeno uno di questi REGISTRI.
Per esempio, per memorizzare il valore 1 nella posizione di memoria $400, devi scrivere:
LDA #$01
STA $400
Cioe':
LoaD into Accumulator value $01 (# indica che è un valore, $ che è esadecimale; senza "#" sarebbe l'indirizzo di un byte in memoria)
STore Accumulator into location $400Ecco fatto, hai scritto una A in alto a sinistra sullo schermo!
Per vederlo concretamente, devi scrivere questo programma nella memoria cel c64: l'istruzione POKE locazione, numero inserisce appunto un numero in una locazione di memoria.
Siccome "LDA numero" corrisponde al numero xxx, e "STA locazione" corrisponde al numero yyy, per memorizzare questo microprogramma in memoria dovrai memorizzare questi numeri in fila:
xxx
1
yyy
00
04
I valori di xxx e yyy non me li ricordo, e non mi ricordo nemmeno se $0400 si memorizza come 00 04 o 04 00.... :huh:
Cmq, una volta scoperti, per memorizzare il programma si fa:
poke 49152,xxx
poke 49153,1
poke 49154,yyy
poke 49155,0
poke 49156,4
sys 49152
Naturalmente, per programmi piu' complicati bisognerà usare un ASSEMBLER...