PDA

Просмотр полной версии : Вид курсора мыши



Alex_Burn
26.04.2008, 20:10
Здравствуйте, уважаемые участники форума!

Не знает и кто-нибудь из вас, как менять вид текстового курсора мыши (скажем, изобразить какую-либо фигурку) ? :confused:

airyashov
26.04.2008, 23:15
Задать форму курсора в текстовом режиме
С помощью функции 0Ah программа может изменять форму курсора мыши в текстовом режиме.

Регистры на входе:
AX = 000Ah
BX = тип курсора:
0 - определяемый программно;
1 - определяемый аппаратно;
CX = маска экрана (для BX=0) или начальная строка курсора (для BX=1);
DX = маска курсора (для BX=0) или конечная строка курсора (для BX=1)
Регистры на выходе:
Регистры не используются

В зависимости от содержимого регистра BX драйвер мыши использует курсор, определяемый аппаратными средствами, либо курсор, определяемый программно. По умолчанию используется “программный курсор”, который отображается в виде символа с инвертированным значением атрибута. Курсор, сформированный аппаратными средствами, выглядит аналогично обычному текстовому курсору, его форма - прямоугольник. Размер этого прямоугольника можно задавать при помощи регистров CX и DX.
Для курсора, определяемого программно, вначале выполняется операция логического “И” над содержимым видеопамяти в том месте, куда указывает курсор, и маской экрана. Затем выполняется операция “Исключающее ИЛИ” с маской курсора.
Младший байт масок соответствует коду ASCII символа, старший - это байт атрибута символа.
А.В. Фролов, Г.В. Фролов, 1997 Аппаратное обеспечение персонального компьютера Часть 1

Alex_Burn
27.04.2008, 14:55
Что-то у меня не получается. Вроде и делаю все правильно, а курсор не меняется.
Может быть предоставете небольшой примерчик?

