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

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

Date: 2026-02-23 14:46 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
С клавишей insert у меня случился конфуз, когда эта клавиша исчезла с клавиатур. Дальше-то чо, как переключать... и т.д. Много смешного.

Date: 2026-02-24 01:17 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Ой, какая хорошая клавка! Кабы я сидел за столом с большим компом...

Date: 2026-02-23 14:49 (UTC)
green_fr: (Default)
From: [personal profile] green_fr
С удовольствием прочитал :-) Но споткнулся об "или включен CapsLock и клавиша - буква". Во французской клавиатуре CapsLock неожиданно меняет поведение цифр наверху от клавиатуры. Потому что они изначально цифры только с Shift - простое нажатие на эти клавиши выдаёт либо французскую диактритику, либо разнообразную пунктуацию. А с Shift - цифры. Ну и CapsLock работает соответствующе: без Shift получаются цифры, а с Shift - пунктуация.

Date: 2026-02-23 14:49 (UTC)
green_fr: (Default)
From: [personal profile] green_fr
Написал и понял, что я не представляю, как это работало на французской клавиатуре под DOS. Меня здесь тогда ещё не было :-)

Date: 2026-02-24 01:18 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
На маке сейчас довольно модно капслоком переключать рус/лат.

Date: 2026-02-24 07:52 (UTC)
green_fr: (Default)
From: [personal profile] green_fr
Какой кошмар :-) Надо попробовать!

Но извращённым стилем напоминает давнюю историю, когда мне дали перевести базу данных с мака на писи, а оригинальная база содержала поля "на русском" и "на французском". Только авторы не думали о кодировке, они поставили два шрифта, один из которых отображал стандартные ASCII латинницы кириллицей. То есть, код один и тот же, но отрисовываются они по-разному, в зависимости от того, в каком поле этот символ. А я долго не мог понять, почему не вижу в дампе базы вроде как находящийся в ней текст.

Date: 2026-02-24 12:07 (UTC)
From: [personal profile] litwr
Названия bios-scancodes или scancodes вводят в заблуждение. Сканкоды идут прямо от аппаратуры и не зависят от модифаейров, Alt/Shift/... сами порождают сканкоды. Там довольно интересно в том, что они разной длины, для большинства клавиш - байт, но для некоторых целых 5, а может и больше на расширенных клавах. Удивительно, что в документации на BIOS по INT 16h возвращаемые значения называют также сканкодами, но при этом называют их и the BIOS translation of a keystroke! Их таблички давно сделаны, например, тут - https://stanislavs.org/helppc/scan_codes.html - интересно есть ли какая-то логика в значениях "сканкодов" с модификаторами?

Date: 2026-02-25 09:32 (UTC)
From: [personal profile] litwr
Насколько понял, аппаратура при загрузке ДОС переключается в режим генерации кодов в стиле первых PC + коды для новых клавиш (set 1). Иначе BIOS просто не сможет с ними работать. Возможно в табличках про INT 16h понятнее было бы использовать the BIOS scancode. Но реально имеем 3 уровня: 1) от контроллера клавы; 2) от порта 60h (и 64h, но для этого порта возможен ещё некий подуровень), с которым работает BIOS; 3) от БИОСа. Для USB-клав данные от порта 60h стандартные вроде. Биос-сканкоды не дают статуса нажато-отжато, поэтому не всегда хороши.

Date: 2026-02-26 06:22 (UTC)
From: [personal profile] litwr
И с играми могут быть проблемы. Пробовали что-нибудь типа старого доброго Диггера или Кота?