c で os を作成し、アセンブリを 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 が呼び出されたときに、スキャン変数を bool として使用して、文字を配列に入れています。しかし、それを呼び出し元のメインファイルに戻す方法がわかりません。