Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 15
1

Выводить координаты мышки по срабатыванию любой кнопки мышки каждый раз разными цветами

30.09.2018, 03:03. Просмотров 4101. Ответов 7
Метки нет (Все метки)


Здравствуйте , никак не могу разобраться в задании , необходимо выводить координаты мышки по срабатыванию любой клавиши мыши (пкм и лкм) причем разными цветами каждый раз , насколько я понял необходимо использовать прерывания мышки и для разных цветов прерывания видеоадаптера , но найти информации про прерывания видеоадаптера на tasm найти не могу ровно как и понять
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2018, 03:03
Ответы с готовыми решениями:

Координаты клика мышки
Всем привет.Нужно в программе в поле объекта TImage получить координаты клика мышки.Можно ли это...

Координаты мышки в panel
Нужно определить координаты мыши в панели. Подскажите какие есть по этому поводу идеи Нашел как...

Определить координаты мышки
Друзья, мне нужно на сайт простенькую штуку. Есть панель=окно, в нее вставлена картинка. нужен...

Координаты мышки. TASM
Подскажите как получить координаты мышки и вывести их в строку?! d_s segment r db 13, 'R $'...

7
Эксперт Hardware
5175 / 1835 / 344
Регистрация: 29.07.2014
Сообщений: 2,786
Записей в блоге: 5
30.09.2018, 06:49 2
Цитата Сообщение от crashbandicoot9 Посмотреть сообщение
насколько я понял необходимо использовать прерывания мышки и для разных цветов прерывания видеоадаптера ,
прерывания видяхи тут не причём - берёшь координаты мыши через INT-33h,
и просто выводишь эти координаты разными цветами на экран (можно в видеобуфер)
0
Модератор
Эксперт по электронике
7492 / 3691 / 1445
Регистрация: 01.02.2015
Сообщений: 11,486
Записей в блоге: 2
30.09.2018, 11:22 3
Лучший ответ Сообщение было отмечено crashbandicoot9 как решение

Решение

crashbandicoot9, начните с реализации подзадач, последовательно продвигаясь к итоговой программе.

1. Вывод цветной строки при помощи int 10h ax=1300h
http://www.codenet.ru/progr/dos/int_0009.php
2. Преобразование числа в строку и вывод цветной строки на экран
Вывод нескольких чисел в файл
3. Почитайте о пользовательском прерывании в драйвере мыши
https://www.cyberforum.ru/post10032856.html
Возьмите оттуда каркас и настройте прерывание на любое нажатие и вызов из прерывания преобразование в строку и вывод на экран.

Ещё раз повторю - последовательно, а не сразу мегакод.

Добавлено через 1 минуту
В пояснительной статье из FAQ есть ссылки на справку по функциям int 33h. Посмотрите.
0
Модератор
Эксперт по электронике
7492 / 3691 / 1445
Регистрация: 01.02.2015
Сообщений: 11,486
Записей в блоге: 2
02.10.2018, 18:31 4
Лучший ответ Сообщение было отмечено crashbandicoot9 как решение

Решение

Тут ещё что-то подправить нужно и я бы часть процедур на макросы заменил или напрямую в код вставил вызовы сервисов. Но это вкусовщина
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
;выводить координаты мышки по срабатыванию любой клавиши мыши (пкм и лкм)
;причем разными цветами каждый раз , насколько я понял необходимо
;использовать прерывания мышки и для разных цветов прерывания видеоадаптера
.model small, Pascal
 
.stack 400h
 
