

            Pixel setzen in VESA-Modi   -   PART II
            

Ich hab mir das mit der vorherigen Routine noch einmal berlegt,
und bin dabei zu dem Entschlu gekommen, da es sinnvoller ist,
die beiden Routinen in eine Unit zu packen. Dann braucht man
nicht immer die Variablen innerhalb des Hauptprogramms zu de-
klarieren, sondern dieses geschieht schon in der Unit selber.
Man braucht einfach nur noch 'USES ...,VesaPix;' im Hauptpro-
gramm einfgen (wobei '...,' natrlich fr eventuelle andere
Units steht und nicht eingegeben werden soll!), InitSetVesaPixPas
aufzurufen und danach SetVesaPixPas(x,y,Farbe), um einen Punkt zu
setzen. Ich glaube, einfacher geht es nicht. Wenn doch: Immer
her damit!

Nun die UNIT:

UNIT VesaPix;

INTERFACE

 PROCEDURE InitSetVESAPixPas;
 PROCEDURE SetVESAPixPas(x,y : LONGINT; Farbe : BYTE);

IMPLEMENTATION

 USES DOS;

 TYPE Zeiger = RECORD
       Offset,Segment : WORD;
      END;

 VAR Regs            : Registers;
     xAufloesung     : WORD;
     Granu           : LONGINT;
     Puffer          : ARRAY[0..255] OF BYTE;
     FensterProc     : Zeiger;

PROCEDURE InitSetVESAPixPas;
BEGIN
WITH Regs DO BEGIN
  AX := $4F03;
  INTR($10,Regs);     {Liefert VESAModus in BX zurck}
  CX := BX;           {Vesa-Modus nach CX}
  ES := Seg(Puffer);  {Segment von Puffer nach ES}
  DI := Ofs(Puffer);  {Offset von Puffer nach DI}
  AX := $4F01;        {Vesa-Infos holen}
  INTR($10,Regs);     {und in ES:DI/Puffer ablegen}
  xAufloesung := Puffer[$13] * 256 + Puffer[$12];
  Granu       := (Puffer[$05] * 256 + Puffer[$04]) SHL 10;
         {Granu = Granu * 1024}
  FensterProc.Offset  := Puffer[$0D] * 256 + Puffer[$0C];
  FensterProc.Segment := Puffer[$0F] * 256 + Puffer[$0E];
         {Offset+Segment der Routine zum Fensterverschieben}
 END;
END;

PROCEDURE SetVESAPixPas(x,y : LONGINT; Farbe : BYTE);
VAR Anzahl : WORD;
    Offset : LONGINT;
BEGIN
 Offset := y * xAufloesung + x;   {Offset berechnen}
 Anzahl := Offset DIV Granu;      {Wie oft mu Fenster verschoben
                                   werden?}
 Offset := Offset MOD Granu;      {Neuer Offset im verschobenen
                                   Fenster}
 ASM
  XOR BX,BX
  MOV DX,Anzahl
  CALL DWORD PTR FensterProc;    {Fenster verschieben}
 END;
 MEM[$A000:Offset] := Farbe;
END;

BEGIN
END.


Ich habe darauf verzichtet, die Pascal-Routine fr's Fensterver-
schieben zu benutzen. Eigentlich knnte ich jetzt auch noch die
anderen, in Pascal geschriebenen 'Assembleranweisungen' direkt
in Assembler bersetzen. Dafr bin ich aber zum einen zu faul und
zum anderen ist dies die Pascal Rubrik, oder? Andererseits...
Was soll's? Wenn Ihr ein wenig Phanatasie habt, wobei das eigent-
lich gar nichts mit Phantasie zu tun hat, wenn Ihr also eigent-
lich keine Phantasie habt, dann bekommt Ihr das auch alleine hin,
oder? Na also!

                                                 Kemil

