home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1988-12-23 | 6.0 KB | 285 lines |
- (***********************************************)
- (* MOUSE.MOD *)
- (* (C) 1988 M.Schlöter & TOOLBOX *)
-
- IMPLEMENTATION MODULE Mouse;
-
- FROM SYSTEM IMPORT Registers, Seg, Ofs, BYTE;
- FROM Lib IMPORT Intr;
-
- CONST
- MouseIntr = 51;
- (* Interrupt-Nr. of mouse driver software *)
-
-
- VAR MRegs : Registers;
- TextMode : BOOLEAN; (* Use text coordinates? *)
- i : INTEGER; (* FOR init-loop *)
-
-
- PROCEDURE CheckM() : INTEGER;
- (* Returns # of mouse-buttons or 0 if no mouse *)
- BEGIN
- MRegs.AX := 0;
- Intr(MRegs,MouseIntr);
- IF (INTEGER(MRegs.AX) = -1) THEN
- RETURN INTEGER(MRegs.BX)
- ELSE
- RETURN 0;
- END;
- END CheckM;
-
-
- PROCEDURE MPointerOn;
- BEGIN
- MRegs.AX := 1;
- Intr(MRegs,MouseIntr);
- END MPointerOn;
-
-
- PROCEDURE MPointerOff;
- BEGIN
- MRegs.AX := 2;
- Intr(MRegs,MouseIntr);
- END MPointerOff;
-
-
- PROCEDURE MState (VAR ActX, ActY,
- PressedButtons : INTEGER);
- (* Returns position and pressed button(s) *)
- BEGIN
- MRegs.AX := 3;
- Intr(MRegs,MouseIntr);
- ActX := INTEGER(MRegs.CX);
- ActY := INTEGER(MRegs.DX);
- PressedButtons := INTEGER(MRegs.BX);
- IF TextMode THEN
- ActX := (ActX DIV 8) + 1;
- ActY := (ActY DIV 8) + 1;
- END;
- END MState;
-
-
- PROCEDURE SetMouse (x, y : INTEGER);
- (* set mouse position *)
- BEGIN
- IF TextMode THEN
- x := (x - 1) * 8;
- y := (y - 1) * 8;
- END;
- MRegs.AX := 4;
- MRegs.CX := WORD(x);
- MRegs.DX := WORD(y);
- Intr(MRegs, MouseIntr);
- END SetMouse;
-
-
- PROCEDURE MButtonPressedPolling (button : INTEGER;
- VAR x,y,n : INTEGER);
- (* Where has button been pressed and *)
- (* how often since last call ? *)
- BEGIN
- MRegs.AX := 5;
- MRegs.BX := button;
- Intr(MRegs, MouseIntr);
- x := INTEGER(MRegs.CX);
- y := INTEGER(MRegs.DX);
- n := INTEGER(MRegs.BX);
- IF TextMode THEN
- x := (x DIV 8) + 1;
- y := (y DIV 8) + 1;
- END;
- END MButtonPressedPolling;
-
-
- PROCEDURE MButtonReleasedPolling (button : INTEGER;
- VAR x,y,n : INTEGER);
- (* Where has button been released and *)
- (* how often since last call ? *)
- BEGIN
- MRegs.AX := 6;
- MRegs.BX := button;
- Intr(MRegs,MouseIntr);
- x := INTEGER(MRegs.CX);
- y := INTEGER(MRegs.DX);
- n := INTEGER(MRegs.BX);
- IF TextMode THEN
- x := (x DIV 8) + 1;
- y := (y DIV 8) + 1;
- END;
- END MButtonReleasedPolling;
-
-
- PROCEDURE SetMFenceX (xmin, xmax : INTEGER);
- BEGIN
- IF TextMode THEN
- xmin := (xmin - 1) * 8;
- xmax := (xmax - 1) * 8;
- END;
- MRegs.AX := 7;
- MRegs.CX := WORD(xmin);
- MRegs.DX := WORD(xmax);
- Intr(MRegs,MouseIntr);
- END SetMFenceX;
-
-
- PROCEDURE SetMFenceY (ymin, ymax : INTEGER);
- BEGIN
- IF TextMode THEN
- ymin := (ymin - 1) * 8;
- ymax := (ymax - 1) * 8;
- END;
- MRegs.AX := 8;
- MRegs.CX := WORD(ymin);
- MRegs.DX := WORD(ymax);
- Intr(MRegs,MouseIntr);
- END SetMFenceY;
-
-
- PROCEDURE SetMFence (x1, y1, x2, y2 : INTEGER);
- (* set limits of mouse area *)
- BEGIN
- SetMFenceX(x1, x2);
- SetMFenceY(y1, y2);
- END SetMFence;
-
-
- PROCEDURE SetGraphM (HotX, HotY : INTEGER;
- masks : tMMasks);
- (* define graphis mouse-pointer *)
-
- BEGIN
- MRegs.AX := 9;
- MRegs.BX := WORD(HotX);
- MRegs.CX := WORD(HotY);
- MRegs.DX := Ofs(masks);
- MRegs.ES := Seg(masks);
- Intr(MRegs,MouseIntr);
- END SetGraphM;
-
-
- PROCEDURE SetTextMAttr (MouseChar : CHAR;
- CharColor,
- BackgroundColor : INTEGER);
- (* Set text-mouse attributes *)
-
- VAR attr : BYTE;
-
- BEGIN
- MRegs.AX := 10;
- MRegs.BX := 0;
- attr := BYTE(CharColor)
- + BYTE(BackgroundColor << 4);
- IF CharColor > 15 THEN
- attr := attr + BYTE(128);
- END;
- MRegs.CX := WORD(attr << BYTE(8));
- MRegs.DX := WORD(MRegs.CX) + WORD(ORD(MouseChar));
- Intr(MRegs,MouseIntr);
- END SetTextMAttr;
-
-
- PROCEDURE GetMRate (VAR xmove, ymove: INTEGER);
- (* Whats the mouse-moving rate since *)
- (* last event (in mickeys) ? *)
- BEGIN
- MRegs.AX := 11;
- Intr(MRegs,MouseIntr);
- xmove := INTEGER(MRegs.CX);
- ymove := INTEGER(MRegs.DX);
- END GetMRate;
-
-
- PROCEDURE SetMouseRate (dx, dy: INTEGER);
- (* rate between "mickeys" and pixels *)
- BEGIN
- MRegs.AX := 15;
- MRegs.CX := WORD(dx);
- MRegs.DX := WORD(dy);
- Intr(MRegs,MouseIntr);
- END SetMouseRate;
-
-
- PROCEDURE MButtonPressed() : BOOLEAN;
- (* Is actually a button pressed ? *)
- BEGIN
- MRegs.AX := 3;
- Intr(MRegs,MouseIntr);
- RETURN (BITSET{MRegs.BX} * BITSET{7}) <> BITSET{};
- END MButtonPressed;
-
-
- PROCEDURE ActMButton() : INTEGER;
- (* Which mouse-button is actually pressed ? *)
- BEGIN
- MRegs.AX := 3;
- Intr(MRegs,MouseIntr);
- RETURN INTEGER(MRegs.BX);
- END ActMButton;
-
-
- PROCEDURE WaitMEvent;
- (* Wait until mouse moved or button clicked *)
-
- VAR dx, dy: INTEGER;
-
- BEGIN
- REPEAT
- GetMRate(dx, dy);
- UNTIL (dx <> 0) OR (dy <> 0) OR MButtonPressed();
- END WaitMEvent;
-
-
- PROCEDURE SetMSpeed (s : INTEGER);
- (* Set mouse-speed *)
- BEGIN
- IF (s >= 1) AND (s <= 9) THEN
- SetMouseRate(s*6, s*12);
- END;
- END SetMSpeed;
-
-
- PROCEDURE MouseInArea(x1, y1, x2, y2 : INTEGER)
- : BOOLEAN;
- (* Mouse-pointer in area ? *)
-
- VAR temp, x, y : INTEGER;
-
- BEGIN
- IF x1 > x2 THEN
- temp := x1; x1 := x2; x2 := temp;
- END;
- IF y1 > y2 THEN
- temp := y1; y1 := y2; y2 := temp;
- END;
- MState(x, y, temp);
- RETURN (x >= x1) AND (x <= x2)
- AND (y >= y1) AND (y <= y2);
- END MouseInArea;
-
-
- PROCEDURE TextCoords(flag : BOOLEAN);
- (* Use text-coordinates ? *)
- BEGIN
- TextMode := flag;
- END TextCoords;
-
-
- BEGIN (* Init-code *)
- TextMode := TRUE;
- FOR i := 0 TO 15 DO
- MArrow.screen[i] := 0FFFFH;
- END;
- MArrow.mask[0] := 08000H;
- MArrow.mask[1] := 0E000H;
- MArrow.mask[2] := 0F800H;
- MArrow.mask[3] := 0FE00H;
- MArrow.mask[4] := 0D800H;
- MArrow.mask[5] := 0C00H;
- MArrow.mask[6] := 0600H;
- MArrow.mask[7] := 0300H;
- FOR i := 8 TO 15 DO
- MArrow.mask[i] := 0000H;
- END;
- END Mouse.