vesamode.pp 7.0 KB

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