.data
        ;коды клавиш
        KeyCode_Esc                     equ     1Bh     ;Esc
 
        ;Константы событий "мыши"
        MouseEvent_None                 equ     0000h   ;Удалить пользовательский обработчик
        MouseEvent_Move                 equ     0001h   ;любое перемещение
        MouseEvent_PressLeftButton      equ     0002h   ;нажатие левой кнопки
        MouseEvent_ReleaseLeftButton    equ     0004h   ;отпускание левой кнопки
        MouseEvent_PressRightButton     equ     0008h   ;нажатие правой кнопки
        MouseEvent_ReleaseRightButton   equ     0010h   ;отпускание правой кнопки
        MouseEvent_PressMiddleButton    equ     0020h   ;нажатие средней кнопки
        MouseEvent_ReleaseMiddleButton  equ     0040h   ;отпускание средней кнопки
 
        MouseInitOk                     equ     0FFFFh  ;инициализация мыши - успешна
        MouseInitFault                  equ     0000h   ;инициализация мыши - мышь или драйвер мыши не установлены
 
        MouseButtons_Any                equ     0000h   ;количество кнопок у мыши - отлично от 2 и 3
        MouseButtons_2                  equ     0002h   ;количество кнопок у мыши - 2
        MouseButtons_2_                 equ     0FFFFh  ;количество кнопок у мыши - 2
        MouseButtons_3                  equ     0003h   ;количество кнопок у мыши - 3
 
        ;сообщения программы
        msgMouseFault                   db      'The mouse or mouse driver was not detected.', 13, 10, '$'
        msgCoord                        db      'X: '
        strCoordX                       db      '12, Y: '
        strCoordY                       db      '12'
        lenCoord                        equ     $-msgCoord
        ;цвет выводимой строки
        strColor                        db      1
.code
 
;Ожидание нажатия клавиши на клавиатуре
;вход
; - нет
;выход
;ax - al - ASCII код нажатой клавиши, ah - скан-код
ReadKey         proc
        mov     ah,     00h
        int     16h
        ret
ReadKey         endp
 
;преобразование числа со знаком в строку
;на входе:
;  ax - число для преобразования
;  ds:di - адрес буфера строки
;на выходе:
;  строка
;  ax - длина строки
IntToStr        proc
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        mov     bx,     10
        xor     cx,     cx      ;символов в модуле числа
        xor     si,     si      ;символов знака '-'
        or      ax,     ax
        jns     @@div
                neg     ax
                mov     [di],   byte ptr '-'
                inc     si
                inc     di
        @@div:
                xor     dx,     dx
                div     bx
                push    dx
                inc     cx      ;количество цифр в числе
                or      ax,     ax
        jnz     @@div
        mov     ax,     cx      ;длина строки возвращается в ax
        add     ax,     si
        @@store:
                pop     dx
                add     dl,     '0'
                mov     [di],   dl
                inc     di
        loop    @@store
 
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        ret
IntToStr        endp
 
;Инициализация работы с "мышью"
;Выполняется аппаратный и программный сброс мыши и драйвера
;вход
; - нет
;выход
;ax - результат инициализации
;   - 0000h, если мышь или драйвер мыши не установлены
;   - FFFFh, если драйвер и мышь установлены
;bx - число кнопок
;   - 0002 или FFFF - две
;   - 0003 - три
;   - 0000 - другое количество
MouseInit       proc
        mov     ax,     0000h
        int     33h
        ret
MouseInit       endp
 
;Показать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseShowCursor proc
        push    ax
        mov     ax,     0001h
        int     33h
        pop     ax
        ret
MouseShowCursor endp
 
;Спрятать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseHideCursor proc
        push    ax
        mov     ax,     0002h
        int     33h
        pop     ax
        ret
MouseHideCursor endp
 
;Определение курсора мыши в текстовом режиме
;вход
;BX = hardware/software text cursor
;     0000h software ( (char/attr AND CX) XOR DX)
;       CX = screen mask
;       DX = cursor mask
;     0001h hardware
;       CX = start scan line
;       DX = end scan line
;выход
; - нет
MouseDefineTextCursor   proc
        push    ax
        mov     ax,     000Ah
        int     33h
        pop     ax
        ret
MouseDefineTextCursor   endp
 
;Установить/удалить обработчик событий от "мыши"
;вход
;ES:DX = адрес обработчика
;СХ = условие вызова
;   бит 0 — любое перемещение мыши
;   бит 1 — нажатие левой кнопки
;   бит 2 — отпускание левой кнопки
;   бит 3 — нажатие правой кнопки
;   бит 4 — отпускание правой кнопки
;   бит 5 — нажатие средней кнопки
;   бит 6 — отпускание средней кнопки
;СХ = 0000h — отменить обработчик;выход
;выход
; - нет
MouseSetHandler proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    es
 
        mov     ax,     000Ch
        int     33h
 
        pop     es
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
MouseSetHandler endp
 
