124 lines
2.9 KiB
C
124 lines
2.9 KiB
C
//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());
|
|
write_cr3((dword)vmm_PDBR);
|
|
write_cr0(0x80000000|read_cr0());
|
|
printf("%x\t%x\n", read_cr0(), read_cr3());
|
|
printf("Memory available to OS: %d MB (Bytes: %d)\n", mm_totalmem/0x100000, mm_totalmem);
|
|
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;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|