VESA

0

Sorki że znowu ten temat.....

mov ax,4f02h
mov bx,105h

.. ustalam vesa....

ale kiedy już tak mam, rysuje tylko na kawałku ektanu tj. nie schodzi poniżej linii 100.... próbowałem coś z bankami ale to nic nie daje.. czy ktoś może wie jak to zrobić żeby było na całym ekranie ?

0
procedure PutPixel(x, y: Integer; kolor: Byte);
var
  pom: Longint;
  Offset, Bank: Integer;
begin
  pom := y shl 10 + x;
  Offset := pom and $ffff;
  Bank := pom shr 16;
  asm
    mov dx, Bank
    mov ax, 4f05h
    mov bx, 0
    int 10h
  end;
  mem[$a000:Offset] := kolor;
end;

Aby to sprawnie dzialalo najlepiej zapamietywac jaki Bank jest ustawiony i zmieniac go tylko gdy trzeba.

0
procedure pixel(x,y:Integer;kolor:integer);
          var
          pom,p: LongInt;
          offset:integer;
begin
 pom := (y shl 10) + x;
 p := (pom shr 14);
bank:=p;
asm
mov dx, bank
mov ax, 4f05h
mov bx, 0
int 10h
end;
    offset := pom and $FFFF;
    Mem[$A000:offset]:=kolor;
    end;
    begin
    asm
    mov ax,4f02h
    mov bx,118h
    int 10h
    end;
    for i:=0 to 1024 do pixel(i,i,i);
    readkey;
    end.

i nie działa :/

0

a dlaczego nie użyć VESY 2.0 z liniowym buforem?

0
program q;
uses Crt;
var
  stary: Word;

  procedure pixel(x,y:Integer;r, g, b:Byte);
  var
    pom, p: LongInt;
    offset, bank: Word;
  begin
    pom := (y shl 10) + x;
    bank := y shr 4;
    if bank <> stary then
    begin
      stary := bank;
      asm
        mov dx, bank
        mov ax, 4f05h
        mov bx, 0
        int 10h
      end;
    end;
    offset := Word(pom shl 2);
    Mem[$A000:offset]:=r;
    Mem[$A000:offset+1]:=g;
    Mem[$A000:offset+2]:=b;
  end;

var
  i, j: Integer;
begin
  asm
    mov ax,4f02h
    mov bx,118h
    int 10h
  end;
  stary := 0;
  for j := 0 to 767 do
    for i:=0 to 1023 do
      pixel(i, j, i mod 256, j mod 256, 255);
  readkey;
end.

a dlaczego nie użyć VESY 2.0 z liniowym buforem?

Bo w TP w trybie rzeczywistym zrobic tego nie moze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1