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);