#include #include "kernel.h" // general kernel config #include "console.h" // this will allow us to write to screen // garbage int unhandled=0; char col=100; char col2=0; int cursor=0; char last_code=0; uint8_t kb_in; //// interrupt stuff ///// // #define INT_MAX 255 // // interrupt descriptor table static struct int_desc { uint16_t addrLo; uint16_t sel; uint8_t zeros; uint8_t flags; uint16_t addrHi; } idt[INT_MAX]; // interrupt descriptor table descriptor static struct idt_desc { uint16_t size; uint16_t baseLo; uint16_t baseHi; } idtd; void int_def_handler() { __asm__("pusha"); unhandled++; // todo also the other pic!// TODO __asm__("mov $0x20, %al"); __asm__("out %al, $0x20"); __asm__("popa"); __asm__("leave"); __asm__("iret"); } void int_kb_handler() { __asm__("pusha"); __asm__("in $0x60, %al"); __asm__("mov %%al, %0"::"m" (kb_in)); int0(kb_in); //TODO!! __asm__("mov $0x20, %al"); __asm__("out %al, $0x20"); __asm__("popa"); __asm__("leave"); __asm__("iret"); } void int_init(uint16_t sel) { int i; for(i=0; i> 16) & 0xffff; idt[irq].addrHi = 0x0; idt[irq].zeros=0; idt[irq].flags=flags; idt[irq].sel=sel; } void int_install() { idtd.size=8*34; idtd.baseHi=0x0000; idtd.baseLo=&idt[0]; __asm__("lidt %0"::"m" (idtd)); } /* void int_show() { uint16_t *ptr3=&idt[0]; print_string("idt located: "); print_hex(ptr3); print_nextline(); // first two bytes as chars int offset; for(offset=32;offset<40;offset++) { print_hex(offset-32); //irq print_string(" -> "); print_hex(*(ptr3+offset*4)); //addrLo print_hex(*(ptr3+1+offset*4)); //sel print_hex(*(ptr3+2+offset*4)); //zeros & flags print_hex(*(ptr3+3+offset*4)); //addrHi print_nextline(); } } */ void int_disable() { __asm__("cli"); } void int_enable() { __asm__("sti"); } ////////// KERNEL MAIN///// ///// // void kernel_main() { // clear console scr_clear(); // hello message scr_put_string(KERNEL_HELLO_MESSAGE); scr_nextline(); scr_nextline(); // init interrupt decriptor table // install and enable! int_init(0x08); int_install(); int_enable(); scr_put_string("Interrupts Up and Running"); scr_nextline(); // kernel main loop while(1) { // print_nextline(); // print_str_col(0,0,"ABC",col); print_str_col(1,SCR_HEIGHT,"(*)",col2++); //int0(); } } /// keyboard driver //// void int0(uint8_t in) { int i=0; // //print_hex(int_count); uint8_t make_codes[]={ 0x1e, // A 0x30, // B 0x2e, // C 0x20, // D 0x12, // E 0x21, // F 0x22, // G 0x23, // H 0x17, // I 0x24, // J 0x25, // K 0x26, // L 0x32, // M 0x31, // N 0x18, // O 0x19, // P 0x10, // Q 0x13, // R 0x1F, // S 0x14, // T 0x16, // U 0x2F, // V 0x11, // W 0x2D, // X 0x15, // Y 0x2c, // Z }; uint8_t break_codes[]={ 0x9e, // A 0xb0, // B 0xae, // C 0xa0, // D 0x92, // E 0xa1, // F 0xa2, // G 0xa3, // H 0x97, // I 0xa4, // J 0xa5, // K 0xa6, // L 0xb2, // M 0xb1, // N 0x98, // O 0x99, // P 0x90, // Q 0x93, // R 0x9F, // S 0x94, // T 0x96, // U 0xaF, // V 0x91, // W 0xaD, // X 0x95, // Y 0xac, // Z }; //if(last_code==*int_count)return; for(i=0;i<26;i++) { if(make_codes[i]==in) { print_char_col(cursor,20,'A'+i,0xf); } } for(i=0;i<26;i++) { if(break_codes[i]==in) { print_char_col(cursor++,20,'a'+i,SCR_RED); } } last_code=in; }