vesamode.pp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Florian Klaempfl
  5. member of the Free Pascal development team
  6. Video unit extension for VESA Modes for go32v2
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. unit vesamode;
  14. interface
  15. implementation
  16. uses
  17. dos,go32,dpmiexcp,video,mouse;
  18. type
  19. twordarray = array[0..0] of word;
  20. pwordarray = ^twordarray;
  21. TVESAInfoBlock = record
  22. VESASignature : ARRAY[0..3] OF CHAR;
  23. VESAVersion : WORD;
  24. OEMStringPtr : PChar;
  25. Capabilities : LONGINT;
  26. VideoModePtr : pwordarray;
  27. TotalMemory : WORD;
  28. Reserved : ARRAY[1..242] OF BYTE;
  29. end;
  30. TVesaVideoMode = record
  31. {Col,Row : word;
  32. Color : boolean;}
  33. V : TVideoMode;
  34. Mode : word;
  35. end;
  36. Const
  37. VesaVideoModeCount = 5;
  38. VesaVMD : Array[264..268] of TVesaVideoMode = (
  39. (V : (Col: 80; Row : 60; Color : True); Mode : 264),
  40. (V : (Col: 132; Row : 25; Color : True); Mode : 265),
  41. (V : (Col: 132; Row : 43; Color : True); Mode : 266),
  42. (V : (Col: 132; Row : 50; Color : True); Mode : 267),
  43. (V : (Col: 132; Row : 60; Color : True); Mode : 268)
  44. );
  45. var
  46. infoblock : TVESAInfoBLock;
  47. SupportedVesaVMD : Array[0..VesaVideoModeCount-1] of TVesaVideoMode;
  48. i : longint;
  49. m : word;
  50. Var
  51. SysGetVideoModeCount : function : word;
  52. SysSetVideoMode : function (Const VideoMode : TVideoMode) : boolean;
  53. SysGetVideoModeData : Function (Index : Word; Var Data : TVideoMode) : boolean;
  54. const
  55. VesaRegisteredModes : word = 0;
  56. function ReturnSuperVGAInfo(var ib : TVESAInfoBLock) : Word;
  57. var
  58. regs : registers;
  59. begin
  60. regs.ah:=$4f;
  61. regs.al:=0;
  62. regs.es:=tb_segment;
  63. regs.di:=tb_offset;
  64. intr($10,regs);
  65. dosmemget(tb_segment,tb_offset,ib,sizeof(ib));
  66. ReturnSuperVGAInfo:=regs.ax;
  67. end;
  68. function SetSuperVGAMode(m : word) : word;
  69. var
  70. regs : registers;
  71. begin
  72. regs.ah:=$4f;
  73. regs.al:=2;
  74. regs.bx:=m;
  75. intr($10,regs);
  76. SetSuperVGAMode:=regs.ax;
  77. end;
  78. function SetVESAMode(const VideoMode: TVideoMode): Boolean;
  79. var
  80. w : word;
  81. begin
  82. SetVESAMode:=false;
  83. for w:=VesaRegisteredModes-1 downto 0 do
  84. begin
  85. if (VideoMode.col=SupportedVesaVMD[w].v.col) and
  86. (VideoMode.row=SupportedVesaVMD[w].v.row) and
  87. (VideoMode.color=SupportedVesaVMD[w].v.color) then
  88. begin
  89. w:=SetSuperVGAMode(SupportedVesaVMD[w].mode);
  90. if w<>$4f then
  91. SetVESAMode:=false
  92. else
  93. begin
  94. SetVESAMode:=true;
  95. ScreenWidth:=VideoMode.Col;
  96. ScreenHeight:=VideoMode.Row;
  97. ScreenColor:=VideoMode.Color;
  98. // cheat to get a correct mouse
  99. {
  100. mem[$40:$84]:=ScreenHeight-1;
  101. mem[$40:$4a]:=ScreenWidth;
  102. memw[$40:$4c]:=ScreenHeight*((ScreenWidth shl 1)-1);
  103. }
  104. DoCustomMouse(true);
  105. end;
  106. end;
  107. if SetVESAMode then
  108. exit;
  109. end;
  110. SetVESAMode:=SysSetVideoMode(VideoMode);
  111. end;
  112. procedure InitializeVesaModes;
  113. begin
  114. ReturnSuperVGAInfo(infoblock);
  115. if not((infoblock.VESASignature[0]<>'V') or
  116. (infoblock.VESASignature[1]<>'E') or
  117. (infoblock.VESASignature[2]<>'S') or
  118. (infoblock.VESASignature[3]<>'A')) then
  119. begin
  120. {$R-}
  121. i:=0;
  122. while true do
  123. begin
  124. dosmemget(hi(dword(infoblock.VideoModePtr)),lo(dword(infoblock.VideoModePtr))+i*2,m,2);
  125. case m of
  126. 264:
  127. Begin
  128. {RegisterVideoMode(80,60,true,@SetVESAMode,264);}
  129. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  130. Inc(VesaRegisteredModes);
  131. End;
  132. 265:
  133. Begin
  134. {RegisterVideoMode(132,25,true,@SetVESAMode,265);}
  135. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  136. Inc(VesaRegisteredModes);
  137. End;
  138. 266:
  139. Begin
  140. {RegisterVideoMode(132,43,true,@SetVESAMode,266);}
  141. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  142. Inc(VesaRegisteredModes);
  143. End;
  144. 267:
  145. Begin
  146. {RegisterVideoMode(132,50,true,@SetVESAMode,267);}
  147. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  148. Inc(VesaRegisteredModes);
  149. End;
  150. 268:
  151. Begin
  152. {RegisterVideoMode(132,60,true,@SetVESAMode,268);}
  153. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  154. Inc(VesaRegisteredModes);
  155. End;
  156. $ffff:
  157. break;
  158. end;
  159. inc(i);
  160. end;
  161. end;
  162. end;
  163. Function VesaGetVideoModeData (Index : Word; Var Data : TVideoMode) : boolean;
  164. Var
  165. PrevCount : word;
  166. begin
  167. PrevCount:=SysGetVideoModeCount();
  168. VesaGetVideoModeData:=(Index<=PrevCount);
  169. If VesaGetVideoModeData then
  170. begin
  171. SysGetVideoModeData(Index,Data);
  172. exit;
  173. end;
  174. VesaGetVideoModeData:=(Index-PrevCount)<=VesaRegisteredModes;
  175. If VesaGetVideoModeData then
  176. Data:=SupportedVesaVMD[Index-PrevCount-1].V;
  177. end;
  178. Function VesaGetVideoModeCount : Word;
  179. begin
  180. VesaGetVideoModeCount:=SysGetVideoModeCount()+VesaRegisteredModes;
  181. end;
  182. Var
  183. Driver : TVideoDriver;
  184. (*
  185. Const
  186. SysVideoDriver : TVideoDriver = (
  187. InitDriver : @SysInitVideo;
  188. DoneDriver : @SysDoneVideo;
  189. UpdateScreen : @SysUpdateScreen;
  190. ClearScreen : Nil;
  191. SetVideoMode : @SysSetVideoMode;
  192. GetVideoModeCount : @SysGetVideoModeCount;
  193. GetVideoModeData : @SysGetVideoModedata;
  194. SetCursorPos : @SysSetCursorPos;
  195. GetCursorType : @SysGetCursorType;
  196. SetCursorType : @SysSetCursorType;
  197. GetCapabilities : @SysGetCapabilities
  198. );
  199. *)
  200. initialization
  201. { Get the videodriver to be used }
  202. GetVideoDriver (Driver);
  203. InitializeVesaModes;
  204. { Change needed functions }
  205. SysGetVideoModeCount:=Driver.GetVideoModeCount;
  206. Driver.GetVideoModeCount:=@VesaGetVideoModeCount;
  207. SysGetVideoModeData:=Driver.GetVideoModeData;
  208. Driver.GetVideoModeData:=@VesaGetVideoModeData;
  209. SysSetVideoMode:=Driver.SetVideoMode;
  210. Driver.SetVideoMode:=@SetVESAMode;
  211. SetVideoDriver (Driver);
  212. end.
  213. {
  214. $Log$
  215. Revision 1.3 2002-09-07 16:01:19 peter
  216. * old logs removed and tabs fixed
  217. }