Newsgroup: it.comp.lang.pascal
Titolo: Output pixel

 tp per visualizzare i pixel?
Spero di essere abbastanza chiaro: ho imparato da poco tempo a usare
queste risoluzioni e grazie anche a risposte ricevute da questo
newsgroup.
Il problema  questo: la memoria video e' solo 64K quindi sufficiente per
risoluzioni basse (Es: 320x200 8bit: qui sono sufficienti 64000 byte) ma
non più per quelle alte (Es: 800x600 8bit richiederebbe 480000 byte).
Il problema viene risolto con il "bank switch" che e' una funzione che
fa riferire i 64K a un'altra zona di schermo.
Lo standard VESA fornisce tutte le funzioni del caso: con questo piccolo
programmino ti spiego brevemente quelle che ti servono per prime, poi,
se ti interessa approfondire, come sto facendo io, ti do altri spunti.
program RandomPixels;
{$X+}uses Crt;
const Mode=$0105; {$0101=640x480; $0103=800x600; $0105=1024x768;
$0107=1280x1024 chiedimi per la lista}
type TInfo=record {questa  la struttura dei dati che fornisce la
funzione 1 dello standard VESA}
       ModeAttributes:word;
       WindowA:byte;
       WindowB:byte;
       Granularity:word;
       Size:word;
       StartSegmentA:word;
       StartSegmentB:word;
       BSwitch:pointer; {puntatore alla funzione Bank Switch}
       BytesPerScanLine:word;
       Width:word;
       Heigth:word;
       WidthCharCell:byte;
       HeigthCharCell:byte;
       NumMemoryPlanes:byte;
       BitsPerPixel:byte;
       NumBanks:byte;
       MemoryModelType:byte;
       SizeOfBank:byte;
       NumImagePages:byte;
       reserved1:byte;
       RedMaskSize:byte;
       RedFieldPosition:byte;
       GreenMaskSize:byte;
       GreenFieldPosition:byte;
       BlueMaskSize:byte;
       BlueFieldPosition:byte;
       ReservedMaskSize:byte;
       ReservedFieldPosition:byte;
       DirectColorModeInfo:byte;
       AddLinearVideoBuffer:longint;
       PointerStartOffscreenMem:longint;
       KBOffscreenMem:word;
       reserved2:array[0..215] of byte;
     end;
     TBankSwitch=procedure;
var BankSwitch:^TBankSwitch; {questa e' la funzione che poi chiamerai
con l'assembler}
    Info:TInfo; {questa e' la variabile con le informazioni}
    I,J:word;
procedure GetInfo(VMode:word;var Info: TInfo); assembler; {Funzione
1:ottiene le informazioni su un determinato modo}
asm
  mov ax,4F01h
  mov cx,VMode
  les di,Info
  int 10h
end;
procedure SetMode(VMode:word); {Funzione 2:setta un determinato modo}
begin
  asm
    mov ax,4F02h
    mov bx,Mode
    int 10h
  end;
  GetInfo(VMode,Info);
  BankSwitch:=Info.BSwitch; {fa in modo che il puntatore BankSwitch
punti alla funzione BankSwitch}
end;
procedure SetText; {torna in modalità testo}
begin
  asm
    mov ax,0003h
    int 10h
  end;
end;
procedure Pixel(x,y:word;col:byte); assembler; {disegna un pixel, dato
x,y e il colore (solo 8bit)}
asm
  mov ax,y {AX=y}
  mov dx,Info.Width {DX=Larghezza}
  mul dx {AX*DX=DX:AX (qui il risultato)}
  add ax,x {AX=AX+x; in AX resta il punto da scrivere, in DX il numero
di Bank}
  push ax
  call BankSwitch
  pop ax
  mov di,ax
  mov ax,0A000h
  mov es,ax
  mov al,col
  stosb {scrive il punto in memoria video}
end;
begin
  SetMode(Mode);
  for I:=0 to Info.Heigth-1 do for J:=0 to Info.Width-1 do
  Pixel(J,I,Random(255));
  ReadKey;
  SetText;
end.
Fine del programma
Non e' detto che ti funzioni: infatti con questa procedura Pixel, viene
saltato un passaggio:
DX, per supportare tutte le schede video, dovrebbe contenere
NumeroBank*(Info.Size/Info.Granularity) ma, dato che in quasi tutte le
schede, questo rapporto e' 1, qui l'ho omesso.
Se hai altri problemi o vuoi altre informazioni, contattami!
Ciao
--
     Giuliano Vettorazzi
     E-Mail: 
giu...@tin.it

Ho provato ad usare l'assembly da TP per lavorare a risoluzioni superiori a
quelle del TP quali 800x600 ecc.
Come si accede alla memoria delle schede video per i modi non definiti in
tp per visualizzare i pixel?
ciao e Grazie
	Eddi

, il giorno 15 Sep 1997 20:39:56
GMT hai scritto:
#Ho provato ad usare l'assembly da TP per lavorare a risoluzioni
superiori a
#quelle del TP quali 800x600 ecc.
#
#Come si accede alla memoria delle schede video per i modi non
definiti in
#tp per visualizzare i pixel?
#
#ciao e Grazie
#
#	Eddi
Ciao, 
se non hai voglia di pardere un sacco di tempo con l'asm, fai un salto
al mio sito, nella sezione Grafica c'e' il driver BGI per tutte le
risoluzioni e anche una unit grafica in versione beta per manipolare
la VESA, fatta dal nostro workgroup (contatta eventualmente
anto...@sistemia.it
)
Saluti
REMO FRANCESCHELLI - ITIAV 4a Info.
http://www.geocities.com/SiliconValley/Lakes/7668/
(Programmazione in Pascal)
** Concentrazione = Forza **