;Обработчик событий "мыши"
;вход
;АХ содержит условие вызова,
;ВХ - состояние кнопок,
;СХ, DX - X- и Y-координаты курсора,
;SI, DI - счетчики последнего перемещения по горизонтали и вертикали
;      (единицы измерения для этих счетчиков - мики, 1/200 дюйма),
;DS - сегмент данных драйвера мыши.
;выход
; - нет
MyMouseHandler  proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    ds
        push    es
 
        ;чтобы не было восстановления предыдущего состояния
        ;экрана после перемещения мыши, спрячем курсор
        call    MouseHideCursor
        ;Программы, работающие в текстовом режиме,
        ;должны разделить полученные координаты на 8
        ;(как координату X, так и координату Y).
        shr     cx,     1
        shr     cx,     1
        shr     cx,     1
        shr     dx,     1
        shr     dx,     1
        shr     dx,     1
        ;для работы с переменными программы и для вывода строки
        ;устанавливаем ds и es на сегмент данных программы
        mov     ax,     @data
        mov     ds,     ax
        mov     es,     ax
        ;преобразование чисел в строку
        mov     word ptr [strCoordX],   '  '
        mov     word ptr [strCoordY],   '  '
        mov     ax,     dx
        lea     di,     [strCoordY]
        call    IntToStr
        mov     ax,     cx
        lea     di,     [strCoordX]
        call    IntToStr
        ;вывод строки
        mov     ah,     0Fh             ;уточнение параметров видеорежима
        int     10h
        mov     ax,     1300h           ;функция вывода строки
        mov     bl,     [strColor]      ;bl - цвет текста
        ;mov     bh,     00h            ;страница видеопамяти, берётся из вызова справки
        mov     dl,     00              ;позиция X экрана (от 0)
        mov     dh,     00              ;позиция Y экрана (от 0)
        mov     cx,     lenCoord        ;длина строки
        mov     bp,     offset msgCoord ;в es:bp помещаем адрес начала строки
        int     10h
        ;изменение цвета строки для следующего вызова
        mov     al,     [strColor]
        inc     al
        and     al,     0Fh
        cmp     al,     1
        adc     al,     0
        mov     [strColor],     al
        ;после изменений на экране покажем курсор
        call    MouseShowCursor
@@Exit:
        pop     es
        pop     ds
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        retf
MyMouseHandler  endp
 
;основная программа
main            proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;попытка инициализации мыши
        call    MouseInit
        cmp     ax,     MouseInitOk
        je      @@MouseInitOk
        ;если инициализация не удалась - вывести сообщение
        ;и завершить программу
        mov     ah,     09h
        lea     dx,     msgMouseFault
        int     21h
        jmp     @@mainExit
 
@@MouseInitOk:
        ;установить курсор
        mov     bx,     0       ;software cursor
        mov     cx,     0FFFFh  ;and mask
        mov     dx,     0FF00h  ;xor mask
        call    MouseDefineTextCursor
        ;показать курсор
        call    MouseShowCursor
        ;установить пользовательский обработчик событий "мыши"
        push    es
        mov     ax,     seg MyMouseHandler
        mov     es,     ax
        mov     dx,     offset  MyMouseHandler
        mov     cx,     MouseEvent_PressLeftButton
        call    MouseSetHandler
        pop     es
 
        ;цикл ожидания нажатия кнопки ESC
        ;в цикле проверяется работа обработчика мыши
@@WaitEscapePressed:
        call    ReadKey
        cmp     al,     KeyCode_Esc
        jne     @@WaitEscapePressed
 
        ;завершение работы с "мышью"
        ;спрятать курсор
        call    MouseHideCursor
        ;удалить пользовательский обработчик прерывания
        mov     cx,     MouseEvent_None
        call    MouseSetHandler
 
@@mainExit:
        mov     ax,     4C00h
        int     21h
main            endp
 
end     main
1
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 15
07.10.2018, 20:37  [ТС] 5
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
        .model  tiny
        .code
        org     100h
start: 
    ;;; 320x100 decimal dosbox 640x200 max (027f 00c7)
    
    ;mov bl, 04fh
    ;mov cx, 4
    ;mov ah, 9h
    ;int 10h
    
    
    mov ax, 1
    int 33h
    mov ax, 3
    int 33h
 
    
    
        
    mov ax, cx
    xchg    al, ah
    call ShowHex
    
    xchg    al, ah
    call ShowHex
 
 
    push    dx
        mov     dx, offset endl
        mov ah,2
 
    int     21h
    pop dx
    
    mov ax, dx
    xchg    al, ah
    call ShowHex
    xchg    al, ah
    call ShowHex
 
    ret
