* video fixes (merged)

This commit is contained in:
peter 2001-10-12 16:04:45 +00:00
parent 68bc48c96a
commit 025137bb3b
2 changed files with 160 additions and 33 deletions

View File

@ -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)
}

View File

@ -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