Unit MOUSE; INTERFACE const n=40; Type MC=Array[1..50,1..50] of byte; Var _Cursor:MC; (* Инициализация мыши *) Function InitMouse:boolean; (* Функция возвращает количество кнопок у мыши *) function ButtonMouse:byte; (* Отображение указателя мыши *) Procedure ShowMouse; (* Скрыть указатель *) Procedure HideMouse; (* Возвращаются координаты указателя *) Procedure GetMouseXY(VAR KoordX,KoordY:Word ); (* Возвращает true, если указатель находится в *) (* заданной области X1,Y1,X2,Y2 *) Function MouseIn(X1,Y1,X2,Y2:word):boolean; (* Следующая Функция возвращает следующие значения: *) (* 1 - если нажата левая кнопка. *) (* 2 - если нажата правая кнопка. *) (* 3 - если нажаты левая и правая кнопки *) (* 4 - если нажата средняя кнопка (колесико) *) (* 5 - если нажаты левая кнопка и колесико *) (* 6 - если нажаты правая кнопка и колесико. *) (* 7 - если нажаты все кнопки (2 кнопки и колесико).*) Function ButtonPressed:byte; (* Установка указателя мыши в позицию X, Y *) Procedure GotoMouseXY(x,y:word); (* Возвращает true, если была нажата любая клавиша. *) Function MousePressed: Boolean; (* Следующая функция возвращает количество нажатий *) (* левой(при num=0), средней(при num=2), *) (* правой(при num=1) кнопкой мыши с момента *) (* последнего вызова данной процедуры. *) Function getnum(num:word; var x,y:word):word; (*Ограничение перемещения указателя по горизонтали. *) Procedure LimHor(max,min:word); (*Ограничение перемещения указателя по вертикали. *) Procedure LimVer(max,min:word); (* возвращает величины смещения мыши по вертикали и *) (* горизонтали (в микки) со времени последнего *) (* вызова процедуры. *) Procedure GetMikki(var x,y:integer); (* Область исключения указателя *) (* координаты x1,y1,x2,y2 - соответственно - *) (* левая граница(горизонт), *) (* гарница сверху, правая граница, нижняя. *) Procedure SetArea(x1,y1,x2,y2:word); (* Установка пороговой скорости *) (* Значение по умолчания - 64 микки/с *) Procedure SetSpeedMouse(mikkiS:word); (* Установка чувствительности мыши *) Procedure SetMouseOptions(hor,ver,porog:word); (* Установка своего обработчика движения *) Procedure SetMouseEventManager; IMPLEMENTATION Var x,y:word; pr:boolean; Function InitMouse:boolean; var ResultRegAX:word; begin pr:=false; asm mov ax,$00 int $33 mov ResultRegAX,ax end; If ResultRegAX=$FFFF then InitMouse:=true else InitMouse:=false End; function ButtonMouse:byte; var ResultRegBX:word; Begin Asm mov ax,$00 int $33 mov ResultRegBX,bx End; ButtonMouse:=ResultRegBX end; Procedure ShowMouse; begin if not pr then begin Asm Mov AX,$01 Int $33 end end end; Procedure HideMouse; assembler; Asm Mov AX,$02 INT $33 End; Procedure GetMouseXY(VAR KoordX,KoordY:Word ); var ResultCX,ResultDX:word; begin Asm mov ax,$03 int $33 mov ResultCX,CX mov ResultDX,DX end; KoordX:=ResultCX; KoordY:=ResultDX end; Function MouseIn(X1,Y1,X2,Y2:word):boolean; var rdx,rcx:word; begin asm mov ax,$03 int $33 mov rdx,dx mov rcx,cx end; MouseIn := (rcx>=X1) and (rcx<=X2) and (rdx>=Y1) and (rdx<=Y2) end; Function ButtonPressed:byte; var rbl:byte; begin asm mov ax,$03 int $33 mov rbl,bl end; ButtonPressed:=rbl end; Procedure GotoMouseXY(x,y:word); assembler; asm mov ax,$04 mov cx,x mov dx,y end; Function MousePressed: Boolean; var resultbx:word; begin asm Mov ax, $03 Int $33 mov resultbx,bx end; MousePressed := resultbx<>0 end; Function getnum(num:word; var x,y:word):word; var kn,ResultCX,ResultDX:word; begin asm mov ax,$05 mov bx,num int $33 mov ResultCX,cx mov ResultDX,dx mov kn,bx end; getnum:=kn; x:=ResultCX; y:=ResultDX end; Procedure LimHor(max,min:word); assembler; asm mov ax,$07 mov cx,min mov dx,max int $33 end; Procedure LimVer(max,min:word); assembler; asm mov ax,$08 mov cx,min mov dx,max int $33 end; Procedure GetMikki(var x,y:integer); var RCX,RDX:word; begin asm mov ax,$0B int $33 mov RCX,cx mov RDX,dx end; x:=RCX; y:=RDX end; Procedure SetArea(x1,y1,x2,y2:word); assembler; asm mov ax,$10 mov cx,x1 mov dx,y1 mov si,x2 mov di,y2 int $33 end; Procedure SetSpeedMouse(mikkiS:word); assembler; asm mov ax,$13 mov dx,mikkiS end; Procedure SetMouseOptions(hor,ver,porog:word); assembler; asm mov ax,$1A mov bx,hor mov cx,ver mov dx,porog int $33 end; procedure GrMouseVGA; far; var a,x1,y1,yt,xt:word; i,j,color:byte; begin a:=0; asm mov x1,cx mov y1,dx end; for i:=1 to n do for j:=1 to n do begin color:=0; yt:=y+i; xt:=x+j; asm mov ah,0ch mov al,color mov bh,0 mov dx,yt mov cx,xt int 10h end; end; asm lea cx,a mov dx,y1 mov cx,x1 mov x,cx mov y,dx end; for i:=1 to n do for j:=1 to n do begin color:=_Cursor[i,j]; yt:=y1+i; xt:=x1+j; asm mov ah,0ch mov al,color mov bh,0 mov dx,yt mov cx,xt int 10h end; end; end; Procedure SetMouseEventManager; var saddr,oaddr:word; a,i,j:byte; begin hidemouse; pr:=true; for i:=1 to n do for j:=1 to n do _cursor[i,j]:=15; a:=0; saddr:=seg(GrMouseVGA); oaddr:=ofs(GrMouseVGA); asm pusha mov ax,0Ch lea cx,a mov es,saddr mov dx,oaddr int 33h popa end; end; End.