Newsgroup: it.comp.lang.pascal
Titolo: come disegnare un pixel con la memoria VGA?

ciao.
da qualche giorno sto cercando disperatamente di scrivere una procedura per
disegnare un pixel sullo schermo utilizzando direttamente la memoria della
VGA.
in internet ho trovato questa:
procedure putpixel(x,y:integer;col:byte);
  begin
    mem[$a000:x+(y*320)]:=col;
  end;
che disegna un punto con la MCGA, quindi 320x200x256. Questa procedura
funziona correttamente.
Se io però scelgo come modalità grafica la VGA 640x480x16 (modalità 12), e
quindi scrivo:
procedure putpixel(x,y:integer;col:byte);
  begin
    mem[$a000:x+(y*640)]:=col;
  end;
non ottengo il punto desiderato, ma solo una riga tipo "_". Ho anche provato
a riscrivere la procedura in assembler, però non ci sono riuscito. :))
Chi mi può aiutare?
Ah, uso una scheda S3 Virge DX con 4MB.

Un bel di' Albe' scrisse:
A> non ottengo il punto desiderato, ma solo una riga tipo "_". Ho anche provato
A> a riscrivere la procedura in assembler, però non ci sono riuscito. :))
A> Chi mi può aiutare?
A> 
nessuno: scrivere direttamente in memoria (cosi') funziona solo
per la 320x200x256.
Comunque, dai retta a me, la suddetta modalita' e' ottima per un sacco 
di cose, giochi compresi! :-)
Sembra brutta... ma ce ne puoi fare di cose, e belle! :-)
-- 
"I cretini sono sempre piu' ingegnosi delle precauzioni che si prendono per
impedir loro di nuocere", corollario 3 alla legge di Murphy
-- 
Emanuele Cesena
em...@iol.it
          occhio all'antispam NOSPAM!
http://www.geocities.com/SiliconValley/Grid/8879


si, me ne sto accorgendo anch'io...perň che delusione...mah
grazie mille, ciao!

per la 320x200x256.
In effetti il procedimento da seguire e' leggermente + complesso.
Innanzitutto inizializza la grafica con la seguente procedura:
Procedure InitG;
Begin
   Asm
   Mov Ax, 12h
   Int 10h
   Mov Dx, 3CEh
   Mov Ax, 205h
   Out Dx, Ax
   Mov dx, 3C4h
   Mov Ax, 0F02h
   Out Dx, Ax
   End
End;
Infine utilizza la seguente procedura per scrivere un pixel direttamente
in memoria video:
Procedure PutP(X, Y: Word; Col: Byte);
Var NumByte: Word;
    NumBit: Byte;
Begin
   NumByte := Y*80+X Div 8;
   NumBit := 1 shl (7-X Mod 8);
   Asm
   Mov Ax, 0A000h        
   Mov Es, Ax
   Mov Dx, 3CEh           
   Mov Ah, NumBit
   Mov Al, 8h
   Out Dx, Ax
   Mov Di, NumByte
   Mov Al, Es:[Di]       
   Mov Ah, Col           
   Mov Es:[Di], Ah
   End                   
End;
Il tutto dovrebbe funzionare ... almeno spero :)
Bye, Mobius

>
A> si, me ne sto accorgendo anch'io...però che delusione...mah
A> 
che delusione per che?? :-)
Comunque non ho detto che non si possano usare modalita' grafiche piu'
evolute... solo che te le sconsiglio se vuoi fare un gioco :-)
-- 
"3. Parla con autorita', ma soltanto di fatti ovvi e comprovati", dal
decalogo di Spark per il giovane manager


Un bel di' Mobius scrisse:
M> Infine utilizza la seguente procedura per scrivere un pixel direttamente
M> in memoria video:
M> 
Comunque (parlo principalmente per l'amico che ha iniziato il thread),
di solito non si scrive direttamente nella memoria video: e' troppo lento :-)
Si preferisce scrivere in una pagina virtuale, attendere rintracciamenti
vari, e poi copiare la pagina virtuale in memoria video :-)
Io, almeno, ho fatto cosi' :-)
-- 
"Si puo' fare una cosa a prova di bomba, ma non a prova di iella", legge di
Naeser


 Io, almeno, ho fatto cosi' :-)
