video.inc 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. {
  2. System independent low-level video interface for go32v2
  3. $Id$
  4. }
  5. {$ASMMODE ATT}
  6. uses
  7. mouse,
  8. go32;
  9. var
  10. OldVideoBuf : PVideoBuf;
  11. { used to know if LastCursorType is valid }
  12. const
  13. InitVideoCalled : boolean = false;
  14. LastCursorType : word = crUnderline;
  15. { allways set blink state again }
  16. procedure SetHighBitBlink;
  17. var
  18. regs : trealregs;
  19. begin
  20. regs.ax:=$1003;
  21. regs.bx:=$0001;
  22. realintr($10,regs);
  23. end;
  24. procedure InitVideo;
  25. var
  26. regs : trealregs;
  27. begin
  28. VideoSeg:=$b800;
  29. if (ScreenWidth=$ffff) or (ScreenHeight=$ffff) or
  30. (ScreenWidth=0) or (ScreenHeight=0) then
  31. begin
  32. ScreenColor:=true;
  33. regs.ah:=$0f;
  34. realintr($10,regs);
  35. if (regs.al and 1)=0 then
  36. ScreenColor:=false;
  37. if regs.al=7 then
  38. begin
  39. ScreenColor:=false;
  40. VideoSeg:=$b000;
  41. end
  42. else
  43. VideoSeg:=$b800;
  44. ScreenWidth:=regs.ah;
  45. regs.ax:=$1130;
  46. regs.bx:=0;
  47. realintr($10,regs);
  48. ScreenHeight:=regs.dl+1;
  49. end;
  50. regs.ah:=$03;
  51. regs.bh:=0;
  52. realintr($10,regs);
  53. CursorLines:=regs.cl;
  54. CursorX:=regs.dl;
  55. CursorY:=regs.dh;
  56. If InitVideoCalled then
  57. Begin
  58. FreeMem(VideoBuf,VideoBufSize);
  59. FreeMem(OldVideoBuf,VideoBufSize);
  60. End;
  61. { allocate pmode memory buffer }
  62. VideoBufSize:=ScreenWidth*ScreenHeight*2;
  63. GetMem(VideoBuf,VideoBufSize);
  64. GetMem(OldVideoBuf,VideoBufSize);
  65. InitVideoCalled:=true;
  66. SetHighBitBlink;
  67. SetCursorType(LastCursorType);
  68. { ClearScreen; removed here
  69. to be able to catch the content of the monitor }
  70. end;
  71. procedure DoneVideo;
  72. begin
  73. If InitVideoCalled then
  74. Begin
  75. LastCursorType:=GetCursorType;
  76. ClearScreen;
  77. SetCursorType(crUnderLine);
  78. SetCursorPos(0,0);
  79. FreeMem(VideoBuf,VideoBufSize);
  80. VideoBuf:=nil;
  81. FreeMem(OldVideoBuf,VideoBufSize);
  82. OldVideoBuf:=nil;
  83. InitVideoCalled:=false;
  84. VideoBufSize:=0;
  85. End;
  86. end;
  87. function GetCapabilities: Word;
  88. begin
  89. GetCapabilities := $3F;
  90. end;
  91. procedure SetCursorPos(NewCursorX, NewCursorY: Word);
  92. var
  93. regs : trealregs;
  94. begin
  95. regs.ah:=$02;
  96. regs.bh:=0;
  97. regs.dh:=NewCursorY;
  98. regs.dl:=NewCursorX;
  99. realintr($10,regs);
  100. CursorY:=regs.dh;
  101. CursorX:=regs.dl;
  102. end;
  103. { I don't know the maximum value for the scan line
  104. probably 7 or 15 depending on resolution !!
  105. }
  106. function GetCursorType: Word;
  107. var
  108. regs : trealregs;
  109. begin
  110. regs.ah:=$03;
  111. regs.bh:=0;
  112. realintr($10,regs);
  113. GetCursorType:=crHidden;
  114. if (regs.ch and $60)=0 then
  115. begin
  116. GetCursorType:=crBlock;
  117. if (regs.ch and $1f)<>0 then
  118. begin
  119. GetCursorType:=crHalfBlock;
  120. if regs.cl+1=(regs.ch and $1F) then
  121. GetCursorType:=crUnderline;
  122. end;
  123. end;
  124. end;
  125. procedure SetCursorType(NewType: Word);
  126. var
  127. regs : trealregs;
  128. const
  129. MaxCursorLines = 7;
  130. begin
  131. regs.ah:=$01;
  132. regs.bx:=NewType;
  133. case NewType of
  134. crHidden : regs.cx:=$2000;
  135. crHalfBlock : begin
  136. regs.ch:=MaxCursorLines shr 1;
  137. regs.cl:=MaxCursorLines;
  138. end;
  139. crBlock : begin
  140. regs.ch:=0;
  141. regs.cl:=MaxCursorLines;
  142. end;
  143. else begin
  144. regs.ch:=MaxCursorLines-1;
  145. regs.cl:=MaxCursorLines;
  146. end;
  147. end;
  148. realintr($10,regs);
  149. end;
  150. function DefaultVideoModeSelector(const VideoMode: TVideoMode; Params: Longint): Boolean;
  151. type
  152. wordrec=packed record
  153. lo,hi : word;
  154. end;
  155. var
  156. regs : trealregs;
  157. begin
  158. regs.ax:=wordrec(Params).lo;
  159. regs.bx:=wordrec(Params).hi;
  160. realintr($10,regs);
  161. defaultvideomodeselector:=true;
  162. DoCustomMouse(false);
  163. end;
  164. function VideoModeSelector8x8(const VideoMode: TVideoMode; Params: Longint): Boolean;
  165. type
  166. wordrec=packed record
  167. lo,hi : word;
  168. end;
  169. var
  170. regs : trealregs;
  171. begin
  172. regs.ax:=3;
  173. regs.bx:=0;
  174. realintr($10,regs);
  175. regs.ax:=$1112;
  176. regs.bx:=$0;
  177. realintr($10,regs);
  178. videomodeselector8x8:=true;
  179. ScreenColor:=true;
  180. ScreenWidth:=80;
  181. ScreenHeight:=50;
  182. DoCustomMouse(false);
  183. end;
  184. procedure ClearScreen;
  185. begin
  186. FillWord(VideoBuf^,VideoBufSize shr 1,$0720);
  187. UpdateScreen(true);
  188. end;
  189. procedure UpdateScreen(Force: Boolean);
  190. begin
  191. if LockUpdateScreen<>0 then
  192. exit;
  193. if not force then
  194. begin
  195. asm
  196. movl VideoBuf,%esi
  197. movl OldVideoBuf,%edi
  198. movl VideoBufSize,%ecx
  199. shrl $2,%ecx
  200. repe
  201. cmpsl
  202. orl %ecx,%ecx
  203. jz .Lno_update
  204. movb $1,force
  205. .Lno_update:
  206. end;
  207. end;
  208. if Force then
  209. begin
  210. { dosmemput(videoseg,0,videobuf^,VideoBufSize);}
  211. asm
  212. pushw %es
  213. pushl %edi
  214. pushl %esi
  215. xor %edi, %edi
  216. movw videoseg, %di
  217. shll $0x4, %edi
  218. movl videobuf, %esi
  219. movl videobufsize, %ecx
  220. movw %fs, %ax
  221. movw %ax, %es
  222. rep movsb
  223. popl %esi
  224. popl %edi
  225. popw %es
  226. end ['EAX','ECX'];
  227. move(videobuf^,oldvideobuf^,VideoBufSize);
  228. end;
  229. end;
  230. procedure RegisterVideoModes;
  231. begin
  232. RegisterVideoMode(40, 25, False,@DefaultVideoModeSelector, $00000000);
  233. RegisterVideoMode(40, 25, True, @DefaultVideoModeSelector, $00000001);
  234. RegisterVideoMode(80, 25, False,@DefaultVideoModeSelector, $00000002);
  235. RegisterVideoMode(80, 25, True, @DefaultVideoModeSelector, $00000003);
  236. RegisterVideoMode(80, 50, True, @VideoModeSelector8x8, 0);
  237. end;
  238. {
  239. $Log$
  240. Revision 1.3 2000-02-07 22:54:44 florian
  241. * custommouse define removed, i.e. code is always active
  242. * the xor value for the mouse cursor must be $7f instead of $ff
  243. Revision 1.2 2000/02/06 14:29:45 florian
  244. * mouse support for vesa resolutions under go32v2, needs currently the define
  245. custommouse
  246. Revision 1.1 2000/01/06 01:20:30 peter
  247. * moved out of packages/ back to topdir
  248. Revision 1.1 1999/11/24 23:36:38 peter
  249. * moved to packages dir
  250. Revision 1.14 1999/10/03 19:53:26 peter
  251. * changed screenheight detection
  252. Revision 1.13 1999/08/16 18:26:20 peter
  253. * asm updatescreen for speed reasons
  254. Revision 1.12 1999/06/02 11:22:10 pierre
  255. * @ needed for proc address
  256. Revision 1.11 1999/04/01 12:51:51 pierre
  257. * removed clearscreen in initvideo for capture
  258. Revision 1.10 1999/03/21 22:49:40 florian
  259. * correct screeneight in 80x50 mode
  260. Revision 1.9 1999/03/14 22:15:49 florian
  261. * my last changes doesn't work correctly, fixed more
  262. the screen height calculation works incorrect in 80x50 mode
  263. Revision 1.8 1999/03/14 17:43:03 florian
  264. + 80x50 mode support added
  265. * some bugs in VESA mode support removed
  266. Revision 1.7 1999/02/19 16:42:48 peter
  267. * fixed typo
  268. Revision 1.6 1999/02/19 12:29:52 pierre
  269. * several bugs related to Cursor fixed !
  270. I still don't know the maximum value for
  271. the scan line (depends on resolution used !)
  272. Revision 1.5 1999/02/08 17:53:17 pierre
  273. + added restoring of BlinkState in InitVideo, old mode not stored
  274. Revision 1.4 1998/12/15 17:17:17 peter
  275. + cursor at 1,1 at the end
  276. Revision 1.3 1998/12/12 19:13:01 peter
  277. * keyboard updates
  278. * make test target, make all only makes units
  279. Revision 1.2 1998/12/10 11:41:50 florian
  280. * cursor is properly restored in DoneVideo
  281. Revision 1.1 1998/12/04 12:48:27 peter
  282. * moved some dirs
  283. Revision 1.4 1998/11/01 20:29:11 peter
  284. + lockupdatescreen counter to not let updatescreen() update
  285. Revision 1.3 1998/10/28 21:18:26 peter
  286. * more fixes
  287. Revision 1.2 1998/10/28 00:02:08 peter
  288. + mouse
  289. + video.clearscreen, video.videobufsize
  290. Revision 1.1 1998/10/26 11:31:47 peter
  291. + inital include files
  292. }