Включение клавиатуры светодиодные фонари

Мне дали код для анализа. Этот код включает светодиоды numLock и scrollLock на клавиатуре. Я понимаю большую часть этого кода, но не понимаю часть цикла (0104). То, что я знаю, это для ожидания, чтобы входной буфер был пустым. Но нужно ли это? Код хорошо работает без этой части.

0100: MOV AL, ED
0102: OUT 60, AL
0104: IN  AL, 64
0106: TEST AL, 02
0108: JNZ 0104
010A: MOV AL, 03
010C: OUT 60, AL

1 ответ

Решение

Здесь есть хорошая информация о контроллере AT Keyboard. Биты в регистре состояния (порт 0x64), которые вам, вероятно, будут наиболее интересны для чтения и записи данных на порт 0x60:

Бит 1: состояние входного буфера

0: входной буфер пуст, можно записать. 1: входной буфер заполнен, пока не пишите.

Бит 0: состояние выходного буфера

0: Буфер вывода пуст, пока не читается. 1: Выходной буфер заполнен, можно прочитать. (В ситуации PS/2 бит 5 сообщает, доступны ли доступные данные с клавиатуры или мыши.) Этот бит очищается при считывании порта 0x60.

Вы должны подождать, пока бит состояния входного буфера не очистится, прежде чем записывать на порт 0x60. Несоблюдение ожидания может привести к потере данных, отправленных на контроллер. Перед чтением данных с порта 0x60 следует подождать, пока не будет установлен бит состояния выходного буфера, поскольку это означает, что есть данные для чтения. Чтение данных, которые недоступны, приведет к тому, что все данные, считанные с порта, будут считаться данными, если они вообще не являются данными.

На первый взгляд термины " Ввод и вывод" в регистре состояния могут показаться нелогичными. Биты получили свое название с точки зрения контроллера клавиатуры, а не ПК. Выходной буфер на контроллере является входным буфером на ПК и наоборот.

Эмуляторы и виртуальные машины кажутся куда более щадящими. Если вы хотите, чтобы ваш код имел больше шансов работать на множестве реальных аппаратных средств и эмуляторов, вам нужно будет вставить циклы, которые ждут соответствующего состояния, прежде чем продолжить.


Первая часть кода отправляет команду 0xED 1 на клавиатуру:

0100: MOV AL, ED
0102: OUT 60, AL

Эта команда задокументирована как:

Команда 0xED: запись светодиодов

За этой командой следует байт, указывающий желаемую настройку светодиодов. Биты 7-3: не используются, 0. Бит 2: 1: светодиод CapsLock включен. Бит 1: 1: светодиод NumLock включен. Бит 0: 1: светодиод ScrollLock включен. Когда все в порядке, оба байта подтверждены. Если второй байт распознается как команда, эта команда получает подтверждение и вместо нее выполняется. В противном случае возвращается NACK (и может потребоваться включение клавиатуры).

В этом разделе кода ожидается, что бит 1 (состояние выходного буфера) станет 0:

0104  IN  AL, 64
0106: TEST AL, 02
0108: JNZ 0104

Когда контроллер клавиатуры готов к приему данных, ПК может свободно записывать данные в порт 0x60, что и делает этот код:

010A: MOV AL, 03
010C: OUT 60, AL

Это данные светодиода, связанные с командой 0xED. Значение 03=00000011. Бит 1 установлен для включения NumLock, а бит 1 установлен для включения ScrollLock.


Сноски

  • 1 Код должен был дождаться, пока бит состояния входного буфера не станет равным 0, прежде чем писать команду клавиатуры 0xED на порт 0x60.
Другие вопросы по тегам