video.inc 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. {
  2. System independent low-level video interface for go32v2
  3. $Id$
  4. }
  5. {$ASMMODE ATT}
  6. uses
  7. mouse,
  8. go32;
  9. procedure TargetEntry;
  10. begin
  11. end;
  12. procedure TargetExit;
  13. begin
  14. end;
  15. var
  16. OldVideoBuf : PVideoBuf;
  17. { used to know if LastCursorType is valid }
  18. const
  19. InitVideoCalled : boolean = false;
  20. LastCursorType : word = crUnderline;
  21. { allways set blink state again }
  22. procedure SetHighBitBlink;
  23. var
  24. regs : trealregs;
  25. begin
  26. regs.ax:=$1003;
  27. regs.bx:=$0001;
  28. realintr($10,regs);
  29. end;
  30. function BIOSGetScreenMode(var Cols,Rows: word; var Color: boolean): boolean;
  31. var r: trealregs;
  32. L: longint;
  33. LSel,LSeg: word;
  34. B: array[0..63] of byte;
  35. type TWord = word; PWord = ^TWord;
  36. var Size: word;
  37. OK: boolean;
  38. begin
  39. L:=global_dos_alloc(64);
  40. LSeg:=(L shr 16);
  41. LSel:=(L and $ffff);
  42. r.ah:=$1b; r.bx:=0;
  43. r.es:=LSeg; r.di:=0;
  44. realintr($10,r);
  45. OK:=(r.al=$1b);
  46. if OK then
  47. begin
  48. dpmi_dosmemget(LSeg,0,B,64);
  49. Cols:=PWord(@B[5])^; Rows:=B[$22];
  50. Color:=PWord(@B[$27])^<>0;
  51. end;
  52. global_dos_free(LSel);
  53. BIOSGetScreenMode:=OK;
  54. end;
  55. procedure InitVideo;
  56. var
  57. regs : trealregs;
  58. begin
  59. VideoSeg:=$b800;
  60. if (ScreenWidth=$ffff) or (ScreenHeight=$ffff) or
  61. (ScreenWidth=0) or (ScreenHeight=0) then
  62. begin
  63. ScreenColor:=true;
  64. regs.ah:=$0f;
  65. realintr($10,regs);
  66. if (regs.al and 1)=0 then
  67. ScreenColor:=false;
  68. if regs.al=7 then
  69. begin
  70. ScreenColor:=false;
  71. VideoSeg:=$b000;
  72. end
  73. else
  74. VideoSeg:=$b800;
  75. ScreenWidth:=regs.ah;
  76. regs.ax:=$1130;
  77. regs.bx:=0;
  78. realintr($10,regs);
  79. ScreenHeight:=regs.dl+1;
  80. BIOSGetScreenMode(ScreenWidth,ScreenHeight,ScreenColor);
  81. end;
  82. regs.ah:=$03;
  83. regs.bh:=0;
  84. realintr($10,regs);
  85. CursorLines:=regs.cl;
  86. CursorX:=regs.dl;
  87. CursorY:=regs.dh;
  88. If InitVideoCalled then
  89. Begin
  90. FreeMem(VideoBuf,VideoBufSize);
  91. FreeMem(OldVideoBuf,VideoBufSize);
  92. End;
  93. { allocate pmode memory buffer }
  94. VideoBufSize:=ScreenWidth*ScreenHeight*2;
  95. GetMem(VideoBuf,VideoBufSize);
  96. GetMem(OldVideoBuf,VideoBufSize);
  97. InitVideoCalled:=true;
  98. SetHighBitBlink;
  99. SetCursorType(LastCursorType);
  100. { ClearScreen; removed here
  101. to be able to catch the content of the monitor }
  102. end;
  103. procedure DoneVideo;
  104. begin
  105. If InitVideoCalled then
  106. Begin
  107. LastCursorType:=GetCursorType;
  108. ClearScreen;
  109. SetCursorType(crUnderLine);
  110. SetCursorPos(0,0);
  111. FreeMem(VideoBuf,VideoBufSize);
  112. VideoBuf:=nil;
  113. FreeMem(OldVideoBuf,VideoBufSize);
  114. OldVideoBuf:=nil;
  115. InitVideoCalled:=false;
  116. VideoBufSize:=0;
  117. End;
  118. end;
  119. function GetCapabilities: Word;
  120. begin
  121. GetCapabilities := $3F;
  122. end;
  123. procedure SetCursorPos(NewCursorX, NewCursorY: Word);
  124. var
  125. regs : trealregs;
  126. begin
  127. regs.ah:=$02;
  128. regs.bh:=0;
  129. regs.dh:=NewCursorY;
  130. regs.dl:=NewCursorX;
  131. realintr($10,regs);
  132. CursorY:=regs.dh;
  133. CursorX:=regs.dl;
  134. end;
  135. { I don't know the maximum value for the scan line
  136. probably 7 or 15 depending on resolution !!
  137. }
  138. function GetCursorType: Word;
  139. var
  140. regs : trealregs;
  141. begin
  142. regs.ah:=$03;
  143. regs.bh:=0;
  144. realintr($10,regs);
  145. GetCursorType:=crHidden;
  146. if (regs.ch and $60)=0 then
  147. begin
  148. GetCursorType:=crBlock;
  149. if (regs.ch and $1f)<>0 then
  150. begin
  151. GetCursorType:=crHalfBlock;
  152. if regs.cl+1=(regs.ch and $1F) then
  153. GetCursorType:=crUnderline;
  154. end;
  155. end;
  156. end;
  157. procedure SetCursorType(NewType: Word);
  158. var
  159. regs : trealregs;
  160. const
  161. MaxCursorLines = 7;
  162. begin
  163. regs.ah:=$01;
  164. regs.bx:=NewType;
  165. case NewType of
  166. crHidden : regs.cx:=$2000;
  167. crHalfBlock : begin
  168. regs.ch:=MaxCursorLines shr 1;
  169. regs.cl:=MaxCursorLines;
  170. end;
  171. crBlock : begin
  172. regs.ch:=0;
  173. regs.cl:=MaxCursorLines;
  174. end;
  175. else begin
  176. regs.ch:=MaxCursorLines-1;
  177. regs.cl:=MaxCursorLines;
  178. end;
  179. end;
  180. realintr($10,regs);
  181. end;
  182. function DefaultVideoModeSelector(const VideoMode: TVideoMode; Params: Longint): Boolean;
  183. type
  184. wordrec=packed record
  185. lo,hi : word;
  186. end;
  187. var
  188. regs : trealregs;
  189. begin
  190. regs.ax:=wordrec(Params).lo;
  191. regs.bx:=wordrec(Params).hi;
  192. realintr($10,regs);
  193. defaultvideomodeselector:=true;
  194. DoCustomMouse(false);
  195. end;
  196. function VideoModeSelector8x8(const VideoMode: TVideoMode; Params: Longint): Boolean;
  197. type
  198. wordrec=packed record
  199. lo,hi : word;
  200. end;
  201. var
  202. regs : trealregs;
  203. begin
  204. regs.ax:=3;
  205. regs.bx:=0;
  206. realintr($10,regs);
  207. regs.ax:=$1112;
  208. regs.bx:=$0;
  209. realintr($10,regs);
  210. videomodeselector8x8:=true;
  211. ScreenColor:=true;
  212. ScreenWidth:=80;
  213. ScreenHeight:=50;
  214. DoCustomMouse(false);
  215. end;
  216. procedure ClearScreen;
  217. begin
  218. FillWord(VideoBuf^,VideoBufSize shr 1,$0720);
  219. UpdateScreen(true);
  220. end;
  221. procedure UpdateScreen(Force: Boolean);
  222. begin
  223. if LockUpdateScreen<>0 then
  224. exit;
  225. if not force then
  226. begin
  227. asm
  228. movl VideoBuf,%esi
  229. movl OldVideoBuf,%edi
  230. movl VideoBufSize,%ecx
  231. shrl $2,%ecx
  232. repe
  233. cmpsl
  234. orl %ecx,%ecx
  235. jz .Lno_update
  236. movb $1,force
  237. .Lno_update:
  238. end;
  239. end;
  240. if Force then
  241. begin
  242. { dosmemput(videoseg,0,videobuf^,VideoBufSize);}
  243. asm
  244. pushw %es
  245. pushl %edi
  246. pushl %esi
  247. xor %edi, %edi
  248. movw videoseg, %di
  249. shll $0x4, %edi
  250. movl videobuf, %esi
  251. movl videobufsize, %ecx
  252. movw %fs, %ax
  253. movw %ax, %es
  254. rep movsb
  255. popl %esi
  256. popl %edi
  257. popw %es
  258. end ['EAX','ECX'];
  259. move(videobuf^,oldvideobuf^,VideoBufSize);
  260. end;
  261. end;
  262. procedure RegisterVideoModes;
  263. begin
  264. RegisterVideoMode(40, 25, False,@DefaultVideoModeSelector, $00000000);
  265. RegisterVideoMode(40, 25, True, @DefaultVideoModeSelector, $00000001);
  266. RegisterVideoMode(80, 25, False,@DefaultVideoModeSelector, $00000002);
  267. RegisterVideoMode(80, 25, True, @DefaultVideoModeSelector, $00000003);
  268. RegisterVideoMode(80, 50, True, @VideoModeSelector8x8, 0);
  269. end;
  270. {
  271. $Log$
  272. Revision 1.4 2000-10-04 11:53:31 pierre
  273. Add TargetEntry and TargetExit (merged)
  274. Revision 1.3 2000/08/16 18:51:57 peter
  275. * Fixes from Gabor (merged)
  276. Revision 1.2 2000/07/13 11:32:24 michael
  277. + removed logs
  278. }