#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=== KoalemOS ===\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)); 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, i; unsigned char c = 0; for(;;) { for(y=0;y<768;y++) { for(x=0;x<1024;x++) { putpixel(x, y, c, c, c, 0xff); } } c+=4; } serial_write_string("\nExecution finished, halting..."); }