Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Мышка под ДоС и ее совместимость с SVGA...


Автор: yOhoOo 23.11.2007, 17:03
Здравствуйте кважаемые.

Для реализации графической оболочки к проге юзаю VESA. Хотел было добавить мышку, взял готовые куски своего старого кода (для проги работающей при помощи EGAVGA.bgi). Мышка там реализовывалась вот так: 


Код

      _AX=1;
       geninterrupt(0x33);
       _CX=0;
       _DX=638;
       _AX=7;
       geninterrupt(0x33);
       _CX=0;
       _DX=478;
       _AX=8;
       geninterrupt(0x33);

Ну и что то там дальше...

Так вот, открыл я для себя что так не пойдет для VESA ибо вылетает тут же из программы в виндоз да ошибку пишет.  C чем это связано? Как это лечить?  

ЗЫ Пробывал вместо VESA юзать готовые SVGA.bgi но результат тот же...

Автор: Sartorius 23.11.2007, 17:20
В DOSBox-e запускать не пробовал?

Автор: yOhoOo 23.11.2007, 22:39
Цитата

В DOSBox-e запускать не пробовал? 


Поясни пожалуйста. Это что такое?

Автор: MAKCim 23.11.2007, 23:01
Цитата(yOhoOo @  23.11.2007,  22:39 Найти цитируемый пост)
Поясни пожалуйста. Это что такое? 

а если гугл начать использовать?  smile 

Автор: yOhoOo 24.11.2007, 05:52
Цитата

В DOSBox-e запускать не пробовал? 


Прочитал про ДосбОкс. А можно еще как нибудь попытатся справится с моей проблемой? Средствами кода например). Не очень бы хотелось таскать за программой этот загрузчик...

Автор: bsa 24.11.2007, 11:33
yOhoOo, тогда забудь про VESA и SVGA

Автор: yOhoOo 25.11.2007, 23:54
Ход конем...

Автор: archimed7592 26.11.2007, 03:37
yOhoOo, ход конем - это пытаться в современность пользоваться прямым доступом к аппаратуре. Ни одно нормальная ОС делать этого не позволяет.

Автор: yOhoOo 26.11.2007, 10:55
Все, убедили, пошел качать ДОСбокс...

Автор: yOhoOo 29.11.2007, 23:29
Гыыы А вот и нет. Я просто тупой, не понял очевидныйх вещей: 

Код

      _AX=0;
       geninterrupt(0x33);
      _AX=1;
       geninterrupt(0x33);
       _CX=0;
       _DX=638;
       _AX=7;
       geninterrupt(0x33);
       _CX=0;
       _DX=478;
       _AX=8;
       geninterrupt(0x33)


как я уже сказал вылетает.

А вот так:
Код

       _AX=0;
       geninterrupt(0x33);
       _CX=0;
       _DX=638;
       _AX=7;
       geninterrupt(0x33);
       _CX=0;
       _DX=478;
       _AX=8;


Вылеталть не будет. 

Связанно это с тем,  что в SVGA режиме:
Цитата

Остается только сожалеть о том, что эти полезные функции нельзя использовать при работе в графических режимах VESA. Как уже говорилось драйвер не может определить характеристики этих режимов, необходимые для построения изображения курсора

А вообще почитайте здесь: http://computers.plib.ru/programming/SVGA/menu.html


Так наглядно можно проверить что курсор действительно перемещается:
Код

do {
_AX=3;
geninterrupt(0x33);
x=_CX;
y=_DX;
button=_BL;

sprintf(c,"koordinata X=%d Y=%d кнопка=%d",x,y, button);

if (button==1) outtextxy(x,y,c);
}while(!kbhit());


А общая идея курсора выглядит так:
Код


_AX=3;
geninterrupt(0x33);
x=_CX;
y=_DX;

putimage(x,y, 'че-то там', XOR_PUT);// Картинка курсора как вы догадались наверное, 'Че то там' эта   
                                                               ваша переманная, которая этот рисунок хранит. XOR_PUT  
                                                               заменяет старую картинку на новую. (Посмотрите на пример в 
                                                               хэлпе по функции putimage() Там как раз таки XOR_PUT)

do {
_AX=3;
geninterrupt(0x33);
xTemp=_CX;
yTemp=_DX;
button=_BL;

if(xTemp!=x || yTemp!=y) { putimage(x,y, 'че-то там', XOR_PUT);  x=xTemp; y=yTemp; }

}while(!kbhit() || Button!=1);


Автор: sprata 12.9.2008, 06:08
yOhoOo, код который ты кинул это конечно неплохая идея визуализации вручную указателя мыши в режме SVGA. Но она подойдет только для одноцветного заднего фона. Так как ф-ии getimage() и putimage() работают с прямоугольными областями экрана, то реализовать перемещение треугольного курсора по неоднородному фону не удасться, так как незайдействованная  в рисовании курсора часть захваченной прямоугольной области будет перемещаться вместе с курсором и тем самым закрывать задний фон. Едиснтвенный выход, используя твою идею, это сделать курсор не треугольным, а прямоугольным.

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

Автор: yOhoOo 21.7.2009, 15:50
Цитата

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


Усе норм, тока поменять надо немного. Без ксор пута все. Обычными getimage/ putimage.
Берешь, перед тем как рисовать курсор копируешь в переменную скажем FONT_BOX область, где твой курсор будет жить,  затем рисуешь курсор. Затем отслеживаешь изменения в регистрах по X, Y координатам. Если нет изменений то ждешь) Если есть рисуешь поверх курсора область снова. Затем копируешь область под новыми координатами в FONT_BOX. И опять курсор рисуешь сверху.
Повторять до полного удовлетворения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)