ITALIA  
 
Commodore 64 vs. Sinclair Spectrum :: La Grafica
 
 
 
Schermata di avvio dello Spectrum +2
Saturare i colori
L'hardware dello Spectrum genera 8 colori brillanti e molto saturi anche in condizioni normali. Questi colori risaltano in pagine testuali ed in giochi con elementi grafici ed animazioni su sfondo nero. Tuttavia si rivelano spesso inadatti a gestire immagini di tipo più realistico. I colori del 64 sono di base 16, con tonalità leggermente diverse da quelli dello Spectrum e, in condizioni normali, parzialmente desaturati. Questo, combinato con il multicolor, li rende adatti a rappresentare sfondi colorati a tutto schermo di scene più realistiche come i fondali di numerosi giochi, a partire dal vecchio Summer Games. Se si desira una maggiore saturazione fino ad arrivare alle gradazioni di altri micro come lo Spectrum o il VIC-20 basta aumentare i livelli di colore e contrasto sul televisore e/o ritoccare il trimmer centrale del modulatore RF interno. Un elevata saturazione tuttavia tende a far assomigliare troppo tra loro alcuni colori ed è pertanto sconsigliata per quei giochi in multicolor ove la varietà dei fondali ne risenta.
 
Scrolling, sprite e frame rate nello Spectrum
Non avendo a disposizione un integrato specializzato nella gestione del video, lo Spectrum deve fare affidamento sullo Z80 al quale spetta il compito di gestire lo scroll ed il movimento degli sprite nei giochi. La gestione delle animazioni via software richiede che ogni singolo sprite in movimento venga continuamente cancellato e ridisegnato nella nuova posizione, mentre il fondale ivi presente deve essere salvato in memoria e quello nella vecchia posizione ripristinato. Anche se si usano blocchi già pronti da intercambiare all'occorrenza ciò comporta numerosi accessi alla memoria, proprio l'operazione dove lo Z80 è penalizzato. In maniera analoga lo scrolling richiede un continuo movimento dei dati sul video. Bisogna poi gestire anche le eventuali collisioni con il fondale, il bordo o gli altri sprite, ciò che comporta un continuo esame della posizione degli stessi. Purtroppo lo Z80 si rivela inadatto a sobbarcarsi da solo tutti questi compiti con il risultato che molti giochi per lo Spectrum risultano scattosi e poco fluidi. Spesso i programmatori preferivano utilizzare un fondale monocromatico (o nessun fondale) oppure rinunciare allo scrolling dividendo il gioco in schermate separate consecutive. In molti giochi per lo Spectrum che richiedevano un po' di potenza in più spesso il frame rate si attestava su i 15-20 fps laddove sul Commodore 64 si avevano invece animazioni morbide e scrolling fluido anche in velocità con frame rate pieno a 50 fps.

Il chip MOS VIC-II

La grafica nel Commodore 64 è gestita dall'integrato 6567 VIC-II, all' epoca uno dei più avanzati nel settore home. Si tratta di un chip custom con 47 registri interni più un raster register programmabili a piacere e capace di generare grafica bitmap con risoluzione massima di 320x200. Esso è un po' la "scheda grafica" del Commodore 64. Il VIC-II è capace di visualizzare 16 colori contemporanei su schermo, gestire 5 modi grafici diversi più 3 modi invalidi, non documentati ma settabili. La risoluzione del testo è di 38 o 40 colonne per 24 o 25 linee, sempre in 16 colori. Oltre alla grafica bitmap il VIC-II può gestire 8 animazioni indipendenti con stretch X-Y e collision detection multiplexabili a 16, 24 ed anche più utilizzando il registro raster. Ha inoltre la possibilità di definire uno o più set di caratteri grafici custom ognuno contenente fino a 256 caratteri, possibilità di hardware scrolling, capacità di gestire direttamente 16k di DRAM alla volta e di utilizzare una linea di interrupt (4 sorgenti interne di interrupt) [1].

 
MOS VIC-II
La complessità di questo chip ha portato col tempo alla scoperta di diversi modi non documentati e allo sviluppo di trucchi e tecniche anche ingegnose per ottenere molto di più di quanto la Commodore stessa avesse previsto. Ufficialmente, oltre alle modalità testuali, dispondedi una modalità bitmap 320x200 a 16 colori con 2 colori da una palette di 16 per ogni macroblocco di 8x8 pixel (sfondo e soggetto) ed il bitmap multicolor dove, a spese della risoluzione orizzontale, adesso 160x200 poichè i pixel raddoppiano in larghezza, permette di utilizzare 4 colori per macroblocco di 4x8 pixel. Questi stessi modi sono disponibili per gli sprites creando così sprites mono- bi- o multicolore, con in più lo scaling (ufficialmente solo 2x) e collision detection fra loro, col bordo o con testo/grafica bitmap. Le animazioni sono completamente indipendenti dal fondale ed è ad esempio possibile utilizzare sprites in alta risoluzioni su fondali multicolor o viceversa.

