123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 1999-2000 by Florian Klaempfl
- member of the Free Pascal development team
- Video unit extension for VESA Modes for go32v2
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- unit vesamode;
- interface
- implementation
- uses
- dos,go32,dpmiexcp,video,mouse;
- type
- twordarray = array[0..0] of word;
- pwordarray = ^twordarray;
- TVESAInfoBlock = record
- VESASignature : ARRAY[0..3] OF CHAR;
- VESAVersion : WORD;
- OEMStringPtr : PChar;
- Capabilities : LONGINT;
- VideoModePtr : pwordarray;
- TotalMemory : WORD;
- 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
- regs : registers;
- begin
- regs.ah:=$4f;
- regs.al:=0;
- regs.es:=tb_segment;
- regs.di:=tb_offset;
- intr($10,regs);
- dosmemget(tb_segment,tb_offset,ib,sizeof(ib));
- ReturnSuperVGAInfo:=regs.ax;
- end;
- function SetSuperVGAMode(m : word) : word;
- var
- regs : registers;
- begin
- regs.ah:=$4f;
- regs.al:=2;
- regs.bx:=m;
- intr($10,regs);
- SetSuperVGAMode:=regs.ax;
- end;
- function SetVESAMode(const VideoMode: TVideoMode): Boolean;
- var
- w : word;
- begin
- SetVESAMode:=false;
- for w:=VesaRegisteredModes-1 downto 0 do
- begin
- if (VideoMode.col=SupportedVesaVMD[w].v.col) and
- (VideoMode.row=SupportedVesaVMD[w].v.row) and
- (VideoMode.color=SupportedVesaVMD[w].v.color) then
- begin
- if SetSuperVGAMode(SupportedVesaVMD[w].mode) <> $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;
- procedure InitializeVesaModes;
- begin
- ReturnSuperVGAInfo(infoblock);
- if not((infoblock.VESASignature[0]<>'V') or
- (infoblock.VESASignature[1]<>'E') or
- (infoblock.VESASignature[2]<>'S') or
- (infoblock.VESASignature[3]<>'A')) then
- begin
- {$R-}
- i:=0;
- while true do
- begin
- dosmemget(hi(dword(infoblock.VideoModePtr)),lo(dword(infoblock.VideoModePtr))+i*2,m,2);
- case m of
- 264:
- Begin
- {RegisterVideoMode(80,60,true,@SetVESAMode,264);}
- SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
- Inc(VesaRegisteredModes);
- End;
- 265:
- Begin
- {RegisterVideoMode(132,25,true,@SetVESAMode,265);}
- SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
- Inc(VesaRegisteredModes);
- End;
- 266:
- Begin
- {RegisterVideoMode(132,43,true,@SetVESAMode,266);}
- SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
- Inc(VesaRegisteredModes);
- End;
- 267:
- Begin
- {RegisterVideoMode(132,50,true,@SetVESAMode,267);}
- SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
- Inc(VesaRegisteredModes);
- End;
- 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.
|