将扫描码转换为 ASCII

Convert Scancodes to ASCII

所以我让 IRQ1 正常工作,但事实证明它打印了从端口 0x60 读取的扫描码。我知道我必须将这些转换为实际字符,但我似乎无法理解它。我正在尝试在 nasm 中执行此操作。我知道我可以使用键映射,但它会引发有关生成或破坏代码的问题(我应该使用哪个以及我应该如何处理另一个?)。没有数学公式可以将它们转换为ASCII吗?我已经在网上阅读了很多有关它的信息,但没有太大帮助。任何关于如何将扫描代码转换为 nasm 中的字符的帮助都表示赞赏。

没有这样的数学公式。事实上,键盘布局之间的映射略有不同。这是一个相当困难的问题。通常,您会为用户提供一种方法 select 他们的键盘布局并基于此加载地图。所以回答你的问题:我建议你制作一个数组,将每个扫描码映射到正确的字符。我假设你在 qemu 或其他模拟器中 运行 它,并且其中的键映射对于所有意图和 purposes 都是相当恒定的。然后,一旦您的内核在开发中得到进一步发展,您就可以提供多个可以由用户换出的键映射数组。尽管我会把它放在需要在您的 os.

中执行的任务列表中很低的位置

这样一个数组的例子(对于像你在 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)的映射。您需要为此做一些测试。