summaryrefslogtreecommitdiff
path: root/src/kernel/kernel.c
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-06-16 19:22:57 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-06-16 19:22:57 +0200
commitdd7cbebcb41381fdb87e5c8e4d9d988337919c9c (patch)
treeb12740ff22b0101b1891f8b162f1e9142da797c0 /src/kernel/kernel.c
parentb6f1311502f48a091dd51bd7443105963071af9a (diff)
downloadabaos-dd7cbebcb41381fdb87e5c8e4d9d988337919c9c.tar.gz
abaos-dd7cbebcb41381fdb87e5c8e4d9d988337919c9c.tar.bz2
switching mode text/graphics, text is distorted
Diffstat (limited to 'src/kernel/kernel.c')
-rw-r--r--src/kernel/kernel.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c
index 19cf8e6..6342a26 100644
--- a/src/kernel/kernel.c
+++ b/src/kernel/kernel.c
@@ -27,10 +27,16 @@ static void handle_mouse_event( mouse_event_t *event, void *context );
static bool terminate = false;
+typedef enum {
+ MODE_TEXT,
+ MODE_GRAPHICS
+} mode_t;
+
typedef struct {
vga_text_t vga_text;
driver_manager_t driver_manager;
vga_t vga;
+ mode_t mode;
} global_context_t;
static global_context_t global_context;
@@ -39,6 +45,8 @@ static global_context_t global_context;
// the boot loader expects the entry point to be here!
void kernel_main( void )
{
+ global_context.mode = MODE_TEXT;
+
serial_t serial;
serial_init( &serial );
@@ -181,12 +189,22 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context )
} else if( strcmp( buf, "mode" ) == 0 ) {
// TODO: move mode switches to and from graphics/text mode here,
// for now when we enter the graphics mode we remain there
- if( vga_set_mode( vga, vga_make_mode( 320, 200, 8 ) ) ) {
- vga_clear_screen( vga, vga_make_RGB( 0x00, 0x00, 0xA8 ) );
- vga_draw_char( vga, 'A', 100, 100, vga_make_RGB( 0x00, 0x00, 0xA8 ),
- vga_make_RGB( 0xFF, 0xFF, 0xFF ) );
+ switch( global_context->mode ) {
+ case MODE_TEXT:
+ if( vga_set_mode( vga, vga_make_mode( 320, 200, 8 ) ) ) {
+ vga_clear_screen( vga, vga_make_RGB( 0x00, 0x00, 0xA8 ) );
+ vga_draw_char( vga, 'A', 100, 100, vga_make_RGB( 0x00, 0x00, 0xA8 ),
+ vga_make_RGB( 0xFF, 0xFF, 0xFF ) );
+ }
+ global_context->mode = MODE_GRAPHICS;
+ break;
+
+ case MODE_GRAPHICS:
+ if( vga_set_mode( vga, vga_make_mode( 640, 480, 4 ) ) ) {
+ }
+ global_context->mode = MODE_TEXT;
+ break;
}
-
} else {
printf( "ERR: Unknown pre-boot command '%s'\n", buf );
}