Вот, собственно, навоял мышевой модуль.
Структыра tPointerShape описывает графический курсор мыши.
typeПервый вызов MouseSetPointerShape нормально назначает картинку мышевому курсору.
tPointerShape = record
AndMask : array [1..16] of word;
XorMask : array [1..16] of word;
end;
const
a : byte = 1;
{ Почему-то если здесь должна быть хотябы одна (можно и больше)
константа, иначе рисунок PS1 окажется передернут }
PS1 : tPointerShape = ...
PS2 : tPointerShape = ...
procedure MouseSetPointerShape(X, Y : word;
PointerShape : pointer); assembler;
asm
mov AX, $0009
mov BX, X
mov CX, Y
mov DX, Seg PointerShape { << ** }
mov ES, DX { << ** }
mov DX, Offset PointerShape
{
Здесь в паре ES-DX должен быть PointerShape но почему-то
получается ES=0. Пришлось временно поставить "mov DX, DS",
но это не есть карашо
}
int $33
end;
{ И самое прикольное... }
begin
MouseSetPointerShape(8, 8, @PS1); { << 1 }
...
MouseSetPointerShape(8, 8, @PS2); { << 2 }
end.
Если пошлешь мне мылом свою програмку с модулем для работы с мышью, найду ошибку...
Вот, смотри:
uses graph;
type
ppointershape=^tpointershape;
tpointershape=record
andmask:array[1..16] of word;
xormask:array[1..16] of word;
end;
var
ps1,ps2:tpointershape;
grDriver: Integer;
p: Integer;
ErrCode: Integer;
procedure initmouse; assembler;
asm
mov ax,0
int 33h
end;
procedure showmouse; assembler;
asm
mov ax,1
int 33h
end;
procedure hidemouse; assembler;
asm
mov ax,2
int 33h
end;
procedure initmask(x,y:integer;mask:ppointershape); assembler;
asm
mov ax,9
mov bx,x
mov cx,y
les dx,mask
int 33h
end;
begin
grDriver := Detect;
InitGraph(grDriver, p,'');
setfillstyle(1,1);
bar(20,20,120,120);
for p:=1 to 16 do
begin
ps1.xormask[p]:=random(65535)+1;
ps1.andmask[p]:=not ps1.xormask[p];
ps2.xormask[p]:=random(65535)+1;
ps2.andmask[p]:=not ps2.xormask[p];
end;
initmouse;
initmask(10,10,@ps1); {Выставим одну маску}
showmouse;
readln;
hidemouse;
initmask(10,10,@ps2); {выставим вторую маску}
showmouse;
readln;
hidemouse;
initmask(10,10,@ps1); {Вернём назад старую}
showmouse;
readln;
hidemouse;
end.
У тебя в сущности то же самое, чо и в моем
procedure initmask(x,y:integer;mask:ppointershape); assembler;
asm
mov ax,9
mov bx,x
mov cx,y
les dx,mask { <--- }
int 33h
end;
Всё верно, и тогда (если объявить как External) будет изменён ES командой les. В сущности он и так меняется. В ES загружается тот сегмент, в котором находится table, а она находится именно в сегменте данных, а ES по умолчанию и так указывает на сегмент данных, но это не факт. И это нужно учитывать (как в случае с External).
К тому же у меня этот код нормально рабтает.
Курсор меняется и для этого не надо никаких констант.
Разве у тебя не работает ? :)))))