diff options
author | Anton Kling <anton@kling.gg> | 2024-10-16 20:41:17 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-10-16 20:41:17 +0200 |
commit | 4e817cecfa7328af34fb96db7f052352737cd07e (patch) | |
tree | e2470a6e3f9683ed83a1e4067dd0ab79a9b67be5 /kernel/drivers/vbe.c | |
parent | 6d4f0e917f638c0ab53d847037938d83497f53ea (diff) |
kernel: Add RSOD(red screen of death)
This is not useful since 99% of the time I will have access to the
serial output. But it does look cool.
Diffstat (limited to 'kernel/drivers/vbe.c')
-rw-r--r-- | kernel/drivers/vbe.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/kernel/drivers/vbe.c b/kernel/drivers/vbe.c index 05edfb8..9271867 100644 --- a/kernel/drivers/vbe.c +++ b/kernel/drivers/vbe.c @@ -1,5 +1,6 @@ #include <assert.h> #include <drivers/vbe.h> +#include <fonts.h> #include <fs/devfs.h> #include <fs/vfs.h> #include <mmu.h> @@ -24,6 +25,43 @@ struct DISPLAY_INFO { struct DISPLAY_INFO vbe_info; +#define place_pixel_pos(_p, _pos) \ + { *(u32 *)((u32 *)framebuffer + _pos) = _p; } + +static int get_bitmap_value(const unsigned char bitmap[], int i) { + int array_index = i / 8; + int byte_index = i % 8; + int rc = (bitmap[array_index] >> byte_index) & 0x1; + return rc; +} + +void vbe_drawfont(u32 px, u32 py, const u8 c) { + u32 x, y; + x = px; + y = py; + if (px + 8 > framebuffer_width) { + return; + } + if (py + 8 > framebuffer_height) { + return; + } + const unsigned char *bitmap = font8x8_basic[c]; + for (int i = 0; i < 8 * 8; i++) { + u32 pos = x + y * framebuffer_width; + if (get_bitmap_value(bitmap, i)) { + place_pixel_pos(0xFFFFFF, pos); + } + x++; + if (x >= 8 + px) { + y++; + x = px; + } + if (y > py + 8) { + break; + } + } +} + int display_driver_init(multiboot_info_t *mbi) { assert(CHECK_FLAG(mbi->flags, 12)); framebuffer_width = mbi->framebuffer_width; |