Вид курсора мыши
Модератор: Andy
Попробуйте WIN кодировку Я пишу в RadASM, открываете наверное под DOS
С вашего позволения, покажу то,что вижу.
[Syntax="Asm"]
.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
[/Syntax]
Так-то ничего страшного, но читать не приятно. Да и хотелось-бы знать, что вы там написали.
[Syntax="Asm"]
.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
[/Syntax]
Так-то ничего страшного, но читать не приятно. Да и хотелось-бы знать, что вы там написали.
Какой-то древнеукраинский или кривой Т9 )))))
It's a long way to the top if you wanna rock'n'roll
[Syntax="Asm"]
.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[/Syntax]
.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[/Syntax]
somewhere, вот-вот! Это постоянное перепрограммирование 4-х символов нужно было, чтобы продемонстрировать особую крутость программы. Т.к. в этих случаях делалось даже так, что курсор плавно "скользил" по тексту, находящемуся на экране.somewhere писал(а):Вообще такие вещи всегда делались вручную, никто никакие функции не использовал. Например, люди создавали графический курсор (стрелку) в текстовом режиме. Добивались этого путем программирования знакогенератора - т.е. битовых строк, которые определяют каждый текстовый символ, через порты видеоадаптера.
Причем предполагалось что общее количество различных символов на экране всегда меньше 256-4 (252). Вид тех самых 4 символов, на которых стоял указатель мыши заменялся на битовые изображения этих символов с наложением курсора (стрелки). Только коды этих символов менялись на диапазон с 252-255, чтобы остальные символы на экране не попортились новым изображением. Для примера можно посмотреть NDD.EXE или FFORMAT.COM в которых именно такая реализация.
Примерно по такой же схеме рисовались графические формы поверх текстовых и все в то время удивлялись как люди совмещали графический и текстовый режимы.
Я подозреваю, что это черезчур для учебной задачки Alex_Burn-а. Видимо, ему как раз достаточно через Int 33h, AX = 000Ah, как написал airyashovв #2.
А через постоянное перепрограммирование внешнего вида символов мы как-то раз реалировали "бегущее сообщение". Наподобие того, как бегут по экрану (снизу вверх) титры кинофильма.
Там еще тонкость, что помимо программирования вида символов хорошо бы (если речь шла о VGA) перевести экран в режим матрицы символа 8x16 (из 9x16). Для лучшей смотрибельности.
Ну да, была такая фича. Я когда делал, всегда смотрел видеорежим чтобы определить размер матрицы. Ну или функцию Int 10h юзал для ее определения. Зато прикольно, когда по нортону вместо красного прямоугольника настоящий курсор ходил. Косяк только один был - его цвет, т.к. он зависел от аттрибутов символов и мог быть неравномерным." писал(а):Там еще тонкость, что помимо программирования вида символов хорошо бы (если речь шла о VGA) перевести экран в режим матрицы символа 8x16 (из 9x16). Для лучшей смотрибельности.
Просто внешне показалось, что нужно реализовать графический курсор в текстовом режиме, который не "шагает" по символьной матрице, а двигается плавно." писал(а):Я подозреваю, что это черезчур для учебной задачки Alex_Burn-а
It's a long way to the top if you wanna rock'n'roll
Всем большое спасибо за помощь! Вроде разобрался.
Что касается задания, то просто хотелось, чтобы форма курсора в графическом режиме была отлична от прямоугольника.
Что касается задания, то просто хотелось, чтобы форма курсора в графическом режиме была отлична от прямоугольника.
г-н airyashov, а что в вашем примере значат следующие строки?
[Syntax="ASM"]
mov ax,1130h
mov bx, 0004h
int 10h
[/Syntax]
[Syntax="ASM"]
mov ax,1130h
mov bx, 0004h
int 10h
[/Syntax]
получить адрес памяти где хранятся коды знакогенератора для символов 128-255