From 1215e39086ac29eea0f7ccc1a8ffd776f068e2d3 Mon Sep 17 00:00:00 2001 From: Arnau478 Date: Fri, 17 Jun 2022 12:28:24 +0200 Subject: [PATCH] Basic VGA driver --- src/kernel/drivers/vga.c | 9 ++++++++ src/kernel/drivers/vga.h | 45 ++++++++++++++++++++++++++++++++++++++++ src/kernel/main.c | 8 ++++--- 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/kernel/drivers/vga.c create mode 100644 src/kernel/drivers/vga.h diff --git a/src/kernel/drivers/vga.c b/src/kernel/drivers/vga.c new file mode 100644 index 0000000..2ed09f0 --- /dev/null +++ b/src/kernel/drivers/vga.c @@ -0,0 +1,9 @@ +#include "vga.h" + +void set_char(int x, int y, char c){ + VGA_MEMORY[(x+y*VGA_WIDTH)*2] = c; +} + +void set_color(int x, int y, uint8_t color){ + VGA_MEMORY[(x+y*VGA_WIDTH)*2+1] = color; +} diff --git a/src/kernel/drivers/vga.h b/src/kernel/drivers/vga.h new file mode 100644 index 0000000..212ad6b --- /dev/null +++ b/src/kernel/drivers/vga.h @@ -0,0 +1,45 @@ +#pragma once + +#include + +#define VGA_MEMORY ((char *)0xB8000) + +#define VGA_COLOR_FG_BLACK 0x00 +#define VGA_COLOR_FG_BLUE 0x01 +#define VGA_COLOR_FG_GREEN 0x02 +#define VGA_COLOR_FG_CYAN 0x03 +#define VGA_COLOR_FG_RED 0x04 +#define VGA_COLOR_FG_PINK 0x05 +#define VGA_COLOR_FG_ORANGE 0x06 +#define VGA_COLOR_FG_WHITE 0x07 +#define VGA_COLOR_FG_LIGHT_BLACK 0x08 +#define VGA_COLOR_FG_LIGHT_BLUE 0x09 +#define VGA_COLOR_FG_LIGHT_GREEN 0x0A +#define VGA_COLOR_FG_LIGHT_CYAN 0x0B +#define VGA_COLOR_FG_LIGHT_RED 0x0C +#define VGA_COLOR_FG_LIGHT_PINK 0x0D +#define VGA_COLOR_FG_LIGHT_ORANGE 0x0E +#define VGA_COLOR_FG_LIGHT_WHITE 0x0F + +#define VGA_COLOR_BG_BLACK 0x00 +#define VGA_COLOR_BG_BLUE 0x10 +#define VGA_COLOR_BG_GREEN 0x20 +#define VGA_COLOR_BG_CYAN 0x30 +#define VGA_COLOR_BG_RED 0x40 +#define VGA_COLOR_BG_PINK 0x50 +#define VGA_COLOR_BG_ORANGE 0x60 +#define VGA_COLOR_BG_WHITE 0x70 +#define VGA_COLOR_BG_LIGHT_BLACK 0x80 +#define VGA_COLOR_BG_LIGHT_BLUE 0x90 +#define VGA_COLOR_BG_LIGHT_GREEN 0xA0 +#define VGA_COLOR_BG_LIGHT_CYAN 0xB0 +#define VGA_COLOR_BG_LIGHT_RED 0xC0 +#define VGA_COLOR_BG_LIGHT_PINK 0xD0 +#define VGA_COLOR_BG_LIGHT_ORANGE 0xE0 +#define VGA_COLOR_BG_LIGHT_WHITE 0xF0 + +#define VGA_WIDTH 80 +#define VGA_HEIGHT 25 + +void set_char(int x, int y, char c); +void set_color(int x, int y, uint8_t color); diff --git a/src/kernel/main.c b/src/kernel/main.c index 52099ad..92b2867 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -1,7 +1,9 @@ #include -#include "arch/i686/io.h" +#include "drivers/vga.h" void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){ - char *mem = (char *)0xB8000; // Screen memory address (when on text mode) - for(int i = 0; 1; i++) mem[i] = 88; // Fill screen with Blue 'X' characters over pink background + // Print a light cyan 'X' over green on the top left corner + set_char(0, 0, 'X'); + set_color(0, 0, VGA_COLOR_BG_GREEN | VGA_COLOR_FG_LIGHT_CYAN); + for(;;); // Halt here }