[SeaBIOS] [PATCH 13/20] vgabios: Change vga_set_mode() to directly setup BDA.

Kevin O'Connor kevin at koconnor.net
Sun Jan 1 18:22:42 CET 2012


The calls to set_cursor_shape, set_cursor_pos, and set_active_page
have no impact other than to set the BDA variables, because the
standard vga mode switch already programed the registers these
functions set.  So, just setup the BDA directly.

The stdvga_set_text_block_specifier call is unnecessary - it sets
a register which is already programmed that way.

Call stdvga_get_crtc() to obtain the crtc address instead of inferring
it from the memory model.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 vgasrc/vgabios.c |   34 +++++++++++-----------------------
 1 files changed, 11 insertions(+), 23 deletions(-)

diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index 4724c4b..cb8793e 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -387,22 +387,28 @@ vga_set_mode(u8 mode, u8 noclearmem)
     if (noclearmem == 0x00)
         clear_screen(vmode_g);
 
-    // Set CRTC address VGA or MDA
-    u16 crtc_addr = VGAREG_VGA_CRTC_ADDRESS;
-    if (GET_GLOBAL(vmode_g->memmodel) == MTEXT)
-        crtc_addr = VGAREG_MDA_CRTC_ADDRESS;
+    // Write the fonts in memory
+    u8 memmodel = GET_GLOBAL(vmode_g->memmodel);
+    if (memmodel & TEXT)
+        stdvga_load_font(get_global_seg(), vgafont16, 0x100, 0, 0, 16);
 
     // Set the BIOS mem
     u16 cheight = GET_GLOBAL(vmode_g->cheight);
     SET_BDA(video_mode, mode);
     SET_BDA(video_cols, GET_GLOBAL(vmode_g->twidth));
     SET_BDA(video_pagesize, GET_GLOBAL(vmode_g->slength));
-    SET_BDA(crtc_address, crtc_addr);
+    SET_BDA(crtc_address, stdvga_get_crtc());
     SET_BDA(video_rows, GET_GLOBAL(vmode_g->theight)-1);
     SET_BDA(char_height, cheight);
     SET_BDA(video_ctl, (0x60 | noclearmem));
     SET_BDA(video_switches, 0xF9);
     SET_BDA(modeset_ctl, GET_BDA(modeset_ctl) & 0x7f);
+    SET_BDA(cursor_type, memmodel & TEXT ? 0x0607 : 0x0000);
+    int i;
+    for (i=0; i<8; i++)
+        SET_BDA(cursor_pos[i], 0x0000);
+    SET_BDA(video_pagestart, 0x0000);
+    SET_BDA(video_page, 0x00);
 
     // FIXME We nearly have the good tables. to be reworked
     SET_BDA(dcc_index, 0x08);   // 8 is VGA should be ok for now
@@ -413,24 +419,6 @@ vga_set_mode(u8 mode, u8 noclearmem)
     SET_BDA(video_msr, 0x00); // Unavailable on vanilla vga, but...
     SET_BDA(video_pal, 0x00); // Unavailable on vanilla vga, but...
 
-    // Set cursor shape
-    if (GET_GLOBAL(vmode_g->memmodel) & TEXT)
-        set_cursor_shape(0x06, 0x07);
-    // Set cursor pos for page 0..7
-    int i;
-    for (i = 0; i < 8; i++) {
-        struct cursorpos cp = {0, 0, i};
-        set_cursor_pos(cp);
-    }
-
-    // Set active page 0
-    set_active_page(0x00);
-
-    // Write the fonts in memory
-    if (GET_GLOBAL(vmode_g->memmodel) & TEXT) {
-        stdvga_load_font(get_global_seg(), vgafont16, 0x100, 0, 0, 16);
-        stdvga_set_text_block_specifier(0);
-    }
     // Set the ints 0x1F and 0x43
     SET_IVT(0x1f, SEGOFF(get_global_seg(), (u32)&vgafont8[128 * 8]));
 
-- 
1.7.6.4




More information about the SeaBIOS mailing list