【问题标题】:Convert Scancodes to ASCII将扫描码转换为 ASCII
【发布时间】:2020-04-09 15:22:23
【问题描述】:

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

【问题讨论】:

    标签: x86 keyboard nasm osdev scancodes


    【解决方案1】:

    没有这样的数学公式。事实上,键盘布局之间的映射略有不同。这是一个相当困难的问题。通常,您会为用户提供一种选择键盘布局并基于此加载地图的方法。所以回答你的问题:我建议你制作一个数组,将每个扫描码映射到正确的字符。我假设您在 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 */
    };
    

    请注意,此映射并不完整,不适用于所有键盘,您可能需要重新定义修饰键(如控制、alt 和 shift)的映射。您需要为此进行一些测试。

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      相关资源
      最近更新 更多