diff --git a/src/kernel/drivers/vga.c b/src/kernel/drivers/vga.c index 77f7155..6297984 100644 --- a/src/kernel/drivers/vga.c +++ b/src/kernel/drivers/vga.c @@ -1,5 +1,6 @@ #include "vga.h" #include "../arch/i686/io.h" +#include "../lib/memory.h" static uint8_t current_color = VGA_COLOR_DEFAULT; @@ -62,7 +63,17 @@ int vga_print_char(char c, int x, int y){ offset++; } - // TODO: Scroll + if(offset >= VGA_WIDTH * VGA_HEIGHT){ // Overflow, must scroll + for(int i = 1; i < VGA_HEIGHT; i++){ + memcpy(VGA_WIDTH*i*2 + VGA_MEMORY, VGA_WIDTH*(i-1)*2 + VGA_MEMORY, VGA_WIDTH*2); + } + char *last_line = VGA_WIDTH*(VGA_HEIGHT-1)*2 + VGA_MEMORY; + for(int i = 0; i < VGA_WIDTH*2; i++){ + last_line[i] = 0; + } + + offset -= VGA_WIDTH; + } vga_set_cursor(offset); return offset; diff --git a/src/kernel/lib/memory.c b/src/kernel/lib/memory.c index f767494..53a08ef 100644 --- a/src/kernel/lib/memory.c +++ b/src/kernel/lib/memory.c @@ -19,3 +19,9 @@ void *kcalloc(size_t count, size_t size){ } return ptr; } + +void memcpy(uint8_t *source, uint8_t *dest, size_t count){ + for(size_t i = 0; i < count; i++){ + dest[i] = source[i]; + } +} diff --git a/src/kernel/lib/memory.h b/src/kernel/lib/memory.h index ed11cf6..8f8117f 100644 --- a/src/kernel/lib/memory.h +++ b/src/kernel/lib/memory.h @@ -1,9 +1,12 @@ #pragma once #include +#include #define ALLOC_START (void *)0x1000 void *kmalloc(size_t size); // TODO: void kfree(void *ptr); void *kcalloc(size_t count, size_t size); + +void memcpy(uint8_t *source, uint8_t *dest, size_t count);