Как в DOS происходит ввод с клавиатуры? Есть вызов Int 16h AH=00h, блокирующее чтение символа. Он возвращает в регистре AX два байта: код ASCII и сканкод. Как эти байты образуются и как они соответствуют нажатым клавишам? Я провёл тщательное исследование: написал програмулину и собрал данные с реального компьютера i486.
Когда вы нажимаете кнопку на клавиатуре, биос делает примерно следующее.
Когда вы нажимаете кнопку на клавиатуре, биос делает примерно следующее.
- Если это модификатор, то есть левый-правый Shift или Ctrl ил и Alt или CapsLock или NumLock - обновляется статус. Новый символ не вводится. Иначе преобразуем введённую клавишу в ascii+сканкод, в зависимости от статуса модификаторов.
- Если нажат Alt, делаем как здесь.
- Иначе если нажат Ctrl, делаем как здесь.
- Иначе если:
- нажат Shift,
- или включен CapsLock и клавиша - буква,
- или включен NumLock и клавиша из дополнительной цифровой клавиатуры (с правой стороны)
- Иначе делаем как здесь.

no subject
Date: 2026-02-23 14:46 (UTC)no subject
Date: 2026-02-24 00:18 (UTC)https://www.amazon.com/Keychron-Mechanical-Swappable-Bluetooth-Compatible/dp/B0G492WCX4/
no subject
Date: 2026-02-24 01:17 (UTC)no subject
Date: 2026-02-23 14:49 (UTC)no subject
Date: 2026-02-23 14:49 (UTC)no subject
Date: 2026-02-24 00:02 (UTC)Запустите на древней французской писишке, потыкайте в кнопки, и узнаем. 😀
no subject
Date: 2026-02-24 00:00 (UTC)Очевидно, во французском биосе CapsLock работает несколько сложнее.
no subject
Date: 2026-02-24 01:18 (UTC)no subject
Date: 2026-02-24 07:52 (UTC)Но извращённым стилем напоминает давнюю историю, когда мне дали перевести базу данных с мака на писи, а оригинальная база содержала поля "на русском" и "на французском". Только авторы не думали о кодировке, они поставили два шрифта, один из которых отображал стандартные ASCII латинницы кириллицей. То есть, код один и тот же, но отрисовываются они по-разному, в зависимости от того, в каком поле этот символ. А я долго не мог понять, почему не вижу в дампе базы вроде как находящийся в ней текст.
no subject
Date: 2026-02-24 22:42 (UTC)no subject
Date: 2026-02-24 12:07 (UTC)no subject
Date: 2026-02-24 22:41 (UTC)Что там идёт от аппаратуры - биос всё скрывает. Мало ли какие бывают клавиатуры. Программисту незачем знать, иначе программа не будет работать на других писишках.
Вот как в документации:
INT 16h Keyboard 00h Read character Entry: None Exit: AH=scan code AL=characterТабличка по ссылке полезная. Я по сути воспроизвёл её, вычитав из реального компьютера. Так оно надёжнее: доверяй, но проверяй. 😀
Логика в сканкодах плохо прослеживается.
no subject
Date: 2026-02-25 09:32 (UTC)no subject
Date: 2026-02-25 19:39 (UTC)no subject
Date: 2026-02-26 06:22 (UTC)