vesamode.pp 6.8 KB

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