2026-02-23

vak: (Знайка)
Как в DOS происходит ввод с клавиатуры? Есть вызов Int 16h AH=00h, блокирующее чтение символа. Он возвращает в регистре AX два байта: код ASCII и сканкод. Как эти байты образуются и как они соответствуют нажатым клавишам? Я провёл тщательное исследование: написал програмулину и собрал данные с реального компьютера i486.

Когда вы нажимаете кнопку на клавиатуре, биос делает примерно следующее.
  • Если это модификатор, то есть левый-правый Shift или Ctrl ил и Alt или CapsLock или NumLock - обновляется статус. Новый символ не вводится. Иначе преобразуем введённую клавишу в ascii+сканкод, в зависимости от статуса модификаторов.
  • Если нажат Alt, делаем как здесь.
  • Иначе если нажат Ctrl, делаем как здесь.
  • Иначе если:
    • нажат Shift,
    • или включен CapsLock и клавиша - буква,
    • или включен NumLock и клавиша из дополнительной цифровой клавиатуры (с правой стороны)
    - делаем как здесь.
  • Иначе делаем как здесь.
Дополнительная хитрость: клавиша Insert переключает модификатор "Insert" при каждом нажатии. Если нет Alt или Ctrl. Впрочем, большинство досовских программ этот модификатор игнорируют.