  unit MyMouse;
  { bare bones mouse unit used by the simulator -stolen from swag, sorta }

  interface

  uses dos;

  var
    mousex, mousey:integer;

  procedure initmouse(var buttons:byte; var is:boolean);
  Procedure showmouse;
  Procedure hidemouse;
  procedure getmousexy;
  procedure mouseto80;
  Procedure MouseExit;
  function mouserightpressed:boolean; {??}
  function mouseleftpressed:boolean;
  function mouserightdown:boolean;
  function mousebothdown:boolean;
  function mouseleftdown:boolean;

 implementation

 Var
   ExitPtr: pointer;
   Regs: registers;
   TempWord: word;

  procedure initmouse(var buttons:byte; var is:boolean);
  var msavailable:boolean;
      msbuttons:byte;
  begin
     msavailable:=false;
     Asm
       MOV MsButtons,0
       MOV AX,0000h
       INT 33h
       CMP AX,0000h
       JE  @Dne
       CMP AX,0FFFFh
       JNE @Dne
       MOV MsAvailable,True
       CMP BX,0002h
       JE  @Two
       CMP BX,0003h
       JE  @Thr
       CMP BX,0FFFFh
       JE  @Thr
 @Two: MOV MsButtons,2
       JMP @Dne
 @Thr: MOV MsButtons,3
 @Dne:
     End;
     buttons:=msbuttons;
     is:=msavailable;
  end;

  Procedure showmouse; Assembler;
  Asm
    MOV AX,0001h
    INT 33h
  end;

  Procedure Hidemouse; Assembler;
  Asm
    MOV AX,0002h
    INT 33h
  end;

  procedure getmousexy; Assembler;
  Asm
    MOV AX,0003h
    INT 33h
    MOV mousex,CX
    MOV mousey,DX
  end;

  procedure mouseto80;
  begin
    {makes it a number for 80x25 text mode}
    mousex:=(mousex div 8)+1;
    mousey:=(mousey div 8)+1;
  end;

  {dont know the diff between 'rghtDOWN and rightPRESSED'}

  function mouseleftpressed:boolean;
  begin
    asm
      MOV @Result,False
      MOV AX,0005h
      MOV BX,0000h
      INT 33h
      {MOV Count,BX} {what is count?}
      MOV mousex,CX
      MOV mousey,DX
      CMP AX,1
      JNE @Done
      MOV @Result,True
      @Done:
    end;
  end;

  function mouserightpressed:boolean;
  begin
    asm
      MOV @Result,False
      MOV AX,0005h
      MOV BX,0001h
      INT 33h
      {MOV Count,BX} {what is count?}
      MOV mousex,CX
      MOV mousey,DX
      CMP AX,2
      JNE @Done
      MOV @Result,True
      @Done:
    end;
  end;

  function mouserightdown:boolean;
  begin
    asm
      MOV @Result,False
      MOV AX,0003h
      INT 33h
      MOV mousex,CX
      MOV mousey,DX
      CMP BX,2
      JNE @Done
      MOV @Result,True
      @Done:
    end;
  end;

  function mousebothdown:boolean;
  begin
    asm
      MOV @Result,False
      MOV AX,0003h
      INT 33h
      MOV MouseX,CX
      MOV MouseY,DX
      CMP BX,3
      JNE @Done
      MOV @Result,True
      @Done:
    end;
  end;

  function mouseleftdown:boolean;
  begin
    Asm
      MOV @Result,False
      MOV AX,0003h
      INT 33h
      MOV mousex,CX
      MOV mousey,DX
      CMP BX,1
      JNE @Done
      MOV @Result,True
      @Done:
    end;
  end;

  Procedure MouseExit;
  begin
    ExitProc:=ExitPtr;
  end;

  begin
    ExitPtr:=ExitProc;
    ExitProc:=@MouseExit;
  End.