Giustissimo, anche se molto dipende da cio' che si deve fare ... non
e' proprio vero che conviene sempre :)
Piccolo particolare ... alla fine devi comunque accedere alla memoria
video, e quindi io gli ho spiegato come scrivere un pixel in 640x480 a
16 colori come aveva richiesto. E' ovvio che poi e' lui che deve
modificarsi le procedure in modo tale che soddisfino le sue esigenze.
Visto che ci sono faccio anche un'osservazione personale ...
Io abbandonerei le risoluzioni grafiche a 16 colori per 2 motivi:
   - Sono troppo lente da gestire per la storia che si deve lavorare
     con i vari piani di colore.
   - Fanno schifo :)
Secondo me conviene passare a risoluzioni che utilizzano 256 colori,
oppure limitarsi alla 320x200 sempre a 256 colori.
Bye, Mobius


si, si, hai ragione...
in fin dei conti la procedura è la stessa, basta inizializzare una porzione
di memoria da usare come schermo virtuale e poi nella procedura putpixel,
invece di indicare il segmento A000h, bisogna indicare il puntatore allo
schermo virtuale...correggimi se sbaglio...
grazie a tutti per l'aiuto, sto iniziando  a capire un po' di cose
finalmente...
ciao!

Chi mi può aiutare?


Un bel di' Albe' scrisse:
A> si, si, hai ragione...
A> in fin dei conti la procedura è la stessa, basta inizializzare una porzione
A> di memoria da usare come schermo virtuale e poi nella procedura putpixel,
A> invece di indicare il segmento A000h, bisogna indicare il puntatore allo
A> schermo virtuale...correggimi se sbaglio...
A> 
Perfetto: non cambierei nemmeno una firgola :-))
A> grazie a tutti per l'aiuto, sto iniziando  a capire un po' di cose
A> finalmente...
A> 
ottimo!
-- 
"La supposizione e' la madre di tutte le boiate", legge di Wethern


Un bel di' Mobius scrisse:
M> Giustissimo, anche se molto dipende da cio' che si deve fare ... non
M> e' proprio vero che conviene sempre :)
ovvio :-)
M> Piccolo particolare ... alla fine devi comunque accedere alla memoria
M> video, 
si, ma accedi con funzioni molto piu' veloci che copiano tutta una
pagina in un'altra :-)
M> e quindi io gli ho spiegato come scrivere un pixel in 640x480 a
M> 16 colori come aveva richiesto. E' ovvio che poi e' lui che deve
M> modificarsi le procedure in modo tale che soddisfino le sue esigenze.
M> 
certo, certo... infatti nno avevo nulla da criticare :-)
M> Visto che ci sono faccio anche un'osservazione personale ...
M> Io abbandonerei le risoluzioni grafiche a 16 colori per 2 motivi:
M>    - Sono troppo lente da gestire per la storia che si deve lavorare
M>      con i vari piani di colore.
M>    - Fanno schifo :)
M> 
ottimo!
M> Secondo me conviene passare a risoluzioni che utilizzano 256 colori,
M> oppure limitarsi alla 320x200 sempre a 256 colori.
M> 
mi associo, soprattutto per la 320x200x256: come ho gia'
scritto, sembra far schifo, ma ci si puo' fare davvero tanto!! :)
Fra l'altro molti giochi (magari non ce ne accorgiamo) ma sono
in 320x200 :-)
Ah... io suppongo che si vogliano fare dei giochini... ovvio che se volete
disegnare 2 funzioni, piu' si aumenta la risoluzione, meglio e' :))
-- 
"Un esperto e' una persona che evitando tutti i piccoli errori, punta dritto
alla catastrofe", definizione di Weinberg
