Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Мышь под DOS в TP7 в граф. режиме

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

ZYV



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте,
 
Вот есть такая проблема. Надо используя драйвер svga256.bgi рисовать свой курсор мышки. Для этой цели я набросал такой вот юнит:
 

Код:
 
unit zmouse;
 
interface
 
type
  mousedriver = object
    constructor init;
    destructor destroy;
  end;
 
implementation
 
procedure move_handler; far; assembler;
asm
end;
 
constructor mousedriver.init;
var
  mh_off, mh_seg: word;
begin
  mh_seg := Seg(move_handler);
  mh_off := Ofs(move_handler);
 
  asm
 
    {Turn on mouse}
    mov ax, 0
    int 33h
 
    { Install custom handler }
    mov ax, 0ch
    mov cx, 1fh
 
    mov es, mh_seg
    mov dx, mh_off
 
    int 33h
 
  end;
end;
 
destructor mousedriver.destroy; assembler;
asm
  {Disable mouse tracking handler}
  mov ax, 0ch
  mov cx, 00h
  int 33h
end;
 
end.
 

 
Когда вызывается init включается мышь и устанавливается пользовательская функция на движение мыши. Когда вызывается destroy она снимается. Всё круто, когда мышка сдвигается, управление действительно передаётся процедуре  “ move_handler ”. Но есть одна проблема… как же нарисовать курсор? Я написал процедурку в стиле:
 

Код:
 
procedure cursorDraw(x, y: integer);
var
  i, j: byte;
begin
 
  for i := 1 to cur.height do begin
    for j := 1 to cur.width do begin
      if ((cur.d[j, i].r <> -1) and (cur.d[j, i].g <> -1) and (cur.d[j, i].b <> -1)) then begin
        putpixel(x - 1 + j, y - 1 + i, findnearcol(cur.d[j, i].r, cur.d[j, i].g, cur.d[j, i].b));
      end;
    end;
  end;
end;
 

 
Которая рисует курсор из предварительно загруженного массива другой процедурой… Но как же её туды впихнуть? Я ассемблер начал изучать сегодня и написать всё на ассемблере поэтому не представляется возможным. А вот как вызвать из этой процедуры паскалевскую нормальную я никак не могу понять. Может быть кто-то  делал это?
 
Спасибо,
Z.

Всего записей: 98 | Зарегистр. 19-07-2003 | Отправлено: 01:26 22-02-2004
ZYV



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hi, all!
 
Порылся в исходниках GrafX (mouselib) и наешл там кое-что. Написал такой Handler:
 

Код:
 
procedure test;
begin
  putpixel(m_x-10, m_y-10, 15);
end;
 
var
  m_x, m_y: word;
 
procedure mhandler; far; assembler;
asm
  { Load default data segment - destroyed by driver }
  mov   si,seg @DATA
  mov   ds,si
 
  { Save ALL registers   }
  db 66h;pusha
  db 0Fh,0A8h {push gs}
  db 0Fh,0A0h {push fs}
 
  mov m_x, cx
  mov m_y, dx
  call test
 
  { Reload ALL registers }
  db 0Fh,0A1h {pop fs}
  db 0Fh,0A9h {pop gs}
  db 66h;popa
end;
 

 
Вроде работает... Какие-то ошибки были, но кажется это из-за другого. Может быть кто-нибудь мне объяснит, что я собственно сделал :)?

Всего записей: 98 | Зарегистр. 19-07-2003 | Отправлено: 10:21 22-02-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
var mh_off, mh_seg: word;  
begin  
  mh_seg := Seg(move_handler);  
  mh_off := Ofs(move_handler);  
  asm  
    mov es, mh_seg  
    mov dx, mh_off  
 

1) Seg(move_handler) у тебя всегда равен регистру CS. А Ofs(move_handler) пишется в ассемблере.

Код:
 
   mov dx,cs
   mov es,dx
   mov dx, OFFSET move_handler
 

2) Стэк всегда в регистрах SS:SP так что смело меняй местами  

Код:
 
  { Save ALL registers   }  
  db 66h;pusha  
  db 0Fh,0A8h {push gs}  
  db 0Fh,0A0h {push fs}  
 
 { Load default data segment - destroyed by driver }  
  mov   si,seg @DATA  
  mov   ds,si  
 

Иначе твой обработчик портит регистры DS:SI. В приведённом тобой коде сохраняются все 32-х разрядные регистры. Для TP7 и BP7 этого делать не обязательно. Я вообще использовал директиву interrupt. Но там единственный момент - нужно делать свои RETF. Используй компиляцию tpc ??.pas /v и анализируй весь код в TD (Turbo Debugger)

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 11:15 24-02-2004
ZYV



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо большое за грамотные комментарии!! Всё заработало. Разве только я последним советом не воспользуюсь… Я в asm полный n00b, ну и нужен он мне пока из чисто утилитарных соображений. Будет время – углублю знания. Теперь handler выглядит так:
 

Код:
 
