fpusrscr.pas 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998 by Berczi Gabor
  5. User screen support routines
  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 FPUsrScr;
  13. interface
  14. {$ifdef TP}
  15. {$define DOS}
  16. {$else}
  17. {$ifdef GO32V2}
  18. {$define DOS}
  19. {$endif}
  20. {$endif}
  21. uses Objects;
  22. type
  23. PScreen = ^TScreen;
  24. TScreen = object(TObject)
  25. function GetWidth: integer; virtual;
  26. function GetHeight: integer; virtual;
  27. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  28. procedure GetCursorPos(var P: TPoint); virtual;
  29. procedure Capture; virtual;
  30. procedure SwitchTo; virtual;
  31. procedure SwitchBack; virtual;
  32. end;
  33. {$ifdef DOS}
  34. TDOSVideoInfo = record
  35. Mode : word;
  36. ScreenSize: word;
  37. Page : byte;
  38. Rows,Cols : integer;
  39. CurPos : TPoint;
  40. CurShapeT : integer;
  41. CurShapeB : integer;
  42. StateSize : word;
  43. StateBuf : pointer;
  44. end;
  45. PDOSScreen = ^TDOSScreen;
  46. TDOSScreen = object(TScreen)
  47. constructor Init;
  48. destructor Done; virtual;
  49. public
  50. function GetWidth: integer; virtual;
  51. function GetHeight: integer; virtual;
  52. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  53. procedure GetCursorPos(var P: TPoint); virtual;
  54. procedure Capture; virtual;
  55. procedure SwitchTo; virtual;
  56. procedure SwitchBack; virtual;
  57. private
  58. VideoInfo : TDOSVideoInfo;
  59. VBufferSize : word;
  60. VBuffer : PByteArray;
  61. TM : TDOSVideoInfo;
  62. function GetLineStartOfs(Line: integer): word;
  63. procedure GetBuffer(Size: word);
  64. procedure FreeBuffer;
  65. procedure GetVideoMode(var MI: TDOSVideoInfo);
  66. procedure SetVideoMode(MI: TDOSVideoInfo);
  67. end;
  68. {$endif}
  69. {$ifdef Linux}
  70. PLinuxScreen = ^TLinuxScreen;
  71. TLinuxScreen = object(TScreen)
  72. constructor Init;
  73. destructor Done; virtual;
  74. public
  75. function GetWidth: integer; virtual;
  76. function GetHeight: integer; virtual;
  77. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  78. procedure GetCursorPos(var P: TPoint); virtual;
  79. procedure Capture; virtual;
  80. procedure SwitchTo; virtual;
  81. procedure SwitchBack; virtual;
  82. end;
  83. {$endif}
  84. procedure InitUserScreen;
  85. procedure DoneUserScreen;
  86. const UserScreen : PScreen = nil;
  87. implementation
  88. uses
  89. Dos,Video
  90. {$ifdef TP}
  91. {$ifdef DPMI}
  92. ,WinAPI
  93. {$endif}
  94. {$endif}
  95. {$ifdef FPC}
  96. {$ifdef GO32V2}
  97. ,Go32
  98. {$endif}
  99. {$endif}
  100. ;
  101. function TScreen.GetWidth: integer;
  102. begin
  103. Getwidth:=0;
  104. Abstract;
  105. end;
  106. function TScreen.GetHeight: integer;
  107. begin
  108. Getheight:=0;
  109. Abstract;
  110. end;
  111. procedure TScreen.GetLine(Line: integer; var Text, Attr: string);
  112. begin
  113. Abstract;
  114. end;
  115. procedure TScreen.GetCursorPos(var P: TPoint);
  116. begin
  117. Abstract;
  118. end;
  119. procedure TScreen.Capture;
  120. begin
  121. Abstract;
  122. end;
  123. procedure TScreen.SwitchTo;
  124. begin
  125. Abstract;
  126. end;
  127. procedure TScreen.SwitchBack;
  128. begin
  129. Abstract;
  130. end;
  131. {****************************************************************************
  132. TDOSScreen
  133. ****************************************************************************}
  134. {$ifdef DOS}
  135. constructor TDOSScreen.Init;
  136. begin
  137. inherited Init;
  138. Capture;
  139. end;
  140. destructor TDOSScreen.Done;
  141. begin
  142. inherited Done;
  143. FreeBuffer;
  144. end;
  145. function TDOSScreen.GetWidth: integer;
  146. begin
  147. GetWidth:=VideoInfo.Cols;
  148. end;
  149. function TDOSScreen.GetHeight: integer;
  150. begin
  151. GetHeight:=VideoInfo.Rows;
  152. end;
  153. procedure TDOSScreen.GetLine(Line: integer; var Text, Attr: string);
  154. var X: integer;
  155. W: word;
  156. begin
  157. Text:=''; Attr:='';
  158. if Line<GetHeight then
  159. begin
  160. W:=GetLineStartOfs(Line);
  161. for X:=0 to GetWidth-1 do
  162. begin
  163. Text:=Text+chr(VBuffer^[W+X*2]);
  164. Attr:=Attr+chr(VBuffer^[W+X*2+1]);
  165. end;
  166. end;
  167. end;
  168. procedure TDOSScreen.GetCursorPos(var P: TPoint);
  169. begin
  170. P:=VideoInfo.CurPos;
  171. end;
  172. procedure TDOSScreen.Capture;
  173. var
  174. VSeg,SOfs: word;
  175. begin
  176. GetVideoMode(VideoInfo);
  177. GetBuffer(VideoInfo.ScreenSize);
  178. if VideoInfo.Mode=7 then
  179. VSeg:=SegB000
  180. else
  181. VSeg:=SegB800;
  182. SOfs:=MemW[Seg0040:$4e];
  183. {$ifdef FPC}
  184. DosmemGet(VSeg,SOfs,VBuffer^,VideoInfo.ScreenSize);
  185. {$else}
  186. Move(ptr(VSeg,SOfs)^,VBuffer^,VideoInfo.ScreenSize);
  187. {$endif}
  188. end;
  189. procedure TDOSScreen.SwitchTo;
  190. var
  191. VSeg,SOfs: word;
  192. begin
  193. GetVideoMode(TM);
  194. SetVideoMode(VideoInfo);
  195. if VideoInfo.Mode=7 then
  196. VSeg:=SegB000
  197. else
  198. VSeg:=SegB800;
  199. SOfs:=MemW[Seg0040:$4e];
  200. {$ifdef FPC}
  201. DosmemPut(VSeg,SOfs,VBuffer^,VideoInfo.ScreenSize);
  202. {$else}
  203. Move(VBuffer^,ptr(VSeg,SOfs)^,VideoInfo.ScreenSize);
  204. {$endif}
  205. end;
  206. procedure TDOSScreen.SwitchBack;
  207. begin
  208. Capture;
  209. SetVideoMode(TM);
  210. end;
  211. function TDOSScreen.GetLineStartOfs(Line: integer): word;
  212. begin
  213. GetLineStartOfs:=(VideoInfo.Cols*Line)*2;
  214. end;
  215. procedure TDOSScreen.GetBuffer(Size: word);
  216. begin
  217. if (VBuffer<>nil) and (VBufferSize=Size) then Exit;
  218. if VBuffer<>nil then FreeBuffer;
  219. VBufferSize:=Size;
  220. GetMem(VBuffer,VBufferSize);
  221. end;
  222. procedure TDOSScreen.FreeBuffer;
  223. begin
  224. if (VBuffer<>nil) and (VBufferSize>0) then FreeMem(VBuffer,VBufferSize);
  225. VBuffer:=nil;
  226. end;
  227. procedure TDOSScreen.GetVideoMode(var MI: TDOSVideoInfo);
  228. var
  229. r: registers;
  230. {$ifdef TP}
  231. P: pointer;
  232. Sel: longint;
  233. {$I realintr.inc}
  234. {$endif}
  235. begin
  236. if (MI.StateSize>0) and (MI.StateBuf<>nil) then
  237. begin FreeMem(MI.StateBuf,MI.StateSize); MI.StateBuf:=nil; end;
  238. MI.ScreenSize:=MemW[Seg0040:$4c];
  239. r.ah:=$0f;
  240. intr($10,r);
  241. MI.Mode:=r.al;
  242. MI.Page:=r.bh;
  243. MI.Cols:=r.ah;
  244. MI.Rows:=MI.ScreenSize div (MI.Cols*2);
  245. r.ah:=$03;
  246. r.bh:=MI.Page;
  247. intr($10,r);
  248. with MI do
  249. begin
  250. CurPos.X:=r.dl; CurPos.Y:=r.dh;
  251. CurShapeT:=r.ch; CurShapeB:=r.cl;
  252. end;
  253. (*
  254. {$ifdef TP}
  255. { check VGA functions }
  256. MI.StateSize:=0;
  257. r.ah:=$1c; r.al:=0; r.cx:=7; intr($10,r);
  258. if (r.al=$1c) and ((r.flags and fCarry)=0) and (r.bx>0) then
  259. begin
  260. MI.StateSize:=r.bx;
  261. GetMem(MI.StateBuf,MI.StateSize); FillChar(MI.StateBuf^,MI.StateSize,0);
  262. P:=MI.StateBuf;
  263. {$ifdef DPMI}
  264. Sel:=GlobalDosAlloc(MI.StateSize);
  265. P:=Ptr(Sel shr 16,0);
  266. {$endif}
  267. r.ah:=$1c; r.al:=1; r.cx:=7;
  268. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  269. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  270. {$ifdef DPMI}
  271. Move(Ptr(Sel and $ffff,0)^,MI.StateBuf^,MI.StateSize);
  272. GlobalDosFree(Sel and $ffff);
  273. {$endif}
  274. end;
  275. {$endif}
  276. *)
  277. end;
  278. procedure TDOSScreen.SetVideoMode(MI: TDOSVideoInfo);
  279. var r: registers;
  280. {$ifdef TP}
  281. P: pointer;
  282. Sel: longint;
  283. {$I realintr.inc}
  284. {$endif}
  285. begin
  286. r.ah:=$0f;
  287. intr($10,r);
  288. if r.al<>MI.Mode then
  289. begin
  290. r.ah:=$00; r.al:=MI.Mode; intr($10,r);
  291. end;
  292. r.ah:=$05; r.al:=MI.Page; intr($10,r);
  293. r.ah:=$02; r.bh:=MI.Page; r.dl:=MI.CurPos.X; r.dh:=MI.CurPos.Y; intr($10,r);
  294. r.ah:=$01; r.ch:=MI.CurShapeT; r.cl:=MI.CurShapeB; intr($10,r);
  295. (*
  296. {$ifdef TP}
  297. if (MI.StateSize>0) and (MI.StateBuf<>nil) then
  298. begin
  299. P:=MI.StateBuf;
  300. {$ifdef DPMI}
  301. Sel:=GlobalDosAlloc(MI.StateSize);
  302. Move(MI.StateBuf^,ptr(Sel and $ffff,0)^,MI.StateSize);
  303. P:=Ptr(Sel shr 16,0);
  304. {$endif}
  305. r.ah:=$1c; r.al:=2; r.cx:=7;
  306. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  307. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  308. {$ifdef DPMI}
  309. GlobalDosFree(Sel and $ffff);
  310. {$endif}
  311. end;
  312. {$endif}
  313. *)
  314. end;
  315. {$endif}
  316. {****************************************************************************
  317. TLinuxScreen
  318. ****************************************************************************}
  319. {$ifdef Linux}
  320. constructor TLinuxScreen.Init;
  321. begin
  322. inherited Init;
  323. end;
  324. destructor TLinuxScreen.Done;
  325. begin
  326. inherited Done;
  327. end;
  328. function TLinuxScreen.GetWidth: integer;
  329. begin
  330. GetWidth:=ScreenWidth;
  331. end;
  332. function TLinuxScreen.GetHeight: integer;
  333. begin
  334. GetHeight:=ScreenHeight;
  335. end;
  336. procedure TLinuxScreen.GetLine(Line: integer; var Text, Attr: string);
  337. begin
  338. Text:='';
  339. Attr:='';
  340. end;
  341. procedure TLinuxScreen.GetCursorPos(var P: TPoint);
  342. begin
  343. P.X:=0;
  344. P.Y:=0;
  345. end;
  346. procedure TLinuxScreen.Capture;
  347. begin
  348. end;
  349. procedure TLinuxScreen.SwitchTo;
  350. begin
  351. end;
  352. procedure TLinuxScreen.SwitchBack;
  353. begin
  354. end;
  355. {$endif}
  356. {****************************************************************************
  357. Initialize
  358. ****************************************************************************}
  359. procedure InitUserScreen;
  360. begin
  361. {$ifdef DOS}
  362. UserScreen:=New(PDOSScreen, Init);
  363. {$else}
  364. {$ifdef LINUX}
  365. UserScreen:=New(PLinuxScreen, Init);
  366. {$else}
  367. UserScreen:=New(PScreen, Init);
  368. {$endif}
  369. {$endif}
  370. end;
  371. procedure DoneUserScreen;
  372. begin
  373. if UserScreen<>nil then
  374. begin
  375. UserScreen^.SwitchTo;
  376. Dispose(UserScreen, Done);
  377. end;
  378. end;
  379. end.
  380. {
  381. $Log$
  382. Revision 1.3 1999-02-02 16:41:42 peter
  383. + automatic .pas/.pp adding by opening of file
  384. * better debuggerscreen changes
  385. Revision 1.2 1999/01/04 11:49:51 peter
  386. * 'Use tab characters' now works correctly
  387. + Syntax highlight now acts on File|Save As...
  388. + Added a new class to syntax highlight: 'hex numbers'.
  389. * There was something very wrong with the palette managment. Now fixed.
  390. + Added output directory (-FE<xxx>) support to 'Directories' dialog...
  391. * Fixed some possible bugs in Running/Compiling, and the compilation/run
  392. process revised
  393. Revision 1.1 1998/12/28 15:47:53 peter
  394. + Added user screen support, display & window
  395. + Implemented Editor,Mouse Options dialog
  396. + Added location of .INI and .CFG file
  397. + Option (INI) file managment implemented (see bottom of Options Menu)
  398. + Switches updated
  399. + Run program
  400. Revision 1.0 1998/12/24 09:55:49 gabor
  401. Original implementation
  402. }