summaryrefslogtreecommitdiff
path: root/src
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
parentb6f1311502f48a091dd51bd7443105963071af9a (diff)
downloadabaos-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.c24
-rw-r--r--src/kernel/kernel.c28
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 );
}