Tra gli "effetti" speciali ottenibili ricordiamo l'apertura del bordo, che il VIC II genera "blankando" l'area più esterna dello schermo, rendendo in questo modo visibile la grafica coperta. La tecnica FLI che permette di assegnare un diverso colore ad ogni pixel. IFLI, XFLI e simili che permettono di simulare tonalità di colore intermedie aumentando via software il numero di colori fino a 128 ottenuti alternando pixel di due colori diversi e generando così un' interpretazione di fase completamente nuova (color blends). La tecnica di sprite stretching che permette di superare la limitazione imposta dallo stretching solo 2x degli sprite, ottenendo un fattore di scala qualsiasi. Ci sono molte altre tecniche possibili, ognuna con vantaggi e svantaggi, alcune però richiedono un certo uso della CPU e quindi limitano le possibilità della macchina [2].

Un immagine bitmap in 320x200 da The Hobbit per C64

La grafica dello Spectrum

La grafica bitmapped dello Spectrum è caratterizzata da una sola modalità che viene utilizzata sia in modo testo che in modo grafico vero e proprio, con una leggera riduzione delle linee verticali quando si utilizzano i comandi grafici da BASIC. La risoluzione è fissa, settata a 256x192 punti con un massimo di 8 colori su schermo e di 2 colori per macroblocco di 8x8 pixel. In particolare, alcuni sostengono che lo Spectrum sia dotato effettivamente non di 8 ma bensì di 16 colori. In realtà ciò non è corretto ed è spesso fonte di errori. Agli 8 colori disponibili di base si affiancano 8 colori BRIGHT, ovvero tonalità leggermente più luminose dei colori base. Tuttavia è necessario notare che non esiste un nero bright e che per alcuni colori come blu e rosso, le tonalità osservate su un normale televisore sono praticamente identiche. Ma soprattutto non si deve dimenticare che il BRIGHT è un attributo di cella e che quindi in un macroblocco di 8x8 pixel non è possibile ad esempio utilizzare un colore normale ed uno bright insieme. Nonostante le limitazioni, per il 1982 questa è comunque una buona modalità grafica, almeno rispetto ai micro precedenti, sia per risoluzione che per numero di colori.

La generazione della grafica, come tutto quello di cui non si occupa la CPU del resto, è demandata alla ULA che è un integrato generico e che non può essere programmato per ottenere modi grafici diversi. Quanto detto spiega perché molti dei giochi dello Spectrum graficamente si somiglino. Infatti a causa della limitazione ad un solo modo grafico e a 2 colori per macroblocco si nota spesso come diversi personaggi, nemici, oggetti o parti della grafica siano tutti "monocolore", tipicamente su sfondo nero. Ad esempio l'eroe è tutto giallo, la porta è tutta verde, il nemico è tutto celeste ecc... altri effetti artificiosi si notano quando due oggetti di colore diverso in movimento si accavallano ed uno tende a "colorare" l'altro (colour clash). Analogamente un altro effetto ben noto si ottiene tentando di realizzare "sprites" multicolore o grafica statica multicolore: si nota spesso come in certe parti del disegno (dove la curva di pixel separa due zone diversamente colorate come ad esempio monti-cielo) i colori tendano a "traboccare" dove non dovrebbero, su piccole aree squadrate. Tecniche utilizzate per limitare questi effetti tendono a prediligere zone di nero (o di bianco se lo sfondo è bianco ecc...) più o meno ampie da interporre tra le diverse parti colorate, facendo si che diversi giochi per Spectrum risultino abbastanza "vuoti" (ad esempio quelli sulla falsariga di Atic Atac), oppure evitano completamente il colore, generando così giochi monocromatici, allineano la grafica a blocchi di 8x8 pixel in tutte le direzioni in modo da avere coincidenza tra gli elementi grafici e gli attributi colore delle celle, ma limitando così la libertà dei programmatori, circondano gli sprite di uno spesso contorno nero in modo da ridurre il clashing [3]. Si noti che questa stessa modalità è disponibile ed utilizzabile per giochi o programmi anche sul C64, con un numero di punti maggiore e con l'ausilio delle animazioni hardware da affiancare a quelle software. Questo modo viene effettivamente usato per diversi giochi, incluse molte avventure grafiche e quasi tutti i porting di giochi da Spectrum a Commodore 64. Lo Spectrum non dispone di una modalità testuale vera e propria poiché anche in modo testo i caratteri vengono visualizzati scrivendo direttamente nel display file, in pratica vengono letteralmente disegnati. Questo rende la modalità pseudo testuale dello Spectrum più lenta (a causa del maggior numero di accessi alla memoria video) rispetto a quella di altri micro. Da questo punto di vista l'utilizzo di caratteri ridefiniti non fornisce prestazioni migliori, né aiuta a ridurre l'occupazione di memoria poiché la grafica deve ancora trovar posto nel display file statico. Nel Commodore 64 invece i caratteri ridefiniti combinati con la modalità testuale rappresentano un punto di forza sia per il risparmio di memoria (la modalità testuale necessita solo di 1000 bytes di memoria schermo, a cui aggiungiamo il set di caratteri che occupa al massimo 2K), sia per il ridotto numero di accessi alla RAM necessari che porta così a velocizzare le operazioni.

