Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
1
TASM

Работа с мышью - исправить код

16.05.2012, 16:12. Показов 2334. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
почему не работает сие творение
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
.386 ;определяем с командами какого процессора работаем
code segment 'code' ; определение кодового сегмента
assume cs:code,ds:code,es:code
оrg 100h ;резервируем 256 байт для PSP
Begin: jmp Start ;прыгаем через данные
BASE equ 3F8h ;базовый адрес порта COM1
Old0Co dw ? ;смещение старого обработчика 0Ch
Old0Cs dw ? ;сегмент старого обработчика 0Ch
Save0 dw ? ;старое значение регистра данных
Save1 db ? ;cтарое значение регистра управления прерываниями
Save3 db ? ;старое значение регистра управления линией
Save4 db ? ;старое значение регистра управления модемом
Maska db ? ;старое значение маски контролера прерываний
X dw 40 ;текущая координата Х
Y dw 12 ;текущая координата Y
Fix db 1 ;флаг фиксации курсора
Fbyte db ? ;первый байт пакета данных
198
OfsX db ? ;смещение по Х
OfsY db ? ;смещение по Y
Count db ? ;счетчик принятых байт в пакете
Buttons db 0 ;количество нажатых клавиш
;Стирает или восстанавливает курсор
XorPut proc
push es
pusha
; Вычисляем адрес байта видеопамяти в котором находится атрибут
; символа с координатами (X,Y) по формуле:
; адрес=0B800h:((Y*80)+X)*2+1
mov ax,0b800h ;в ax:=адрес начала видеопамяти
mov es,ax ;es:=ax
mov ax,Y ;ax:=Y
mov bx,160 ;bx:=80*2 (ширина экрана*2 байта)
mul bx ;ax:=Y*160
mov bx,X ;bx:=X
shl bx,1 ;bx:= bx *2
add ax,bx ;ax:=ax + bx
inc ax ;ax увеличим на 1
mov bx,ax ;bx:=ax
mov dl,byte ptr es:[bx] ;читаем атрибут по вычисл. адресу
xor dl,52 ;накладываем на него XOR-маску
mov byte ptr es:[bx],dl ;измененный атрибут в видеопамять
popa
pop es
ret
XorPut endp
; Обработчик 0Ch
Int_0Ch proc far
sti ;запрещаем аппаратные прерывания
push ds
pushf
pusha
push cs
pop ds ;ds:=cs
mov dx,BASE;в dx адрес базового порта для доступа к данным
in al,dx ;читаем очередной байт из регистра данных
test al,1000000b;если 6-ой бит равен 1,то это 1 байт пакета
jnz FirstByte ;это первый байт !
cmp Count,1 ;первый байт принят ?
je N2 ;да, принимаем второй.
jmp N3 ;иначе третий.
FirstByte: ;обработка первого принятого байта
mov Count,1 ;установим счетчик принятых байт
199
mov FByte,al ;сохраним первый принятый байт пакета
mov ah,al ;ah:=al
and al,00000011b ;устанавливаем старшие биты в OfsX
shl al,6
mov OfsX,al ;OfsX:=al
and ah,00001100b;устанавливаем старшие биты в OfsY
shl ah,4
mov OfsY,ah ;OfsY:=ah
jmp ExInt ;будем принимать остальные байты пакета
N2: ;обработка второго принятого байта
mov ah,OfsX ;ah:=OfsX
or ah,al ;устанавливаем младшие биты OfsX
mov OfsX,ah ;OfsX:=ah
mov Count,2 ;изменяем счетчик принятых байт
jmp ExInt ;будем принимать остальные байты пакета
N3: ;обработка третьего принятого байта
mov ah,OfsY ;ah:=Ofs
or ah,al ;устанавливаем младшие биты OfsY
mov OfsY,ah ;OfsY:=ah
;Наконец-то прочитали весь пакет, теперь его обработаем
call XorPut ;уберем курсор
cmp fix,1 ;курсор зафиксирован ?
je but ;да ! Переходим на анализ нажатых кнопок
mov al,OfsX ;al:=OfsX
cbw ;расширяем al до слова
add X,ax ;X=X+OfsX
mov al,OfsY ;al:=OfsY
cbw ;расширяем al до слова
add Y,ax ;Y=Y+OfsY
; Проверяем X и Y на предельные значения
cmp X,79 ;X ушел за правую границу экрана ?
jle NoR ;нет !
mov X,79 ;да ! Х:=79 (правая граница экрана)
jmp AY ;уходим на проверку Y
NoR: cmp X,0 ;X ушел за левую границу экрана ?
jns AY ;нет !
mov X,0 ;ушел ! X:=0
AY: cmp Y,24 ;Y ушел за нижнюю границу экрана ?
jle NoD ;нет !
mov Y,24 ;да ! Y:=24
jmp But ;идем на обработку кнопок
NoD: cmp Y,0 ;Y ушел за верхнюю границу экрана ?
jns But ;нет ! Идем на обработку кнопок
mov Y,0 ;да ! Y:=0
But: ;начинаем обработку нажатых кнопок
200
mov al,Fbyte ;берем первый байт пакета
mov Buttons,0 ;сбрасываем счетчик количества нажатых
кнопок
LB: test al,0100000b ;левая кнопка нажата ?
jz RB ;нет ! Смотрим правую.
mov fix,0 ;да ! Освобождаем мышь
inc Buttons ;Buttons увеличиваем на 1
RB: test al,0010000b;правая кнопка нажата ?
jz Analiz ;нет ! Идем дальше
mov fix,1 ;если нажата правая кнопка
inc Buttons ;увеличим Buttons на 1
Analiz: cmp Buttons,2 ;были нажаты обе кнопки ?
jne NoPress ;нет !
call XorPut ;стираем указатель
call UnInstall ;выгружаемся
NoPress:
call XorPut ;стираем указатель
ExInt: mov al,20h ;завершение аппаратного прерывания
out 20h,al
popa
popf
pop ds
iret
Int_0Ch endp
; Процедура восстановления старых значений портов и старого
; обработчика
UnInstall PROC
pusha
cli ;запрещаем аппаратные прерывания
mov dx,BASE+4 ;в dx адрес порта для доступа к р-ру
; управления модемом
mov al,Save4 ;в al =сохраненное значение регистра
out dx,al ;восстанавливаем исходное значение регистра
mov al,Maska ;в al - сохраненное значение маски
out 21h,al ;восстанавливаем исходное значение маски
mov dx,BASE+1 ;в dx - адрес порта для доступа к регистру
; управления прерываниями
mov al,Save1 ;в al - сохраненное значение регистра
out dx,al ;восстанавливаем исходное значение регистра
mov dx,BASE+3 ;в dx адрес порта для доступа к регистру
;управления линией
mov al,Save3 ;в al - сохраненное значение регистра
or al,80h ;установим DLAB = 1 для доступа
out dx,al ;к делителю частоты
mov dx,BASE ;в dx - адрес базового порта
201
mov ax,Save0 ;в ax - сохраненный делитель частоты
out dx,ax ;восстанавливаем значение делителя частоты
mov dx,BASE+3 ;в dx адрес порта для доступа к регистру
; управления линией
mov al,Save3 ;в al - сохраненное значение регистра
out dx,al ;восстанавливаем исходное значение регистра
push ds
mov ax,cs:Old0Cs;в ax - сегментный адрес старой ПОП
mov ds,ax ;ds:= ax
mov dx,cs:Old0Co ;в dx - смещение старого обработчика
mov ax,250Ch ;установим старый обработчик прерывания 0Ch
int 21h ;восстанавливаем старый обработчик
pop ds
sti ;разрешаем аппаратные прерывания
popa
ret
UnInstall ENDP
Start: cli ;запрещаем аппаратные прерывания
mov ax,350Ch ;ah=35h для выдачи адреса ПОП 0Ch
int 21h ;получаем адрес вектора прерывания 0Ch
mov Old0Cs,es ;сохраняем сегм. адрес старого обработчика
mov Old0Co,bx ;сохраняем смещение старого обработчика
lea dx,Int_0Ch;в dx адрес нового обработчика
mov ax,250Ch ;ah=25h для установки адреса обработчика
; прерывания 0Ch
int 21h ;установим свой обработчик
; Начинаем инициализацию мышки
mov dx,BASE+3 ;в dx адрес порта для доступа к регистру
; управления линией
in al,dx ;читаем содержимое регистра
mov Save3,al ;сохраняем его
or al,80h ;установим DLAB = 1 для доступа
out dx,al ;к делителю частоты
mov dx,BASE ;в dx - адрес базового порта
in ax,dx ;читаем регистр младшего байта делителя
mov Save0,ax ;частоты и сохраняем его
mov ax,60h ;делитель частоты=115200/1200=60h - 1200 бод
out dx,ax ;устанавливаем делитель частоты
mov dx,BASE+3 ;в dx адрес порта для доступа к регистру
; управления линией
mov al,00000010b ;установим структуру сигнала
out dx,al ;7 информационных бит,1 стоп-бит
mov dx,BASE+1 ;в dx адрес порта для доступа к регистру
; управления прерываниями
in al,dx ;читаем содержимое регистра
202
mov Save1,al ;сохраняем его
mov al,00000001b ;разрешаем генерацию прерывания по
out dx,al ;готовности принимаемых данных
in al,21h ;читаем маску контролера прерываний
mov Maska,al ;сохраняем маску
and al,11101111b ;размаскируем линию IRQ4
out 21h,al ;меняем маску
mov dx,BASE+4 ;в dx адрес порта для доступа к регистру
; управления модемом
in al,dx ;читаем содержимое регистра
mov Save4,al ;сохраняем его
mov al,00000001b ;установим сигнал на линии DTR
out dx,al ;заносим в регистр
mov al,00000011b ;установим сигнал на линиях DTR и RTS
out dx,al ; заносим в регистр
mov al,00001011b ;установим сигнал на линиях DTR, RTS и
OUT2
out dx,al ;заносим в регистр
sti ;разрешаем аппаратные прерывания
int 27h ;остаемся резидентными
code ends
end begin
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2012, 16:12
Ответы с готовыми решениями:

