venerdì 2 luglio 2010

VGA

Print
Nel 1987 IBM definisce le specifiche dello standard VGA (Video Graphics Array) che di fatto va a livellare le capacità grafiche degli home computer degli anni '90. I sistemi più votati al gaming (Atari ST ed Amiga) restano leggermente superiori grazie all'hardware dedicato che, gli permette di gestire in modo più agevole sprite e scrolling; a tali limitazioni si sopperirà grazie all'incremento della potenza di calcolo dei PC (i 486 stanno per arrivare!!!).


Prima di buttarci a capofitto nell'analisi delle specifiche tecniche voglio farvi notare la particolarità dell'acronimo VGA, in cui l'ultima lettera "perde" il significato di Adapter (adattatore, come era stato per CGA ed EGA) a favore di Array (vettore). La nuova definizione deriva dall'adozione, da parte di IBM, del modello single-chip, abbandonando il precedente che prevedeva la presenza diversi componenti aggiuntivi. Questo approccio facilita il processo costruttivo della scheda in quanto al chip VGA dovranno essere affiancati unicamente la memoria video, l'oscillatore al quarzo (il mitico clock!) ed il RAMDAC (per la conversione analogica-digitale del contenuto delle memoria).
Tutt'oggi la VGA è il "comune denominatore" che tutte le schede video (si anche la tua ATI Radeon HD 5970 con 2GB DDR5!!!!) devono essere in grado di gestire prima che il sistema operativo carichi il driver specifico. Quando il sistema operativo non "trova" il driver specifico della scheda si avvia in modalità VGA (te ne accorgerai subito dopo avere installato la tua Radeon nuova fiammante!!!).

Specifiche tecniche

Le specifiche della VGA sono le seguenti:
  • 256 KB di RAM
  • modalità a 16 e 256 colori
  • tavolozza di 262,144 colori
  • clock principale tra 25,175 MHz o 28,322 MHz
  • frequenza di aggiornamento fino 70 Hz
  • Vertical Blank Interrupt (come il buon vecchio C64)
  • modalità planare fino a 16 colori (4 piani di bit)
  • modalità packed-pixel a 256 colori
  • font ridefinibili
  • Barrel Shifter per  velocizzare alcune operazioni in aritmentica a virgola mobile
  • gestione hardware dello scrolling
Modalità grafiche

Le modalità grafiche standard sono le seguenti:
  • 640x480x16 colori
  • 640x350x16 colori
  • 320x200x16 colori
  • 320x200x256 colori
Oltre a questa modalità la VGA può essere configurata per emulare le modalità delle schede che ha sostituito (EGA e CGA).

Il termine VGA è diventato di uso comune per definire la risoluzione 640x480 indipendentemente dall'hardware utilizzato per visualizzarla.

Modalità testuali

