Sull'Articolo -
PROGRAMMAZIONE GRAFICA - FUNZIONAMENTO VECCHIE SCHEDE VIDEO di Giovanni Ceglia - giovanniceglia@xungame.com (é stato visto 11159 volte) |
(prima parte) by Giovanni Ceglia
Premetto che questo articolo spiegherà il funzionamento e quindi le tecniche di programmazione grafica di base, molto a basso livello per hardware e software preciso e specifico, quindi questo mini tutorials non va inteso come guida generica, anche se i principi di funzionamento potrebbero essere simili per altre architetture.
L'hardware a cui si riferisce questo mini tutorial, sono gli elaboratori che montano processori della famiglia x86 di Intel, con schede un pò vecchiotte, ed un sistema operativo funzionante in modalità del processore così detta reale. Per chi non
lo sapesse i processori della famiglia x86 Intel e compatibili, possono lavorare (almeno fino ad adesso - sempre mie conoscenze, le cose potrebbero evolversi da un momento all'altro) in tre modalità, le quali sono la modalità reale che è quella di default e di avvio dei vari processori della famiglia, la modalità x86 virtuale e la modalità protetta, salvo poi evoluzioni che potrebbero portare alla nascità di nuovi processori della famiglia con aggiuntive modalità operative, in linea di massima per il momento sono queste. Riepilogando:
- modalità reale e di default
- modalità 8086 virtuale
- modalità protetta
Prima di cominciare a giochicchiare un pò nella realizzazione di programmi per la grafica, bisogna fare alcune premesse, riguardo l'architettura dei vecchi processori della famiglia x86 e sulle tre modalità operative.
La modalità di default è quella "reale" la quale fa operare il processore come se fosse un processore sempre a 16bit ed utilizza un indirizzamento a 20bit, tramite coppie di registri a 16bit, ora quì non voglio mettermi a spiegare le varie istruzioni di accesso alla memoria ecc. ecc.. e non voglio spiegare il perchè di certe cosè che spiegherò comunque in altri mini tutorial, ma mi limiterò a dire che se qualcosa viene fatta in un certo modo, è dovuto alla tale modalità di esecuzione del processore e a tale architettura hardware.
Questa premessa era necessaria siccome oggi giorno (al momento in cui scrivo - anno 2002 ) i sistemi più utilizzati, parlo dei sistemi operativi, non utilizzano la modalità reale del processore, ma quella protetta, mentre questo tutorial spiegherà i meccanismi per quella reale e poi appena avrò sperimentato anche quella protetta, scriverò il seguito a tutto questo.
Siete dunque avvisati, miei cari amici che se quello che io scriverò qui non vi funziona è probabilmente dovuto al fatto che lo state sperimentando in una modalità del processore differente e i risultati in questo caso potrebbero essere solo un bel crash di windows con le relative conseguenze se usate windows e un messaggio di errore se usate sistemi più seri e professionali, tipo unix e tutti i suoi cloni (Linux).
Brevemente dico solamente che per accedere ad un'area di memoria in modalità reale, si utilizza la tecnica della segmentazione con indirizzo di spiazzamento, dove viene indicata prima la pagina da raggiungere e poi lo spiazzamento, solitamente le pagine sono di dimensione pari a 16 bytes. A noi interessa raggiungere l'area di memoria dopo i primi 640k di memoria. Premesso che in modalità reale è possibile indirizzare soltanto un 1 megabyte di memoria ram.
L'area che ci interessa sono i 64k dopo i primi 640k che le schede video (almeno quelle vecchie) utilizzavano come area di buffer/swap dei dati, in pratica quello che c'è nei 64k dopo i primi 640k viene ricopiato tale e quale nella memoria video.
A questo punto le nostre conoscenze sono più ampie e quindi possiamo proseguire in questa avventura e sperimentare qualcosa che non vi farà diventare dei guru della programmazione grafica, ma che vi darà sicuramente delle soddisfazioni se avete letto tutto con attenzione.
Passiamo a due numeri, detto che la memoria viene vista in modalità reale come una serie di segmenti ognuno di 16 bytes, per accedere dovremmo trovare prima il segmento, il cui indirizzo è A000 in hesadecimale, praticamente 40960 in decimale, e poi da questo potremo accedere ad ogni singolo byte dell'area di scambio dati di 64k tra memoria video e memoria ram.
Senza spiegare adesso l'architettura dell ' 8086, faccio un esempio di accesso con tale processore alla memoria dopo i primi 640k:
Ricordate però che non tutte le schede video potrebbero utilizzare quella zona per lo scambio, quindi non è detto che funzioni sempre e per sempre, però io non ho mai visto una scheda video che non utilizzasse quell'area di memoria per lo scambio.
;Codice per processori 80x86 e superiori operanti in modalità reale.
;Codice in assembly scritto con sintassi Intel
mov ax,A000h
mov es,ax
mov di,32000
mov es:byte ptr [di],50d
Questo codice se avete inizializzato la grafica, vi metterà un puntino al centro del buffer video, se la grafica è inizializzata per esempio a 320x200x256 colori vi piazzerà un bel puntino verde (probabilmente) al centro del video.
Mi stavo dunque dimenticando di dire alcune cose molto importanti sulle modalità operative delle schede video, le schede video possono operare in vare modalità ed hanno comportamenti differenti a seconda della loro modalità e della marca e del modello. Per esempio come ho detto solitamente viene utilizzata l'area dopo i A0000 bytes di memoria (è corretto con 5 per chè ho indicato i bytes non i segmenti di 16, rifletteteci) per lo scambio dati tra memoria video e memoria grafica, ma questo avviene per esempio solo in alcune modalità operative delle schede grafiche, infatti in modalità testo per esempio vengono utilizzate altre aree che sono quella dopo B0000 oppure dopo B8000, a seconda della scheda grafica e della marca e versione.
Con questo quindi bisogna dire che esistono migliaia di modalità operative per le schede grafiche, differenti in base alla scheda video, marca, modello ecc... ecc.... e prima era una tragedia creare giochi per certe risoluzioni, infatti i giochi vecchi venivano programmati quasi sempre per risoluzioni standard.
Esistono delle risoluzioni che sono da considerarsi standard per il loro funzionamento che va sotto alcuni parametri specifici, non mi dilungherò sulle modalità a 2, 4 o 16 colori, ma mi soffermerò sulla madre di tutte le modalità storiche per i primi videogames, cioè la famosissima modalità 320x200x256, modalità standard esistono ovviamente anche per la modalità testo.
Un'altra cosa da dire giusto per curiosità è la differenza che esiste fra modalità testo e modalità video, che sta nel fatto che in modalità testo i valori che sono swappati in memoria video, rappresentano non dei punti, ma delle lettere, dei caratteri ascii che vengono visualizzati come tali, a seconda del set del video e della schede grafica, mentre in modalità grafica i valori sono dei punti, con alcune precisazioni da fare sul loro significato a seconda della risoluzione.
Detto questo bisogna adesso conoscere come attivare una modalità grafica, ebbene è possibili attraverso le interruzioni o servizi della bios, oppure attraverso la programmazione diretta (questo vale sempre e solo per la modalità reale del processore) delle varie schede (non lo illustrerò mai, perchè non l'ho mai fatto e mai lo farò, tuttavia alcune cose verranno fatte in questo modo).
L'interruzione che ci interessa è la 10h, cioè quella che permette di operare sul video. La modalità standard che utilizzeremo per giochicchiare un pochino, sarà la 320x200x256 colori (in seguito verrà spiegato come utilizzare altre modalità più avanzate) .
Il valore per identificare la modalità è il 13h che corrisponde appunto alla 320x200x256 e che era ed è un valore standard di riferimeno, quindi dovrebbe funzionare sul 99% delle schede grafiche esistenti sulla faccia della terra.
Quindi per attivare la modalità grafica a 320x200x256 che ricordo a tutti, è una modalità standard e quindi funziona in maniera identica su più schede grafiche, basta mandare nel registro AX il valore della modalità e poi richiamare l'interruzione, in questo modo:
;Codice in Assembly per X86 Intel
;Codice che inizializza a 320x200x256 colori.
mov ax,13h
int 10h
Per tornare in modalità testo:
;Codice in Assembly per X86 Intel
;Codice che inizializza a 40x25x16 colori.
mov ax,03h
int 10h
A questo punto non ci resta che scrivere delle funzioni più serie ed utilizzabili, in modo che possiamo portare
ed utilizzare facilmente quello che abbiamo appena imparato, ma per questo rimando al prossimo articolo.