Хорошая информация о контроллере клавиатуры AT здесь . Биты в регистре состояния (порт 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 включен. Когда все в порядке, оба байта
ACKed. Если второй байт распознается как команда, эта команда
Подтверждено и сделано вместо. В противном случае возвращается 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.