Articolo pubblicato sul n. 30 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nel maggio 1984

MCmicrocomputer


Commodore 64:
Caratteri utente e sprite

di Andrea de Prisco

Quello della grafica e, più in generale, della presentazione delle informazioni sullo schermo è un problema che interessa sempre gli utenti di una macchina. Questo articolo è dedicato a quei possessori di un Commodore 64 che vogliono saperne di più sulla definizione dei caratteri e sui cosiddetti "sprite", fondamentali nella realizzazione di qualsiasi gioco che comporti l'automazione (veloce) di figure sullo schermo. Copertina del numero di MCmicrocomputer contenente l'articolo

 La sezione video del 64  

II circuito integrato che gestisce la sezione video del Commodore 64 è il 6567 - in Europa: negli States è 6566 -, detto VIC II in conseguenza del fatto che il6 561 usato nel VIC 20 era il primo Video Interface Chip. II 6567 si programma tramite 47 registri ad 8 bit, mappati a partire dalla locazione decimale 53248 (D000 in esadecimale), che consentono di abilitare ben 7 modi di funzionamento:  

(1) caratteri standard;

(2) caratteri multicolor;

(3) caratteri extended background color;

(4) alta risoluzione bit-map;

(5) alta risoluzione bit-map multicolor;

(6) gestione sprite;

(7) gestione sprite multicolor.  

Sostanzialmente abbiamo a disposizione una pagina testo con 3 varianti (normale, multicolor e multicolor esteso), una pagina in alta risoluzione con 2 varianti (a mappa semplice e multicolor) ed infine 2 tipi di sprite, ai quali dedichiamo la seconda parte dell'articolo e quindi adesso non ci soffermeremo nel guardarli.  

La pagina testo  

In pagina testo ogni carattere va inteso come una griglia di 8 x 8 punti; i parametri in gioco per determinare quanta memoria è necessaria per ogni carattere sono due, la risoluzione grafica e quella cromatica (= dei colori). Un punto sullo schermo può essere visibile o no, quindi serve almeno 1 bit per ognuno, ma può esser colorato in una tonalità a scelta tra diverse possibilità: il numero di bit per ogni punto raddoppia ogni due scelte di colore disponibili.  

Nel modo testo abbiamo un solo colore possibile per i punti accesi, ai quali corrisponde un bit in memoria, per cui la definizione di un carattere richiede 8 x 8/8 = 8 byte (sembra un gioco!). Alcuni di questi vengono resi visibili (mettendo un 1), mentre gli altri assumono il colore dello sfondo (mettendo uno 0): per avere i dati relativi a quel carattere basterà prendere le otto righe di dati binari e convertirle in otto numeri interi decimali; tutto ciò e mostrato in figura 1. II modo multicolor permette di usare 3 tonalità - selezionabili tra 8 - per i punti accesi; poiché aumenta la risoluzione di colore si dimezza la risoluzione grafica, mettendo a disposizione una griglia 4 x 8 i cui punti orizzontali sono però lunghi il doppio di quelli normali, per cui lo spazio occupato rimane lo stesso. II 6567 prende allora le combinazioni di bit, a due a due, e le interpreta come codice del colore di quel punto lungo; tutto ciò è mostrato in figura 2.  

Anche con il multicolor rimane il fatto che la parte della griglia che non viene accesa, ovvero lo sfondo del carattere, viene colorato nella stessa tinta dello sfondo dello schermo: questa situazione è risolta dal modo a colore di sfondo esteso (extended background color), che permette proprio di colorare lo sfondo del carattere in modo diverso da quello dello schermo. La risoluzione grafica è quella massima, 8 x8, e quella cromatica, che consente la scelta tra 4 tonalità, viene fatta a discapito del numero di caratteri che possono esser mostrati, che scende a 64.  II Multicolor e I'Extended Background Color non possono essere usati allo stesso tempo.  

Definiamo i nostri caratteri  

Il 6567, per le sue molteplici funzioni, ha accesso a ben 16K byte di memoria. Poiché abbiamo 64K byte di RAM, corrispondenti a 4 blocchi da 16K I'uno, il VIC II può scegliere uno di questi 4, che iniziano alle locazioni 0 (esadecimale 0000), 16384 ($4000), 32768 ($8000) e 49152 ($C000): la selezione va fatta agendo sui registri del secondo 6526 del 64, il CIA n. 2.  

Prima di iniziare abbiamo bisogno di spazio in RAM per metterci il nostro set di caratteri. Per far ciò dovremo quindi sfruttare ancora I'istruzione POKE:  

POKE 44, 16: POKE 43,1: POKE 4096,0: NEW  

[return] 

E adesso veniamo al grosso del lavoro.  

