[Back to MOUSE SWAG index] [Back to Main SWAG index] [Original]

    {
    From: FRED JOHNSON
    Subj: Mousey Control..
    Can someone out there please explain how to read from the mouse?
    }

    {Explanation below in reference table}
    USES dos,crt;

    VAR
     M1,M2,M3,M4 : word;
     Regs        : Registers;  { MS DOS Registers }
     satisfied   : boolean;    { if mouse pos and button are together }

    PROCEDURE mouse( var M1,M2,M3,M4 : word );
      begin
        With Regs DO
          begin
            AX := M1; BX := M2; CX := M3; DX := M4;
          end;
        intr($33,Regs); { Interrupt $33, the mouse interrupt }
        With Regs DO
          begin
            M1 := AX; M2 := BX; M3 := CX; M4 := DX;
          end;
      end;

    PROCEDURE initmouse;
      begin
        M1 := 1 ; Mouse( M1,M2,M3,M4 ) { Set mouse cursor ON }
      end;

    BEGIN
      satisfied := false;
      textcolor(7); { Grey }
      clrscr;
      initmouse;
     while not keypressed do { until  KEYBOARD key is pressed }
        begin
         M1 := 3;
          MOUSE(m1,M2,M3,M4);
          IF (M2 and 1) <> 0 then
            begin                { if left button pressed }
              writeln(' Left Button');
              write(' M3 =',M3 div 8); write(' M4 =',M4 div 8);
            end;
          if (M2 and 2) <> 0 then
            begin                { if rght button pressed }
              writeln(' Right Button');
              write(' M3 =',M3 div 8); write(' M4 =',M4 div 8);
            end;
          if (M2 and 4) <> 0 then                      {if midlbutton pressed}
            begin
              M1 := 4; M2 := 0; M3 := 30*8; M4 := 11*8; {Sets MCursor out of }
              mouse( M1,M2,M3,M4 );                     {the way }
              gotoxy(25,10); write('***************');
              gotoxy(25,11); write('* ');textcolor(14);
              write('C'); textcolor(07); write('learscreen *');
              gotoxy(25,12); write('* '); textcolor(14);
              write('Q'); textcolor(07); write('uit        *');
              gotoxy(25,13); write('***************');
              repeat
                M1 := 3;
                mouse(M1,M2,M3,M4);
                if (M3 div 8) = 26 then                 { Tests X position }
                  if (M4 div 8) = 10 then               { Tests Y position }
                    if (M2 and 1) <> 0 then             { Tests lft button }
                      begin
                        satisfied := true;
                        M1 := 4; M2  := 0; M3 :=0; M4 :=0;{MCursor out of way}
                        mouse( M1,M2,M3,M4 );
                        clrscr;
                      end;

                if (M3 div 8) = 26 then                { Tests X position }
                  if (M4 div 8) = 11 then              { Tests Y position }
                    if (M2 and 1) <> 0 then            { Tests lft button }
                      begin
                        satisfied := true;
                        M1 := 0; M2 :=0; M3 :=0; M4 := 0;  { Turn Mouse Off }
                        mouse( M1,M2,M3,M4 );
                        clrscr;
                        halt;
                      end;

              until satisfied = true;
              clrscr;
              end;
              satisfied := false;
       end;
       M1 := 0;                                            { Turn Mouse Off }
       mouse(M1,M2,M3,M4);
    END.

    Reference Table
      M1 M2 M3 M4
      1  0  0  0   = Turn Mouse on with cursor.
      2  0  0  0   = Turn Mouse Off.
      3  ?  ?  ?   = To see if buttons are pressed.
                      Test registers with logical AND   (M2 is BX register)
                      M2 and 1 = Left Button
                      M2 and 2 = Right Button
                      M2 and 3 = Left and Right Buttons
                      M2 and 4 = Middle Button
                      M2 and 5 = Left and Middle Buttons
                      M2 and 6 = Right and Middle Buttons
                      M2 and 7 = Left, Middle and Right Buttons

      3  0  X  Y  = Get Mouse Cursor position.
                     M3 (CX) will return Mouse X coordinates. (0  =left wall)
                     M4 (DX) will return Mouse Y coordinates. (632= rght wall)
                     Divide by 8 and add 1 for Turbo Pascal XY position.

      4  0  X  Y  = Set Mouse Cursor position.
                     M3 (CX) set for Mouse X coordinate.      (0  = left wall)
                     M4 (DX) set for Mouse Y coordinate.      (632= rght wall)

      6  ?  0  0  = Mouse Button Release Status.             M2(BX)set if True

                              Assembly Language Example
    mov ax,0001   ; (M1 := 1)
    int 33h       ; Set Mouse cursor ON
    here:         ;
    mov ax,0003   ; (M1 := 3)
    int 33h       ; Test for mouse Keypress
    and bx,1      ; left button?
    jne lft       ;
    mov ax,0003   ;
    int 33h       ;
    and bx,2      ; right button?
    jne rht       ;
    mov ax,0003   ;
    int 33h       ;
    and bx,4      ; middle button?
    jne mid       ;
    jmp here      ; if not keep looping
    lft:          ;
    mov dx,lft_st ; address of string if left button
    jmp prnt      ;
    rht:          ;
    mov dx,rht_st ; address of string if right button

[Back to MOUSE SWAG index] [Back to Main SWAG index] [Original]