Le modalità alfanumeriche standard della VGA utilizzano 40x25 o 80x25 caselle di testo. Ogni cella può utilizzare uno dei 16 colori disponibili per il carattere (l'intera palette della vecchia CGA) e 8 per lo sfondo (i soli colori a bassa intensità).Ogni carattere può essere fatto lampeggiare e tutti i caratteri che lampeggia lo fanno all'unisono. Se si "rinuncia" alla possibilità di far lampeggiare le caselle di testo, si possono utilizzare i 16 colori anche per lo sfondo.

Nelle modalità testuali ogni carattere è rappresentato da due byte. Il byte basso (o byte carattere) rappresenta il codice del carattere che verrà visualizzato, il byte alto (o byte attributi) descrive le proprietà ad esso associate quali colore di sfondo, colore del carattere, font-set e blinking.

La tabella seguente riassume quanto descritto:

Attributi Carattere
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
blink**   colore di sfondo colore carattere* codice carattere

*: il bit 3 del byte alto seleziona il font-set da utilizzare, tra i due disponibili se diversi, o completa il colore (se i font-set sono uguali)
**: il bit 7 del byte alto imposta la condizione di blinking, o il quarto bit del colore di sfondo in base alla modalità selezionata

Come accennato la VGA mette a disposizione due font-set liberamente ridefinibili. Ogni carattere è definito da una matrice di 8x8 pixel. In alcune modalità, come ad esempio la 80x25, ogni carattere è descritto da una matrice 9x16 pixel; in queste configurazioni il nono bit può valere 0 per ogni linea, oppure nella modalità Line Graphics Enable, il bit ha lo stesso valore di quello più a destra (il bit 0). Questa modalità viene utilizzata per realizzare pseudo grafica in modalità testuale.

Segue la tabella riassuntiva delle modalità grafiche e testuali della VGA

ModoTipo Risoluzione Caratteri Colori
0h,1h Testo 360x400 40x25 16
2h,3h Testo 720x400 80x25 16
4h,5h Grafica 320x200 40x25 4
6h Grafica 640x200 80x25 2
7h Testo 720x400 80x25 Mono
Dh Grafica 320x200 40x25 16
Eh Grafica 640x200 80x25 16
Fh Grafica 640x350 80x25 Mono
10h Grafica 640x350 80x25 16
11h Grafica 640x480 80x30 2
12h Grafica 640x480 80x30 16
13h Grafica 320x200 40x25 256


La palette

La VGA estende ulteriormente la tavolozza dei colori portandola alla bellezza di 262,144. Il numero dei colori visualizzabili contemporanemente sale a 256 anche se ufficialmente nella sola modalità 320x200 (il famigerato Mode 13h).

Per ogni componente cromatica (rosso, verde e blu) sono disponibili 6 bit, per una profondità di colore totale di 18 bit (2^18 = 262,144 combinazioni differenti). Ovviamente come già per la EGA, ognuno dei 256 colori della palette di default (nella figura seguente) può essere ridefinito pescando a piene mani dalla tavolozza completa (in Xenon 2, recensito nel post precedente, la palette è molto più orientata ai colori metallici come da tradizione dei Bitmap Brothers).



L'utilizzo del RAMDAC permette di realizzare interessanti effetti (come ad esempio il fading, dissolvenza dei colori verso il nero). In pratica tramite l'utilizzo di un DAC fa si che ridefinendo "al volo" un colore della palette utilizzata, questo si rifletta automaticamente a video. Giocando un po' con i gradienti di colori, il gioco è fatto :o)

Tweaked mode

Nel tentativo di portare la VGA ai suoi limiti nel corso degli anni furono scoperte diverse modalità truccate che permisero di utilizzare risoluzioni e tecniche non standard. La più famosa di queste è senza dubbio il Mode X (come fu battezzata da Michael Abrash, suo scopritore) modalità tweacked del Mode 13h.

Nelle modalità grafiche standard della VGA (quindi anche nel Mode 13h), la memoria è vista come un insieme di locazioni di memoria consecutive che "mappano" uno ad uno i pixel del video; per la modalità 320x200x256 colori si ha l'impressione di accedere ad un'area di memoria sequenziale di 64KB. In realtà tutte le modalità grafiche della VGA hanno una rappresentazione planare, su 4 piani di bit, della memoria video: il colore del pixel non è specificato in aree sequanziali della memoria ma suddivisa tra più blocchi (i bit-plane). Il primo pixel è mappato sul primo byte del primo piano, il secondo è il primo byte del secondo piano e così via. Rispetto alla EGA in cui il calcolo del bit-plane, dato il pixel, era a carico del programmatore, nelle modalità VGA standard tale complessità è demandata del processo grafico, che si incarica di calcolare in quale piano è mappato il pixel che si vuole andare a "colorare". Suppongo che la domanda che si pose Michael Abrash fu: "Possibile che non si riescano a sfruttare in modo più efficente tutti i 256KB di memoria video previsti per la VGA?".
Agendo sui registri di configurazione della VGA, Abrash, riuscì ad avere l'accesso diretto ai bit-plane in barba alla logica interna della scheda che mascherava questa possibilità. La modalità standard di utilizzo della VGA viene da qui in poi denominata chained (incatenata), la nuova unchained (senza catene). Gli americani sono troppo i migliori nell'affibbiare un nome alle cose!!!
L'accesso diretto alla memoria benché complicasse, non di poco, la programmazione e diminuisse l'efficienza dell'esecuzione (i conti prima fatti in hardware, ora erano affidati al programma) si rivelò decisiva grazie ad alcune sue caratteristiche:

  • risoluzione fino a 360x480x256 colori
  • possibilità di utilizzare le tecniche di double e triple buffering ossia sfruttare la maggior memoria video per preparare la videata successiva (back buffer) nel ciclo raster in cui l'immagine corrente (front buffer) viene visualizzata e quindi eseguire un page flipping (scambio di pagina) prima dell'inizio del ciclo di rinfresco successivo (durante il quale, ovviamente, si preparava la nuova immagine!). Se consideriamo la modalita 320x200x256 colori abbiamo a disposizione ben 4 "pagine" sui cui poter operare (320x200x256 = 64KB per ogni videata, da cui 256KB/64KB = 4 pagine)
  • possibilità di valorizzare 4 pixel sulla stessa linea raster in una singola istruzione, sfruttando a proprio vantaggio la logica che nelle modalità standard permette di mascherare la gestione dei bit-plane. Questa tecnica permette di ottimizzare lo riempimento di poligoni e linee e sarà fondamentale per la realizzazione di primi giochi 3D.
In letteratura Mode X è diventato sinonimo della modalità 320x240x256 colori. In tale configurazione, essendo il rapporto tra la risoluzione verticale e quella orizzontale uguale a quelle del monitor (4:3) si può godere del beneficio del pixel quadrato (square pixel) che migliora sensibilmente la qualità dell'immagine.

Tra le modalità più utilizzate voglio ancora ricordare il Mode Y, 320x200x256 colori (come il Mode 13h ma in versione unchained) e il Mode Cube 256x256x256 colori (in questa configurazione a scapito della calo di dettaglio, si ha una maggiore velocità di accesso alla memoria video in quando, non sono necessarie operazioni addizionali per il calcolo del bit-plane).

Indirizzamento

La memoria video della VGA è mappata sulla memoria reale del PC tra i segmenti 0xA0000 e 0xBFFFF (memory mapping), nello specifico gli indirizzi di "partenza" sono i seguenti:

  • 0xA0000 per le modalità grafiche EGA e VGA (64KB)
  • 0xB0000 per le modalità testuali monocromatiche (32 KB)
  • 0xB8000 per le modalità testuali a colori e per quelle grafiche compatibili CGA (32 KB)
Questa separazione tra gli indirizzi permise di realizzare i primi sistemi dual monitor. In buona sostanza installate due schede VGA impostandone una in modalità grafica ed una in modalita testuale monocromatica si può, ad esempio, visualizzare un foglio di calcolo su di un monitor ed il grafico corrispondente sul secondo (in quando le due schede leggono i dati da locazioni differenti delle memoria). Oppure, avere da un parte il programma in esecuzione e dall'altra in debugger in modalità testuale. Fichissimo!!!! :o)

Conclusioni

Bene siamo giunti alla conclusione di questa cavalcata in groppa allo standard VGA. Chiedo scusa fin da ora a tutti gli esperti che noteranno imprecisioni ed omissioni di questo post. Ho volutamente cercato di semplificare i concetti e le tecniche più complesse per rendere la trattazione accessibile a tutti. Questo vuol essere un blog divulgativo che permetta a tutti di farsi un'idea su quelle che erano le caratteristiche dei videogiochi e dell'hardware che hanno fatto il periodo d'oro (a mio avviso) di questo media sui personal computer. Lascio ad altri i tecnicismi esasperati :o)

Vi lascio con sei screenshot di famosissimi giochi PC VGA ... sapete riconoscerli? Attendo le vostre risposte nei commenti ... al vincitore, forse, ricchi premi e cotillons :o)

