Newsgroup: it.comp.lang.c
Titolo: problemi con midi video DOS

Ciao a tutti. Ho necessitá di spippolare con la memoria video dei modi
12h (EGA 640x480x16 colori) e 101h (SVGA 640x480x256 colori). A quanto
ho capito per la 12h non funziona esattamente nello stesso modo che
per la classica 13h (puntatore ad A0000000L e via), perché mi da
stranissimi risultati: dove sbaglio? Magari la memoria video di questa
modalitá comincia in un altro punto? E per la palette mi regolo come
per la 13h (ma con solo 16 colori, certo)?
Per quanto riguarda la 101h, é in unchainde mode, ma come mi regolo
(so come funziona il modo, non so peró l'indirizzo esatto dei quattro
segmenti e come regolarmi per la palette).
Qualche anima pia mi da' una mano?
Ciaoo!
giu

E' una vita che non tratto più questi argomenti, quindi non ti prometto che
sia la esatto.
Se non ricordo male, essendo la modalità ega a 16 colori, i punti
necessitano solo di 4 bit, quindi vanno passati a coppie.
4 bit per un pixel e 4 per quello successivo.
Da qualche parte dovrei avere un vecchio libro sulla VGA, controllerò.


ti ringrazio molto, avevo problemi particolarmente con la maledetta
12h (con al 101h riesco a disegnare anche se per ora é lentissimo), in
particolare per la gestione dei coloro e l'uso diretto del segmento di
memoria video (anzi DEI segmenti); eppoi, come faccio a settare solo
quattro bit lavorando su dei char (8 bit). Scusa ancora le domande da
neofita, se trovi qualcosa ti ringrazio (non ci perdere la vita,
comunque :)
giu

>come faccio a settare solo quattro bit lavorando su dei char (8 bit).
Per ora non ho potuto controllare i miei manuali per la gestione della
memoria video in EGA.
Cmq. per settare 4 bit su dei char da 8 basta ricorrere alle istruzioni dei
processori che servono a smaltire anche calcoli che risulterebbero più
complessi.
USA lo shifting dei registri.
La logica è questa. se tu hai due char (8 bit) che utilizzano solo i primi 4
bit per specificare valori fino a 16 (quindi il caso di immagini a 16
colori) puoi ottenere un char che li memorizzi entrambi, facendo così
char col1 = 8;
char col2 = 15;
col1 =  col1<<4 || col2;
quello strano segno [<<] indica al processore, di spostare il contenuto di
quella variabile di n bit.
Questo è valido sia SX (<<) che a destra (>>).
In assembly usi l'istruzione shl e shr.
Questa istruzione è differente dalla [rol] perché i bit che escono fuori dal
byte vengono persi, mentre sulla rol, i bit rientrano dal punto + basso del
byte.
Se hai dimestichezza avrai già capito che shiftare i bit a sx equivale a
moltiplicare il valore per 2*nbit e spostare a DX significa dividere.
ad esempio se devi moltiplicare in ciclo, una variabile 2 o per un valore
fisso conosciuto, ti conviene precalcolarti lo shifting e usare queste
istruzioni, che sono decisamente più rapide rispetto alle moltiplicazioni.
Ad esempio se nella modalità 13h devi scrivere un punto alla riga x,
dovresti moltiplicarlo per 320, giusto?
Ma 320 = (2^6) * 5 giusto?
Ma è anche vero che 5 = 2^2 +1
Che strano 1 = 2^0
quindi 320 = (2^6)*(2^2 +2^0) =2^8 + 2^6
Ora invece di moltiplicare per 320 usi quel doppi shifting, e risparmi
notevoli cicli di clock e i giochini vanno più veloci :)
Per ora questa dritta, domani mi scartabello i miei vecchi documenti e ti
faccio sapere per la modalità EGA.
A ti consiglio di cercare su Internet una documentazione fondamentale, si
chiama "HelpPC" trovi tutte le specifiche Hardware che ti servono, li puoi
vedere anche la differenza in numero di cicli di clock tra una operazione di
shifting e una di moltiplicazione.

col1 =  col1<<4 || col2;
ok, utilizzavo giá gli shifting per smanettare sulla memoria video in
13h; quello che ancora non mi é chiaro (sono un poco tardo) é questo:
nella memoria video della 12h i 'pixel' sono accoppiati? Quindi per
settarne uno devo prima leggerne due (un byte) e poi lavorare con gli
shift per cambiare solo i quattro bit che mi interessano e lasciare
intatti gli altri, no? E il tutto non diventa mostruosamente lento (in
aggiunta ai controlli per il cambio di banco, una semplice putPixel
diventa un inferno cambogiano :)? E come faccio, nella putPixel
suddetta, a sapere QUALE gruppo di 4 bit devo cambiare? Cioé, cose
tipo "se il pixel da scrivere é pari fai cosí, altrimenti cosá"? 
Ci penseró, grazie ancora e scusa il tormento.
giu

Allora............
Sto consultando il manuale sulle schede video.
La modalità 12h come la 10 usa 4 piani perspicificare un singolo punto.
Hanno lo stesso funzionamento, solo che la 12h arriva a 480 righe, contro le
350 della 10.
In ogni piano viene memorizzato un bit, la somma (4 bit) appuntoda i 16
colori.
La formula per scrivere un punto (cito la documentazione) è la seguente :
Indirizzo del byte = y * 80 + x/8
Posizione del bit (0-7) = 7 - (x modulo 8)
Per ora questa è la documentazione che ho trovato.
Se riesco a ricordarmi un pochino di C e a rimediare un Turbo C, provo a
vedere se riesco a implementare qualcosa di funzionante, in tal caso ti
posto codice e qualche info in più.

posto codice e qualche info in più.
per caritá!!! non ti sbattere, davvero. Ora che mi hai detto come
funziona rimetteró in moto la mia potente capacitá informatica e
batteró la Bestia!!! Grazie davvero!
giu

C'è un libro dedicato alla VGA EGa, che è molto interessante, ma essendo
molto vecchio credo che sia impossibile da reperire.
E' da li che ho preso quella documentazione.
A il fatto della memoria a piani e una caratteristica che ha un suo perchè.
Ad esempio il modo 320x200 256colori come lo conosci tu è in realtà una
emulazione.
Puoi ad esempio dire alla S-Video di usare la modalità non link ( non sono
così sicuro di questi termini perchè è una vita che non ci lavoro) dova
appunto i punti vengono disegnati su 4 aree di memoria, con i quali puoi poi
abilitare alcune funzioni HW.
Ciao.