Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2009, 15:34   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию DOS Клавиатура, Вектор прерывания

Приветствую. Я написал прогу, и в она ставит новый обработчик 009h. Дело в том что я так же сохраняю старый обработчик по 050h. В конце концов, срабатывает мой обработчик в котором

Код:
handler proc far
	int 050h
	iret
handler endp
Я хочу получать и изменять текущий скан код клавиатуры и разумеется, чтобы потом его получал оригинальный обработчик (в моем случае 050h).
Подскажите ? Спасибо.
BOBAH13 вне форума Ответить с цитированием
Старый 07.03.2009, 17:20   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию примерчик

Выкладываю полностью программку, которую писал в 1998 году..
Там всё прозрачно, да и комментарии есть...
Удачи.
Вложения
Тип файла: rar FIXF3.rar (810 байт, 68 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.03.2009, 19:23   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

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

Код:
handler:
	push ax
	push es
	push di
	pushf

	
	mov ax,040h
	push ax
	pop es
	
	mov di,word ptr es:[01ch]
	sub di,1
	
	mov al,'a'
	mov byte ptr es:[di],al


	popf
	pop di
	pop es
	pop ax
	
	int 50h
	iret
Поидеи, этот код должен каждую клавишу заменять на 'a'. Или я не прав ?
BOBAH13 вне форума Ответить с цитированием
Старый 08.03.2009, 01:06   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я далеко не специалист. ну, раз уж "подписался" отвечать, то попытаюсь хоть чем-то помочь...

Цитата:
Поидеи, этот код должен каждую клавишу заменять на 'a'. Или я не прав ?
нет. всё далеко не так просто... ;-(

прежде всего я не вижу вызова старого обработчика!
и существует всего два подхода - 1) нужные клавиши обслуживаем сами - (читаем из порта 60/пишем и т.д. - читайте ниже), либо вызываем старый обработчик и меняем то, что он обработал (например, положенные им в буфер клавиатуры символы...

например, в приложенном моём примере EXMP_09.rar (1.1 Кбайт) вместо английской a у Вас будет "нажиматься" s
в буфере подменяются и скан код и ASCII-код...

Дальше.
думаю, что Вам может быть полезна программка Никиты Корзуна, которая показывает состояние клавиатуры/очереди и т.д. - KNKBDI - KN.rar (4.7 Кбайт)


и ОБЯЗАТЕЛЬНО почитайте по ссылкам:
Робер Журден_ Справочник программиста на персональном компьютере фирмы IBM (читать 3.1.9 Перепрограммирование прерывания клавиатуры.)

Деревянко_ СПО ПЭВМ - 7. Клавиатура

http://hellknights.void.ru/articles/...ected_mode.htm (Теперь рассмотрим обработчик прерывания IRQ1 от клавиатуры....)

ну, и на закуску - ещё маленький пример древней программки по перекодированию/сохранению/воспроизведению нажимаемых клавиш - (c) Могилевец:
MOGILEVE.rar (15.6 Кбайт)

p.s. А для чего это Вам всё надо?... может быть, Ваша задача решается совсем по другому?...
Вложения
Тип файла: rar EXMP_09.rar (1.1 Кб, 54 просмотров)
Тип файла: rar KN.rar (4.7 Кб, 48 просмотров)
Тип файла: rar MOGILEVE.rar (15.6 Кб, 52 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.03.2009, 07:44   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Это мой курсовой. Вызов старого обработчика происходит по прирыванию int 50h .

Вот обработчик

Код:
handler proc far
	int 50h

	cli
	pushf
	push ds
	push ax
	push si

	mov ax,40h
	mov ds,ax

	mov si,03ch
	
	xor ax,ax
	mov al,'1'
	mov word ptr [si],ax
	
	pop si
	pop ax
	pop ds
	popf
	sti

	iret
handler endp
По идеи должна всегда выпадать 1 Но смотрим аттач
Вложения
Тип файла: zip example.zip (2.9 Кб, 19 просмотров)

Последний раз редактировалось BOBAH13; 08.03.2009 в 08:51.
BOBAH13 вне форума Ответить с цитированием
Старый 09.03.2009, 07:02   #6
Elessar
Новичок
Джуниор
 
Регистрация: 09.03.2009
Сообщений: 1
По умолчанию

Нужна подробная информация по портам 20h(21h) и 0A1h(0A0h)
Elessar вне форума Ответить с цитированием
Старый 09.03.2009, 09:14   #7
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

не знаю нащёт int 50h....... я обычно тупо jmp делал....... так вот при jmp перед вызовом нужно pushf....... т.е. на момент вызова прерывания в вершине флаги должны находиться..... также нужно проверять не вышел ли хвост за "границу".....
Код:
mov ax,40h
mov es,ax
mov bx,es:[1Ch]
dec bx
dec bx ;(отнимать от хвоста нужно 2 байта, т.к. потом вы записываете слово)
cmp bx,1Eh
jae go
mov bx,3Ch
go:
mov word ptr es:[bx],0031h
и далее к основному обработчику....
Надо бы избавиться от привычки ставить многоточие.....

Последний раз редактировалось Min; 09.03.2009 в 09:16.
Min вне форума Ответить с цитированием
Старый 09.03.2009, 10:34   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от Min Посмотреть сообщение
не знаю нащёт int 50h....... я обычно тупо jmp делал....... так вот при jmp перед вызовом нужно pushf....... т.е. на момент вызова прерывания в вершине флаги должны находиться..... также нужно проверять не вышел ли хвост за "границу".....
Код:
mov ax,40h
mov es,ax
mov bx,es:[1Ch]
dec bx
dec bx ;(отнимать от хвоста нужно 2 байта, т.к. потом вы записываете слово)
cmp bx,1Eh
jae go
mov bx,3Ch
go:
mov word ptr es:[bx],0031h
и далее к основному обработчику....
Спасибо попробую.
BOBAH13 вне форума Ответить с цитированием
Старый 09.03.2009, 12:01   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

BOBAH13, прежде всего скажите, EXMP_09.rar у вас работает или нет?

во-вторых, я согласен с Min.
Единственное, мне кажется, что помещать символ в очередь нужно БЕЗ вызова старого прерывания. Или, если Вы хотите менять результат обработки, надо после вызова:
Код:
pushf
call far cs:[old_09]
проверил. Решение от Min - РАБОТАЕТ!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.03.2009, 07:50   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Да все работает, но к моему глубокому удивлению, следующий код (проверка символа) не работает. Можете подсказать что не так?

Код:
CheckKey equ '1'
NewKey equ '2'

handler proc far
	int 50h

	cli
	pushf
	push es
	push bx
	push ax



	mov ax,40h
	mov es,ax
	mov bx,es:[1ch]

	dec bx
	dec bx


	cmp bx,1eh
	jae l1
	mov bx,3ch
l1:
	


	mov ax,word ptr es:[bx] ; Я думал что это буфер символа
	cmp ax,CheckKey ; Как нистранно, всегда не равно :)
	jne l2
	
	mov ax,NewKey
	mov word ptr es:[bx],ax

l2:
	


	pop ax
	pop bx
	pop es
	popf
	sti

	iret
handler endp
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прерывания Kn793 Общие вопросы Delphi 3 10.01.2009 18:43
Прерывания DOS odi_noki Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 26 14.11.2008 13:51
прерывания sergei64_89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 22.04.2008 13:37