Alla prossima ...

 

 

 

9 commenti:

  1. Ma quante ne sai Tex! O' ma un giorno un post su Alex Kid lo farai?

    RispondiElimina
  2. Ahhhhhhh ... sacrileggio ... un po' su Alex Kid su un sito per PC!!!!!! Magari potrei permettere al vincitore del quizzone di fare lui un post sul blog su un argomento a lui caro (sempre in tema di videogames ovviamente ... niente cose strane!!!). Dimmi i titoli dei giochi e vinci!!

    RispondiElimina
  3. Avranno già risposto in tanti ma ci provo pure me:
    * Doom
    * Gods
    * Hand Of Fate
    * Lands Of Lore
    * The Secret Of Monkey Island
    * Alone In The Dark

    RispondiElimina
  4. Doom, Gods, Legends Of Kyrandia, Lands Of Lore, Monkey Island II e Alone In The Dark. Ma forse era una domanda retorica. X-D Ad ogni modo, pare che il primo gioco commerciale in VGA fu "War In The Middle Earth", uno strategico basato sul Signore degli Anelli. Ricordo tanto di recensione comparativa che metteva in evidenza le differenze con la "misera" versione EGA, sembrava di stare su un'altra galassia.

    RispondiElimina
  5. Razzista! Allora mi toccherà aspettare parecchio fino a che parlerai di FIFA 98 che insieme ad Alex Kid è stato il gioco da me più giocato

    RispondiElimina
  6. Beh, caro operaio della nuova Sipm visto che siamo al 1990 dovrai aspettare ancora un po' ... ma non disperare .... verrà il tuo momento :o)

    RispondiElimina
  7. Li so li so

    Doom2 , Gods

    Legend of Kyrandia, Lands of Lore

    Monkey Island 2 , Alone in the Dark

    ho vinto qualcosa?

    RispondiElimina
  8. Come hai giustamente osservato, in modo testo a 80 colonne la risoluzione era di 720 per 400 pixel, non di 640 per 400: questo significa che ogni carattere aveva una risoluzione di 9 x 16 pixel... ma in memoria, era registrato con una matrice di 8 x 16 (in modo da poter definire una linea con un byte).

    Questo comporta una ulteriore stranezza della VGA, che non hai citato: memorizzando i caratteri in questo modo, ogni carattere avrebbe la fila di pixel alla sua destra vuota (la prova: scrivendo una serie di underscore ____ si vedeva una riga tratteggiata: un pixel ogni 9 era spento): come fare quindi ad usare i caratteri semigrafici, considerando che alcuni dovevano essere usati per tracciare linee orizzontali continue (senza interruzioni ogni 9 pixel)?

    Dal momento che, nel set di caratteri standard, i caratteri semigrafici che prevedevano di accendere anche qualche pixel all'estrema destra erano tutti raggruppati insieme, è stata usata una soluzione di fortuna: vale a dire, i caratteri da 192 a 220 sono gestiti in un modo un po' diverso: su tutti gli altri caratteri, il nono pixel di ogni riga è sempre spento, mentre nei caratteri tra 192 e 220 il nono pixel di ogni riga è sempre uguale all'ottavo (se l'ottavo pixel è acceso, anche il nono si accende): di conseguenza, per tali caratteri, i pixel dell'ottava colonna sono sempre raddoppiati.

    In condizioni normali non ci si accorge di tale stranezza, che però diventa evidente se si cerca di usare un set di caratteri programmato: i caratteri che devono potersi congiungere con il carattere alla loro destra (ad esempio, per disegnare pulsanti o altri elementi di finestre, come nelle norton utilities) devono per forza trovarsi in tale intervallo, ed è possibile utilizzarne solo 28 (pochino, considerando che i caratteri disponibili sono 256); anche il trucco che permetteva di usare il puntatore del mouse a freccina in modo testo (normalmente, in modo testo, il mouse era un quadratino pieno e "invertente": alcuni programmi, però, usando quattro caratteri ridefiniti, che rappresentavano i caratteri sottostanti il cursore a cui si aggiungeva l'immagine del puntatore, permettevano di mostrare una freccia anche in modo testo) richiedeva di usare almeno due caratteri di tale intervallo, lasciandone liberi solo 26.


    Per questo motivo, giochi come megazeux, che richiedevano un uso intenso dei caratteri ridefiniti, preferivano usare una risoluzione più bassa (la risoluzione EGA, 640 x 350, con caratteri formati da una matrice 8 x 14)

    RispondiElimina
    Risposte
    1. Accidenti grazie mille per il contributo ... ti meriteresti un premio ma visto che c'è la crisi ti dovrai accontentare di un mio sincero grazie!

      A parte gli scherzi ... quanto mi hai raccontato è veramente interessante e meriterebbe un aggiornamento del post ... appena mi riesco a ritagliare un po' di tempo, purtroppo si lavora più prime delle vacanze che durante il resto dell'anno, cercherò di colmare la lacuna.

      Tex

      Elimina