diff --git a/src/kernel/drivers/vga.c b/src/kernel/drivers/vga.c index 9046610..3e31e11 100644 --- a/src/kernel/drivers/vga.c +++ b/src/kernel/drivers/vga.c @@ -1,6 +1,8 @@ #include "vga.h" #include "../arch/i686/io.h" +static uint8_t current_color = VGA_COLOR_BG_BLACK | VGA_COLOR_FG_WHITE; + void set_char(int x, int y, char c){ VGA_MEMORY[(x+y*VGA_WIDTH)*2] = c; } @@ -23,3 +25,64 @@ int get_cursor(){ offset += i686_inb(VGA_PORT_DATA); // Low byte return offset; } + +static int get_offset_y(int offset){ + return offset / VGA_WIDTH; +} + +static int get_offset_x(int offset){ + return (offset - (get_offset_y(offset)*VGA_WIDTH)); +} + +int print_char(char c, int x, int y){ + if(x >= VGA_WIDTH || y >= VGA_HEIGHT){ // Incorrect coords + VGA_MEMORY[2*VGA_WIDTH*VGA_HEIGHT-2] = 'E'; + VGA_MEMORY[2*VGA_WIDTH*VGA_HEIGHT-1] = VGA_COLOR_BG_RED || VGA_COLOR_FG_BLACK; + return y*VGA_WIDTH+x; + } + + int offset; + if(x >= 0 && y >= 0) offset = y*VGA_WIDTH+x; + else offset = get_cursor(); + + if(c == '\n'){ + y = get_offset_y(offset); + offset = (y+1)*VGA_WIDTH; + } + else if(c == '\b'){ + VGA_MEMORY[offset*2] = ' '; + VGA_MEMORY[offset*2+1] = current_color; + } + else{ + VGA_MEMORY[offset*2] = c; + VGA_MEMORY[offset*2+1] = current_color; + offset++; + } + + // TODO: Scroll + + set_cursor(offset); + return offset; +} + +void print_string_at(char *str, int x, int y){ + int offset; + if(x >= 0 && y >= 0){ + offset = y*VGA_WIDTH+x; + } + else{ + offset = get_cursor(); + x = get_offset_x(offset); + y = get_offset_y(offset); + } + + while(*str){ + offset = print_char(*(str++), x, y); + x = get_offset_x(offset); + y = get_offset_y(offset); + } +} + +void print_string(char *str){ + print_string_at(str, -1, -1); +} diff --git a/src/kernel/drivers/vga.h b/src/kernel/drivers/vga.h index 3fdecde..ae121f1 100644 --- a/src/kernel/drivers/vga.h +++ b/src/kernel/drivers/vga.h @@ -48,3 +48,6 @@ void set_char(int x, int y, char c); void set_color(int x, int y, uint8_t color); void set_cursor(int offset); int get_cursor(); +int print_char(char c, int x, int y); +void print_string_at(char *str, int x, int y); +void print_string(char *str); diff --git a/src/kernel/main.c b/src/kernel/main.c index 6c3af3a..2e3c73d 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -2,9 +2,6 @@ #include "drivers/vga.h" void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){ - // 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); - set_cursor(1); + print_string("Hello world!\n:D"); for(;;); // Halt here }