Serge_Bliznykov
27.04.2008, 21:32
Что-то у меня не получается. Вроде и делаю все правильно, а курсор не меняется.
Может быть предоставете небольшой примерчик?
ой... опять всё это непросто.
в виндузовском окне работать НЕ БУДЕТ!
Переводите консоль в полноэкранный режим (ALT-ENTER), обязательно запускайте какое-нибудь DOS приложение, поддерживающее мышь (например, TurboPascal) и там уже смотрите! (ну, или грузите комп с дискетки с DOS'ом)


о вложении.
Вот, в давние-давние времена,
в те времена, когда некоторых нонешных программеров ещё и на свете не было,
был такой комьютерный (софтовый - т.е. исключительно в виде файлов)
киевский журнальчик "Софтпанорама"...
Вот, оттуда я взял сейчас DOS драйвер мышки.
"V-Lab Alpha-Graphics Mouse Driver v.1.04".
с исходниками на ASM.

Alex_Burn
27.04.2008, 23:41
Serge_Bliznykov,
При попытке запустить выложенный вами *.asm файл с помощью AsmConstructor'а у меня появилось 102 ошибки!!



Переводите консоль в полноэкранный режим (ALT-ENTER), обязательно запускайте какое-нибудь DOS приложение, поддерживающее мышь (например, TurboPascal) и там уже смотрите! (ну, или грузите комп с дискетки с DOS'ом)


Нельзя ли по-подробней?

Например, в проге, которую я пытаюсь написать, в Виндоуз графический курсор выводится нормально, а текстовый - в виде прямоугольника, а с дискетки не выводится ни текстовый, ни графический.

З. Ы. Везет мне с заданиями, правда?

somewhere
28.04.2008, 09:12
а с дискетки не выводится ни текстовый, ни графический.
Это потому что не загружен драйвер мыши.
Вообще такие вещи всегда делались вручную, никто никакие функции не использовал. Например, люди создавали графический курсор (стрелку) в текстовом режиме. Добивались этого путем программирования знакогенератора - т.е. битовых строк, которые определяют каждый текстовый символ, через порты видеоадаптера.
Причем предполагалось что общее количество различных символов на экране всегда меньше 256-4 (252). Вид тех самых 4 символов, на которых стоял указатель мыши заменялся на битовые изображения этих символов с наложением курсора (стрелки). Только коды этих символов менялись на диапазон с 252-255, чтобы остальные символы на экране не попортились новым изображением. Для примера можно посмотреть NDD.EXE или FFORMAT.COM в которых именно такая реализация.
Примерно по такой же схеме рисовались графические формы поверх текстовых и все в то время удивлялись как люди совмещали графический и текстовый режимы.

airyashov
28.04.2008, 11:48
Вот, пример, под DOSBox работает.
Прога и драйвер мыши.
В NDD.EXE и FFORMAT.COM помоему другой принцип, курсор явно не текстовый, движется не по символам, а по пикселям

somewhere
28.04.2008, 13:11
В NDD.EXE и FFORMAT.COM помоему другой принцип, курсор явно не текстовый, движется не по символам, а по пикселям
Курсор движется по символам, просто перепрограммируется внешний вид символов, я об этом уже писал - и, сказать больше, сам писал такие резидентные курсоры.

airyashov
28.04.2008, 13:17
Получается нужно максимально 4 символа постоянно перепрограммировать? Да прикольно вспомнить как все начиналось :)

Alex_Burn
29.04.2008, 13:01
airyashov, спасибо большое за пример и прогу!
Только вот в проге с комментариями проблемы, отображаются плохо. С каким шрифтом это необходимо читать?

airyashov
29.04.2008, 13:17
Попробуйте WIN кодировку Я пишу в RadASM, открываете наверное под DOS

Alex_Burn
29.04.2008, 13:43
С вашего позволения, покажу то,что вижу.



.model small
.stack 100h
.286p
.data
infoprog db 10,13,"Mouse test",10,13,'$'
mouse_err db 10,13,"Mouse error",10,13,'$'
sym db 11111111b
db 11111111b
db 11111000b
db 11111000b
db 11111000b
db 11011000b
db 11001100b
db 11001100b
db 00000110b
db 00000110b
db 00000011b
db 00000011b
db 00000001b
db 00000001b
db 00000000b
db 00000000b

db 0,0,0,0,0,0,0,0
.code
.startup
mov ax,0003h ; гсвановивм 03h режим 80е25
int 10h
mov dx,offset infoprog ; влвесви индормажионное сообйение
mov ax,0900h
int 21h
mov ax,0c07h ; ожидаем нажавие Enter длп запгска программл
int 21h
cmp al,0dh; Ќажава клавииа Enter?
jz run_prog ; если да, во запгсвивм программг
jmp exit_prog; иназе влеод из программл
run_prog:
xor ax,ax ; проверпем нализии манипглпвора млим
int 33h
cmp ax,0ffffh; если резглмвав равен 0ffffh во все в порпдке
je mouse_ok
mov ax, 0900h; иназе влдавм предгпреждение и завериивм программг
mov dx, offset mouse_err
int 21h
exit_prog:
mov ax, 4c00h ; законзивм программг
int 21h

mouse_ok:
mov ax,1130h
mov bx, 0004h
int 10h

mov ax,1100h
mov cx,1
mov dx,255
mov bx,1000h
push ds
pop es
mov bp, offset sym
int 10h

mov ax,0200h
mov dx,255
int 21h

mov ax, 0001h ; вклозивм млим
int 33h

mov ax,000ah
mov bx,0
mov cx,0ff00h
mov dx,000ffh
int 33h

GetChar:
mov ax,0700h ; ожидаем нажавие на клавииг Esc
int 21h
cmp al,27;нажава Esc?
jne GetChar; если нев продолживм опрос клавиавгрл

mov ax, 0002h ; влклозивм млим
int 33h

mov ax, 4c00h ; законзивм программг
int 21h
end




Так-то ничего страшного, но читать не приятно. Да и хотелось-бы знать, что вы там написали.

somewhere
29.04.2008, 15:15
Какой-то древнеукраинский или кривой Т9 )))))