La prima operazione da compiere è di dire al CIA che gli daremo dei dati su due bit; la ricezione viene abilitata con un

 POKE 56578, PEEK (56578) OR 3  

che pone ad 1 i primi due bit senza modificare gli altri. A questa punto potremo selezionare il banco da 16K, agendo sulla locazione 56576 nel seguente modo:  

POKE 56576, PEEK((56576) AND 252) OR A 

 sapendo che  

  • A = 0 seleziona il banco 3, C000-FFFF  

  • A = 1 seleziona il banco 2, 8000-BFFF  

  • A=2 seleziona il banco 1,  4000-7FFF  

  • A = 3 seleziona il banco 0, 0000-3FFF

 e che all'accensione viene usato il banco 0 (valore di default).  

II modo di funzionamento standard, presente all'accensione, mette a disposizione tutti i caratteri disponibili sui 64: maiuscoli, minuscoli, grafici, inversi ecc, mappati in opportune locazioni della ROM interna. Come abbiamo visto, ogni carattere è descritto da 8 numeri interi - minori di 256 - contenuti in 8 locazioni di memoria successive; ogni carattere ha un numero di codice, cui si fa riferimento per individuare I'inizio della descrizione, che starà a partire dalla locazione  

(inizio mappa) + (cod. schermo) x 8.  

L'inizio della mappa, codificato nel contenuto della locazione 53272, può esser modificato, consentendoci di sostituire la solita mappa con una a nostra scelta. Solitamente non si desidera rimpiazzare tutti i caratteri, ma solo una parte, ad esempio quelli in carattere inverso: in quel caso la nuova mappa sarà realizzata andando a leggere (con delle PEEK) i gruppi di 8 byte corrispondenti ai soliti caratteri, e andando a porli nella nuova mappa (tramite le POKE), per poi completare I'opera modificando i valori che definiscono i nostri caratteri.  

Dato che ogni set di caratteri contiene 256 elementi, come visto di 8 byte I'uno, ogni mappa dovrà estendersi per  

256 x 8 = 2048 byte  

Le mappe del 64 sono come detto due, e sono selezionabili premendo contemporaneamente i tasti SHIFT e CBM. Noi potremo scegliere un blocco da 2K byte all'interno della zona da 16K prescelta in precedenza agendo sulla locazione 56576 (sempre dopo aver specificato il valore della locazione 56578): questa si fa agendo sui contenuto della locazione 53272 tramite il comando: 

POKE 53272, (PEEK (53272) AND 240) OR B) sapendo che la formula è  

(inizio blocco 2K) = (inizio blocco 16K) + 1Kx B;  

ovviamente, poiché ci servono blocchi da 2K, useremo solo valori pari di B.  

Colpo di scena! Se tra i banchi da 16K si se1eziona quello di codice 0, o quello di codice 2, e si sceglie a $1000 e $1800 l'inizio del generatore di caratteri, si ha l'immagine della ROM già presente nella macchina, quindi in definitiva non potremo alterare nulla. Per usare una mappa RAM, modificabile a nostro piacimento, bisognerà scegliere inizi diversi da quei due valori, oppure tra i blocchi da 16K selezionare quello di codice I o 3.  

Interrompiamo le interruzioni  

Per agire sulla mappa di memoria, differentemente da quanta accadeva sui VIC, il 64 richiede la disabilitazione degli interrupt: questa può esser realizzata da Basic tramite un'opportuna istruzione di mascheratura:  

10 POKE 56334. PEEK (56334) AND 254.  

Questa riga di programma, come pure quelle che seguono, vanno messe in un listatino con i numeri di linea, poiché la disabilitazione degli interrupt ha come effetto collaterale la sconnessione della tastiera, il che rende ovviamente impossibile continuare a digitare le istruzioni in modo diretto. Inoltre bisogna momentaneamente sconnettere l'intero blocco della zona di Input-Output, con una  

20 POKE 1, PEEK (1) AND 251;  

entrambe queste funzioni andranno riabilitate quando avremo finito di trasferire la nostra mappa.  

Trasferiremo nella nuova RAM il contenuto della solita ROM, in modo da avere un set di caratteri in RAM; successivamente modificheremo parzialmente questo set. Per copiare la ROM in RAM basterà la linea  

30 FOR T=0 TO 2047: POKE 2048+T, PEEK (53248+T): NEXT  

e poi dovremo invertire le operazioni sugli interrupt e sulla selezione del banco I/O; 40 POKE 1, PEEK (1) OR 4: POKE 56334, PEEK (56334) OR 1.  

Adesso abbiamo un completo set di caratteri, quello di maiuscole, a partire dalla locazione 2048 fino alla 4095; per stabilire da dove partono i dati del carattere che andremo a modificare vale la regola (indir. inizio mappa) x (codice di schermo del caratt.) x 8;  