La memoria contesa

Un'altro dei problemi che affligge lo Spectrum nella generazione della grafica è quello della memoria contesa. Il problema nasce dal fatto che i 16K di memoria inferiori, quelli dove si trova anche il display file, non possono essere letti contemporaneamente da due dispositivi (cioè la ULA e la CPU). D'altra parte la ULA deve poter accedere a questa memoria perché ha bisogno costantemente di attingere ai dati per la generazione dell'immagine. Poiché il fascio di elettroni del televisore non può essere interrotto, la ULA deve avere la priorità nell'accesso ed ha la capacità di stoppare momentaneamente il processore. Ciò significa che l'esecuzione di codice che si trovi in quest'area di memoria o accessi in lettura o scrittura alla stessa risulteranno più lenti. A seconda del momento dell'esecuzione una istruzione può richiedere fino a 6 cicli in più del normale. Per tali motivi è problematico eseguire routine di salvataggio o che producano dei suoni, le temporizzazioni infatti risulterebbero sballate ed i suoni andrebbero fuori fase [4]. Problemi simili si verificano anche nella gestione dell'I/O dando luogo all'I/O contesa. Nel Commodore 64 invece niente di tutto questo si verifica. Il VIC-II è compatibile bus 6502 e ciò significa che la CPU ed il processore video possono accedere alla memoria nello stesso ciclo di clock (una delle peculiarità degli integrati serie 6500) utilizzando i diversi fronti (salita e discesa) dell'impulso di clock. Il VIC-II non ha bisogno di fermare il processore e non esiste il problema della memoria contesa: le routine possono essere piazzate ovunque senza problemi. L'unico caso in cui il VIC-II richiede cicli aggiuntivi è quando deve prelevare i dati per gli sprite. Il rallentamento è nell'ordine di pochi punti percentuali.

Riassunto delle caratteristiche grafiche

Numero di colori: 16
Risoluzione:
320x200 bitmap, 2 colori tra 16 per ogni blocco 8x8.
160x200 bitmap, 4 colori tra 16 per ogni blocco 8x4.
40x25, 40x24, 38x25, 38x24 testuali in 16 colori.
Caratteri ridefinibili:
si, 256 per ogni set, intercambiabili.
Sprite hardware:
si, 8 indipendenti single o multicolor, multiplexabili.
Sprite software:
si.
Scroll fine hardware:
si.
Registro raster:
si.
Memoria video gestibile:
fino a 64K in banchi da 16K intercambiabili.

Numero di colori: 8
Risoluzione:
256x192 bitmap, 2 colori tra 8 per ogni blocco da 8x8 con attributo bright.
32x24 pseudo-testuale generata in bitmap, 8 colori con attributo bright.
Caratteri ridefinibili: si, 256 per ogni set, intercambiabili.
Sprite hardware: no.
Sprite software:
si.
Scroll fine hardware:
no.
Registro raster:
no.
Memoria video gestibile:
6.5K, display file statico.

Riferimenti
[1],[2] The MOS 6567/6569 video controller (VIC-II) and its application in the Commodore 64, Christian Bauer, 28 agosto 1996
[3] Computer_Graphics During The 8 bit Computer Era, Steven Collins, 1998
[4] comp.sys.sinclair FAQ, 16K/48K Spectrum Reference