Помощь - Поиск - Пользователи - Календарь
Полная версия: Параметры в Procedure Assembler
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
MYF
Вот, собственно, навоял мышевой модуль.
Структыра tPointerShape описывает графический курсор мыши.
type
  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.
Первый вызов MouseSetPointerShape нормально назначает картинку мышевому курсору.
А вот второй - почему-то опять лепит тот же PS1.
mj
Если пошлешь мне мылом свою програмку с модулем для работы с мышью, найду ошибку...
Some1
Вот, смотри:
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.
MYF
У тебя в сущности то же самое, чо и в моем
procedure initmask(x,y:integer;mask:ppointershape); assembler;
asm
  mov ax,9
  mov bx,x
  mov cx,y
  les dx,mask { <--- }
  int 33h
end

в DX ты грузишь Offset Mask, а в ES - то остается то же, что было. Чаще всего (в BP) ES=DS, но это не зночит, что всегда.
И, кроме того, Mask не всегда находится в сегменте данных. Рисунок курсора можно подгрузить и как "procedure Mask; external; {$L MASK.OBJ}", тогда он окажется в сегменте кода.
Some1
Всё верно, и тогда (если объявить как External) будет изменён ES командой les. В сущности он и так меняется. В ES загружается тот сегмент, в котором находится table, а она находится именно в сегменте данных, а ES по умолчанию и так указывает на сегмент данных, но это не факт. И это нужно учитывать (как в случае с External).
К тому же у меня этот код нормально рабтает.
Курсор меняется и для этого не надо никаких констант.
Разве у тебя не работает ? :)))))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.