From 4e817cecfa7328af34fb96db7f052352737cd07e Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Wed, 16 Oct 2024 20:41:17 +0200 Subject: 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. --- kernel/drivers/vbe.c | 38 ++++++++++++++++++++++++++++++++++++++ kernel/drivers/vbe.h | 2 ++ 2 files changed, 40 insertions(+) (limited to 'kernel/drivers') 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 #include +#include #include #include #include @@ -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; diff --git a/kernel/drivers/vbe.h b/kernel/drivers/vbe.h index 369f384..c0f6c42 100644 --- a/kernel/drivers/vbe.h +++ b/kernel/drivers/vbe.h @@ -1,6 +1,8 @@ #ifndef VBE_H #define VBE_H #include + +void vbe_drawfont(u32 px, u32 py, const u8 c); int display_driver_init(multiboot_info_t *mb); void display_driver_cross(multiboot_info_t *mbi); void add_vbe_device(void); -- cgit v1.2.3