MSMOUSE.MOD 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * MSMOUSE.MOD - Microsoft mouse drivers *
  5. * *
  6. * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (*%F _fdata *)
  11. (*# call(seg_name => null) *)
  12. (*# data(seg_name => null) *)
  13. (*%E *)
  14. (*# module(implementation=>off) *)
  15. (*# call(o_a_copy => off) *)
  16. (*# check(stack=>off,
  17. index=>off,
  18. range=>off,
  19. overflow=>off,
  20. nil_ptr=>off) *)
  21. IMPLEMENTATION MODULE MsMouse;
  22. (* MSDOS Only *)
  23. IMPORT Lib, SYSTEM, CoreMain;
  24. PROCEDURE Reset(): INTEGER;
  25. VAR
  26. r: SYSTEM.Registers;
  27. status: CARDINAL;
  28. BEGIN
  29. r.AX:=0;
  30. Lib.Intr(r, 33H);
  31. status:=r.AX;
  32. IF status = MAX(CARDINAL) THEN
  33. RETURN(r.BX);
  34. END;
  35. RETURN MAX(INTEGER);
  36. END Reset;
  37. PROCEDURE Cursor(Mode: BOOLEAN);
  38. VAR
  39. r: SYSTEM.Registers;
  40. BEGIN
  41. IF Mode = _MS_HIDE THEN
  42. r.AX:=2;
  43. ELSIF Mode = _MS_SHOW THEN
  44. r.AX:=1;
  45. ELSE
  46. RETURN;
  47. END;
  48. Lib.Intr(r, 33H);
  49. RETURN;
  50. END Cursor;
  51. PROCEDURE GetStatus(VAR mp: MsData);
  52. VAR
  53. r: SYSTEM.Registers;
  54. BEGIN
  55. r.AX:=3;
  56. Lib.Intr(r, 33H);
  57. mp.row:=r.DX;
  58. mp.col:=r.CX;
  59. mp.left_pressed:=0 IN BITSET(r.BX);
  60. mp.right_pressed:=1 IN BITSET (r.BX);
  61. mp.middle_pressed:=2 IN BITSET(r.BX);
  62. RETURN;
  63. END GetStatus;
  64. PROCEDURE SetPosition(Row, Col: INTEGER);
  65. VAR
  66. r: SYSTEM.Registers;
  67. BEGIN
  68. r.AX:=4;
  69. r.CX:=Col;
  70. r.DX:=Row;
  71. Lib.Intr(r, 33H);
  72. RETURN;
  73. END SetPosition;
  74. PROCEDURE GetPress(Button: INTEGER; VAR mp: MsData);
  75. VAR
  76. r: SYSTEM.Registers;
  77. BEGIN
  78. r.AX:=5;
  79. r.BX:=Button;
  80. Lib.Intr(r, 33H);
  81. mp.row:=r.DX;
  82. mp.col:=r.CX;
  83. mp.left_pressed:=0 IN BITSET(r.AX);
  84. mp.right_pressed:=1 IN BITSET(r.AX);
  85. mp.middle_pressed:=2 IN BITSET(r.AX);
  86. mp.actions:=r.BX;
  87. RETURN;
  88. END GetPress;
  89. PROCEDURE GetRelease(Button: INTEGER; VAR mp: MsData);
  90. VAR
  91. r: SYSTEM.Registers;
  92. BEGIN
  93. r.AX:=6;
  94. r.BX:=Button;
  95. Lib.Intr(r, 33H);
  96. mp.row:=r.DX;
  97. mp.col:=r.CX;
  98. mp.left_pressed:=0 IN BITSET(r.AX);
  99. mp.right_pressed:=1 IN BITSET (r.AX);
  100. mp.middle_pressed:=2 IN BITSET(r.AX);
  101. mp.actions:=r.BX;
  102. RETURN;
  103. END GetRelease;
  104. PROCEDURE SetRange(mp: MsRange);
  105. VAR
  106. r: SYSTEM.Registers;
  107. BEGIN
  108. r.AX:=7;
  109. r.CX:=mp.min_col;
  110. r.DX:=mp.max_col;
  111. Lib.Intr(r, 33H);
  112. r.AX:=8;
  113. r.CX:=mp.min_row;
  114. r.DX:=mp.max_row;
  115. Lib.Intr(r, 33H);
  116. RETURN;
  117. END SetRange;
  118. PROCEDURE SetGraphCursor(VAR mp: MsGraphcur);
  119. VAR
  120. r: SYSTEM.Registers;
  121. BEGIN
  122. r.AX:=9;
  123. r.BX:=mp.col;
  124. r.CX:=mp.row;
  125. r.DX:=Ofs(mp.screen_mask);
  126. r.ES:=Seg(mp.screen_mask);
  127. Lib.Intr(r, 33H);
  128. RETURN;
  129. END SetGraphCursor;
  130. PROCEDURE SetTextCursor(mp: MsTextCur);
  131. VAR
  132. r: SYSTEM.Registers;
  133. BEGIN
  134. r.AX:=0AH;
  135. r.BX:=CARDINAL(mp.type);
  136. IF mp.type = _MS_HARD THEN
  137. r.CX:=mp.H.start_scan;
  138. r.DX:=mp.H.end_scan;
  139. ELSE
  140. r.CX:=mp.S.screen_mask;
  141. r.DX:=mp.S.cursor_mask;
  142. END;
  143. Lib.Intr(r, 33H);
  144. RETURN;
  145. END SetTextCursor;
  146. PROCEDURE GetMotion(VAR mp: MsMotion);
  147. VAR
  148. r: SYSTEM.Registers;
  149. BEGIN
  150. r.AX:=0BH;
  151. Lib.Intr(r, 33H);
  152. mp.horiz:=r.CX;
  153. mp.vert:=r.DX;
  154. RETURN;
  155. END GetMotion;
  156. TYPE
  157. tr = RECORD
  158. CASE : BOOLEAN OF
  159. | TRUE : IFunc: MouseFuncType;
  160. | FALSE : A: ARRAY [0..1] OF CARDINAL;
  161. END;
  162. END;
  163. PROCEDURE SetInterrupt(VAR mp: MsInterrupt);
  164. VAR
  165. r: SYSTEM.Registers;
  166. temp: tr;
  167. BEGIN
  168. temp.IFunc := mp.IntFunc;
  169. r.AX:=0CH;
  170. r.CX:=mp.mask;
  171. r.DX:=temp.A[0];
  172. r.ES:=temp.A[1];
  173. Lib.Intr(r, 33H);
  174. RETURN;
  175. END SetInterrupt;
  176. PROCEDURE SwapInterrupt(VAR mp: MsInterrupt);
  177. VAR
  178. r: SYSTEM.Registers;
  179. temp: tr;
  180. BEGIN
  181. temp.IFunc := mp.IntFunc;
  182. r.AX:=14H;
  183. r.CX:=mp.mask;
  184. r.DX:=temp.A[0];
  185. r.ES:=temp.A[1];
  186. Lib.Intr(r, 33H);
  187. mp.mask:=r.CX;
  188. mp.IntFunc:=MouseFuncType([r.ES: r.DX]);
  189. RETURN;
  190. END SwapInterrupt;
  191. PROCEDURE LightPen(Mode: BOOLEAN);
  192. VAR
  193. r: SYSTEM.Registers;
  194. BEGIN
  195. IF Mode = _MS_ON THEN
  196. r.AX:=0DH;
  197. ELSE
  198. r.AX:=0EH;
  199. END;
  200. Lib.Intr(r, 33H);
  201. RETURN;
  202. END LightPen;
  203. PROCEDURE SetMickeys(Vert, Horiz: INTEGER);
  204. VAR
  205. r: SYSTEM.Registers;
  206. BEGIN
  207. r.AX:=0FH;
  208. r.CX:=Horiz;
  209. r.DX:=Vert;
  210. Lib.Intr(r, 33H);
  211. RETURN;
  212. END SetMickeys;
  213. PROCEDURE UpdateScreen(x1, y1, x2, y2: INTEGER);
  214. VAR
  215. r: SYSTEM.Registers;
  216. BEGIN
  217. r.AX:=10H;
  218. r.CX:=x1;
  219. r.DX:=y1;
  220. r.SI:=x2;
  221. r.DI:=y2;
  222. Lib.Intr(r, 33H);
  223. RETURN;
  224. END UpdateScreen;
  225. PROCEDURE SetDouble(Threshold: INTEGER);
  226. VAR
  227. r: SYSTEM.Registers;
  228. BEGIN
  229. r.AX:=13H;
  230. r.DX:=Threshold;
  231. Lib.Intr(r, 33H);
  232. RETURN;
  233. END SetDouble;
  234. PROCEDURE DriverSize(): CARDINAL;
  235. VAR
  236. r: SYSTEM.Registers;
  237. BEGIN
  238. r.AX:=15H;
  239. Lib.Intr(r, 33H);
  240. RETURN(r.BX);
  241. END DriverSize;
  242. PROCEDURE SaveDriver(Buffer: ADDRESS);
  243. VAR
  244. r: SYSTEM.Registers;
  245. BEGIN
  246. r.AX:=16H;
  247. r.DX:=Ofs(Buffer^);
  248. r.ES:=Seg(Buffer^);
  249. Lib.Intr(r, 33H);
  250. RETURN;
  251. END SaveDriver;
  252. PROCEDURE RestoreDriver(Buffer: ADDRESS);
  253. VAR
  254. r: SYSTEM.Registers;
  255. BEGIN
  256. r.AX:=017H;
  257. r.DX:=Ofs(Buffer^);
  258. r.ES:=Seg(Buffer^);
  259. Lib.Intr(r, 33H);
  260. RETURN;
  261. END RestoreDriver;
  262. PROCEDURE GetSensitivity(VAR mp: MsSense);
  263. VAR
  264. r: SYSTEM.Registers;
  265. BEGIN
  266. r.AX:=01BH;
  267. Lib.Intr(r, 33H);
  268. mp.v_speed:=r.CX;
  269. mp.h_speed:=r.BX;
  270. mp.threshold:=r.DX;
  271. RETURN;
  272. END GetSensitivity;
  273. PROCEDURE SetSensitivity(mp: MsSense);
  274. VAR
  275. r: SYSTEM.Registers;
  276. BEGIN
  277. r.AX:=01AH;
  278. r.BX:=mp.h_speed;
  279. r.CX:=mp.v_speed;
  280. r.DX:=mp.threshold;
  281. Lib.Intr(r, 33H);
  282. RETURN;
  283. END SetSensitivity;
  284. PROCEDURE SetPage(Page: CARDINAL);
  285. VAR
  286. r: SYSTEM.Registers;
  287. BEGIN
  288. r.AX:=01DH;
  289. r.BX:=Page;
  290. Lib.Intr(r, 33H);
  291. RETURN;
  292. END SetPage;
  293. PROCEDURE GetPage(): CARDINAL;
  294. VAR
  295. r: SYSTEM.Registers;
  296. BEGIN
  297. r.AX:=01EH;
  298. Lib.Intr(r, 33H);
  299. RETURN(r.BX);
  300. END GetPage;
  301. END MsMouse.