e i codici di schermo sono a pag. 132 del manuale in inglese.  

I dati del carattere di codice 0 (la chiocccioletta) partiranno dunque dalla locazione di inizio della mappa, cioè da 2048. Per modificarli dovremo sostituircene di nuovi: ad esempio, per mettere una nota musicale al loro posto, come si capisce dalla figura 3 dovremo far girare il seguente programmino (anche stavolta con i numeri di linea per la presenza dei READ-DATA):  

50 FOR T=2048 TO 2048+7

60 READ G: POKE T,G

70 NEXT

90 DATA 24,20.20,18,48,112,96,0  

e adesso, premendo la chioccioletta, avrete il grazioso simbolo musicale.  

Il Multicolor  

Ripetiamo che il funzionamento a caratteri multicolor differisce da quello standard basilarmente perché la corrispondenza tra bit della mappa e punti dello schermo non è 1 a 1, bensì di 1 a 2: ogni punto sullo schermo viene identificato da due bit consecutivi della mappa, che contengono il codice del colore con cui si vuole visualizzarlo, mentre le dimensioni raddoppiano in orizzontale per poter coprire la stessa superficie. Quindi, ad esempio, considerando la seguente riga di 8 cifre binarie: 00100111  

come una delle 8 righe che definiscono la matrice di un carattere in multicolor, avremo la seguente disposizione grafica e cromatica:  

AABBCCDD  

ove A, B, C e D sono i 4 colori di codici rispettivi 00 (sfondo), 10, 01, 11, ognuno considerato per due punti elementari successivi. II risultato può esser considerato come una griglia 4 x 8 in cui i singoli  elementi hanno la dimensione orizzontale raddoppiata (vedi sempre fig. 2).  

II modo multicolor, come al solito, va abilitato, e la locazione su cui agire è la 53270:  

POKE 53270. PEEK (53270) OR 2^4.  

Quando si vorrà tornare al modo standard si dovrà rimettere tutto a posto, usando quindi la seguente istruzione:  

POKE 53270. PEEK (53270) AND (255 – 2^4).  

Tonando alla gestione di questo tipo di visualizzazione, i quattro codici di colore sono contenuti nelle locazioni che partono da 53281: quello dello sfondo (0 di codice 00) sta proprio nella 53281; quello che corrisponde a 01 in 53282; quello di 10 in 53283; quello di 11 in 53284. Abbiamo a disposizione 8 colori, che si abilitano mollificando i tre bit meno significativi delle locazioni citate; il quarto bit andrà comunque posto ad 1, mentre i quattro più significativi sono tenuti alti (pari ad 1) dal sistema stesso. Per questa motivo se andiamo a leggere (con una PEEK) il, contenuto di queste locazioni, troviamo sempre un numero maggiore di 240, anche se ci andiamo a mettere (tramite una POKE) un valore diverso: il sistema considererà solo i bit più bassi, quindi  

POKE 53281,13  

porterà in lettura, tramite una  

PRINT PEEK (53281) 

il valore 240 + 13 = 253. 

Un editore di caratteri  

Prima di caricare il programma, sia da nastro che da disco, è necessario spostare I'inizio della memoria destinata al Basic, onde creare lo spazio necessario alla nuova mappa di caratteri in RAM. Ciò avviene - come visto - con la seguente sequenza di comandi:  

POKE 44.16: POKE 43,1: POKE 4096,0: NEW  

[return],  

di modo che lo spazio di memoria tra 2048 e 4095 (2K byte) ospiterà la citata mappa.  

Al RUN farà seguito un menu di 4 opzioni:  

  • (1) trasferimento in RAM della ROM, e sua attivazione (in linguaggio macchina);

  • (2) scelta del tipo di carattere (quale, standard o multicolor), e successiva gestione di una griglia 8 x 8, i cui caratteri corrispondono ai bit della mappa;

  • (3) salvataggio della mappa su memoria di massa;

  • (4) caricamento della mappa da memoria di massa.

 Aggiungiamo alcune note sulla seconda opzione. Quando si è in ambiente di progetto del carattere, ovvero all'interno della griglia 8 x 8, ci si muove sfruttando gli usuali tasti del cursore. La determinazione dei punti accesi viene fatta con i tasti funzione sulla destra: in modo standard, F1 corrisponde ad un punto non acceso (colore dello sfondo), mentre F3 è un punto visibile (il cui colore, 10 ricordiamo, e contenuto in 53281); in multicolor F3, F5 ed F7 scelgono il colore del punto (doppio) da accendere, mentre F1 continua a cancellare.

 


Impaginato originale...


  Clicca per ingrandire...
Clicca per ingrandire... Clicca per ingrandire...
Clicca per ingrandire... Clicca per ingrandire...
Clicca per ingrandire...  

Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui