169 похожих чатов

Есть резидентный обработчик прерываний 09h под DOS. Пока он ничего

не делает.

После запуска программы выяснилось, что на клавиши навигации (стрелок вверх и вниз) новый обработчик неправильно реагирует и активизируется 2 раза.

В остальном все работает правильно. Подскажите, в чем ошибка?

.model tiny
.code
ORG 100h
main:
jmp Init

New_09h proc far

push ax dx ds es

mov ax,cs ;DS и ES адресуют данные резидента
mov ds,ax
mov es,ax

in al,60H ;читать ключ
cmp al,1Eh ;Если нажата клавиша 'A'
je do_pop ;да, активизировать popup

pop es ds dx ax
jmp dword ptr cs:[Old_09h]

do_pop: ;код отработки нажатия клавиши 'A'
in al,61H ;взять значениe порта упр. клавиатурой
mov ah,al ;сохранить его
or al,80h ;установить бит разрешения для клавы
out 61H,al ;и вывести его в управляющий порт
xchg ah,al ;извлечь исходное значение порта
out 61H,al ;и записать его обратно
mov al,20H ;послать сигнал "конец прерывания"
out 20H,al ;контроллеру прерываний 8259

pushf
call dword ptr cs:[Old_09h]

pop es ds dx ax
iret ;возврат из обработчика прерываний
New_09h endp

Old_09h DD ? ;определение ячейки памяти для хранения адреса системного обработчик

Init:
;выводим сообщение о загрузке резидента в память
mov ah,09h
mov dx,offset InitMsg
int 21h

;установим наш обработчик на прерывание 09h
mov ax,3509h
int 21h
mov word ptr Old_09h,bx
mov word ptr Old_09h+2,es

;запись стартового обработчика в вектор прерываний
mov ax,2509h
mov dx,offset New_09h
int 21h

;возврат в DOS, оставшись резидентным
mov dx,offset Init
int 27h

InitMsg DB "Resident installed in memory!",13,10,"$"
end main

2 ответов

64 просмотра

В коде не доконца разобрался, надо думать. Есть моя программа 2001г. показывающая скан-коды клавиш. Может она чем поможет?

У стрелок двухбайтовый сканкод e0 75/72. Ты скорее всего съедаешь только вторую часть, тем самым ломая стейтмашину. Кроме этого ты отправляешь ACK, а потом вызываешь предыдущий обработчик, который тоже отправляет ACK. Это дополнительно всё ломает.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта