Включение клавиатуры светодиодные фонари - PullRequest
4 голосов
/ 09 июня 2019

Мне дали код для анализа. Этот код включает светодиоды 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 Ответ

2 голосов
/ 09 июня 2019

Хорошая информация о контроллере клавиатуры 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.
...