IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Параметры в Procedure Assembler
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5

Репутация: -  0  +


Вот, собственно, навоял мышевой модуль.
Структыра 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Adminь
****

Группа: Пользователи
Сообщений: 803
Пол: Мужской
Реальное имя: Евгений

Репутация: -  5  +


Если пошлешь мне мылом свою програмку с модулем для работы с мышью, найду ошибку...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 38

Репутация: -  0  +


Вот, смотри:
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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 5

Репутация: -  0  +


У тебя в сущности то же самое, чо и в моем
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}", тогда он окажется в сегменте кода.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 38

Репутация: -  0  +


Всё верно, и тогда (если объявить как External) будет изменён ES командой les. В сущности он и так меняется. В ES загружается тот сегмент, в котором находится table, а она находится именно в сегменте данных, а ES по умолчанию и так указывает на сегмент данных, но это не факт. И это нужно учитывать (как в случае с External).
К тому же у меня этот код нормально рабтает.
Курсор меняется и для этого не надо никаких констант.
Разве у тебя не работает ? :)))))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 23.08.2017 22:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"