|
|
|
|
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
|
|
|
|