123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- {
- $Id$
- 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;
- 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; Params: Longint): Boolean;
- var
- w : word;
- begin
- w:=SetSuperVGAMode(Params);
- if w<>$4f then
- SetVESAMode:=false
- else
- 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);
- end;
- end;
- var
- infoblock : TVESAInfoBLock;
- i : longint;
- m : word;
- 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:
- RegisterVideoMode(80,60,true,@SetVESAMode,264);
- 265:
- RegisterVideoMode(132,25,true,@SetVESAMode,265);
- 266:
- RegisterVideoMode(132,43,true,@SetVESAMode,266);
- 267:
- RegisterVideoMode(132,50,true,@SetVESAMode,267);
- 268:
- RegisterVideoMode(132,60,true,@SetVESAMode,268);
- $ffff:
- break;
- end;
- inc(i);
- end;
- end;
- end.
|