Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2015, 16:49   #1
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию Работа с мышью

Вот набросал программку (FASM)..
При левом клике - выводит инфу о бивисе из памяти, ..по клавише - выходит.
Но не пойму, как обработать ещё и правый клик. Если дописываю до INT-16 обработчик правого буттона (mov cx,8), то обрабатывается правая кнопка, а левая перестаёт работать:
Код:
USE16
ORG 100h
JMP start

start:
   MOV  AX,12h
   INT  10h          ; видеорежим 640x480

   MOV  AX,0         ; подключим мышь
   INT  33h
   MOV  AX,1         ; покажем курсор
   INT  33h

   MOV  AX,0Ch       ; обработчик событий
   MOV  CX,2         ; событие - левая кнопка
   MOV  DX,fText     ; ES:DX - адрес обработчика
   INT  33h

   MOV  AL,0         ; выходим по любой клавише
   INT  16h

   MOV  AX,0Ch       ; сброс обработчика мыши
   XOR  CX,CX
   INT  33h

   MOV  AX,3         ; возвращаем текстовый режим
   INT  10h
ret                  ; на выход!

fText:
   MOV AX,0FE00h
   MOV DS,AX         ; DS = FE00 (сегмент BIOS'a).
   MOV DX,0091h      ; DX = смещение в сегменте, где находится инфа
   MOV CX,80         ; вывести 80 байт
   MOV AH,40h        ; функция вывода на экран
   INT 21h
retf
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.04.2015, 18:28   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Если дописываю до INT-16 обработчик правого буттона (mov cx,8), то обрабатывается правая кнопка, а левая перестаёт работать
А там не битовое поле? Мне лень искать доку по DOS. Если параметр -- набор битов, нужно 10 передавать.
Vapaamies вне форума Ответить с цитированием
Старый 02.04.2015, 18:46   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
R71MT
А почему не хочешь использовать 5 и 6 функции прерывания мышки?
Цитата:
А там не битовое поле?
Угу: http://src-code.net/funkcii-dos-pred...boty-s-myshyu/
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2015, 19:12   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
А там не битовое поле?
..битовое. Для правой кнопки нужно взвести 3-ий бит (1000b):
Цитата:
СХ = условие вызова
бит 0 — любое перемещение мыши
бит 1 — нажатие левой кнопки
бит 2 — отпускание левой кнопки
бит 3 — нажатие правой кнопки
бит 4 — отпускание правой кнопки
бит 5 — нажатие средней кнопки
бит 6 — отпускание средней кнопки
СХ = 0000h — отменить обработчик
Я передаю в СХ,8 и кнопка работает, но перестаёт работать левая. Одна из двух работает нормально, но когда их две - работает или та, или та..

..а с функциями 5-6 вообще не разобрался.
Никак не догоню, какие проверки здесь надо осуществлять..
Цитата:
Функция 05h: получить информацию о нажатии клавиши.
В регистр BX пересылается номер кнопки (0 - левая, 1 - правая, 2 - средняя). В регистр AX возвращается состояние кнопки (бит 0 - левая кнопка нажата; бит 1 - средняя кнопка; бит 2 - правая кнопка нажата). В регистр BX возвращается счетчик нажатия клавиши.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.04.2015, 19:32   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я передаю в СХ,8
А чего не 30? это же 0011110
Цитата:
какие проверки здесь надо осуществлять..
Вызвать функцию, потом
Код:
test ax,1; Нажата левая
test ax,3; Нажата правая
Если не ошибаюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2015, 19:39   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Stilet, я понимаю так.. , и это работает:
Цитата:
бит 0 — 00000000 = 0
бит 1 — 00000010 = 2 = левая кнопка
бит 2 — 00000100 = 4
бит 3 — 00001000 = 8 = правая кнопка
бит 4 — 00010000 = 16
бит 5 — 00100000 = 32 = средняя кнопка
бит 6 — 01000000 = 64
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 02.04.2015 в 19:42.
R71MT вне форума Ответить с цитированием
Старый 02.04.2015, 19:45   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так там маска )
Это не значит что включив один бит ты не имеешь права включать и другие.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2015, 19:56   #8
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

об этом я не додумался.
А обрабатывать-то потом как, ..чё передавать в DX?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.04.2015, 20:19   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
чё передавать в DX?
Э-э-э... Не понял о чем речь
В DX же драйвер мышки занесет координату Y мышки. Это тебе ее потом нужно будет анализировать. Или ты о чем?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2015, 22:31   #10
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

в коде выше, я в DX указывал адрес (где лежит обработчик левой кнопки):
Код:
   MOV  AX,0Ch       ; обработчик событий
   MOV  CX,2         ; событие - левая кнопка
   MOV  DX,fText     ; ES:DX - адрес обработчика
   INT  33h
..а если сразу взвести биты на обе кнопки (00001010=10d) тогда куда заносить адрес обработчика правого буттона?

А про fn:5-6... Заглянул отладчиком в INT-33, и оказалось, что функции(5-6) этого прерывания (как ты и сказал) проверяют AX на одни и те-же значения: 1-2-3-9-0А.
Код:
C:\>debug
-a
0B35:0100 mov ax,5
0B35:0103 int 33
0B35:0105
-t
AX=0000  BX=0000  CX=0000  DX=0000
MOV     AX,0005
AX=0005  BX=0000  CX=0000  DX=0000
INT     33
AX=0005  BX=0000  CX=0000  DX=0000

PUSHF
CMP     AX,0001
JZ      24DB
CMP     AX,0002
JZ      24F4
CMP     AX,0003
JZ      250F
CMP     AX,0009
JZ      2508
CMP     AX,000A
JZ      24F0
JMP     2501
POPF

AX=0005  BX=0000  CX=0000  DX=0000
Но почему-то такой трюк не срабатывает. Буду разбираться...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с мышью qwe12355 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 27.10.2012 16:21
РАбота с Мышью serg90 Работа с сетью в Delphi 5 19.02.2011 14:25
[C++] Работа с мышью koshkarjov Помощь студентам 0 14.10.2010 22:36
работа с мышью! _Timon Помощь студентам 1 20.01.2009 23:29