Browse Source

* video fixes (merged)

peter 24 years ago
parent
commit
025137bb3b
2 changed files with 160 additions and 33 deletions
  1. 150 26
      rtl/go32v2/vesamode.pp
  2. 10 7
      rtl/go32v2/video.pp

+ 150 - 26
rtl/go32v2/vesamode.pp

@@ -37,6 +37,37 @@ unit vesamode;
          Reserved        : ARRAY[1..242] OF BYTE;
        end;
 
+       TVesaVideoMode = record
+         {Col,Row      : word;
+          Color        : boolean;}
+         V            : TVideoMode;
+         Mode         : word;
+       end;
+
+Const
+  VesaVideoModeCount = 5;
+  VesaVMD : Array[264..268] of TVesaVideoMode = (
+   (V : (Col: 80; Row : 60;  Color : True); Mode : 264),
+   (V : (Col: 132; Row : 25;  Color : True); Mode : 265),
+   (V : (Col: 132; Row : 43;  Color : True); Mode : 266),
+   (V : (Col: 132; Row : 50;  Color : True); Mode : 267),
+   (V : (Col: 132; Row : 60;  Color : True); Mode : 268)
+  );
+
+var
+   infoblock : TVESAInfoBLock;
+   SupportedVesaVMD : Array[0..VesaVideoModeCount-1] of TVesaVideoMode;
+   i : longint;
+   m : word;
+Var
+  SysGetVideoModeCount : function : word;
+  SysSetVideoMode : function (Const VideoMode : TVideoMode) : boolean;
+  SysGetVideoModeData : Function (Index : Word; Var Data : TVideoMode) : boolean;
+
+
+const
+  VesaRegisteredModes : word = 0;
+
     function ReturnSuperVGAInfo(var ib : TVESAInfoBLock) : Word;
 
       var
@@ -65,36 +96,44 @@ unit vesamode;
          SetSuperVGAMode:=regs.ax;
       end;
 
-    function SetVESAMode(const VideoMode: TVideoMode; Params: Longint): Boolean;
+    function SetVESAMode(const VideoMode: TVideoMode): Boolean;
 
       var
          w : word;
 
       begin
-         w:=SetSuperVGAMode(Params);
-         if w<>$4f then
-           SetVESAMode:=false
-         else
+         SetVESAMode:=false;
+         for w:=VesaRegisteredModes-1 downto 0 do
            begin
-              SetVESAMode:=true;
-              ScreenWidth:=VideoMode.Col;
-              ScreenHeight:=VideoMode.Row;
-              ScreenColor:=true;
-              // cheat to get a correct mouse
-              {
-              mem[$40:$84]:=ScreenHeight-1;
-              mem[$40:$4a]:=ScreenWidth;
-              memw[$40:$4c]:=ScreenHeight*((ScreenWidth shl 1)-1);
-              }
-              DoCustomMouse(true);
+             if (VideoMode.col=SupportedVesaVMD[w].v.col) and
+                (VideoMode.row=SupportedVesaVMD[w].v.row) and
+                (VideoMode.color=SupportedVesaVMD[w].v.color) then
+               begin
+                 w:=SetSuperVGAMode(SupportedVesaVMD[w].mode);
+                 if w<>$4f then
+                   SetVESAMode:=false
+                 else
+                   begin
+                      SetVESAMode:=true;
+                      ScreenWidth:=VideoMode.Col;
+                      ScreenHeight:=VideoMode.Row;
+                      ScreenColor:=VideoMode.Color;
+                      // cheat to get a correct mouse
+                      {
+                      mem[$40:$84]:=ScreenHeight-1;
+                      mem[$40:$4a]:=ScreenWidth;
+                      memw[$40:$4c]:=ScreenHeight*((ScreenWidth shl 1)-1);
+                      }
+                      DoCustomMouse(true);
+                   end;
+               end;
+             if SetVESAMode then
+               exit;
            end;
+         SetVESAMode:=SysSetVideoMode(VideoMode);
       end;
 
-var
-   infoblock : TVESAInfoBLock;
-   i : longint;
-   m : word;
-
+procedure InitializeVesaModes;
 begin
    ReturnSuperVGAInfo(infoblock);
    if not((infoblock.VESASignature[0]<>'V') or
@@ -109,19 +148,104 @@ begin
         dosmemget(hi(dword(infoblock.VideoModePtr)),lo(dword(infoblock.VideoModePtr))+i*2,m,2);
         case m of
            264:
-             RegisterVideoMode(80,60,true,@SetVESAMode,264);
+             Begin
+               {RegisterVideoMode(80,60,true,@SetVESAMode,264);}
+               SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
+               Inc(VesaRegisteredModes);
+             End;
            265:
-             RegisterVideoMode(132,25,true,@SetVESAMode,265);
+             Begin
+               {RegisterVideoMode(132,25,true,@SetVESAMode,265);}
+               SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
+               Inc(VesaRegisteredModes);
+             End;
            266:
-             RegisterVideoMode(132,43,true,@SetVESAMode,266);
+             Begin
+               {RegisterVideoMode(132,43,true,@SetVESAMode,266);}
+               SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
+               Inc(VesaRegisteredModes);
+             End;
            267:
-             RegisterVideoMode(132,50,true,@SetVESAMode,267);
+             Begin
+               {RegisterVideoMode(132,50,true,@SetVESAMode,267);}
+               SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
+               Inc(VesaRegisteredModes);
+             End;
            268:
-             RegisterVideoMode(132,60,true,@SetVESAMode,268);
+             Begin
+               {RegisterVideoMode(132,60,true,@SetVESAMode,268);}
+               SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
+               Inc(VesaRegisteredModes);
+             End;
            $ffff:
              break;
         end;
         inc(i);
      end;
    end;
+end;
+
+
+Function VesaGetVideoModeData (Index : Word; Var Data : TVideoMode) : boolean;
+Var
+  PrevCount : word;
+
+begin
+  PrevCount:=SysGetVideoModeCount();
+  VesaGetVideoModeData:=(Index<=PrevCount);
+  If VesaGetVideoModeData then
+    begin
+      SysGetVideoModeData(Index,Data);
+      exit;
+    end;
+  VesaGetVideoModeData:=(Index-PrevCount)<=VesaRegisteredModes;
+  If VesaGetVideoModeData then
+    Data:=SupportedVesaVMD[Index-PrevCount-1].V;
+end;
+
+Function VesaGetVideoModeCount : Word;
+
+begin
+  VesaGetVideoModeCount:=SysGetVideoModeCount()+VesaRegisteredModes;
+end;
+
+
+Var
+  Driver : TVideoDriver;
+(*
+Const
+  SysVideoDriver : TVideoDriver = (
+    InitDriver      : @SysInitVideo;
+    DoneDriver      : @SysDoneVideo;
+    UpdateScreen    : @SysUpdateScreen;
+    ClearScreen     : Nil;
+    SetVideoMode    : @SysSetVideoMode;
+    GetVideoModeCount : @SysGetVideoModeCount;
+    GetVideoModeData : @SysGetVideoModedata;
+    SetCursorPos    : @SysSetCursorPos;
+    GetCursorType   : @SysGetCursorType;
+    SetCursorType   : @SysSetCursorType;
+    GetCapabilities : @SysGetCapabilities
+  );
+*)
+initialization
+
+{ Get the videodriver to be used }
+  GetVideoDriver (Driver);
+  InitializeVesaModes;
+{ Change needed functions }
+  SysGetVideoModeCount:=Driver.GetVideoModeCount;
+  Driver.GetVideoModeCount:=@VesaGetVideoModeCount;
+  SysGetVideoModeData:=Driver.GetVideoModeData;
+  Driver.GetVideoModeData:=@VesaGetVideoModeData;
+  SysSetVideoMode:=Driver.SetVideoMode;
+  Driver.SetVideoMode:=@SetVESAMode;
+
+  SetVideoDriver (Driver);
 end.
+{
+  $Log$
+  Revision 1.2  2001-10-12 16:04:45  peter
+    * video fixes (merged)
+
+}

+ 10 - 7
rtl/go32v2/video.pp

@@ -161,7 +161,7 @@ begin
      if (regs.ch and $1f)<>0 then
       begin
         SysGetCursorType:=crHalfBlock;
-        if regs.cl+1=(regs.ch and $1F) then
+        if regs.cl-1=(regs.ch and $1F) then
          SysGetCursorType:=crUnderline;
       end;
    end;
@@ -246,7 +246,7 @@ begin
   realintr($10,regs);
 end;
 
-Const 
+Const
   SysVideoModeCount = 5;
   SysVMD : Array[0..SysVideoModeCount-1] of TVideoMode = (
    (Col: 40; Row : 25;  Color : False),
@@ -255,7 +255,7 @@ Const
    (Col: 80; Row : 25;  Color : True),
    (Col: 80; Row : 50;  Color : True)
   );
-  
+
 Function SysSetVideoMode (Const Mode : TVideoMode) : Boolean;
 
 Var
@@ -270,20 +270,20 @@ begin
        (Mode.Color=SysVMD[i].Color) then
       SysSetVideoMode:=True
     else
-      Dec(I);  
+      Dec(I);
   If SysSetVideoMode then
     begin
     If (I<SysVideoModeCount-1) then
       DoSetVideoMode(I)
     else
-      SetVideo8x8;  
+      SetVideo8x8;
     ScreenWidth:=SysVMD[I].Col;
     ScreenHeight:=SysVMD[I].Row;
     ScreenColor:=SysVMD[I].Color;
     DoCustomMouse(false);
     end;
 end;
-  
+
 Function SysGetVideoModeData (Index : Word; Var Data : TVideoMode) : boolean;
 
 begin
@@ -318,7 +318,10 @@ initialization
 end.
 {
   $Log$
-  Revision 1.4  2001-10-06 22:28:24  michael
+  Revision 1.5  2001-10-12 16:04:45  peter
+    * video fixes (merged)
+
+  Revision 1.4  2001/10/06 22:28:24  michael
   + Merged video mode selection/setting system
 
   Revision 1.3  2001/09/21 19:50:18  michael