将扫描码转换为 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)的映射。您需要为此做一些测试。
所以我让 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)的映射。您需要为此做一些测试。