home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 03 / extra / mouse.mod < prev    next >
Encoding:
Modula Implementation  |  1988-12-23  |  6.0 KB  |  285 lines

  1. (***********************************************)
  2. (*                  MOUSE.MOD                  *)
  3. (*        (C) 1988 M.Schlöter & TOOLBOX        *)
  4.  
  5. IMPLEMENTATION MODULE Mouse;
  6.  
  7. FROM SYSTEM IMPORT Registers, Seg, Ofs, BYTE;
  8. FROM Lib IMPORT Intr;
  9.  
  10. CONST
  11.   MouseIntr = 51;
  12.   (* Interrupt-Nr. of mouse driver software *)
  13.  
  14.  
  15. VAR MRegs : Registers;
  16.     TextMode : BOOLEAN;  (* Use text coordinates? *)
  17.     i : INTEGER;         (* FOR init-loop *)
  18.  
  19.  
  20. PROCEDURE CheckM() : INTEGER;
  21.   (* Returns # of mouse-buttons or 0 if no mouse *)
  22. BEGIN
  23.   MRegs.AX := 0;
  24.   Intr(MRegs,MouseIntr);
  25.   IF (INTEGER(MRegs.AX) = -1) THEN
  26.     RETURN INTEGER(MRegs.BX)
  27.   ELSE
  28.     RETURN 0;
  29.   END;
  30. END CheckM;
  31.  
  32.  
  33. PROCEDURE MPointerOn;
  34. BEGIN
  35.   MRegs.AX := 1;
  36.   Intr(MRegs,MouseIntr);
  37. END MPointerOn;
  38.  
  39.  
  40. PROCEDURE MPointerOff;
  41. BEGIN
  42.   MRegs.AX := 2;
  43.   Intr(MRegs,MouseIntr);
  44. END MPointerOff;
  45.  
  46.  
  47. PROCEDURE MState (VAR ActX, ActY,          
  48.                   PressedButtons : INTEGER);
  49.   (* Returns position and pressed button(s) *)
  50. BEGIN
  51.   MRegs.AX := 3;
  52.   Intr(MRegs,MouseIntr);
  53.   ActX := INTEGER(MRegs.CX);
  54.   ActY := INTEGER(MRegs.DX);
  55.   PressedButtons := INTEGER(MRegs.BX);
  56.   IF TextMode THEN
  57.     ActX := (ActX DIV 8) + 1;
  58.     ActY := (ActY DIV 8) + 1;
  59.   END;
  60. END MState;
  61.  
  62.  
  63. PROCEDURE SetMouse (x, y : INTEGER);
  64.   (* set mouse position *)
  65. BEGIN
  66.   IF TextMode THEN
  67.     x := (x - 1) * 8;
  68.     y := (y - 1) * 8;
  69.   END;
  70.   MRegs.AX := 4;
  71.   MRegs.CX := WORD(x);
  72.   MRegs.DX := WORD(y);
  73.   Intr(MRegs, MouseIntr);
  74. END SetMouse;
  75.  
  76.  
  77. PROCEDURE MButtonPressedPolling (button : INTEGER;
  78.                               VAR x,y,n : INTEGER);
  79.   (* Where has button been pressed and *)
  80.   (* how often since last call ?       *)
  81. BEGIN
  82.   MRegs.AX := 5;
  83.   MRegs.BX := button;
  84.   Intr(MRegs, MouseIntr);
  85.   x := INTEGER(MRegs.CX);
  86.   y := INTEGER(MRegs.DX);
  87.   n := INTEGER(MRegs.BX);
  88.   IF TextMode THEN
  89.     x := (x DIV 8) + 1;
  90.     y := (y DIV 8) + 1;
  91.   END;
  92. END MButtonPressedPolling;
  93.  
  94.  
  95. PROCEDURE MButtonReleasedPolling (button : INTEGER;
  96.                                VAR x,y,n : INTEGER);
  97.   (* Where has button been released and *)
  98.   (* how often since last call ?        *)
  99. BEGIN
  100.   MRegs.AX := 6;
  101.   MRegs.BX := button;
  102.   Intr(MRegs,MouseIntr);
  103.   x := INTEGER(MRegs.CX);
  104.   y := INTEGER(MRegs.DX);
  105.   n := INTEGER(MRegs.BX);
  106.   IF TextMode THEN
  107.     x := (x DIV 8) + 1;
  108.     y := (y DIV 8) + 1;
  109.   END;
  110. END MButtonReleasedPolling;
  111.  
  112.  
  113. PROCEDURE SetMFenceX (xmin, xmax : INTEGER);
  114. BEGIN
  115.   IF TextMode THEN
  116.     xmin := (xmin - 1) * 8;
  117.     xmax := (xmax - 1) * 8;
  118.   END;
  119.   MRegs.AX := 7;
  120.   MRegs.CX := WORD(xmin);
  121.   MRegs.DX := WORD(xmax);
  122.   Intr(MRegs,MouseIntr);
  123. END SetMFenceX;
  124.  
  125.  
  126. PROCEDURE SetMFenceY (ymin, ymax : INTEGER);
  127. BEGIN
  128.   IF TextMode THEN
  129.     ymin := (ymin - 1) * 8;
  130.     ymax := (ymax - 1) * 8;
  131.   END;
  132.   MRegs.AX := 8;
  133.   MRegs.CX := WORD(ymin);
  134.   MRegs.DX := WORD(ymax);
  135.   Intr(MRegs,MouseIntr);
  136. END SetMFenceY;
  137.  
  138.  
  139. PROCEDURE SetMFence (x1, y1, x2, y2 : INTEGER);
  140.   (* set limits of mouse area *)
  141. BEGIN
  142.   SetMFenceX(x1, x2);
  143.   SetMFenceY(y1, y2);
  144. END SetMFence;
  145.  
  146.  
  147. PROCEDURE SetGraphM (HotX, HotY : INTEGER; 
  148.                      masks      : tMMasks);
  149.   (* define graphis mouse-pointer *)
  150.  
  151. BEGIN
  152.   MRegs.AX := 9;
  153.   MRegs.BX := WORD(HotX);
  154.   MRegs.CX := WORD(HotY);
  155.   MRegs.DX := Ofs(masks);
  156.   MRegs.ES := Seg(masks);
  157.   Intr(MRegs,MouseIntr);
  158. END SetGraphM;
  159.  
  160.  
  161. PROCEDURE SetTextMAttr (MouseChar       : CHAR;
  162.                         CharColor,
  163.                         BackgroundColor : INTEGER);
  164.   (* Set text-mouse attributes *)
  165.  
  166. VAR attr : BYTE;
  167.  
  168. BEGIN
  169.   MRegs.AX := 10;
  170.   MRegs.BX := 0;
  171.   attr := BYTE(CharColor)
  172.           + BYTE(BackgroundColor << 4);
  173.   IF CharColor > 15 THEN
  174.     attr := attr + BYTE(128);
  175.   END;
  176.   MRegs.CX := WORD(attr << BYTE(8));
  177.   MRegs.DX := WORD(MRegs.CX) + WORD(ORD(MouseChar));
  178.   Intr(MRegs,MouseIntr);
  179. END SetTextMAttr;
  180.  
  181.  
  182. PROCEDURE GetMRate (VAR xmove, ymove: INTEGER);
  183.     (* Whats the mouse-moving rate since *)
  184.     (* last event (in mickeys) ?         *)
  185. BEGIN
  186.   MRegs.AX := 11;
  187.   Intr(MRegs,MouseIntr);
  188.   xmove := INTEGER(MRegs.CX);
  189.   ymove := INTEGER(MRegs.DX);
  190. END GetMRate;
  191.  
  192.  
  193. PROCEDURE SetMouseRate (dx, dy: INTEGER);
  194.    (* rate between "mickeys" and pixels *)
  195. BEGIN
  196.   MRegs.AX := 15;
  197.   MRegs.CX := WORD(dx);
  198.   MRegs.DX := WORD(dy);
  199.   Intr(MRegs,MouseIntr);
  200. END SetMouseRate;
  201.  
  202.  
  203. PROCEDURE MButtonPressed() : BOOLEAN;
  204.   (* Is actually a button pressed ? *)
  205. BEGIN
  206.   MRegs.AX := 3;
  207.   Intr(MRegs,MouseIntr);
  208.   RETURN (BITSET{MRegs.BX} * BITSET{7}) <> BITSET{};
  209. END MButtonPressed;
  210.  
  211.  
  212. PROCEDURE ActMButton() : INTEGER;
  213.   (* Which mouse-button is actually pressed ? *)
  214. BEGIN
  215.   MRegs.AX := 3;
  216.   Intr(MRegs,MouseIntr);
  217.   RETURN INTEGER(MRegs.BX);
  218. END ActMButton;
  219.  
  220.  
  221. PROCEDURE WaitMEvent;
  222.   (* Wait until mouse moved or button clicked *)
  223.  
  224. VAR dx, dy: INTEGER;
  225.  
  226. BEGIN
  227.   REPEAT
  228.     GetMRate(dx, dy);
  229.   UNTIL (dx <> 0) OR (dy <> 0) OR MButtonPressed();
  230. END WaitMEvent;
  231.  
  232.  
  233. PROCEDURE SetMSpeed (s : INTEGER);
  234.   (* Set mouse-speed *)
  235. BEGIN
  236.   IF (s >= 1) AND (s <= 9) THEN
  237.     SetMouseRate(s*6, s*12);
  238.   END;
  239. END SetMSpeed;
  240.  
  241.  
  242. PROCEDURE MouseInArea(x1, y1, x2, y2 : INTEGER)
  243.                                          : BOOLEAN;
  244.          (* Mouse-pointer in area ? *)
  245.  
  246. VAR temp, x, y : INTEGER;
  247.  
  248. BEGIN
  249.   IF x1 > x2 THEN
  250.     temp := x1;  x1 := x2;  x2 := temp;
  251.   END;
  252.   IF y1 > y2 THEN
  253.     temp := y1;  y1 := y2;  y2 := temp;
  254.   END;
  255.   MState(x, y, temp);
  256.   RETURN (x >= x1) AND (x <= x2)
  257.          AND (y >= y1) AND (y <= y2);
  258. END MouseInArea;
  259.  
  260.  
  261. PROCEDURE TextCoords(flag : BOOLEAN);
  262.   (* Use text-coordinates ? *)
  263. BEGIN
  264.   TextMode := flag;
  265. END TextCoords;
  266.  
  267.  
  268. BEGIN  (* Init-code *)
  269.   TextMode := TRUE;
  270.   FOR i := 0 TO 15 DO
  271.     MArrow.screen[i] := 0FFFFH;
  272.   END;
  273.   MArrow.mask[0] := 08000H;
  274.   MArrow.mask[1] := 0E000H;
  275.   MArrow.mask[2] := 0F800H;
  276.   MArrow.mask[3] := 0FE00H;
  277.   MArrow.mask[4] := 0D800H;
  278.   MArrow.mask[5] :=  0C00H;
  279.   MArrow.mask[6] :=  0600H;
  280.   MArrow.mask[7] :=  0300H;
  281.   FOR i := 8 TO 15 DO
  282.     MArrow.mask[i] := 0000H;
  283.   END;
  284. END Mouse.
  285.