#include <stddef.h>
#include <string.h>
#include "threads/io.h"
-#include "threads/mmu.h"
#include "threads/interrupt.h"
+#include "threads/vaddr.h"
/* VGA text screen support. See [FREEVGA] for more information. */
static void cls (void);
static void newline (void);
static void move_cursor (void);
+static void find_cursor (size_t *x, size_t *y);
-/* Initializes the VGA text display and clears the screen. */
-void
-vga_init (void)
+/* Initializes the VGA text display. */
+static void
+init (void)
{
- fb = ptov (0xb8000);
- cls ();
+ /* Already initialized? */
+ static bool inited;
+ if (!inited)
+ {
+ fb = ptov (0xb8000);
+ find_cursor (&cx, &cy);
+ inited = true;
+ }
}
/* Writes C to the VGA text display, interpreting control
that might write to the console. */
enum intr_level old_level = intr_disable ();
+ init ();
+
switch (c)
{
case '\n':
outw (0x3d4, 0x0f | (cp << 8));
}
+/* Reads the current hardware cursor position into (*X,*Y). */
+static void
+find_cursor (size_t *x, size_t *y)
+{
+ /* See [FREEVGA] under "Manipulating the Text-mode Cursor". */
+ uint16_t cp;
+
+ outb (0x3d4, 0x0e);
+ cp = inb (0x3d5) << 8;
+
+ outb (0x3d4, 0x0f);
+ cp |= inb (0x3d5);
+
+ *x = cp % COL_CNT;
+ *y = cp / COL_CNT;
+}