vesamode.pp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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. if SetSuperVGAMode(SupportedVesaVMD[w].mode) <> $4f then
  90. SetVESAMode:=false
  91. else
  92. begin
  93. SetVESAMode:=true;
  94. ScreenWidth:=VideoMode.Col;
  95. ScreenHeight:=VideoMode.Row;
  96. ScreenColor:=VideoMode.Color;
  97. // cheat to get a correct mouse
  98. {
  99. mem[$40:$84]:=ScreenHeight-1;
  100. mem[$40:$4a]:=ScreenWidth;
  101. memw[$40:$4c]:=ScreenHeight*((ScreenWidth shl 1)-1);
  102. }
  103. DoCustomMouse(true);
  104. end;
  105. end;
  106. if SetVESAMode then
  107. exit;
  108. end;
  109. SetVESAMode:=SysSetVideoMode(VideoMode);
  110. end;
  111. procedure InitializeVesaModes;
  112. begin
  113. ReturnSuperVGAInfo(infoblock);
  114. if not((infoblock.VESASignature[0]<>'V') or
  115. (infoblock.VESASignature[1]<>'E') or
  116. (infoblock.VESASignature[2]<>'S') or
  117. (infoblock.VESASignature[3]<>'A')) then
  118. begin
  119. {$R-}
  120. i:=0;
  121. while true do
  122. begin
  123. dosmemget(hi(dword(infoblock.VideoModePtr)),lo(dword(infoblock.VideoModePtr))+i*2,m,2);
  124. case m of
  125. 264:
  126. Begin
  127. {RegisterVideoMode(80,60,true,@SetVESAMode,264);}
  128. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  129. Inc(VesaRegisteredModes);
  130. End;
  131. 265:
  132. Begin
  133. {RegisterVideoMode(132,25,true,@SetVESAMode,265);}
  134. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  135. Inc(VesaRegisteredModes);
  136. End;
  137. 266:
  138. Begin
  139. {RegisterVideoMode(132,43,true,@SetVESAMode,266);}
  140. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  141. Inc(VesaRegisteredModes);
  142. End;
  143. 267:
  144. Begin
  145. {RegisterVideoMode(132,50,true,@SetVESAMode,267);}
  146. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  147. Inc(VesaRegisteredModes);
  148. End;
  149. 268:
  150. Begin
  151. {RegisterVideoMode(132,60,true,@SetVESAMode,268);}
  152. SupportedVesaVMD[VesaRegisteredModes]:=VesaVMD[m];
  153. Inc(VesaRegisteredModes);
  154. End;
  155. $ffff:
  156. break;
  157. end;
  158. inc(i);
  159. end;
  160. end;
  161. end;
  162. Function VesaGetVideoModeData (Index : Word; Var Data : TVideoMode) : boolean;
  163. Var
  164. PrevCount : word;
  165. begin
  166. PrevCount:=SysGetVideoModeCount();
  167. VesaGetVideoModeData:=(Index<=PrevCount);
  168. If VesaGetVideoModeData then
  169. begin
  170. SysGetVideoModeData(Index,Data);
  171. exit;
  172. end;
  173. VesaGetVideoModeData:=(Index-PrevCount)<=VesaRegisteredModes;
  174. If VesaGetVideoModeData then
  175. Data:=SupportedVesaVMD[Index-PrevCount-1].V;
  176. end;
  177. Function VesaGetVideoModeCount : Word;
  178. begin
  179. VesaGetVideoModeCount:=SysGetVideoModeCount()+VesaRegisteredModes;
  180. end;
  181. Var
  182. Driver : TVideoDriver;
  183. (*
  184. Const
  185. SysVideoDriver : TVideoDriver = (
  186. InitDriver : @SysInitVideo;
  187. DoneDriver : @SysDoneVideo;
  188. UpdateScreen : @SysUpdateScreen;
  189. ClearScreen : Nil;
  190. SetVideoMode : @SysSetVideoMode;
  191. GetVideoModeCount : @SysGetVideoModeCount;
  192. GetVideoModeData : @SysGetVideoModedata;
  193. SetCursorPos : @SysSetCursorPos;
  194. GetCursorType : @SysGetCursorType;
  195. SetCursorType : @SysSetCursorType;
  196. GetCapabilities : @SysGetCapabilities
  197. );
  198. *)
  199. initialization
  200. { Get the videodriver to be used }
  201. GetVideoDriver (Driver);
  202. InitializeVesaModes;
  203. { Change needed functions }
  204. SysGetVideoModeCount:=Driver.GetVideoModeCount;
  205. Driver.GetVideoModeCount:=@VesaGetVideoModeCount;
  206. SysGetVideoModeData:=Driver.GetVideoModeData;
  207. Driver.GetVideoModeData:=@VesaGetVideoModeData;
  208. SysSetVideoMode:=Driver.SetVideoMode;
  209. Driver.SetVideoMode:=@SetVESAMode;
  210. SetVideoDriver (Driver);
  211. end.
  212. {
  213. $Log$
  214. Revision 1.4 2004-09-14 20:11:31 hajny
  215. * fix incorrect reuse of for loop counter
  216. Revision 1.3 2002/09/07 16:01:19 peter
  217. * old logs removed and tabs fixed
  218. }