Fixup VGA scroll / line cleanup
authorJack Miller <jack@codezen.org>
Fri, 18 Mar 2016 19:48:00 +0000 (14:48 -0500)
committerJack Miller <jack@codezen.org>
Sat, 19 Mar 2016 19:02:48 +0000 (14:02 -0500)
kernel/vga.c

index c44fc0e..1bd0d9e 100644 (file)
@@ -1,3 +1,5 @@
+/* vim: set ts=4 sw=4 sts=4 noet : */
+
 #include <vmalloc.h>
 #include <memmap.h>
 #include <string.h>
@@ -10,6 +12,19 @@ u8 vga_y = 0;
 u8 vga_max_x = 80;
 u8 vga_max_y = 25;
 
+static inline void __vga_clear_coord(u8 y, u8 x)
+{
+       vga_mem[((y * vga_max_x) + x) * 2] = ' ';
+       vga_mem[(((y * vga_max_x) + x) * 2) + 1] = 0xf;
+}
+
+static inline void __vga_clear_line(u8 y)
+{
+       int i;
+       for (i = 0; i < vga_max_x; i++)
+               __vga_clear_coord(y, i);
+}
+
 void vga_putchar(char c)
 {
        if ((c == '\n') || (vga_x >= vga_max_x))
@@ -20,8 +35,9 @@ void vga_putchar(char c)
        }
 
        if (vga_y >= vga_max_y) {
-               memcpy(vga_mem, &vga_mem[vga_max_x], (vga_max_x * (vga_max_y - 1)));
                vga_y--;
+               memcpy(vga_mem, &vga_mem[vga_max_x * 2],  (vga_max_x * vga_y * 2));
+               __vga_clear_line(vga_y);
        }
 
        vga_mem[((vga_max_x * vga_y) + vga_x) * 2] = c;
@@ -31,10 +47,8 @@ void vga_putchar(char c)
 void vga_clear(void)
 {
        int i;
-       for(i = 0; i < (vga_max_x * vga_max_y); i++) {
-               vga_mem[i * 2] = ' ';
-               vga_mem[(i * 2) + 1] = 0xf;
-       }
+       for(i = 0; i < vga_max_y; i++)
+               __vga_clear_line(i);
 }
 
 void vga_init(void)