Нет такой математической формулы. На самом деле, отображение немного отличается между раскладками клавиатуры. Это довольно сложная проблема. Обычно вы предоставляете пользователям возможность выбрать раскладку клавиатуры и загрузить карту на ее основе. Итак, чтобы ответить на ваш вопрос: я бы предложил вам создать массив, отображающий каждый скан-код на правильный символ. Я предполагаю, что вы запускаете его в qemu или другом эмуляторе, и раскладка клавиатуры в нем довольно постоянна для всех намерений и целей. Затем, как только ваше ядро продвинется дальше в разработке, вы предоставите несколько таких массивов сопоставления клавиш, которые могут быть заменены пользователем. Хотя в списке задач, которые должны быть реализованы в вашей операционной системе, я бы выделил это довольно низко.
Пример такого массива (для стандартной раскладки клавиатуры США, как в qemu):
char kbd_US [128] =
{
0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b',
'\t', /* <-- Tab */
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n',
0, /* <-- control key */
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', 0, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0,
'*',
0, /* Alt */
' ', /* Space bar */
0, /* Caps lock */
0, /* 59 - F1 key ... > */
0, 0, 0, 0, 0, 0, 0, 0,
0, /* < ... F10 */
0, /* 69 - Num lock*/
0, /* Scroll Lock */
0, /* Home key */
0, /* Up Arrow */
0, /* Page Up */
'-',
0, /* Left Arrow */
0,
0, /* Right Arrow */
'+',
0, /* 79 - End key*/
0, /* Down Arrow */
0, /* Page Down */
0, /* Insert Key */
0, /* Delete Key */
0, 0, 0,
0, /* F11 Key */
0, /* F12 Key */
0, /* All other keys are undefined */
};
Обратите внимание, что эта карта не полностью завершена, не будет работать для всех клавиатур, и вы можете переопределить отображение для клавиш-модификаторов, таких как control, alt и shift. Вам нужно будет провести тестирование для этого.