mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 13:09:32 +02:00
* video fixes (merged)
This commit is contained in:
parent
68bc48c96a
commit
025137bb3b
@ -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)
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user