Вопрос № 18154: Здравствуйте...
Снова про резиденты... Допустим нужно создать резидентную прогу, которая будет висеть в памяти и активизироваться нажатием некоторой горячей клавиши (например F11). Как я понимаю, для подобных целей нужно перехватить прерывание 9...Вопрос № 18160: проблемы с прямым выводом текста в видеобуфер
приложен код программы, печатающий мордашку, вроде все ок..
ан нет.. помогите плиз..
код взят из рассылок Калашникова Олега, пятилетней давности. По идее должно работать.. все линкуется, компи...
Вопрос № 18154
Здравствуйте...
Снова про резиденты... Допустим нужно создать резидентную прогу, которая будет висеть в памяти и активизироваться нажатием некоторой горячей клавиши (например F11). Как я понимаю, для подобных целей нужно перехватить прерывание 9Н, спросить у порта клавиатуры, какая клавиша была нажата, и если это горячая клавиша, активизировать резидент (например вывести окошко)... Все в роде бы просто... Например в одной программе-справочнике под редакцией Абеля (уже не помню где и когда скачал) для этих целей предлагают
применить следующий код: (см. приложение)
Допустим я напишу нечто подобное, и активизирую резидент... Но что делать дальше??? Как сделать так, чтобы до того, как не будет нажата клавиша деактивации резидента, он получал и обрабатывал нужные клавиши, а ненужные отсеивал... То есть, например резидент активизировался при работе с Дос Навигатором, то как сделать так, чтоб при нажатии (уже при активном резиденте) на F10 я не переходил на строку меню в оболочке, а делал только то, что предусмотрено резидентом при нажатии этой клавиши??? При чем нужно, чтобы
окошко резидента постоянно находилось поверх всех остальных...
Можете хотя бы в общих чертах расказать, как реализуется подобная штуковина???
Если у кого есть примерчик подобной проги, то буду безмерно балгодарен.....
Большое спасибо...
З.Ы. А как на счет 16Н прерывания??? оно тоже вроде бы с клавиатурой работает... Может может лучше перехватывать его... Да и вообще... чего-то я не понимаю почему существуют разные прерывания, для обработки одних и тех же действий...???
Приложение:
Отправлен: 11.03.2005, 20:37
Вопрос задал: CrazyIronToiletPaper (статус: 1-ый класс)
Всего ответов отправлено: 4
Отвечает: Стас
Здравствуйте, CrazyIronToiletPaper!
Начну с конца: Int 9 и Int 16 выполняют абсолютно разные функции.
Int 9 это аппаратное прерывание, срабатывающее каждый раз, когда нажимается И отпускается клавиша. Она сморит что это за клавиша и делает что либо в зависимости от того какая это клавиша, напр. - NumLock - поставить флажок и зажечь(погасить лампочку), если какая то буква - занести её в буфер клавиатуры. (Пользователем не вызывается.)
Int 16 это прерывания пользователя, оно проверяет буффер клавиатуры и извлекает из него коды нажатых клавиш. Его ты сам вызываешь.
>Как сделать так, чтобы до того, как не будет нажата клавиша деактивации резидента, он >получал и обрабатывал нужные клавиши, а ненужные отсеивал...
входя в свой обработчик (int9) первым делом смотришь, ты уже активирован (нажал F10),
если нет - проверяешь, а что нажал в данный момент? Если F10 - ставишь флаг что активировался. Если ты не активировался еще(или уже) и не F10 то отдаешь всю обработку старому обработчику, тебе не к чему этим заниматься.
Если же ты уже активирован то пишешь свою обработку нужных тебе клавиш, или всех, или просто, скажем сбрасываешь их в Log файл. В зависимости от тогда надо тебе чтобы система(и ДОС нафигатор) знала о нажатии этих клавиш вызывашь старый обработчик прерывания или нет.
Полностью заменить Int9 cвоим можно, только нужно ли? Если ты не вызовишь старый обработчик Int9 никто о нажатой клавише не узнает. (Только обработчик запущенный после твоей проги :))
А вот чтобы окошко появлялось поверх Дос нафигатора, тут сложнее, алгоритмов может быть несколько, либо по таймеру, возможно по томуже int9, или посмотрев исходный код навигатора, чтобы "врезаться" в него. Все не очень хорошие.
Насколько я представляю себе он прорисовывает экран либо по таймеру, либо после обработки клавиш(скорее второе), напрямую пишет в видеопамять. А следовательно окошко можно нарисовать только после того как он уже "отрисовался".
Вообщем то можно было бы набрасать прогу, начни, я испавлю и подмогну. А то самому все делать влом. И на имейл: trashcan2СОБАКАyandex.ru
Ответ отправил: Стас (статус: Практикант)
Отправлен: 12.03.2005, 00:50
Отвечает: Евгений Иванов
Здравствуйте, CrazyIronToiletPaper!
насчёт поверх - это тебе нужно работать со страницами видеопамяти.
то есть, переключаешь активную на 3-ю страницу, и выводишь в неё то, что на первой плюс своё изображение ;)
игра такая была Background Tetris. крутая вещичка.
прерывания каждое для своей задачи.
тебе можно запросто использовать 22-ое прерывание.
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 12.03.2005, 11:21
Отвечает: DSota
Здравствуйте, CrazyIronToiletPaper!
1. Можно сделать переменную и держать в нем информацию, нужно ли отсеивать клавиши или нет... При нажатии на клавишу, если эта клавиша 11 то переменная меняется...
2. Прерывание int9 возникает со стороны клавиатуры, когда нужно запомнить символ в буфере, а прерывание 16 вызываеться из программы пользователя, наоборот для получения этих запомненных символов из буфера...
Приложение:
Ответ отправил: DSota (статус: Студент)
Отправлен: 14.03.2005, 11:19
Отвечает: Ayl
Здравствуйте, CrazyIronToiletPaper!
Начну с конца. Разных прерываний для выполнения одних и тех же действий НЕ СУЩЕСТВУЕТ! Это первое. Даже если у тебя есть несколько прерываний для, например, отображения символа на экране, то все равно они выполняют не совсем одинаковые действия. Скажем, некоторые могут дополнительно сохранять еще какую-либо информацию, либо использовать для своей работы дополнительные данные и т.п.
В твоем же случае прерывания 9 и 16 вообще выполняют разные действия. Прерывание 9 - это аппаратное прерывание от клавы (IRQ1), которое генерируется контроллером клавиатуры (КК) при нажатии, удержании или отпускании любой клавиши. Стандартный обработчик этого прерывания производит действия по анализу полученного от КК кода (скен-код), и формирует в зависимости от него, а также от состояния флагов клавиш-переключателей (Shift, Alt, Ctrl, NumLock, CapsLock, ScrollLock) 16-тиразрядное число (пара скен-код + ASCII-код)
для помещения в буфер клавиатуры.
Прерывание же 16 просто выбирает из буфера клавиатуры очередное значение и возвращает его приложению (функции 0, 10 и 20).
Теперь как тебе реализовать твою фишку. Делается это в несколько шагов.
1. Заводишь в своем резиденте флаг активации резидента. Вначале он равен 0.
2. В обработчике прерывания 9 ты сначала проверяешь флаг активации. Если он равен 0, то выполняешь обычные действия по проверке клавиши активации резидента и устанавливаешь флаг вктивации в 1.
3. Если же флаг активации равен 1 (т.е. ты уже находишься в работающем резиденте и тебе нужно обрабатывать клавиши для него), то ты вызываешь старый обработчик прерывания 9 и после этого получаешь из буфера клавиатуры преобразованный код. Либо обрабатываешь самостоятельно скен-коды клавиш и игнорируешь те, которые тебе не нужны.
4. Когда ты завершаешь работу резидента, то сбрасываешь значение флага активации в 0.
На самом деле вообще непонятно, в чем у тебя сложности возникли. Т.к. DOS - однозадачная система, то в тот момент, когда ты активируешь резидент, то активной программой становится именно он, и про прервынную программу никто и не вспомнит до тех пор, пока ты не вернешь ей управление. Поэтому все обращения к буферу клавиатуры будут происходить из твоей программы. Главное, чтобы в нем не осталось ничего лишнего к моменту возвращения в прерванную программу.
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 14.03.2005, 16:31
Вопрос № 18160
проблемы с прямым выводом текста в видеобуфер
приложен код программы, печатающий мордашку, вроде все ок..
ан нет.. помогите плиз..
код взят из рассылок Калашникова Олега, пятилетней давности. По идее должно работать.. все линкуется, компилируется, но при запуске только пустой экран..
ОС - WinXP Pro (SP2)
Turbo Assembler Version 3.2i
заранее спасибо
Приложение:
Отправлен: 12.03.2005, 00:00
Вопрос задал: archie (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: AxMAD
Здравствуйте, archie!
Сначала надо установить текстовый режим(глюк и w2k/xp)!!!
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 12.03.2005, 00:43 Оценка за ответ: 4
Отвечает: Евгений Иванов
Здравствуйте, archie!
Необходимо выставить видеорежим.
например, третий.
mov ax,3
int 16
Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 12.03.2005, 02:49 Оценка за ответ: 5
Отвечает: Ayl
Здравствуйте, archie!
В начале программы напиши:
mov ax, 3
int 10h
и все должно получиться. У WinXP есть такая бяка, что при работе в эмуляторе DOS она устанавливает как основную 1-ю страницу видеобуфера. Указанный выше код производит инициализацию видеорежима и устанавливает 0-ю страницу для отображения.
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 14.03.2005, 17:21