home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / gp / mouse.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-01-31  |  7.9 KB  |  277 lines

  1. UNIT MOUSE;   { uses $33 IRQ to access MicroSoft Mouse Driver functions }
  2. INTERFACE
  3. TYPE
  4.   IntegerArray32 = ARRAY[1..32] of Integer;
  5.  
  6. FUNCTION MouseDriverFound : BOOLEAN;
  7. FUNCTION MouseReset : BOOLEAN;
  8. PROCEDURE ShowCursor;
  9. PROCEDURE HideCursor;
  10. PROCEDURE GetButtonsAndPosition(VAR Buttons, Xpos, Ypos : Integer);
  11. PROCEDURE SetCursorPosition(Xpos, Ypos : Integer);
  12. PROCEDURE GetButtonPressInfo(ButtonNum : Integer;
  13.                         VAR Buttons, Times, Xpos, Ypos : Integer);
  14. PROCEDURE GetButtonReleaseInfo(ButtonNum : Integer;
  15.                          VAR Buttons, Times, Xpos, Ypos : Integer);
  16. PROCEDURE SetHorizCursorBounds(Xmin, Xmax : INTEGER);
  17. PROCEDURE SetVertCursorBounds(Ymin, Ymax : INTEGER);
  18. PROCEDURE DefineGraphicsCursor(Xhot, Yhot : Integer;
  19.                                VAR Masks : IntegerArray32);
  20. PROCEDURE SetTextCursor(TypeCursor, Value1, Value2 : Integer);
  21. PROCEDURE ReadMickeyCount(VAR Xcount, Ycount : Integer);
  22. PROCEDURE SetMickeyPixelRatio(Xratio, Yratio : Integer);
  23. FUNCTION SoftwareReset : BOOLEAN;
  24. PROCEDURE GetMouseSysInfo(VAR MajorVer, MinorVer, MouseType, IRQnum : Integer);
  25. FUNCTION LeftButtonPressed(VAR Xpos, Ypos : Integer): BOOLEAN;
  26. FUNCTION LeftButtonReleased(VAR Xpos, Ypos : Integer): BOOLEAN;
  27. FUNCTION RightButtonPressed(VAR Xpos, Ypos : Integer): BOOLEAN;
  28. FUNCTION RightButtonReleased(VAR Xpos, Ypos : Integer): BOOLEAN;
  29. FUNCTION BothButtonsPressed(VAR Xpos, Ypos : Integer): BOOLEAN;
  30.  
  31.  
  32. IMPLEMENTATION
  33.  
  34. USES DOS;
  35.  
  36. VAR
  37.   Regs : registers;
  38.   Visible : Integer; { used to keep image of internal mouse cursor flag }
  39.  
  40.  
  41. FUNCTION MouseDriverFound : BOOLEAN;
  42. VAR
  43.   Vec : Pointer;
  44. BEGIN
  45.   GetIntVec($33,Vec);
  46.   If (LongInt(Vec) = 0) OR (Byte(Vec^) = 207) THEN
  47.     MouseDriverFound := FALSE
  48.   ELSE
  49.     MouseDriverFound := TRUE;
  50. END;
  51.  
  52. FUNCTION MouseReset : BOOLEAN;
  53. BEGIN
  54.   Regs.AX := 0;
  55.   Intr($33,Regs);
  56.   IF Integer(Regs.AX) = -1 THEN  { word to integer for negative value }
  57.     MouseReset := TRUE  { => MOUSE HARDWARE FOUND AND RESET }
  58.   ELSE
  59.     MouseReset := FALSE;
  60.   Visible := -1;
  61. END;
  62.  
  63. PROCEDURE ShowCursor;
  64. BEGIN
  65.   IF Visible <> 0 THEN
  66.     REPEAT
  67.       Regs.AX := 1;
  68.       Intr($33,Regs);
  69.       Inc(Visible);
  70.     UNTIL Visible = 0;
  71. END;
  72.  
  73. PROCEDURE HideCursor;
  74. BEGIN
  75.   Regs.AX := 2;
  76.   Intr($33,Regs);
  77.   Dec(Visible);
  78. END;
  79.  
  80. PROCEDURE GetButtonsAndPosition(VAR Buttons, Xpos, Ypos : Integer);
  81. BEGIN
  82.   Regs.AX := 3;
  83.   Intr($33,Regs);
  84.   Buttons := Regs.BX;  { 0 neither button, 1 left, 2 right, 3 both }
  85.   Xpos := Regs.CX;
  86.   Ypos := Regs.DX;
  87. END;
  88.  
  89. PROCEDURE SetCursorPosition(Xpos, Ypos : Integer);
  90. BEGIN
  91.   Regs.AX := 4;
  92.   Regs.CX := Xpos;
  93.   Regs.DX := Ypos;
  94.   Intr($33,Regs);
  95. END;
  96.  
  97. PROCEDURE GetButtonPressInfo(ButtonNum : Integer;
  98.                         VAR Buttons, Times, Xpos, Ypos : Integer);
  99. BEGIN                { ButtonNum : button to check: 0 left, 1 right }
  100.   Regs.AX := 5;
  101.   Regs.BX := ButtonNum;
  102.   Intr($33,Regs);
  103.   Buttons := Regs.AX; { CURRENTLY:  0 neither button, 1 left, 2 right, 3 both }
  104.   Times := Regs.BX;   { times button ButtonNum PRESSED since last call}
  105.   Xpos := Regs.CX;    { AT LAST PRESS : X position button ButtonNum }
  106.   Ypos := Regs.DX;                    { Y position button ButtonNum }
  107. END;
  108.  
  109. PROCEDURE GetButtonReleaseInfo(ButtonNum : Integer;
  110.                          VAR Buttons, Times, Xpos, Ypos : Integer);
  111. BEGIN                { ButtonNum : button to check: 0 left, 1 right }
  112.   Regs.AX := 6;
  113.   Regs.BX := ButtonNum;
  114.   Intr($33,Regs);
  115.   Buttons := Regs.AX; { CURRENTLY: 0 neither button, 1 left, 2 right, 3 both }
  116.   Times := Regs.BX;   { times button ButtonNum RELEASED since last call}
  117.   Xpos := Regs.CX;    { AT LAST RELEASE: X position button ButtonNum }
  118.   Ypos := Regs.DX;                     { Y position button ButtonNum }
  119. END;
  120.  
  121. PROCEDURE SetHorizCursorBounds(Xmin, Xmax : INTEGER);
  122. BEGIN
  123.   Regs.AX := 7;
  124.   Regs.CX := Xmin;
  125.   Regs.DX := Xmax;
  126.   Intr($33,Regs);
  127. END;
  128.  
  129. PROCEDURE SetVertCursorBounds(Ymin, Ymax : INTEGER);
  130. BEGIN
  131.   Regs.AX := 8;
  132.   Regs.CX := Ymin;
  133.   Regs.DX := Ymax;
  134.   Intr($33,Regs);
  135. END;
  136.  
  137. PROCEDURE DefineGraphicsCursor(Xhot, Yhot : Integer;
  138.                                VAR Masks : IntegerArray32);
  139. BEGIN
  140.   Regs.AX := 9;
  141.   Regs.BX := Xhot;
  142.   Regs.CX := Yhot;
  143.   Regs.DX := Ofs(Masks);
  144.   Regs.ES := Seg(Masks);
  145.   Intr($33,Regs);
  146. END;
  147.  
  148. PROCEDURE SetTextCursor(TypeCursor, Value1, Value2 : Integer);
  149. BEGIN      { TypeCursor: 0 software cursor, 1 hardware cursor }
  150.   Regs.AX := 10;
  151.   Regs.BX := TypeCursor;
  152.   Regs.CX := Value1; { Software cursor: SCREEN MASK; }
  153.                      { Hardware cursor: FIRST SCAN LINE }
  154.   Regs.DX := Value2; { Software cursor: CURSOR MASK; }
  155.                      { Hardware cursor: LAST SCAN LINE }
  156.   Intr($33,Regs);
  157. END;
  158.  
  159. PROCEDURE ReadMickeyCount(VAR Xcount, Ycount : Integer);
  160. BEGIN     { counts in Mickeys = 1/200" increments SINCE LAST CALL }
  161.   Regs.AX := 11;
  162.   Intr($33,Regs);
  163.   Xcount := Regs.CX;
  164.   Ycount := Regs.DX;
  165. END;
  166.  
  167. (****************************************************)
  168.  
  169. PROCEDURE SetIrqMaskAndSubAddr;
  170.                                 { $33 Intr with Regs.AX = 12 NOT IMPLEMENTED}
  171. BEGIN
  172. END;
  173.  
  174. PROCEDURE LightPenOn;
  175.                                 { $33 Intr with Regs.AX = 13 NOT IMPLEMENTED}
  176. BEGIN
  177. END;
  178.  
  179. PROCEDURE LightPenOff;
  180.                                 { $33 Intr with Regs.AX = 14 NOT IMPLEMENTED}
  181. BEGIN
  182. END;
  183. (****************************************************)
  184.  
  185. PROCEDURE SetMickeyPixelRatio(Xratio, Yratio : Integer);
  186. BEGIN                   { ratio is Mickeys/(8 virtual screen pixels }
  187.   Regs.AX := 15;     { default for horiz is 8 Mickeys/8 virtual screen pixels }
  188.   Regs.CX := Xratio; { default for vert is 16 Mickeys/8 virtual screen pixels }
  189.   Regs.DX := Yratio;
  190.   Intr($33,Regs);
  191. END;
  192.  
  193. (************** Interrupt $33 functions 16 .. 32 not implemented ********)
  194.  
  195. FUNCTION SoftwareReset : BOOLEAN;   { use if cursor in text mode and go }
  196. BEGIN                               { into graphics mode                }
  197.   Regs.AX := 33;
  198.   Intr($33,Regs);
  199.   IF (Integer(Regs.AX) = -1) AND (Regs.BX = 2) THEN
  200.     BEGIN
  201.       SoftwareReset := TRUE;
  202.       Visible := -1;
  203.     END
  204.   ELSE
  205.     SoftwareReset := FALSE;
  206. END;
  207.  
  208. (************** Interrupt $33 functions 34 .. 35 not implemented ********)
  209.  
  210. PROCEDURE GetMouseSysInfo(VAR MajorVer, MinorVer, MouseType, IRQnum : Integer);
  211. BEGIN
  212.   Regs.AX := 36;
  213.   Intr($33,Regs);
  214.   MajorVer := Regs.Bh;    { to be read in HEX }
  215.   MinorVer := Regs.Bl;    { to be read in HEX }
  216.   MajorVer := (MajorVer DIV 16)*10 + (MajorVer MOD 16);
  217.   MinorVer := (MinorVer DIV 16)*10 + (MinorVer MOD 16);
  218.   MouseType := Regs.Ch; {1 bus, 2 serial, 3 InPort, 4 PS/2, 5 Hewlett-Packard}
  219.   IRQnum := Regs.Cl;    { IRQ type : 0 PS/2, 2..5 or 7 mouse }
  220. END;
  221.  
  222. FUNCTION LeftButtonPressed(VAR Xpos, Ypos : Integer): BOOLEAN;
  223. VAR
  224.   Buttons : Integer;
  225. BEGIN
  226.   GetButtonsAndPosition(Buttons,Xpos,Ypos);
  227.   IF Buttons = 1 THEN
  228.     LeftButtonPressed := TRUE
  229.   ELSE
  230.     LeftButtonPressed := FALSE;
  231. END;
  232.  
  233. FUNCTION LeftButtonReleased(VAR Xpos, Ypos : Integer): BOOLEAN;
  234. VAR
  235.   Buttons, Times : Integer;
  236. BEGIN
  237.   GetButtonReleaseInfo(0,Buttons,Times,Xpos,Ypos);
  238.   IF Times <> 0 THEN
  239.     LeftButtonReleased := TRUE
  240.   ELSE
  241.     LeftButtonReleased := FALSE;
  242.   END;
  243.  
  244. FUNCTION RightButtonPressed(VAR Xpos, Ypos : Integer): BOOLEAN;
  245. VAR
  246.   Buttons : Integer;
  247. BEGIN
  248.   GetButtonsAndPosition(Buttons,Xpos,Ypos);
  249.   IF Buttons = 2 THEN
  250.     RightButtonPressed := TRUE
  251.   ELSE
  252.     RightButtonPressed := FALSE;
  253. END;
  254.  
  255. FUNCTION RightButtonReleased(VAR Xpos, Ypos : Integer): BOOLEAN;
  256. VAR
  257.   Buttons, Times : Integer;
  258. BEGIN
  259.   GetButtonReleaseInfo(1,Buttons,Times,Xpos,Ypos);
  260.   IF Times <> 0 THEN
  261.     RightButtonReleased := TRUE
  262.   ELSE
  263.     RightButtonReleased := FALSE;
  264.   END;
  265.  
  266. FUNCTION BothButtonsPressed(VAR Xpos, Ypos : Integer): BOOLEAN;
  267. VAR
  268.   Buttons : Integer;
  269. BEGIN
  270.   GetButtonsAndPosition(Buttons,Xpos,Ypos);
  271.   IF Buttons = 3 THEN
  272.     BothButtonsPressed := TRUE
  273.   ELSE
  274.     BothButtonsPressed := FALSE;
  275. END;
  276.  
  277. END.