Конвертировать сканкоды в ASCII - PullRequest
1 голос
/ 09 апреля 2020

Итак, IRQ1 работает правильно, но оказывается, что он печатает код сканирования, считанный с порта 0x60. Я знаю, что должен преобразовать их в настоящих персонажей, но, похоже, не могу обойти это. Я пытаюсь сделать это в спине. Я знаю, что могу использовать карты ключей, но это вызывает вопросы о кодах make или break (что я должен использовать и что я должен делать с другим?). Нет ли математической формулы для преобразования их в ASCII? Я уже много читал об этом в Интернете, но это мало помогло. Приветствуется любая помощь в том, как преобразовать коды сканирования в символ в nasm.

1 Ответ

1 голос
/ 13 апреля 2020

Нет такой математической формулы. На самом деле, отображение немного отличается между раскладками клавиатуры. Это довольно сложная проблема. Обычно вы предоставляете пользователям возможность выбрать раскладку клавиатуры и загрузить карту на ее основе. Итак, чтобы ответить на ваш вопрос: я бы предложил вам создать массив, отображающий каждый скан-код на правильный символ. Я предполагаю, что вы запускаете его в 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. Вам нужно будет провести тестирование для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...