From 7f48dc6a1765695fe5a3c0ca2d715545baf57ae7 Mon Sep 17 00:00:00 2001 From: Arnau478 Date: Fri, 17 Jun 2022 14:30:41 +0200 Subject: [PATCH] ANSI text coloring --- src/kernel/drivers/vga.c | 37 +++++++++++++++++++++++++++++++++---- src/kernel/drivers/vga.h | 2 ++ src/kernel/main.c | 2 +- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/kernel/drivers/vga.c b/src/kernel/drivers/vga.c index 3e31e11..fc057f9 100644 --- a/src/kernel/drivers/vga.c +++ b/src/kernel/drivers/vga.c @@ -1,7 +1,7 @@ #include "vga.h" #include "../arch/i686/io.h" -static uint8_t current_color = VGA_COLOR_BG_BLACK | VGA_COLOR_FG_WHITE; +static uint8_t current_color = VGA_COLOR_DEFAULT; void set_char(int x, int y, char c){ VGA_MEMORY[(x+y*VGA_WIDTH)*2] = c; @@ -77,9 +77,38 @@ void print_string_at(char *str, int x, int y){ } while(*str){ - offset = print_char(*(str++), x, y); - x = get_offset_x(offset); - y = get_offset_y(offset); + if(*str == '\x1b'){ + str++; + if(*str != '[') continue; + str++; + int ansi_col = 0; + while(*str >= '0' && *str <= '9'){ + ansi_col *= 10; + ansi_col += *str - '0'; + str++; + } + if(*str != 'm') continue; + str++; + if(ansi_col == 0) current_color = VGA_COLOR_DEFAULT; + else if(ansi_col >= 30 && ansi_col <= 37){ + switch (ansi_col) + { + case 30: current_color = (current_color & 0xf0) | VGA_COLOR_FG_BLACK; break; + case 31: current_color = (current_color & 0xf0) | VGA_COLOR_FG_RED; break; + case 32: current_color = (current_color & 0xf0) | VGA_COLOR_FG_GREEN; break; + case 33: current_color = (current_color & 0xf0) | VGA_COLOR_FG_ORANGE; break; + case 34: current_color = (current_color & 0xf0) | VGA_COLOR_FG_BLUE; break; + case 35: current_color = (current_color & 0xf0) | VGA_COLOR_FG_PINK; break; + case 36: current_color = (current_color & 0xf0) | VGA_COLOR_FG_CYAN; break; + case 37: current_color = (current_color & 0xf0) | VGA_COLOR_FG_WHITE; break; + } + } + } + else{ + offset = print_char(*(str++), x, y); + x = get_offset_x(offset); + y = get_offset_y(offset); + } } } diff --git a/src/kernel/drivers/vga.h b/src/kernel/drivers/vga.h index ae121f1..0f5ec18 100644 --- a/src/kernel/drivers/vga.h +++ b/src/kernel/drivers/vga.h @@ -4,6 +4,8 @@ #define VGA_MEMORY ((char *)0xB8000) +#define VGA_COLOR_DEFAULT (VGA_COLOR_BG_BLACK | VGA_COLOR_FG_WHITE) + #define VGA_COLOR_FG_BLACK 0x00 #define VGA_COLOR_FG_BLUE 0x01 #define VGA_COLOR_FG_GREEN 0x02 diff --git a/src/kernel/main.c b/src/kernel/main.c index 2e3c73d..d1e0744 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -2,6 +2,6 @@ #include "drivers/vga.h" void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){ - print_string("Hello world!\n:D"); + print_string("Hello world!\n\x1b[32m:D\x1b[0m\n"); for(;;); // Halt here }