airyashov
29.04.2008, 16:02
.startup
mov ax,0003h ; установить 03h режим 80х25
int 10h
mov dx,offset infoprog ; вывести информационное сообщение
mov ax,0900h
int 21h
mov ax,0c07h ; ожидаем нажатие Enter для запуска программы
int 21h
cmp al,0dh; Нажата клавиша Enter?
jz run_prog ; если да, то запустить программу
jmp exit_prog; иначе выход из программы
run_prog:
xor ax,ax ; проверяем наличии манипулятора мышь
int 33h
cmp ax,0ffffh; если результат равен 0ffffh то все в порядке
je mouse_ok
mov ax, 0900h; иначе выдать предупреждение и завершить программу
mov dx, offset mouse_err
int 21h
exit_prog:
mov ax, 4c00h ; закончить программу
int 21h

mouse_ok:
....
mov ax, 0001h ; включить мышь
int 33h
....
GetChar:
mov ax,0700h ; ожидаем нажатие на клавишу Esc
int 21h
cmp al,27;нажата Esc?
jne GetChar; если нет продолжить опрос клавиатуры

mov ax, 0002h ; выключить мышь
int 33h

mov ax, 4c00h ; закончить программу
int 21h
end

BBB
29.04.2008, 16:02
Вообще такие вещи всегда делались вручную, никто никакие функции не использовал. Например, люди создавали графический курсор (стрелку) в текстовом режиме. Добивались этого путем программирования знакогенератора - т.е. битовых строк, которые определяют каждый текстовый символ, через порты видеоадаптера.
Причем предполагалось что общее количество различных символов на экране всегда меньше 256-4 (252). Вид тех самых 4 символов, на которых стоял указатель мыши заменялся на битовые изображения этих символов с наложением курсора (стрелки). Только коды этих символов менялись на диапазон с 252-255, чтобы остальные символы на экране не попортились новым изображением. Для примера можно посмотреть NDD.EXE или FFORMAT.COM в которых именно такая реализация.
Примерно по такой же схеме рисовались графические формы поверх текстовых и все в то время удивлялись как люди совмещали графический и текстовый режимы. somewhere, вот-вот! Это постоянное перепрограммирование 4-х символов нужно было, чтобы продемонстрировать особую крутость программы. Т.к. в этих случаях делалось даже так, что курсор плавно "скользил" по тексту, находящемуся на экране.

Я подозреваю, что это черезчур для учебной задачки Alex_Burn-а. Видимо, ему как раз достаточно через Int 33h, AX = 000Ah, как написал airyashovв #2 (http://forum.developing.ru/showpost.php?p=55355&postcount=2).

А через постоянное перепрограммирование внешнего вида символов мы как-то раз реалировали "бегущее сообщение". Наподобие того, как бегут по экрану (снизу вверх) титры кинофильма.

Там еще тонкость, что помимо программирования вида символов хорошо бы (если речь шла о VGA) перевести экран в режим матрицы символа 8x16 (из 9x16). Для лучшей смотрибельности.

somewhere
29.04.2008, 19:02
Там еще тонкость, что помимо программирования вида символов хорошо бы (если речь шла о VGA) перевести экран в режим матрицы символа 8x16 (из 9x16). Для лучшей смотрибельности.
Ну да, была такая фича. Я когда делал, всегда смотрел видеорежим чтобы определить размер матрицы. Ну или функцию Int 10h юзал для ее определения. Зато прикольно, когда по нортону вместо красного прямоугольника настоящий курсор ходил. Косяк только один был - его цвет, т.к. он зависел от аттрибутов символов и мог быть неравномерным.

Я подозреваю, что это черезчур для учебной задачки Alex_Burn-а
Просто внешне показалось, что нужно реализовать графический курсор в текстовом режиме, который не "шагает" по символьной матрице, а двигается плавно.

Alex_Burn
01.05.2008, 18:18
Всем большое спасибо за помощь! Вроде разобрался.
Что касается задания, то просто хотелось, чтобы форма курсора в графическом режиме была отлична от прямоугольника.

Alex_Burn
09.05.2008, 17:59
г-н airyashov, а что в вашем примере значат следующие строки?


mov ax,1130h
mov bx, 0004h
int 10h

airyashov
12.05.2008, 10:24
получить адрес памяти где хранятся коды знакогенератора для символов 128-255