Работа с каталогами и накопителями, исправить код
Есть код, помогите исправить ошибки. Код: codesg segment assume cs: codesg, ds: codesg, es:...

Работа с мышью
Возникли трудности с рабором работы мыши. Конкретно по делу: #include<conio.h> #include<stdio.h>...

Работа с мышью: при нажатии ЛКМ выключить индикатор ScrollLock, при ПКМ - пропустить четыре строки и вывести текст
Укажите пожалуйста на ошибки в коде программы, задание следующее:Ограничить передвижение курсора...

Работа с мышью через BIOS
Знаю, что работа с мышью осуществляется через Int 33h, а есть ли средства BIOS для работы с мышью,...

25
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
16.05.2012, 16:55 2
У вас есть ком-портовая мышь? Вот такая, к примеру:
Миниатюры
Работа с мышью - исправить код  
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
16.05.2012, 17:06 3
Цитата Сообщение от Charles Kludge Посмотреть сообщение
У вас есть ком-портовая мышь? Вот такая, к примеру:
Ну ничего себе Маша, жаль не наша
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
16.05.2012, 17:32  [ТС] 4
Charles Kludge, не, нету

Добавлено через 1 минуту
и еще вопросик по масму: как мне правильно собрать это приложение?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.386
.model flat, stdcall
option casemap:none
ExitProcess proto:dword
GetStdHandle proto:dword
WriteConsoleA proto:dword, :dword, :dword, :dword, :dword
ExitProcess proto:dword
includelib C:\masm\lib\kernel32.lib
.data
stdout dword ?
msg byte "Не могу молчать!", 13, 10
cWritten dword ?
.code
start:
    invoke GetStdHandle, -11
    mov stdout, eax
    invoke WriteConsoleA, stdout, addr msg, sizeof msg, addr cWritten, 0
    invoke ExitProcess, 0
end start
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
16.05.2012, 17:40 5
Цитата Сообщение от Fatal Error Посмотреть сообщение
и еще вопросик по масму: как мне правильно собрать это приложение?
Код
@echo off
    if exist "console.obj" del "console.obj"
    if exist "console.exe" del "console.exe"

    \masm32\bin\ml /c /coff "console.asm"
    if errorlevel 1 goto errasm
    \masm32\bin\PoLink /SUBSYSTEM:CONSOLE "console.obj"
    if errorlevel 1 goto errlink
    dir "console.*"
    goto TheEnd
  :errlink
    echo _
    echo Link error
    goto TheEnd
  :errasm
    echo _
    echo Assembly Error
    goto TheEnd
   :TheEnd
pause
Наверно так!
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
16.05.2012, 17:43  [ТС] 6
Цитата Сообщение от IOAN Посмотреть сообщение
Наверно так!
смотри как оно у меня отлаживается, не думаю что так и должно быть
Миниатюры
Работа с мышью - исправить код  
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
16.05.2012, 17:49 7
Цитата Сообщение от Fatal Error Посмотреть сообщение
смотри как оно у меня отлаживается, не думаю что так и должно быть
Нормально отлаживается, а что собственно не так?
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
16.05.2012, 17:53  [ТС] 8
дос окошко меня смущает
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
16.05.2012, 17:57 9
Цитата Сообщение от Fatal Error Посмотреть сообщение
дос окошко меня смущает
Ну это ж консольная программа.
1
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
16.05.2012, 17:57 10
Цитата Сообщение от Fatal Error Посмотреть сообщение
дос окошко меня смущает
Если тем что не виден выводимый текст!
Дык выполняя покомандно скоро появиться...
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
16.05.2012, 17:59  [ТС] 11
понял, спс

