lunedì 24 maggio 2010

Print
Nei post precedenti ho citato più volte lo standard CGA per quanto riguarda la grafica dei primi giochi per PC. Vediamo di scendere un po' più nel dettaglio andando ad inaugurare una nuova serie di articoli, un po' più tecnici, dedicati al retrohardware.

Lo standard CGA (Color Graphics Adapter) viene introdotto da IBM nel 1981 ponendo di fatto le basi per la realizzazione di schede grafiche a colori per PC. Lo standard prevede una profondità di colore di 4 bit con una conseguente palette di 16 colori (2^4).

I tre primi 3 bit da sinistra (3 bit meno significativi) di ogni colore specificano presenza della rispettiva componente RGB (Red, Green, Blue) , il quarto (il più significativo) specifica il valore di intensità che permettere di distinguere la tonalità chiara da quella "normale".

Assegnato ad ogni colore un codice (codice colore) da 0 a 15 le singole componenti cromatiche sono ricavate dalla seguente formula:

rosso = 2/3 * (codiceColore & 4) + 1/3 * (codiceColore & 8);
verde = 2/3 * (codiceColore & 2) + 1/3 * (codiceColore & 8);
blu = 2/3 * (codiceColore & 1) + 1/3 * (codiceColore & 8);

A prima vista può sembrare un macello, ma se ragioniamo con calma chi accorgeremo che:

  • se i bit di colore è a 1 la corrispondente componente cromatica assumo il valore 170 (AA in esadecimale)
  • se il bit di colore è a 0 la corrispondente componente cromatica assume il calore 0
  • se il bit di intensità è a 1, bisogna sommare al valore precedente 85 (ottenendo il valore esadecimale 55 o FF come totale)

Quindi se prendiamo il codice colore 5 (0101) otteniamo il magenta: AA00AA
Se invece prendiamo il codice colore 12 (1100) otteniamo il rosso chiaro: FF5555

Se conoscete come vengono codificati in colori in HTML a questo punto per voi la palette della CGA non ha più nessun segreto :)

Dopo tutto sto pistolotto eccovi la palette CGA in tutto il suo splendore :o)

(0) Nero
000000
(1)Blu
0000AA
(2)Verde
00AA00
(3) Ciano
00AAAA
(4)Rosso
AA0000
(5)Magenta
AA00AA
(6)Marrone
AA5500
(6)Bianco
AAAAAA
(8)Grigio
555555
(9)Blu chiaro
5555FF
(10)Verde
chiaro 55FF55
(11) Ciano chiaro
55FFFF
(12)Rosso chiaro
FF5555
(13)Magenta chiaro
FF55FF
(14)Giallo
FFFF55
(15)Bianco intenso
FFFFFF


Se mi avete seguito con attenzione noterete che nella sequanza dei colori c'è qualcosa che non quadra ... e già il colore con codice 6 dovrebbe essere: (6)Giallo scuro (AAAA00).

Come si spiega questa anomalia? Beh, gli ingegneri di IBM si resero conto che applicando le regole di cui sopra non era disponibile il colore marrone, di conseguenza "fecere un'eccezione" che ci fa arrivare alla seguente formula completa:

rosso = 2/3 * (codiceColore & 4) + 1/3 * (codiceColore & 8);
verde = 2/3 * (codiceColore & 2) + 1/3 * (codiceColore & 8);
blu = 2/3 * (codiceColore & 1) + 1/3 * (codiceColore & 8);

if (codiceColore == 6)
verde = verde / 2;

Da cui essendo il codice colore 6 corrispondente alla seguente configurazione di bit 0110, si ottiene (con semplici calcoli) il risultato: AA5500 (essendo AA/2=55).

Vabbè credo di avervi tediato abbastanza quindi mi taccio e vi rimando al prossimo post per la conclusione di questa "interessante" discussione sullo standard CGA.

1 commento:

  1. Ciao Tex!
    Direi che pur essendo un articolo molto tecnico (almeno per me...per altri magari sara' una cosa semplicissima!) e' fatto davvero bene e ti consiglio di continuare su questa strada....per quanto puo' valere il consiglio di uno come me che di tecnico ha ben poco!
    Continua cosi!

    RispondiElimina