Странно, что работает. Код (Text): ; с этого начинается завершение in al, 0x61 mov ah, al or al, 0x80 out 0x61, al xchg ah, al out 0x61, al Реликтовая конструкция. Нужно ориентироваться на PS/2. Код (Text): mov al, 0x20 out 0x20, al popa ... jmp int_EOI int_EOI: mov al, 20h out 020h, al out 0a0h, al iretd Дважды EOI в один чип, один раз в другой, который по идее вообще здесь ни причем, кКому-то подпортили значение ds и al - без комментариев.
Это всё для совмещения со старыми платформами, а int_EOI я сделал отдельно потому что он вызывается у меня из разных прерываний. а ту строку забыл убрать(я про повторение), говорил же опечатки)
Кстати понял почему может быть ошибка, Igor1024 у тебя ведь комп скорее всего далеко от 386, следовательно стоит контроллер прерываний APIC, а он насколько мне известно работает чуть по-другому, поэтому вариант либо его disable: Код (Text): mov ecx, 1bh rdmsr test ah, 1000b jz dapic_end and ah, 11110111b wrmsr dapic_end: Либо, читай документацию по APIC. http://ru.wikipedia.org/wiki/APIC
Вот код для штатного отладчика в виндоусе. Код (Text): mov ax,0 mov ds,ax mov ds[26],cs mov ds[24],112 jmp 10f nop push ds push ax mov ax,b800 mov ds,ax inc ds[0] in al,60 mov al,a0 out 20,al pop ax pop ds iret Код (Text): mov ax,0 //устанавливаем обработчик mov ds,ax mov ds[26],cs cs - сегмент адреса обработчика mov ds[24],112 //24h=36=9*4- 9 прерывание. Где 112 это смещение адрес обработчика jmp 10f // вечный цикл nop push ds // начало обработчика прерывания сохраняем регистры push ax mov ax,b800 //устанавливаем адрес вывода. Сегмент видео памяти. mov ds,ax inc ds[0] // увеличиваем счётчик для наглядности in al,60 // читаем код из клавиатуры. Что говорит ей что выходной буфер свободен. mov al,a0 // EOI с вращением приоритетов out 20,al // Посылаем ведущему контроллеру ПКП pop ax //восстанавливаем регистры pop ds iret // выходим из прерывания, возвращаем управление программе сокращение EOI -переводится как конец операции прерывания
Phantom_84 Про порт 61h. Оно не то что реликтовое. Оно не корректное, так как относится к другому контроллеру. Да я больше боюсь что это код может вызвать не предсказуемые действия на современных ПК.
BVOG Не надо его трогать. Если система содержит APIC, то она подпадает под мультипроцессорную спецификацию. А там черным по белому написанно что котролле APIC при загрузке запускается в режиме совместимости с PIC.
BVOG Настоятельно рекомендую в обработчике прерывания сделать настройку ds. У меня тоже без настройки работало. А потом занялся с vm-86 и долго отлаживал ошибки.
На самом деле у меня настраиваются все используемые регистры, просто я не привожу весь код обработчика , т.к. там ещё соддержится код обработки спец клавиш, занесение символа в кэш и т.п. З.Ы. Я работаю в P-Mode, и у меня все сегментные регистры предопределены)
Нет, это из другой оперы. Данный вопрос действительно не во всех источниках разобран. Я вроде только у Jourdain'а видел хороший алгоритм. Во первых стоит определится, а нужен ли тебе собственный обработчик, может будет достаточно использовать обработчик от BIOS. INT 0x16 с AH равным 0x00 и 0x01 посмотри. Написание собственного обработчика, уж слишком специфичная, и практически не нужная задача. То есть не нужно изобретать велосипед, когда есть более удобный мопед. Во вторых, подумай, а почему нельзя передать обработку из своего прерывания, старому обработчику. Но если все таки, решил, что свой собственный обработчик единственное решение твоей проблемы, то делай что-то приблизительно следующее: В _начале_ обработчика, сообщаешь только первому контролеру прерываний, что можно вызывать другие прерывания: mov al, 0x20 out 0x20, al sti и в конец Push Ax cli mov ah, 0x80 in Al, 0x61 or Al, Ah Out 0x61, Al jMp $ jMp $ Xor Al, Ah Out 0x61, Al Pop Ax iRet
Непонятные ошибки начнешь ловить, не удивляйся ))) Опять 25. Порт 61h, насколько я помню, сейчас используется для спикера и для маскирования отдельных источников NMI. Порты PS/2 - 60h и 64h. Прерывания разрешать в обработчике тоже ни к чему.
Правильно помнишь, но не все. Спорное утверждение, и чисто дело вкуса. А это лесом идет, пока не никто не отменял режима принудительной совместимости с 8042/8047. Это раз. Ни в одной спецификации не указано, что чтение 0x60 снимает запрос на прерывание. Это два.
MisHel64 Признайтесь что вы их не читали. ICH5 Note that previous PIIXn devices internally latched IRQ12 and IRQ1 and required a port 60h read to clear the latch. The ICH5 can be programmed to latch IRQ12 or IRQ1 (see bit 11 and bit 12 in General Control Register, D31:F0, offset D0h). PIIX 0060h1 RO Reset X-Bus IRQ12/M and IRQ1 PCI/ISA SMSC LPC47U33x OBF flag and set the KIRQ output if enabled. A read of this register will read the data from the Keyboard Data or Command Write Buffer and clear the IBF flag. IBM ps/2 http://www.mcamafia.de/pdf/ibm_hitrc07.pdf Страница 11 по счётчику pdf или 7 по орегинальной нумирации. Читать про Бит 4. Дальше продолжать не буду.
Pavia И не нужно продолжать. Возможно вы и читали, то что цитируете, но боюсь не поняли. Но по сути вопроса там нет ни слова. http://www.mcamafia.de/pdf/ibm_hitrc07.pdf Вот тут в частности, про бит 4 сказано, что это бит - индикатор наличия прерывания. Но ни слова не сказано, что этот бит отвечает за разрешения прерывания. Прочувствуйте разницу. Что бы не провоцировать дальнейший спор, сделаем проще. Попросим ответить Igor1024 всего на три вопроса. И ответить коротко, только да или нет. 1) Обработчик клавиатуры сейчас работает нормально? 2) В нем используется команда IRQ RESET (Запись 1, а потом 0 в 7й бит порта 0x61)? 3) Если отключить использование этой команды, обработчик продолжает работать нормально?