diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-16 19:22:57 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-16 19:22:57 +0200 |
commit | dd7cbebcb41381fdb87e5c8e4d9d988337919c9c (patch) | |
tree | b12740ff22b0101b1891f8b162f1e9142da797c0 /src | |
parent | b6f1311502f48a091dd51bd7443105963071af9a (diff) | |
download | abaos-dd7cbebcb41381fdb87e5c8e4d9d988337919c9c.tar.gz abaos-dd7cbebcb41381fdb87e5c8e4d9d988337919c9c.tar.bz2 |
switching mode text/graphics, text is distorted
Diffstat (limited to 'src')
-rw-r--r-- | src/drivers/video/vga.c | 24 | ||||
-rw-r--r-- | src/kernel/kernel.c | 28 |
2 files changed, 45 insertions, 7 deletions
diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c index 1ec7829..cf1157c 100644 --- a/src/drivers/video/vga.c +++ b/src/drivers/video/vga.c @@ -112,10 +112,30 @@ vga_mode_t vga_make_mode( const int x, const int y, const int color_depth ) return mode; } - +// from http://files.osdev.org/mirrors/geezer/osd/graphics/modes.c static vga_mode_t modes[] = { + { 640, 480, 4, + { + /* MISC */ + 0x67, + /* SEQ */ + 0x03, 0x00, 0x03, 0x00, 0x02, + /* CRTC */ + 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, + 0x00, 0x4F, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x50, + 0x9C, 0x0E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3, + 0xFF, + /* GC */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, + 0xFF, + /* AC */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, + 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x0C, 0x00, 0x0F, 0x08, 0x00 + }, + NULL + }, { 320, 200, 8, - // from http://files.osdev.org/mirrors/geezer/osd/graphics/modes.c { /* MISC */ 0x63, 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 ); } |