//kernel.c //08/13/03 Josh Holtrop //Holtrop's Operating System //Version: 0.1.1 //Modified: 10/23/03 #define VXR video_mode.XResolution #define VYR video_mode.YResolution #include "k_defines.h" #include "lib/string.h" #include "lib/io.h" #include "functions.h" #include "video.h" #include "mm.h" #include "vmm.h" #include "keyboard.h" #include "mouse.h" void isr(dword num); void k_init(); extern dword write_cr0(dword cr0); extern dword read_cr0(); extern dword write_cr3(dword cr3); extern dword read_cr3(); #include "mouse.c" #include "keyboard.c" #include "mm.c" #include "vmm.c" #include "functions.c" #include "video.c" dword timer = 0; void k_init() { console_cls(); remap_pics(0x20, 0x28); //set timer : 2e9c = 100hz outportb(0x43, 0x34); outportb(0x40, 0x9c); //lsb outportb(0x40, 0x2e); //msb video_init((ModeInfoBlock *) 0x90306); video_rectf(VXR*3/11, 0, VXR*4/11, VYR-1, 0x00000088); //test rectangles, draws "HOS" video_rectf(VXR*7/11, 0, VXR*8/11, VYR-1, 0x00000088); video_rectf(VXR/11, 0, VXR*2/11, VYR*2/5, 0x00000088); video_rectf(VXR/11, VYR*3/5, VXR*2/11, VYR-1, 0x00000088); video_rectf(VXR*5/11, VYR/5, VXR*6/11, VYR*4/5, 0x00000088); video_rectf(VXR*9/11, VYR/5, VXR-1, VYR*2/5, 0x00000088); video_rectf(VXR*8/11, VYR*3/5, VXR*10/11, VYR*4/5, 0x00000088); video_vert(10, 10, 16, 0x00ffff00); //should be yellow 'H' video_horiz(13, 10, 14, 0x00ffff00); video_vert(14, 10, 16, 0x00ffff00); video_horiz(10, 17, 21, 0x00ffff00); video_vert(19, 10, 16, 0x00ffff00); video_horiz(16, 17, 21, 0x00ffff00); int a, b; for (a = 0; a < 256; a++) { for (b = 0; b < 256; b++) { video_pset(a+5, b+30, (a<<16)|(b<<8)); video_pset(a+270, b+30, (a<<8)|(b)); video_pset(a+535, b+30, (a<<16)|(b)); video_pset(a+5, b+290, (a<<16)|(b<<8)|0x000000ff); video_pset(a+270, b+290, (a<<8)|(b)|0x00ff0000); video_pset(a+535, b+290, (a<<16)|(b)|0x0000ff00); } } mm_init(); vmm_init(); mouse_init(); printf("HOS 0.1.1 - Kernel Size: %d kb\n", kernel_size()/1024); printf("%x\t%x\n", read_cr0(), read_cr3()); vmm_enable_paging(); printf("%x\t%x\n", read_cr0(), read_cr3()); printf("Memory available to OS: %d MB (Bytes: %d)\n", mm_totalmem/0x100000, mm_totalmem); vmm_map1(0x45000000, 0xB8000, 0x3); *((word *)0x45000002) = 0x0444; vmm_mapn(0x54FFF000, 0xB7000, 0x3, 2); *((word *)0x55000020) = 0x0443; pic1_mask(0); //unmask IRQ's 0-7 pic2_mask(0); //unmask IRQ's 8-15 enable_ints(); dword key = 0; for (;;) { key = kbdWaitKey(); putc(key); } } void isr(dword num) { switch(num) { case 0x20: // IRQ0 - timer interrupt timer++; (*(byte *)0xb8000)++; eoi(); break; case 0x21: // IRQ1 - keyboard interrupt isr_keyboard(); //isr_keybard() takes care of calling eoi() break; case 0x2C: // IRQ12 - PS/2 mouse isr_mouse(); eoi2(); break; default: printf("Interrupt %d (0x%x) Unhandled!!\n", num, num); break; } }