diff --git a/boot/boot.S b/boot/boot.S index e7229429..1116cbfc 100644 --- a/boot/boot.S +++ b/boot/boot.S @@ -252,6 +252,10 @@ do_bios_call.1: cmp %bx, %ax je do_bios_call.set_mode + mov $0x04, %ax + cmp %bx, %ax + je do_bios_call.test_key + /* Else: Bad call, jump to loop. */ jmp do_bios_call.done @@ -277,6 +281,14 @@ do_bios_call.set_mode: int $0x10 jmp do_bios_call.done +do_bios_call.test_key: + movl 36(%esp), %ebx + xor %ax, %ax + mov %bl, %ah + int $0x16 + movl %eax, 20(%esp) + jmp do_bios_call.done + do_bios_call.done: /* Disable interrupts again */ cli diff --git a/boot/kbd.c b/boot/kbd.c index ad793bb2..226054a3 100644 --- a/boot/kbd.c +++ b/boot/kbd.c @@ -166,16 +166,22 @@ int read_key(int * c) { return 1; } +extern int do_bios_call(unsigned int function, unsigned int arg1); + +int kbd_status(void) { + int result = do_bios_call(4,0x11); + return (result & 0xFF) == 0; +} + int read_scancode(int timeout) { if (timeout) { int start_s = read_cmos_seconds(); - while (!(inportb(0x64) & 1)) { + while (kbd_status()) { int now_s = read_cmos_seconds(); if (now_s != start_s) return -1; } - } else { - while (!(inportb(0x64) & 1)); } - return inportb(0x60); + int result = do_bios_call(4,0); + return result >> 8; } #endif