98 lines
2.9 KiB
C
98 lines
2.9 KiB
C
|
|
#include "multiboot.h"
|
|
#include "framebuffer.h"
|
|
#include "serial.h"
|
|
#include "xtoa.h"
|
|
|
|
static inline void outb(unsigned short port, unsigned char val)
|
|
{
|
|
asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
|
|
}
|
|
static inline unsigned char inb(unsigned short port)
|
|
{
|
|
unsigned char ret;
|
|
asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
|
|
return ret;
|
|
}
|
|
|
|
void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo)
|
|
{
|
|
// Cursor disabling
|
|
outb(0x3D4, 0x0A);
|
|
outb(0x3D5, 0x20);
|
|
|
|
int serial_initialized = serial_init();
|
|
serial_write_string("\n=== rOSka ===\n");
|
|
|
|
// Check multiboot header
|
|
if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) {
|
|
return;
|
|
}
|
|
|
|
serial_write_string("\nMultiboot flags: ");
|
|
serial_write_string(itoa(mbootinfo->flags, 2));
|
|
|
|
// Check videomode
|
|
if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) {
|
|
serial_write_string("\nVBE Mode: 0x");
|
|
serial_write_string(itoa(mbootinfo->vbe_mode, 16));
|
|
}
|
|
|
|
if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) {
|
|
serial_write_string("\nVideo info not available");
|
|
return;
|
|
}
|
|
|
|
serial_write_string("\nFramebuffer: ");
|
|
serial_write_string("\n Address: 0x");
|
|
serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16));
|
|
|
|
serial_write_string("\n Dimensions: ");
|
|
serial_write_string(itoa(mbootinfo->framebuffer_width, 10));
|
|
serial_write_string("X");
|
|
serial_write_string(itoa(mbootinfo->framebuffer_height, 10));
|
|
serial_write_string("x");
|
|
serial_write_string(itoa(mbootinfo->framebuffer_bpp, 10));
|
|
serial_write_string("\n Pitch: ");
|
|
serial_write_string(itoa(mbootinfo->framebuffer_pitch, 10));
|
|
serial_write_string("\n RPos:");
|
|
serial_write_string(itoa(mbootinfo->framebuffer_red_field_position, 10));
|
|
serial_write_string("\n GPos:");
|
|
serial_write_string(itoa(mbootinfo->framebuffer_green_field_position, 10));
|
|
serial_write_string("\n BPos:");
|
|
serial_write_string(itoa(mbootinfo->framebuffer_blue_field_position, 10));
|
|
|
|
serial_write_string("\nMemory: ");
|
|
serial_write_string("\n lower: ");
|
|
serial_write_string(uitoa(mbootinfo->mem_lower, 10));
|
|
serial_write_string(" k");
|
|
serial_write_string("\n upper: ");
|
|
serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10));
|
|
serial_write_string(" M");
|
|
|
|
initfb(
|
|
mbootinfo->framebuffer_addr,
|
|
mbootinfo->framebuffer_width,
|
|
mbootinfo->framebuffer_height,
|
|
mbootinfo->framebuffer_bpp,
|
|
mbootinfo->framebuffer_pitch,
|
|
mbootinfo->framebuffer_red_field_position,
|
|
mbootinfo->framebuffer_green_field_position,
|
|
mbootinfo->framebuffer_blue_field_position
|
|
);
|
|
int x, y;
|
|
for (y=mbootinfo->framebuffer_height; y>=0; y--) {
|
|
for (x=mbootinfo->framebuffer_width; x>=0; x--) {
|
|
putpixel(x, y, 0, 0x55, 0x55);
|
|
}
|
|
}
|
|
|
|
putchar("r", 412, 5, 0xff, 0xff, 0xff);
|
|
putchar("O", 452, 5, 0xff, 0xff, 0xff);
|
|
putchar("S", 492, 5, 0xff, 0xff, 0xff);
|
|
putchar("k", 532, 5, 0xff, 0xff, 0xff);
|
|
putchar("a", 572, 5, 0xff, 0xff, 0xff);
|
|
//while(1){}
|
|
|
|
serial_write_string("\nExecution finished, halting...\n");
|
|
}
|