{The handler for the mouse move & buttons}
procedure mouse_move_handler; far; assembler;
asm
  { Save ALL registers   }
  db 66h;pusha
  db 0Fh,0A8h {push gs}
  db 0Fh,0A0h {push fs}
 
  { Load default data segment - destroyed by driver }
  mov   si,seg @DATA
  mov   ds,si
 
  push bx { Preserve BX - it's getting corrupted!! }
 
  mov ax, mouse_x
  mov mouse_ox, ax
  mov ax, mouse_y
  mov mouse_oy, ax
 
  mov mouse_x, cx
  mov mouse_y, dx
 
  call mouse_redraw_cursor
 
  mov ax, mouse_right
  mov mouse_old_right, ax
  mov ax, mouse_left
  mov mouse_old_left, ax
 
  pop bx {Pop BX from the backup}
  mov mouse_left, bx
  mov mouse_right, bx
  and mouse_left, 0001h
  and mouse_right, 0002h
 
  call mouse_event_move
  call mouse_event_button
 
  { Reload ALL registers }
  db 0Fh,0A1h {pop fs}
  db 0Fh,0A9h {pop gs}
  db 66h;popa
end;
 

 
Если кому интересно- выложу модуль, когда будет доделан до кондиции.
 
Кстати, вот ещё вопрос… Может вы знаете чем технически отличаются svga256 и svga256m? В последнем у меня всё работает вообще отлично, а вот в первом есть неприятности – при любом раскладе почему-то поле перемещения мыши 640x200 (для режима 640x480) какой бы я режим не ставил… Мне бы хотелось чтобы и там и там работало. Что же мне, отслеживать перемещения в миках?
 

Всего записей: 98 | Зарегистр. 19-07-2003 | Отправлено: 20:06 24-02-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ZYV
int 33h - Читай доку, там есть функции задающие границы перемещения мыши и её скорость. В этом инте сделано всё для мыши, чтобы можно было только устанавливать свою отрисовку, так как драйвер ничего не обязан знать про твой графический режим. Вполне возможно, что лет через 10, он у тебя станет приблизительно  = 657534545 x 56567456 на 5605678093458 цветов.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 04:41 26-02-2004
ZYV



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pinocchio
 
 

Цитата:
int 33h - Читай доку, там есть функции задающие границы перемещения мыши и её скорость.

 
Вот тут-то и проблема. Не задаётся оно с svga256, только под svga256m работает (ну и egavga разумеется). Так значит тогда только перемещения в mickey помогут отцу русской мыши?
 

Цитата:
В этом инте сделано всё для мыши,чтобы можно было только устанавливать свою отрисовку, так как драйвер ничего не обязан знать про твой графический режим.

 
Ну вот я так и делаю, кстати, может видел мой топик тут где-то про putpixel на asm... Но я надеялся, что функции, задающие границы перемещения будут работать не зависимо от режима. А то  не круто... придется самому следить и, может быть, будет притормаживать потому как на каждое перемещение ещё раз int33h придется опрашивать.

Всего записей: 98 | Зарегистр. 19-07-2003 | Отправлено: 17:50 26-02-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ZYV
Где то я писал, что нужно забыть про ассемблер. Повторюсь - брось это дело негигиенично. У тебя мыха в досе от Windows? А может Gmouse.exe, а может Mouse.exe? То что ты сделаешь - так это привяжешься к существующему у тебя софту, а через 10 лет будешь удивляться почему размеры монитора в DPI-ях, а размеры мышки в NOP-ах.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 13:50 27-02-2004
ZYV



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pinocchio
 
Ты говоришь разумные вещи. По своей бы воле я в эти дебрим не полез. Это что-то типа парт-задания. А тут уж хочешь-не хочешь делать надо.
 
В общдем я нашел описание довольно полное int33h, там оказывает насколько я понял handler' у ещё и перемещения самого устройства в миках передаются. Так что всё выглядит не так грустно, будем стараться. Мне бы ещё putpixel ускорить, тогда бьы совсем круто было.

Всего записей: 98 | Зарегистр. 19-07-2003 | Отправлено: 17:48 27-02-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ZYV
Да ладно тебе "парт задание". В эти дебри только денежный вопрос имеет право толкать.
1) Все CALL procedure замедляют процессор. От сюда MACRO и INCLUDE
2) PutPixel это неправильно. Читай про ES:DI, DS:SI, REP, STOSB, MOVSB.
3) Вывод в память можно делать хоть на паскале побайтно, а когда лепишь в A000:0000 будь добер плюнуть наименьшим количеством ассемблерных операций (тиков)
4) А ты уверен, что устанавливая новые DivX кодаки всегда чюствуешь кайф?

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 02:19 28-02-2004
ZYV



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pinocchio
 
 
 
1) Про call - понятно,, будем избавляться потихоньку. У меня просто перерисовка на pascal'е написана, надо будет  перевести на ASM.
2, 3) - будем читать. Что значит "плюнуть наименьшим количеством тиков"? Да мне хоть как бы. Просто как я понял если я напрямую буду писать, то в режаме 256 цветов по любому укорится как минимум раза в 2. Если можно дай пожалуйста правильно работающий пример какой-нибудь, хоть на Pascal,хоть на ASM.
4) Никогда не пробовал, честно
 
Спасибо,
Z.

Всего записей: 98 | Зарегистр. 19-07-2003 | Отправлено: 15:48 28-02-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Мышь под DOS в TP7 в граф. режиме


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru