void dbg_loop() { while(is_debugging) { //dbg_update_display(); dbg_parse_char(kb_read()); wd_notify(WD_NOTIFY_KMAIN); } }
/* ---------------------------------------------------- * Function: kb_read * --------------------------------------------------*/ unsigned char kb_read(){ unsigned char c = inb(0x60); /* Acknowledge receipt of scancode by disabling and reenabling keyboard. * This is done through bit 7 of port 0x61*/ unsigned char p61 = inb(0x61); outb(0x61, p61 | 0x80); outb(0x61, p61); if(c == 0xE0){ /* 'extended' key has been pressed. Get the extended code from next int. */ return 128 + kb_read(); } else{ /* regular key has been pressed */ return c; } }
/* ---------------------------------------------------- * Function: kb_handler * --------------------------------------------------*/ void kb_handler(void *r){ unsigned char c = kb_read(); if(c & 0x80){ /* key release */ c &= 0x7F; /* get rid of the key release bit */ /* Shift */ if(c == 42 || c == 54){ kb_flags &= ~KBF_SHIFT; } /* CTL */ else if(c == 29 || c == 128+29){ kb_flags &= ~KBF_CTL; } /* ALT */ else if(c == 56 || c == 128+56){ kb_flags &= ~KBF_ALT; /* TODO: separate Alt and AltGr * */ } /* CAPSLOCK */ else if(c == 58){ kb_flags &= ~KBF_CAPS; } /* TODO: SUP (Logo Key) */ } /* key press */ /* Shift */ else if(c == 42 || c == 54){ kb_flags |= KBF_SHIFT; } /* CTL */ else if(c == 29 || c == 128+29){ kb_flags |= KBF_CTL; } /* ALT */ else if(c == 56 || c == 128+56){ kb_flags |= KBF_ALT; } /* CAPSLOCK */ else if(c == 58){ kb_flags |= KBF_CAPS; } /* TODO: SUP (Logo Key) */ else{ if(kb_flags & KBF_SHIFT){ c = kb_layout_sh[c]; } else{ c = kb_layout[c]; } unsigned char i; if(kb_print_to_screen){ for( i=0 ; i<buffer_pos ; i++){ scrn_putc(kb_buffer[i]); kb_buffer[i] = 0; } buffer_pos = 0; scrn_putc((char) c); } else{ if(buffer_pos >= KB_BUFFER_SIZE){ strcpy(kb_err, "Keyboard buffer full."); } else{ kb_buffer[buffer_pos] = (char) c; buffer_pos++; } } } }