У вас в коде четыре ошибки. 1я, возможно не ошибка, а недостаточно данных вами приведенных. В частности, вы уверены что ES равен НУЛЮ? 2я, вы не ознакомилась с литературой по низкоуровневому программированию ни контролера прерываний, ни клавиатуры. Нужно, чуть потеснить код. И для точной диагностики, нужно точно знать, сколько раз вызывается ваш обработчик прерывания клавиатуры. И вызывается ли он вообще. Если вызывается только один раз, то копать в одну сторону. Если вообще не вызывается, то в другую.
1)Ручками прерывание вызывается int 9h и прекрасно отрабатывает. 2)Изучал по книгам Юрова и Кулакова. В смысле? Это аппаратное прерывание. Как была нажата клавиша, так прерывание и происходит. Проблема в том, что прерывание для клавы вообще не вызывается. MisHel64, из-за того, что это кусок кода, у вас возникли такие вот сомнения.
MisHel64 Я написал уже, что если прерывание вызвать руками, то всё работает=> прерывание удачно подменено=> es по-любому 0. Это вы про оформление? А где же ошибки №3 и №4?
Откуда вы знаете, что внутри прерывания ES равен нулю. Это вторая ошибка. Третья ошибка, ну посчитайте, куда будет указывать ES:BX в вашем коде, даже если предположить, что ES=0, а BX=0xB800. Линейный адрес напишите. Откуда знаете? Или вы не все прочитали, или эти книжки в топку. 3я и 4я ошибки тут. Или вы не видите, что оно вызывается. И еще, поменяйте код не mov [es:bx], ax А inc [es:bx], так веселее будет. А перед установкой прерывания в это место выведите символ НУЛЯ.
Всё обрабатывается, только нужно приоритеты расставить. Прерывание от клавы срабатывает 1 раз, потом её перебивает таймер... Во всяком случае мне так кажется.
Тебе не правильно кажется. Клавиатурный контролер не знает, что вы обработали прерывании, и можно вызывать следующее. Я же не зря в книжку тыкал, и спрашивал сколько раз вызывается. И еще. Зачем вы сообщаете второму контролеру, что обработали его прерывание? Он то тут причем?
Да, 2 контроллер здесь совсем не при делах... Это я уже и так, и сяк пробовал, вот и написал... Значит нужно послать 20h в порт 20h , для того, чтобы показать, что прерывание от клавы мы таки обработали. P.S Вот вчера я понаписал (я про 1кб и запись в "видеопамять"), так что прошу прощения за такие грубые оплошности и мою тупость.
То сеть, вы решили свою проблему, и теперь все работает как надо? И совет на всякий случай. Всегда явно задавайте значения регистров с своих обработчиках прерывания. Я про ES в обработчике. Это может привести к очень серьезным багам, на отлов которых вы может потратить недели. Нельзя быть уверенным, что ES всегда будет равен НУЛЮ, если вы этого не указали явно. Второй совет, обработка прерывания от клавиатуры, несколько отличается от обработки других прерываний. По этому типичная логика скорее вредна.
Нет, проблему я ещё не решил. Насколько понимаю, нужно послать 0xF4 в порт 60h для того, чтобы продолжилась передача данных. Ничего более подходящего по работе с клавой я не нашёл. Обрабатывается только 1 прерывание от клавы и всё. Буду искать в других справочниках что же за команду нужно послать, чтобы уведомить контроллер клавы о завершении прерывания.
Совсем с клавой запутался. Итак. В конце обработчика прерывания, перед iret нужно отправить EOI и записать в порт 60h F4h (разрешить передачу данных). MisHel64, поправьте раз я и сейчас не прав...
Pavia это же таки просто чтение (или я опять что-то не то сказал?). А как корректно завершить прерывание?
Вот, что делаю я(у меня работает): Код (Text): use32 keyboard: pusha xor ax, ax in al, 0x60 ;al - код символа по ASCII mov ax, 0x0 mov ds, ax mov ebx, 0xB8000 + 6 mov esi, ebx mov ebx, ascii add ebx, eax mov edi, ebx mov al, byte [edi] mov byte [esi], al ; с этого начинается завершение in al, 0x61 mov ah, al or al, 0x80 out 0x61, al xchg ah, al out 0x61, al mov al, 0x20 out 0x20, al popa jmp int_EOI ascii db 0,0,'1234567890-+',0,0,'QWERTYUIOP[]',0,0,'ASDFGHJKL;',"'`",0,0,'ZXCVBNM,./',0,'*',0,' ',0,0,0,0,0,0,0,0,0,0,0,0,0,'789-456+1230.',0,0 int_EOI: mov al, 20h out 020h, al out 0a0h, al iretd Основной смысл такой, если ошибся скажите - могла быть опечатка.