Добавлено через 1 минуту
Цитата Сообщение от IOAN Посмотреть сообщение
Если тем что не виден выводимый текст!
Дык выполняя покомандно скоро появиться...
он виден, но иероглифами, но это уже дося виновата, ибо мастдай сделал свою кодировку для русских букв
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
16.05.2012, 18:00 12
Fatal Error, земляк, есть функция CharToOem для приведения строки с кириллицей в читабельный вид.
1
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
16.05.2012, 18:02  [ТС] 13
Цитата Сообщение от Vadimych Посмотреть сообщение
функция CharToOem
почитаю на досуге.

Не по теме:

Цитата Сообщение от Vadimych Посмотреть сообщение
земляк
я с волгоградской области:)

0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
16.05.2012, 18:07 14
Цитата Сообщение от Vadimych Посмотреть сообщение
Fatal Error, земляк, есть функция CharToOem для приведения строки с кириллицей в читабельный вид.
Незнал, всегда свой алгоритм использовал
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
10.11.2012, 02:27  [ТС] 15
опять я и опять не могу работать с мышью исходник взял с книги... пишет что мышь не найдена((( а драйвер мыши для доси ее спокойно находит... что делать ума не приложу

Не по теме:

вроде все в архив положил, если что не будет, то вышлю:)

Вложения
Тип файла: rar мышь.rar (11.6 Кб, 13 просмотров)
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
10.11.2012, 09:02  [ТС] 16
а под виртуалкой работает... не находит мышь в чистой досе...
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
10.11.2012, 11:44 17
Рабочий драйвер мыси со всеми потрохами из ФриДоси: http://cutemouse.sourceforge.n... se21b4.zip
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
10.11.2012, 12:56  [ТС] 18
Charles Kludge, а к чему он мне? я ведь брал пример из книги для PS/2 мыши... но она не находит мышу... у меня есть еще какой-то драйвер для мыши который норм работает... а почему эта програ (это не драйвер) не робит - хз...

Добавлено через 56 минут
и у меня проблема еще: если запустить keyrus.com, то нельзя перехватывать никаких прерываний... хоть мышь, хоть клава, хоть даже векроты 60, 61h - дося мрет... а если не пускать этот драйвер - то все норм... что посоветуете?
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
10.11.2012, 13:12 19
Цитата Сообщение от Fatal Error
а к чему он мне?
Там есть адекватный тест для мышиного драйвера.
Цитата Сообщение от Fatal Error
я ведь брал пример из книги для PS/2 мыши...
Угу. А теперь разбор полётов. На кой GUI сдался вот этот кусок:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; РАЗРЕШИТЬ ПЕРЕДАЧУ ДАННЫХ ОТ МЫШИ
        call    Wait8042BufferEmpty
        mov     AL,0D4h ;послать мыши байт данных
        out     64h,AL
        call    Wait8042BufferEmpty
        mov     AL,0F4h ;разрешить передачу данных
        out     60h,AL
; Получить код подтверждения приема команды
        call    WaitMouseData
        jz      @@DataInputError ;данные не поступили
        in      AL,60h
        ; Получено подтверждение приема команды?
        cmp     AL,0FAh          
        jnz     @@DataInputError ;нет подтверждения
особенно с командой 0F4h?
И да, ссыль на книгу в студию.
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
10.11.2012, 13:24  [ТС] 20
вот книга
Цитата Сообщение от Charles Kludge Посмотреть сообщение
На кой GUI сдался вот этот кусок:
хз
а про драйверр клавы и смерть доси что скажешь?

Добавлено через 2 минуты
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Там есть адекватный тест для мышиного драйвера.
тест прошел нормально в виртуалке, позже под флехой проверю
0
10.11.2012, 13:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2012, 13:24
Помогаю со студенческими работами здесь

Работа с мышью. Обработка кликов
Обработка кликов мыши (0 - кликов нет, 1 - лкм, 2 - пкм). Знаю, что косяк в jmp progr - циклится...

Работа с мышью: вывод символа по нажатию мыши в позиции экрана, в которой нажал
Доброго времени суток, есть проблема. Пытаюсь сделать вывод по нажатию мыши в месте, в которое...

Работа с мышью: в графическом режиме рисует линии при нажатии кнопки и движении мышки
Осталось сдать последнюю лабу, но что-то никак. Находил похожие, но они на FASM. Вот прошу помощи...

Работа с мышью: С помощью клавиш [+] и [-] изменять область движения "мыши"
Всем привет! С мышью еще не работал. помогите пожалуйста написать программу: С помощью клавиш и ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru