我正在尝试在 c 中创建一个操作系统并在 32 位保护模式下进行程序集。我正在尝试创建一个 scanf() 类型的函数,该函数在按下回车按钮之前获取键盘输入。我有一个基本的键盘 IRQ 处理程序设置,它打印任何输入的内容,我想实现一个 scanf() 函数,但我无法将键盘处理程序的值返回到主内核。
这是键盘处理程序的代码。
unsigned int shift_key = 0;
unsigned int caps_key = 0;
int counter = 0;
char *sbuf;
int scan = 1;
void keyboard_handler(registers_t regs)
{
// monitor_write("handler called");
unsigned char scancode;
scancode = get_scancode();
if(scancode == 0x2A )
{
shift_key = 1;//Shift key is pressed
//monitor_write("Shift + ");
}
else if(scancode == 0xAA)
{
shift_key= 0;//Shift Key is not pressed
// monitor_write("Unshift");
}
else if(scancode == 0x3A && caps_key == 1)
{
caps_key = 0;//Caps key is pressed
// monitor_write("Shift + ");
}
else if(scancode == 0x3A && caps_key == 0)
{
caps_key = 1;//Caps key is pressed
// monitor_write("Shift + ");
}
//Left arrow
else if(scancode == 0x4B)
{
move_cursor_LR(1,0);
}
//right Arrow
else if(scancode == 0x4D)
{
move_cursor_LR(0,1);
}
else
{
if (shift_key == 1 && caps_key == 0)
{
// int shiftaltctrl = 1;//Put anything to see what special keys were pressed
monitor_put(Kkbdus[scancode]);
if (scan == 1 && Kkbdus[scancode] != '\n')
{
sbuf[counter] = Kkbdus[scancode];
counter++ ;
}
}
if (caps_key == 1 && shift_key == 0)
{
// int shiftaltctrl = 1;//Put anything to see what special keys were pressed
monitor_put(Kkbdus[scancode]);
if (scan == 1 && Kkbdus[scancode] != '\n')
{
sbuf[counter] = Kkbdus[scancode] ;
counter++ ;
}
}
if(shift_key == 0 && caps_key == 0)
{
monitor_put(kbdus[scancode]); //Prints the character which was pressed
if (scan == 1 && kbdus[scancode] != '\n')
{
sbuf[counter] = kbdus[scancode];
counter++ ;
}
}
if( caps_key == 1 && shift_key == 1)
{
monitor_put(kbdus[scancode]);
if (scan == 1 && kbdus[scancode] != '\n')
{
sbuf[counter] = kbdus[scancode];
counter++ ;
}
}
if(scan == 1 && kbdus[scancode] == '\n')
{
scan = 0;
sbuf[0] = '\0';
}
if(kbdus[scancode] == '\t')
{
monitor_write(sbuf);
}
}
}
当调用 irq 时,我使用 scan 变量作为布尔值将字符放入数组中。但我无法将它返回到我调用它的主文件中。