ShowHex:
 
first PROC 
        push ax
    push cx
    push dx
        mov     di, OFFSET asHex
        mov     cx, ax
        and     ax, 000fh
        mov     bx, OFFSET HexTabl
        xlat
        mov     [di+1], al
 
        mov     ax, cx
        and     ax, 00f0h
        mov     cl, 4
        shr     ax, cl
        xlat
        mov     [di], al
 
        mov     ah, 13h
        mov     al, 1
        mov bl,2h
        mov     bp, OFFSET asHex
        mov cx, gg -1- offset asHex ;
        
        mov dl, 10
mov dh, 7 
mov bh, 0
        int     10h
    
    pop dx
    pop cx
        pop ax
        ret
        first ENDP
    
HexTabl  db     '0123456789abcdef'
asHex    db     '00','$'
gg:
endl         db      0Dh, 0Ah, '$'
    end     start
пытался сделать , вывод неправильный совсем не понимаю в чем ошибка
0
Модератор
Эксперт по электронике
7492 / 3691 / 1445
Регистрация: 01.02.2015
Сообщений: 11,486
Записей в блоге: 2
07.10.2018, 21:16 6
Лучший ответ Сообщение было отмечено crashbandicoot9 как решение

Решение

А что у вас в коде происходит? Просто без комментариев нужно постоянно сверяться с функциями int 33h по справочнику.

Добавлено через 29 минут
crashbandicoot9, первичен алгоритм.
У всех свои предпочтения - я алгоритмы записываю в виде плана с нумерованными строками.

Для начала вы должны определиться в способе решения - polling (постоянный опрос) или interrupt (по прерыванию).

Я привёл пример и ссылки на примеры работы по прерыванию. Если вы хотите по опросу, то алгоритм должен быть таким.

1. Инициализация мыши
- удостовериться в её существовании и установке драйвера, если нет - диагностическое сообщение и выход.
- установить форму курсора для текстового режима
- показать курсор мыши
2. Цикл опроса клавиатуры и драйвера мыши
2.1 на клавиатуре нажата клавиша. Нет - перейти к п.2.3
2.2 Считать клавишу. Проверить - нажата клавиша Esc? Да - перейти к п.3
2.3 Проверить - на мышке нажата ЛКМ или ПКМ? Нет - перейти к п 2.1
2.4. Здесь уже ясно, что нажата кнопка мыши. Считать координаты мыши.
2.5 Вывести координаты мыши - спрятать курсор, вывести строку, показать курсор.
2.7 Перейти к п.2.1
3. Завершение программы
- спрятать курсор
- передать управление операционной системе DOS.

В вашей программе ничего этого нет. Попробуйте реализовать и мой алгоритм приводить в качестве комментариев.
1
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 15
08.10.2018, 00:40  [ТС] 7
у меня ваш код не запускается вылезает Fatal:Cannot generate COM file : stack segment present
0
Модератор
Эксперт по электронике
7492 / 3691 / 1445
Регистрация: 01.02.2015
Сообщений: 11,486
Записей в блоге: 2
08.10.2018, 06:45 8
Лучший ответ Сообщение было отмечено crashbandicoot9 как решение

Решение

Наверное потому, что у меня не DOS com, а DOS exe программа.

А почему бы не сделать собственную. Алгоритм я довольно подробно описал. Вот прямо по шагам и набирать. А мою использовать для образца.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2018, 06:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Запомнить координаты мышки в graphabc
Как в GraphABC при нажатии кнопки мышки в графическом окне запомнить координаты это тойчки????

Задать координаты по щелчку мышки
Добрый день! Помогите, пожалуйста! У меня такая проблема, что я никак не могу понять, как сделать...

Изменить координаты клика мышки
Есть монитор 19 дюймов, нанего прицепили сверху тачпад но уже 22 дюйма, и когда пытаешся отрыть...

Как отслеживать координаты мышки?
как отслеживать координаты мышки? если можно примерчиком.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.