ZalupaCalc2/src/kmain.c

77 lines
1.8 KiB
C

#include "serial.h"
#include "drawing.h"
#include "mouse.h"
#include "timer.h"
#include "speaker.h"
#include "gdt.h"
#include "idt.h"
#include "heap.h"
#include "pmm.h"
#include "vmm.h"
#include "pic.h"
#include "string.h"
#include "multiboot.h"
uint32_t color_white = 0x00FFFFFF;
extern uint32_t* fb_ptr;
extern uint32_t* backbuffer;
extern uint32_t screen_width;
extern uint32_t screen_height;
extern uint8_t _binary_assets_logo_bmp_start[];
extern uint8_t _binary_assets_bg_bmp_start[];
extern uint8_t _binary_assets_cursor_bmp_start[];
uint32_t frame_count = 0;
uint32_t last_fps_ticks = 0;
uint32_t current_fps = 0;
extern uint32_t _kernel_end;
uint32_t kernel_end = (uint32_t)&_kernel_end;
void kernel_main(uint32_t mboot_addr, uint32_t magic) {
serial_init();
if (magic != MULTIBOOT_BOOTLOADER_MAGIC) {
while(1);
}
struct multiboot_info* mbi = (struct multiboot_info*)mboot_addr;
if (!(mbi->flags & (1 << 6))) {
while(1);
}
gdt_init();
idt_init();
pic_remap(32, 40);
pic_clear_mask(0);
pic_clear_mask(1);
pic_clear_mask(2);
pic_clear_mask(12);
timer_init(100);
mouse_init();
pmm_init(mbi, (uint32_t)&_kernel_end);
vmm_init();
kheap_init();
if (mbi->flags & (1 << 12)) {
draw_init(mbi);
}
__asm__ __volatile__("sti");
char fpsbuf[4];
while (1) {
draw_bmp(_binary_assets_bg_bmp_start, 0, 0);
draw_cursor_sprite(_binary_assets_cursor_bmp_start, mouse_x, mouse_y);
draw_string("FPS: ", 0, 0, color_white);
itoa(current_fps, fpsbuf, 10);
draw_string(fpsbuf, 40, 0, color_white);
flip_buffer();
frame_count++;
if (system_ticks - last_fps_ticks >= 100) {
current_fps = frame_count;
frame_count = 0;
last_fps_ticks = system_ticks;
}
}
}