Консультация № 177755
09.04.2010, 00:46
0.00 руб.
0 5 1
Здравствуйте!

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

Предпочтителен - TASM, но буду рад и другим вариантам.
Процессор - 64-битный.

В приложении пример реализации изменения типа курсора в текстовом режиме при нажатии некоторой клавиши на клавиатуре.

Спасибо!

Приложение:
.model small
data_seg segment
data_seg ends
main segment
; устанавливаем соответствие между регистрами и сегментами
assume cs:main, ds: data_seg
start:
; посылаем начальный адрес сегмента в регистр ax
mov ax, data_seg
mov ds, ax
;инициализация мыши
mov ax, 0
int 33h
;сделать указатель видимым
mov ax, 1
int 33h

escape:
mov ah, 7 ;ждать esc
int 21h ;прерывание для работы с клавиатурой
cmp al, 31h ;проверка на нажатие клавиши “1”
jne waiting
mov ax, 0ah ;задать форму курсора
mov bx,0 ;тип программный
mov cx, 0h ;маска ввода
mov dh, 0dh ;маска курсора
mov dl, 02h
int 33h

waiting:
cmp al, 27
jne escape

mov ax, 2 ;выключить курсор
int 33h
mov ax, 4c00h
int 21h ;выход
main ends
end start

Обсуждение

давно
Посетитель
7438
7205
09.04.2010, 10:53
общий
это ответ
Здравствуйте, Гальцов Андрей.
Вот Вам программка, сделанная на основе Вашей.
Хочу только обратить внимание, что запускать программу надо только из текстового режима (т.е. нажать Alt-Enter на окне CMD)

Приложение:
.model small
data_seg segment
Xsize dw 0 ;максимальная позиция по-горизонтали
Ysize dw 0 ;максимальная позиция по-вертикали
flag db 0 ;флаг смены позиции
data_seg ends

main segment
; устанавливаем соответствие между регистрами и сегментами
assume cs:main, ds: data_seg
start:
; посылаем начальный адрес сегмента в регистр ax
mov ax, data_seg
mov ds, ax

;определим позицию текстового курсора мыши по-горизонтали
mov ah, 0fh
int 10h
mov al, ah ;в ah - число текстовых строк
mov ah, 0
dec ax ;счет с 0, номер последней строки = число строк минус 1
shl ax, 3 ;преобразуем в позицию точки, на каждый символ 8 точек
mov Xsize, ax ;сохраним позицию для правого символа

;определим позицию текстового курсора мыши по-вертикали
mov ax, 1130h
int 10h
mov al, dl ;в dl число строк - 1 (т.е. уже номер последней строки)
mul cl ;умножим на число строк на символ
mov Ysize, ax ;сохраним позицию для нижнего символа

;инициализация мыши
mov ax, 0
int 33h
;сделать указатель видимым
mov ax, 1
int 33h

escape:
mov ah, 7 ;ждать esc
int 21h ;прерывание для работы с клавиатурой
cmp al, 31h ;проверка на нажатие клавиши “1”
jne waiting
changepos: ;устанавливаем позицию курсора
mov cx, Xsize
mov dx, Ysize
cmp flag, 0 ;проверим, куда перемещаем курсор
je setpos ;в правый нижний угол
shr cx, 1 ;в центр экрана
shr dx, 1
setpos:
mov ax, 2 ;гасим курсор
int 33h
mov ax, 4 ;устанавливаем
int 33h
mov ax, 1 ;показываем курсор
int 33h
xor flag, 1 ;меняем флаг
jmp escape
waiting:
cmp al, 27
jne escape

mov ax, 2 ;выключить курсор
int 33h
mov ax, 4c00h
int 21h ;выход
main ends
end start
5
Спасибо большое!)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.04.2010, 12:13
общий
Лысков Игорь Витальевич:
А Вы не могли бы сказать в каком компиляторе сделана программа?...а то она у меня не запускается...
давно
Посетитель
7438
7205
11.04.2010, 02:04
общий
tasm 4.1
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
12.04.2010, 10:14
общий
Гальцов Андрей:
Я чуть-чуть подправил программку...
mov cx, Xsize
mov dx, Ysize
Были другие имена у переменных, переименовывал и попутал...
Сейчас запускается?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
13.04.2010, 18:08
общий
Лысков Игорь Витальевич:
Спасибо! Всё отлично работает
Форма ответа