diff options
Diffstat (limited to 'kernel/kernel.c')
| -rw-r--r-- | kernel/kernel.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c new file mode 100644 index 0000000..665455d --- /dev/null +++ b/kernel/kernel.c @@ -0,0 +1,99 @@ +#define SCR_WIDTH 80 +#define SCR_HEIGHT 23 + +#define SCR_CTRL 0x3D4 +#define SCR_DATA 0x3D5 + +#define SCR_BLACK 0x0 +#define SCR_BLUE 0x1 +#define SCR_GREEN 0x2 +#define SCR_CYAN 0x3 +#define SCR_RED 0x4 +// todo... +# define SCR_WHITE 0xf + + + +void print_char(int x, int y, char c, char col) +{ + char* video_mem=(char *)0xb8000+(x+y*SCR_WIDTH)*2; + video_mem[0]=c; + video_mem[1]=col; +} + +float func(float x,float y) +{ + return x*x*y; +} + +void clear_screen() +{ + int x=0; + int y=0; + + for(x=0;x<SCR_WIDTH;x++) + for(y=2;y<SCR_HEIGHT;y++) + print_char(x,y,'R',SCR_BLACK); +} + +void sleep(int i) +{ + int x; + + for(x=0;x<i;x++) + { + __asm__("nop"); + + } +} + +void kernel_main() +{ + + int col=0; + + while(1) + { + + print_char(0,0,'*',col++%0xf); + int0(); + + } + +} + +void kernel_main_joke() +{ + + float time=0; + int col=0; + int x; + + while(1) + { + time++; + print_char(0,0,'R',col++%0xf); + for(x=0;x<SCR_WIDTH;x++) + { + print_char(x,(2+(int)func((float)x,0.002*(time/100)))%(SCR_HEIGHT-2),'R',SCR_BLUE); + } + if(time>300)time=0; + + } + +} + +int cursor=0; +void int0() +{ + int i=0; + char codes[]={ 0x1e,0x30,0x2e,0x23,0x24,0x2b,0x34,0x33,0x43,0x3b,0x42,0x4b,0x3a,0x31,0x44,0x43,0x15,0x2d,0x1b,0x2c,0x3c,0x2a,0x1d,0x22,0x35,0x1a}; + + char* int_count=(char *)0x7c00+3; + + for(i=0;i<24;i++){ + if(codes[i]==*int_count) + print_char(10,10,'A'+i,0xf); + } + +} |
