Unit mouse; Interface Procedure RESET_MOUSE (var errore : boolean; var num : word); Procedure OPEN_MOUSE; Procedure CLOSE_MOUSE; Function LEFT_BUTTON : boolean; Function RIGHT_BUTTON : boolean; Function MIDDLE_BUTTON : boolean; Function X_MOUSE (w : boolean) : word; (* w=True se in Graphic Mode *) Function Y_MOUSE (w : boolean) : word; Procedure POS_MOUSE (x,y : word); Procedure WINDOW_MOUSE (x,y,x1,y1 : word); Procedure GRAPHIC_CURSOR (nome : string; var errore : boolean; hotx,hoty : word); Procedure TEXT_CURSOR1 (inizio, fine : word); Procedure TEXT_CURSOR2 (sfondo, colore : byte); Function X_REL : word; Function Y_REL : word; Procedure RAPPORTO_MOUSE (oriz,vert : word); Procedure NOWINDOW_MOUSE (x,y,x1,y1 : word); Implementation Uses dos; Var r : registers; Procedure GEST_MOUSE (inf : word); begin r.ax:=inf; Intr ($33,r) end; Procedure RESET_MOUSE (var errore : boolean; var num : word); begin GEST_MOUSE (0); errore:=r.ax = -1; num:=r.bx end; Procedure OPEN_MOUSE; begin GEST_MOUSE (1) end; Procedure CLOSE_MOUSE; begin GEST_MOUSE (2) end; Function LEFT_BUTTON : boolean; begin GEST_MOUSE (3); left_button:= (r.bx = 1) or (r.bx = 3) or (r.bx = 5) or (r.bx = 7) end; Function RIGHT_BUTTON : boolean; begin GEST_MOUSE (3); right_button:= (r.bx = 2) or (r.bx = 3) or (r.bx = 6) or (r.bx = 7) end; Function MIDDLE_BUTTON : boolean; begin GEST_MOUSE (3); middle_button:= (r.bx = 4) or (r.bx = 5) or (r.bx = 6) or (r.bx = 7) end; Function X_MOUSE (w : boolean) : word; begin GEST_MOUSE (3); If w then x_mouse:=r.cx else x_mouse:=r.cx div 8 end; Function Y_MOUSE (w : boolean) : word; begin GEST_MOUSE (3); If w then y_mouse:=r.dx else y_mouse:=r.dx div 8 end; Procedure POS_MOUSE (x,y : word); begin r.cx:=x; r.dx:=y; GEST_MOUSE (4) end; Procedure WINDOW_MOUSE (x,y,x1,y1 : word); begin r.cx:=x; r.dx:=x1; GEST_MOUSE (7); r.cx:=y; r.dx:=y1; GEST_MOUSE (8) end; Procedure GRAPHIC_CURSOR (nome : string; var errore : boolean; hotx,hoty : word); Const n = 16; Type vettore = array[1..n]of word; vettore2 = array[1..n*2]of word; Var cursore : file of vettore; buffer : vettore; mappa : vettore2; i : byte; begin Assign (cursore,nome); {$I-} Reset (cursore); {$I+} errore:=Ioresult<>0; If not(errore) then begin Read (cursore,buffer); Close (cursore); For i:=1 to 16 do mappa[i]:=not(buffer[i]); For i:=17 to 32 do mappa[i]:=buffer[i-16]; r.bx:=hotx; r.cx:=hoty; r.es:=Seg(mappa); r.dx:=Ofs(mappa); GEST_MOUSE (9) end end; Procedure TEXT_CURSOR1 (inizio, fine : word); begin r.bx:=1; r.cx:=inizio; r.dx:=fine; GEST_MOUSE(10) end; Procedure TEXT_CURSOR2 (sfondo, colore : byte); begin if (sfondo<16)and(colore<16) then begin r.bx:=0; r.cx:=$00ff; r.dx:=(colore*256)+(sfondo*4096); GEST_MOUSE(10) end end; Function X_REL : word; begin GEST_MOUSE (11); X_REL:=r.cx end; Function Y_REL : word; begin GEST_MOUSE (11); Y_REL:=r.dx end; Procedure RAPPORTO_MOUSE (oriz,vert : word); begin r.cx:=oriz; r.dx:=vert; GEST_MOUSE (15) end; Procedure NOWINDOW_MOUSE (x,y,x1,y1 : word); begin r.cx:=x; r.dx:=y; r.si:=x1; r.di:=y1; GEST_MOUSE (16) end; end. (*---------------------------------------------------*) (* PUT THE FOLLOWING CODE IN THE FILE TEST.PAS *) program Test; uses CRT, Mouse; var e: Boolean; n: Word; begin ClrScr; Reset_Mouse (e, n); if e then WriteLn ('Mouse Initialization Failed!') else begin Open_Mouse; repeat GotoXY (20, 25); Write ('Mouse: X = ', X_Mouse(False), ' Y = ', Y_Mouse(False), ' '); if Left_Button or Right_Button then begin Close_Mouse; (* YOU MUST HIDE THE MOUSE BEFORE WRITING SOMETHING TO VIDEO *) GotoXY (X_Mouse(False), Y_Mouse(False)); if Left_Button then Write (#178) else Write (' '); Open_Mouse; (* AND THEN MAKE IT VISIBLE AGAIN *) end; until Middle_Button or KeyPressed; Close_Mouse; end; end.