344 Приложение
UserProc: MouseHandlerType absolute OldCJserProc;
OldAX: Word;
Procedure MouseHandler; Par; Assembler;
{Ассемблерный интерфейс для вызова обработчика} ASM (Сохраняем в стеке регистры}
push Ьр
push ds
push es
push ax
mov ax,SEG 6 DATA
mov ds, ax
pop ax
mov OldAX,ax {Проверяем условия вызова}
mov ax,Word ptr [OldUserProc] fax - сегментадреса/
or ax,Word ptr [OldUserProc+2] (Адрес = NIL?}
jz @ {Да - не вызывать} (Готовим вызов процедуры пользователя}
mov ах,OldAX
push ax {Mask :- ах}
push Ьх /Buttons ;« Ьх)
push сх (X := сх}
push dx {У :- dx}
push di {DX :- dl}
push si 'DY :» si} {Вызываем процедуру пользователя}
call [OserProc]
{Выход из процедуры: восстанавливаем регистры} @: pop es
pop ds
pop bp
ret far
end; {MouseHandler} /-——_-——————————;
Procedure SetMouseHandler(Mask: Word; Proc: MouseHandlerType);
{Устанавливает адрес я условия вызова обработчика) begin
if IsMouse then with Reg do begin
UserProc :~ Proc;
ax :- $OC;
ex := Mask;
es := seg(MouseHandler);
dx :- ofs(MouseHandler) ;
Intr($33,Reg) end
end; {SetMouseHandlet} ^———————————————;
Procedure ChangeMouseHandler(Mask: Word; Proc: MouseHandlerType;
var OldMask: Word; var OldProc: Pointer);
/Заменяет старый обработчик новым} begin
if IsMouse then with Reg do begin
OldProc := OldUserProc;
ax := $14;
ex := Masit;
ea :» seg(MouseHandler);