diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-07-08 19:09:31 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-07-08 19:09:31 +0200 |
| commit | c4cc22b897fed06d040d8fdcc0b40b0f0dcf5bcf (patch) | |
| tree | b5be597050a2511841473d0ef2b13308640b9ea6 /kernel/kernel.c | |
| parent | 48bdc0e58fa036d6551fe216daaa6dbb390b8c82 (diff) | |
Further celanup and a little modularization
Diffstat (limited to 'kernel/kernel.c')
| -rw-r--r-- | kernel/kernel.c | 255 |
1 files changed, 10 insertions, 245 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c index bdf1ec1..db9c60e 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -1,162 +1,21 @@ +#include "kernel.h" // general kernel config & includes +#include "console.h" // this will allow us to write to screen -#include <stdint.h> -#include "kernel.h" // general kernel config -#include "console.h" // this will allow us to write to screen +// TODO: cleanup . how can i compile it without the includes!?? -// 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<INT_MAX; i++) - { - if(i==33)int_install_ir(i, 0b10001110, sel,&int_kb_handler); - else int_install_ir(i, 0b10001110, sel,&int_def_handler); - } - -} - -void int_install_ir(int irq, uint16_t flags, uint16_t sel, void *addr) -{ - - uint64_t base=(uint64_t)&(*addr); - - idt[irq].addrLo = base & 0xffff; - idt[irq].addrHi = (base >> 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"); -} +void int_kb_handler(); ////////// KERNEL MAIN///// ///// // void kernel_main() { - + // clear console scr_clear(); // hello message - scr_put_string(KERNEL_HELLO_MESSAGE); - scr_nextline(); - scr_nextline(); + scr_put_string_nl(KERNEL_HELLO_MESSAGE); // init interrupt decriptor table // install and enable! @@ -164,111 +23,17 @@ void kernel_main() int_install(); int_enable(); - scr_put_string("Interrupts Up and Running"); - scr_nextline(); + // install keyboard handler + int_install_ir(33, 0b10001110, 0x08,&int_kb_handler); + + scr_put_string_nl("Interrupts are up and running"); // 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; - -} |
