X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=blobdiff_plain;f=src%2Fdevices%2Fvga.c;h=f421b617bd3706858d2536eb21866531b1fd9b85;hp=949dd975eaec8da2ae0e34551b7ca23765a14792;hb=f1f2dc8de9e336d83383692d4478bb14a3dafc11;hpb=f415a37905c57f61b444806bf84f5405184452aa diff --git a/src/devices/vga.c b/src/devices/vga.c index 949dd97..f421b61 100644 --- a/src/devices/vga.c +++ b/src/devices/vga.c @@ -3,6 +3,7 @@ #include #include #include +#include "devices/speaker.h" #include "threads/io.h" #include "threads/interrupt.h" #include "threads/vaddr.h" @@ -29,13 +30,20 @@ static void clear_row (size_t y); 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 @@ -47,6 +55,8 @@ vga_putc (int c) that might write to the console. */ enum intr_level old_level = intr_disable (); + init (); + switch (c) { case '\n': @@ -71,6 +81,12 @@ vga_putc (int c) if (cx >= COL_CNT) newline (); break; + + case '\a': + intr_set_level (old_level); + speaker_beep (); + intr_disable (); + break; default: fb[cy][cx][0] = c; @@ -138,3 +154,19 @@ move_cursor (void) 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; +}