[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]

    Unit VESA;

    Interface

    Type ModeList=Array[1..32] Of Word;  { List of VESA mode numbers }

         TVesaMode=Record
           Attr     : Word;         { Mode Attributes                   }
           WinA     : Byte;         { Window A attributes               }
           WinB     : Byte;         { Window B attributes               }
           Gran     : Word;         { Window granularity in K bytes     }
           WinSiz   : Word;         { Size of window in K bytes         }
           SegA     : Word;         { Segment address of window A       }
           SegB     : Word;         { Segment address of window B       }
           WinFunc  : Procedure;    { Windows positioning function      }
           Bytes    : Word;         { Number of bytes per line          }
           Width    : Word;         { Number of horizontal pixels       }
           Height   : Word;         { Number of vertical pixels         }
           CharW    : Byte;         { Width of character cell           }
           CharH    : Byte;         { Height of character cell          }
           Planes   : Byte;         { Number of memory planes           }
           Bits     : Byte;         { Number of bits per pixel          }
           nBanks   : Byte;         { Number of banks        (not used) }
           Model    : Byte;         { Memory model type                 }
           Banks    : Byte;         { Size of bank           (not used) }
           Pages    : Byte;         { Number of image pages             }
           Reserved : Byte; { The following are for 15,16,24,32 bit colour modes }
           RedMaskSize   : Byte;    { Size of Red mask in bits          }
           RedFieldPos   : Byte;    { Bit position of LSB of Red mask   }
           GreenMaskSize : Byte;    { Size of Green mask in bits        }
           GreenFieldPos : Byte;    { Bit position of LSB of Green mask }
           BlueMaskSize  : Byte;    { Size of Blue mask in bits         }
           BlueFieldPos  : Byte;    { Bit position of LSB of Blue mask  }
           RsvdMaskSize  : Byte;    { Size of Reserved mask in bits     }
           RsvdFieldPos  : Byte;    { Bit pos. of LSB of Reserved mask  }
           DirColModeInf : Byte;    { Direct Colour mode attributes     }
           Filler   : Array[0..215] Of Byte; { Not used - filler        }
         End;

         TVesaInfo=Record
           Signature    : LongInt;   { Signature - "VESA"               }
           Version      : Word;      { VESA Version number              }
           OEMName      : PChar;     { Pointer to manufacturer name     }
           Capabilities : Longint;   { Capabilities       (Not used)    }
           List         : ^ModeList; { Pointer to list of VESA modes    }
           TotalMemory  : Word;      { Number of 64k memory blocks on card }
           Filler       : Array[1..238] of Byte;
         End; { 258 byte size due to bug in the Diamond SpeedStar 24X v1.01 BIOS }

    Var  VesaMode : TVesaMode;
                    { Contains all info needed for drawing on the screen }
         VesaInfo : TVesaInfo;
                    { Contains info on the VESA BIOS Extensions }

         vesaon   : Byte;
                    { Specifies whether a VESA mode is on or not      }

    Function  IsVesa:Boolean;
              { Detects whether VESA support is present }
    Procedure GetVesaInfo;
              { Get Information on VESA modes, etc }
    Procedure GetVesaModeInfo(md:Word);
              { Get Information on a VESA mode (md) }
    Function  SetMode(md:Word):Boolean;
              { Sets a video mode (OEM and VESA) }
    Function  GetMode:Word;
              { Returns the current video mode }
    Function  SizeOfVideoState:Word;
              { Returns the size of the buffer needed to save the video state }
    Procedure SaveVideoState(Var buf);
              { Saves the SVGA video state in the buffer }
    Procedure RestoreVideoState(Var buf);
              { Restores the SVGA video state from the buffer}
    Procedure SetBank(bank:Word);
              { Set the video bank to draw on }
    Function  GetBank:Word;
              { Gets the current active video bank }
    Procedure SetLineLength(Var len:Word);
              { Sets the logical scan line length, returns the actual length set }
    Function  GetLineLength:Word;
              { Returns the current logical scan line length }
    Procedure SetDisplayStart(pixel,line:Word);
              { Sets the first pixel and line on the display }
    Procedure GetDisplayStart(Var pixel,line:Word);
              { Returns the first pixel and line on the display }

    {---------------------------------------------------------------------------}
    {-----------------------------} Implementation {----------------------------}
    {---------------------------------------------------------------------------}

    Uses Dos;

    Var  rp : Registers;

    Function IsVesa:Boolean;
    Begin
      rp.ax:=$4F03;
      Intr($10,rp);
      IsVesa:=(rp.al=$4F);
    End;

    Procedure GetVesaInfo;
    Begin
      rp.ax:=$4F00;
      rp.di:=Ofs(VesaInfo);
      rp.es:=Seg(VesaInfo);
      Intr($10,rp);
    End;

    Procedure GetVesaModeInfo(md:Word);
    Begin
      rp.ax:=$4F01;
      rp.cx:=md;
      rp.di:=Ofs(VesaMode);
      rp.es:=Seg(VesaMode);
      Intr($10,rp);
    End;

    Function SetMode(md:Word):Boolean;
    Begin
      SetMode:=True; vesaon:=1;
      If md>$FF Then Begin
        rp.bx:=md;
        rp.ax:=$4F02;
        Intr($10,rp);
        If rp.ax<>$4F Then SetMode:=False Else GetVesaModeInfo(md);
      End Else Begin
        rp.ax:=md;
        Intr($10,rp);
        VesaMode.Gran:=64; vesaon:=0;
        VesaMode.SegA:=$A000;
        Case md Of  { OEM (standard) video modes }
          1..3,7 : Begin { Text modes }
                     VesaMode.Width:=80;  VesaMode.Height:=25;
                     If md=7 Then Begin
                       VesaMode.Bits:=1;  VesaMode.SegA:=$B000;
                     End Else Begin
                       VesaMode.Bits:=4;  VesaMode.SegA:=$B800;
                     End;
                     VesaMode.Bytes:=160; VesaMode.Model:=0;
                   End;
          $13 : Begin  { 320 x 200 x 256 colours, VGA & MCGA }
                  VesaMode.Width:=320; VesaMode.Height:=200;
                  VesaMode.Bits:=8;    VesaMode.Model:=4;
                  VesaMode.Bytes:=320;
                End;
          $12 : Begin  { 640 x 480 x 16 colours, VGA only }
                  VesaMode.Width:=640; VesaMode.Height:=480;
                  VesaMode.Bits:=4;    VesaMode.Model:=3;
                  VesaMode.Bytes:=80;
                End;
          $10 : Begin  { 640 x 350 x 16 colours, VGA & EGA with 128k+ }
                  VesaMode.Width:=640; VesaMode.Height:=350;
                  VesaMode.Bits:=4;    VesaMode.Model:=3;
                  VesaMode.Bytes:=80;
                End;
          $0E : Begin  { 640 x 200 x 16 colours, VGA & EGA }
                  VesaMode.Width:=640; VesaMode.Height:=200;
                  VesaMode.Bits:=4;    VesaMode.Model:=3;
                  VesaMode.Bytes:=80;
                End;
          $0D : Begin  { 320 x 200 x 16 colours, VGA & EGA }
                  VesaMode.Width:=320; VesaMode.Height:=200;
                  VesaMode.Bits:=4;    VesaMode.Model:=3;
                  VesaMode.Bytes:=40;
                End;
          Else SetMode:=False;
        End;
      End;
    End;

    Function GetMode:Word;
    Begin
      rp.ax:=$4F03;
      Intr($10,rp);
      GetMode:=rp.bx;
    End;

    Function SizeOfVideoState:Word;
    Begin  { Will save/restore all video states }
      rp.ax:=$4F04;
      rp.dl:=0;
      rp.cx:=$0F;  { hardware, BIOS, DAC & SVGA states }
      Intr($10,rp);
      SizeOfVideoState:=rp.bx;
    End;

    Procedure SaveVideoState(Var buf);
    Begin
      rp.ax:=$4F04;
      rp.dl:=1;
      rp.cx:=$0F;
      rp.es:=Seg(buf);
      rp.bx:=Ofs(buf);
      Intr($10,rp);
    End;

    Procedure RestoreVideoState(Var buf);
    Begin
      rp.ax:=$4F04;
      rp.dl:=2;
      rp.cx:=$0F;
      rp.es:=Seg(buf);
      rp.bx:=Ofs(buf);
      Intr($10,rp);
    End;

    Procedure SetBank(bank:Word);
    Var winnum:Word;
    Begin
      winnum:=bank*64 Div VesaMode.Gran;
      rp.ax:=$4F05;
      rp.bx:=0;
      rp.dx:=winnum;
      Intr($10,rp);
      rp.ax:=$4F05;
      rp.bx:=1;
      rp.dx:=winnum;
      Intr($10,rp);
    End;

    Function GetBank:Word;
    Begin
      rp.ax:=$4F05;
      rp.bx:=$100;
      Intr($10,rp);
      GetBank:=rp.dx;
    End;

    Procedure SetLineLength(Var len:Word);
    Begin
      rp.ax:=$4F06;
      rp.bl:=0;
      rp.cx:=len;
      Intr($10,rp); { dx:=maximum number of scan lines }
      len:=rp.cx;
    End;

    Function GetLineLength:Word;
    Begin
      rp.ax:=$4F06;
      rp.bl:=1;
      Intr($10,rp); { dx:=maximum number of scan lines }
      GetLineLength:=rp.cx;
    End;

    Procedure SetDisplayStart(pixel,line:Word);
    Begin
      rp.ax:=$4F07;
      rp.bx:=0;
      rp.cx:=pixel;
      rp.dx:=line;
      Intr($10,rp);
    End;

    Procedure GetDisplayStart(Var pixel,line:Word);
    Begin
      rp.ax:=$4F07;
      rp.bx:=1;
      Intr($10,rp);
      pixel:=rp.cx;
      line:=rp.dx;
    End;

    End.

[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]