summaryrefslogtreecommitdiff
path: root/kernel/drivers/vbe.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-10-16 20:41:17 +0200
committerAnton Kling <anton@kling.gg>2024-10-16 20:41:17 +0200
commit4e817cecfa7328af34fb96db7f052352737cd07e (patch)
treee2470a6e3f9683ed83a1e4067dd0ab79a9b67be5 /kernel/drivers/vbe.c
parent6d4f0e917f638c0ab53d847037938d83497f53ea (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.c38
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;