VGA: Make use of regs->ebp - now that it is present in 'struct bregs'.
[seabios.git] / vgasrc / vga.c
index 5a5e88edb71b67b35fb28e52c702611ffd51c6a7..d7a5366da994be1d2d0e3b81c9776d33286e516f 100644 (file)
@@ -13,8 +13,6 @@
 //  * refactor redundant code into sub-functions
 //  * See if there is a method to the in/out stuff that can be encapsulated.
 //  * remove "biosfn" prefixes
-//  * don't hardcode 0xc000
-//  * add defs for 0xa000/0xb800
 //  * verify all funcs static
 //
 //  * convert vbe/clext code
@@ -35,7 +33,7 @@
 #define DEBUG_VGA_POST 1
 #define DEBUG_VGA_10 3
 
-#define SET_VGA(var, val) SET_FARVAR(0xc000, (var), (val))
+#define SET_VGA(var, val) SET_FARVAR(get_global_seg(), (var), (val))
 
 
 // ===================================================================
@@ -131,6 +129,15 @@ biosfn_set_cursor_shape(u8 CH, u8 CL)
     outb(CL, crtc_addr + 1);
 }
 
+static u16
+biosfn_get_cursor_shape(u8 page)
+{
+    if (page > 7)
+        return 0;
+    // FIXME should handle VGA 14/16 lines
+    return GET_BDA(cursor_type);
+}
+
 // -------------------------------------------------------------------
 static void
 biosfn_set_cursor_pos(u8 page, u16 cursor)
@@ -165,19 +172,13 @@ biosfn_set_cursor_pos(u8 page, u16 cursor)
     outb(address & 0x00ff, crtc_addr + 1);
 }
 
-// -------------------------------------------------------------------
-static void
-biosfn_get_cursor_pos(u8 page, u16 *shape, u16 *pos)
+static u16
+biosfn_get_cursor_pos(u8 page)
 {
-    // Default
-    *shape = 0;
-    *pos = 0;
     if (page > 7)
-        return;
-
+        return 0;
     // FIXME should handle VGA 14/16 lines
-    *shape = GET_BDA(cursor_type);
-    *pos = GET_BDA(cursor_pos[page]);
+    return GET_BDA(cursor_pos[page]);
 }
 
 // -------------------------------------------------------------------
@@ -193,8 +194,7 @@ biosfn_set_active_page(u8 page)
         return;
 
     // Get pos curs pos for the right page
-    u16 cursor, dummy;
-    biosfn_get_cursor_pos(page, &dummy, &cursor);
+    u16 cursor = biosfn_get_cursor_pos(page);
 
     u16 address;
     if (GET_GLOBAL(vmode_g->class) == TEXT) {
@@ -235,10 +235,9 @@ biosfn_set_video_mode(u8 mode)
     if (CONFIG_CIRRUS)
         cirrus_set_video_mode(mode);
 
-#ifdef VBE
-    if (vbe_has_vbe_display())
-        dispi_set_enable(VBE_DISPI_DISABLED);
-#endif
+    if (CONFIG_VBE)
+        if (vbe_has_vbe_display())
+            dispi_set_enable(VBE_DISPI_DISABLED);
 
     // The real mode
     u8 noclearmem = mode & 0x80;
@@ -362,7 +361,7 @@ biosfn_set_video_mode(u8 mode)
     // FIXME We nearly have the good tables. to be reworked
     SET_BDA(dcc_index, 0x08);   // 8 is VGA should be ok for now
     SET_BDA(video_savetable_ptr, (u32)video_save_pointer_table);
-    SET_BDA(video_savetable_seg, 0xc000);
+    SET_BDA(video_savetable_seg, get_global_seg());
 
     // FIXME
     SET_BDA(video_msr, 0x00); // Unavailable on vanilla vga, but...
@@ -384,17 +383,17 @@ biosfn_set_video_mode(u8 mode)
         call16_vgaint(0x1103, 0);
     }
     // Set the ints 0x1F and 0x43
-    SET_IVT(0x1f, 0xC000, (u32)&vgafont8[128 * 8]);
+    SET_IVT(0x1f, get_global_seg(), (u32)&vgafont8[128 * 8]);
 
     switch (cheight) {
     case 8:
-        SET_IVT(0x43, 0xC000, (u32)vgafont8);
+        SET_IVT(0x43, get_global_seg(), (u32)vgafont8);
         break;
     case 14:
-        SET_IVT(0x43, 0xC000, (u32)vgafont14);
+        SET_IVT(0x43, get_global_seg(), (u32)vgafont14);
         break;
     case 16:
-        SET_IVT(0x43, 0xC000, (u32)vgafont16);
+        SET_IVT(0x43, get_global_seg(), (u32)vgafont16);
         break;
     }
 }
@@ -409,8 +408,8 @@ vgamem_copy_pl4(u8 xstart, u8 ysrc, u8 ydest, u8 cols, u8 nbcols,
     outw(0x0105, VGAREG_GRDC_ADDRESS);
     u8 i;
     for (i = 0; i < cheight; i++)
-        memcpy_far(0xa000, (void*)(dest + i * nbcols)
-                   , 0xa000, (void*)(src + i * nbcols), cols);
+        memcpy_far(SEG_GRAPH, (void*)(dest + i * nbcols)
+                   , SEG_GRAPH, (void*)(src + i * nbcols), cols);
     outw(0x0005, VGAREG_GRDC_ADDRESS);
 }
 
@@ -423,7 +422,7 @@ vgamem_fill_pl4(u8 xstart, u8 ystart, u8 cols, u8 nbcols, u8 cheight,
     outw(0x0205, VGAREG_GRDC_ADDRESS);
     u8 i;
     for (i = 0; i < cheight; i++)
-        memset_far(0xa000, (void*)(dest + i * nbcols), attr, cols);
+        memset_far(SEG_GRAPH, (void*)(dest + i * nbcols), attr, cols);
     outw(0x0005, VGAREG_GRDC_ADDRESS);
 }
 
@@ -437,12 +436,12 @@ vgamem_copy_cga(u8 xstart, u8 ysrc, u8 ydest, u8 cols, u8 nbcols,
     u8 i;
     for (i = 0; i < cheight; i++)
         if (i & 1)
-            memcpy_far(0xb800, (void*)(0x2000 + dest + (i >> 1) * nbcols)
-                       , 0xb800, (void*)(0x2000 + src + (i >> 1) * nbcols)
+            memcpy_far(SEG_CTEXT, (void*)(0x2000 + dest + (i >> 1) * nbcols)
+                       , SEG_CTEXT, (void*)(0x2000 + src + (i >> 1) * nbcols)
                        , cols);
         else
-            memcpy_far(0xb800, (void*)(dest + (i >> 1) * nbcols)
-                       , 0xb800, (void*)(src + (i >> 1) * nbcols), cols);
+            memcpy_far(SEG_CTEXT, (void*)(dest + (i >> 1) * nbcols)
+                       , SEG_CTEXT, (void*)(src + (i >> 1) * nbcols), cols);
 }
 
 // -------------------------------------------------------------------
@@ -454,10 +453,10 @@ vgamem_fill_cga(u8 xstart, u8 ystart, u8 cols, u8 nbcols, u8 cheight,
     u8 i;
     for (i = 0; i < cheight; i++)
         if (i & 1)
-            memset_far(0xb800, (void*)(0x2000 + dest + (i >> 1) * nbcols)
+            memset_far(SEG_CTEXT, (void*)(0x2000 + dest + (i >> 1) * nbcols)
                        , attr, cols);
         else
-            memset_far(0xb800, (void*)(dest + (i >> 1) * nbcols), attr, cols);
+            memset_far(SEG_CTEXT, (void*)(dest + (i >> 1) * nbcols), attr, cols);
 }
 
 // -------------------------------------------------------------------
@@ -494,13 +493,13 @@ biosfn_scroll(u8 nblines, u8 attr, u8 rul, u8 cul, u8 rlr, u8 clr, u8 page,
 
     if (GET_GLOBAL(vmode_g->class) == TEXT) {
         // Compute the address
-        void *address = (void*)(SCREEN_MEM_START(nbcols, nbrows, page));
+        void *address_far = (void*)(SCREEN_MEM_START(nbcols, nbrows, page));
         dprintf(3, "Scroll, address %p (%d %d %02x)\n"
-                , address, nbrows, nbcols, page);
+                , address_far, nbrows, nbcols, page);
 
         if (nblines == 0 && rul == 0 && cul == 0 && rlr == nbrows - 1
             && clr == nbcols - 1) {
-            memset16_far(GET_GLOBAL(vmode_g->sstart), address
+            memset16_far(GET_GLOBAL(vmode_g->sstart), address_far
                          , (u16)attr * 0x100 + ' ', nbrows * nbcols * 2);
         } else {                // if Scroll up
             if (dir == SCROLL_UP) {
@@ -508,11 +507,11 @@ biosfn_scroll(u8 nblines, u8 attr, u8 rul, u8 cul, u8 rlr, u8 clr, u8 page,
                 for (i = rul; i <= rlr; i++)
                     if ((i + nblines > rlr) || (nblines == 0))
                         memset16_far(GET_GLOBAL(vmode_g->sstart)
-                                     , address + (i * nbcols + cul) * 2
+                                     , address_far + (i * nbcols + cul) * 2
                                      , (u16)attr * 0x100 + ' ', cols * 2);
                     else
                         memcpy16_far(GET_GLOBAL(vmode_g->sstart)
-                                     , address + (i * nbcols + cul) * 2
+                                     , address_far + (i * nbcols + cul) * 2
                                      , GET_GLOBAL(vmode_g->sstart)
                                      , (void*)(((i + nblines) * nbcols + cul) * 2)
                                      , cols * 2);
@@ -521,11 +520,11 @@ biosfn_scroll(u8 nblines, u8 attr, u8 rul, u8 cul, u8 rlr, u8 clr, u8 page,
                 for (i = rlr; i >= rul; i--) {
                     if ((i < rul + nblines) || (nblines == 0))
                         memset16_far(GET_GLOBAL(vmode_g->sstart)
-                                     , address + (i * nbcols + cul) * 2
+                                     , address_far + (i * nbcols + cul) * 2
                                      , (u16)attr * 0x100 + ' ', cols * 2);
                     else
                         memcpy16_far(GET_GLOBAL(vmode_g->sstart)
-                                     , address + (i * nbcols + cul) * 2
+                                     , address_far + (i * nbcols + cul) * 2
                                      , GET_GLOBAL(vmode_g->sstart)
                                      , (void*)(((i - nblines) * nbcols + cul) * 2)
                                      , cols * 2);
@@ -627,8 +626,7 @@ biosfn_read_char_attr(u8 page, u16 *car)
         return;
 
     // Get the cursor pos for the page
-    u16 cursor, dummy;
-    biosfn_get_cursor_pos(page, &dummy, &cursor);
+    u16 cursor = biosfn_get_cursor_pos(page);
     u8 xcurs = cursor & 0x00ff;
     u8 ycurs = (cursor & 0xff00) >> 8;
 
@@ -679,11 +677,11 @@ write_gfx_char_pl4(u8 car, u8 attr, u8 xcurs, u8 ycurs, u8 nbcols,
         for (j = 0; j < 8; j++) {
             u8 mask = 0x80 >> j;
             outw((mask << 8) | 0x08, VGAREG_GRDC_ADDRESS);
-            GET_FARVAR(0xa000, *dest_far);
+            GET_FARVAR(SEG_GRAPH, *dest_far);
             if (GET_GLOBAL(fdata_g[src + i]) & mask)
-                SET_FARVAR(0xa000, *dest_far, attr & 0x0f);
+                SET_FARVAR(SEG_GRAPH, *dest_far, attr & 0x0f);
             else
-                SET_FARVAR(0xa000, *dest_far, 0x00);
+                SET_FARVAR(SEG_GRAPH, *dest_far, 0x00);
         }
     }
     outw(0xff08, VGAREG_GRDC_ADDRESS);
@@ -707,7 +705,7 @@ write_gfx_char_cga(u8 car, u8 attr, u8 xcurs, u8 ycurs, u8 nbcols, u8 bpp)
         if (bpp == 1) {
             u8 data = 0;
             if (attr & 0x80)
-                data = GET_FARVAR(0xb800, *dest_far);
+                data = GET_FARVAR(SEG_CTEXT, *dest_far);
             u8 j;
             for (j = 0; j < 8; j++) {
                 if (GET_GLOBAL(fdata_g[src + i]) & mask) {
@@ -718,12 +716,12 @@ write_gfx_char_cga(u8 car, u8 attr, u8 xcurs, u8 ycurs, u8 nbcols, u8 bpp)
                 }
                 mask >>= 1;
             }
-            SET_FARVAR(0xb800, *dest_far, data);
+            SET_FARVAR(SEG_CTEXT, *dest_far, data);
         } else {
             while (mask > 0) {
                 u8 data = 0;
                 if (attr & 0x80)
-                    data = GET_FARVAR(0xb800, *dest_far);
+                    data = GET_FARVAR(SEG_CTEXT, *dest_far);
                 u8 j;
                 for (j = 0; j < 4; j++) {
                     if (GET_GLOBAL(fdata_g[src + i]) & mask) {
@@ -734,7 +732,7 @@ write_gfx_char_cga(u8 car, u8 attr, u8 xcurs, u8 ycurs, u8 nbcols, u8 bpp)
                     }
                     mask >>= 1;
                 }
-                SET_FARVAR(0xb800, *dest_far, data);
+                SET_FARVAR(SEG_CTEXT, *dest_far, data);
                 dest_far += 1;
             }
         }
@@ -757,7 +755,7 @@ write_gfx_char_lin(u8 car, u8 attr, u8 xcurs, u8 ycurs, u8 nbcols)
             u8 data = 0x00;
             if (GET_GLOBAL(fdata_g[src + i]) & mask)
                 data = attr;
-            SET_FARVAR(0xa000, dest_far[j], data);
+            SET_FARVAR(SEG_GRAPH, dest_far[j], data);
             mask >>= 1;
         }
     }
@@ -773,8 +771,7 @@ biosfn_write_char_attr(u8 car, u8 page, u8 attr, u16 count)
         return;
 
     // Get the cursor pos for the page
-    u16 cursor, dummy;
-    biosfn_get_cursor_pos(page, &dummy, &cursor);
+    u16 cursor = biosfn_get_cursor_pos(page);
     u8 xcurs = cursor & 0x00ff;
     u8 ycurs = (cursor & 0xff00) >> 8;
 
@@ -784,11 +781,11 @@ biosfn_write_char_attr(u8 car, u8 page, u8 attr, u16 count)
 
     if (GET_GLOBAL(vmode_g->class) == TEXT) {
         // Compute the address
-        void *address = (void*)(SCREEN_MEM_START(nbcols, nbrows, page)
-                                + (xcurs + ycurs * nbcols) * 2);
+        void *address_far = (void*)(SCREEN_MEM_START(nbcols, nbrows, page)
+                                    + (xcurs + ycurs * nbcols) * 2);
 
-        dummy = ((u16)attr << 8) + car;
-        memset16_far(GET_GLOBAL(vmode_g->sstart), address, dummy, count * 2);
+        u16 dummy = ((u16)attr << 8) + car;
+        memset16_far(GET_GLOBAL(vmode_g->sstart), address_far, dummy, count * 2);
         return;
     }
 
@@ -800,8 +797,7 @@ biosfn_write_char_attr(u8 car, u8 page, u8 attr, u16 count)
         switch (GET_GLOBAL(vmode_g->memmodel)) {
         case PLANAR4:
         case PLANAR1:
-            write_gfx_char_pl4(car, attr, xcurs, ycurs, nbcols,
-                               cheight);
+            write_gfx_char_pl4(car, attr, xcurs, ycurs, nbcols, cheight);
             break;
         case CGA:
             write_gfx_char_cga(car, attr, xcurs, ycurs, nbcols, bpp);
@@ -824,8 +820,7 @@ biosfn_write_char_only(u8 car, u8 page, u8 attr, u16 count)
         return;
 
     // Get the cursor pos for the page
-    u16 cursor, dummy;
-    biosfn_get_cursor_pos(page, &dummy, &cursor);
+    u16 cursor = biosfn_get_cursor_pos(page);
     u8 xcurs = cursor & 0x00ff;
     u8 ycurs = (cursor & 0xff00) >> 8;
 
@@ -852,8 +847,7 @@ biosfn_write_char_only(u8 car, u8 page, u8 attr, u16 count)
         switch (GET_GLOBAL(vmode_g->memmodel)) {
         case PLANAR4:
         case PLANAR1:
-            write_gfx_char_pl4(car, attr, xcurs, ycurs, nbcols,
-                               cheight);
+            write_gfx_char_pl4(car, attr, xcurs, ycurs, nbcols, cheight);
             break;
         case CGA:
             write_gfx_char_cga(car, attr, xcurs, ycurs, nbcols, bpp);
@@ -926,10 +920,10 @@ biosfn_write_pixel(u8 BH, u8 AL, u16 CX, u16 DX)
         mask = 0x80 >> (CX & 0x07);
         outw((mask << 8) | 0x08, VGAREG_GRDC_ADDRESS);
         outw(0x0205, VGAREG_GRDC_ADDRESS);
-        data = GET_FARVAR(0xa000, *addr_far);
+        data = GET_FARVAR(SEG_GRAPH, *addr_far);
         if (AL & 0x80)
             outw(0x1803, VGAREG_GRDC_ADDRESS);
-        SET_FARVAR(0xa000, *addr_far, AL);
+        SET_FARVAR(SEG_GRAPH, *addr_far, AL);
         outw(0xff08, VGAREG_GRDC_ADDRESS);
         outw(0x0005, VGAREG_GRDC_ADDRESS);
         outw(0x0003, VGAREG_GRDC_ADDRESS);
@@ -941,7 +935,7 @@ biosfn_write_pixel(u8 BH, u8 AL, u16 CX, u16 DX)
             addr_far = (void*)((CX >> 3) + (DX >> 1) * 80);
         if (DX & 1)
             addr_far += 0x2000;
-        data = GET_FARVAR(0xb800, *addr_far);
+        data = GET_FARVAR(SEG_CTEXT, *addr_far);
         if (GET_GLOBAL(vmode_g->pixbits) == 2) {
             attr = (AL & 0x03) << ((3 - (CX & 0x03)) * 2);
             mask = 0x03 << ((3 - (CX & 0x03)) * 2);
@@ -955,11 +949,11 @@ biosfn_write_pixel(u8 BH, u8 AL, u16 CX, u16 DX)
             data &= ~mask;
             data |= attr;
         }
-        SET_FARVAR(0xb800, *addr_far, data);
+        SET_FARVAR(SEG_CTEXT, *addr_far, data);
         break;
     case LINEAR8:
         addr_far = (void*)(CX + DX * (GET_BDA(video_cols) * 8));
-        SET_FARVAR(0xa000, *addr_far, AL);
+        SET_FARVAR(SEG_GRAPH, *addr_far, AL);
         break;
     }
 }
@@ -984,7 +978,7 @@ biosfn_read_pixel(u8 BH, u16 CX, u16 DX, u16 *AX)
         attr = 0x00;
         for (i = 0; i < 4; i++) {
             outw((i << 8) | 0x04, VGAREG_GRDC_ADDRESS);
-            data = GET_FARVAR(0xa000, *addr_far) & mask;
+            data = GET_FARVAR(SEG_GRAPH, *addr_far) & mask;
             if (data > 0)
                 attr |= (0x01 << i);
         }
@@ -993,7 +987,7 @@ biosfn_read_pixel(u8 BH, u16 CX, u16 DX, u16 *AX)
         addr_far = (void*)((CX >> 2) + (DX >> 1) * 80);
         if (DX & 1)
             addr_far += 0x2000;
-        data = GET_FARVAR(0xb800, *addr_far);
+        data = GET_FARVAR(SEG_CTEXT, *addr_far);
         if (GET_GLOBAL(vmode_g->pixbits) == 2)
             attr = (data >> ((3 - (CX & 0x03)) * 2)) & 0x03;
         else
@@ -1001,7 +995,7 @@ biosfn_read_pixel(u8 BH, u16 CX, u16 DX, u16 *AX)
         break;
     case LINEAR8:
         addr_far = (void*)(CX + DX * (GET_BDA(video_cols) * 8));
-        attr = GET_FARVAR(0xa000, *addr_far);
+        attr = GET_FARVAR(SEG_GRAPH, *addr_far);
         break;
     }
     *AX = (*AX & 0xff00) | attr;
@@ -1021,8 +1015,7 @@ biosfn_write_teletype(u8 car, u8 page, u8 attr, u8 flag)
         return;
 
     // Get the cursor pos for the page
-    u16 cursor, dummy;
-    biosfn_get_cursor_pos(page, &dummy, &cursor);
+    u16 cursor = biosfn_get_cursor_pos(page);
     u8 xcurs = cursor & 0x00ff;
     u8 ycurs = (cursor & 0xff00) >> 8;
 
@@ -1051,7 +1044,7 @@ biosfn_write_teletype(u8 car, u8 page, u8 attr, u8 flag)
     case '\t':
         do {
             biosfn_write_teletype(' ', page, attr, flag);
-            biosfn_get_cursor_pos(page, &dummy, &cursor);
+            cursor = biosfn_get_cursor_pos(page);
             xcurs = cursor & 0x00ff;
             ycurs = (cursor & 0xff00) >> 8;
         } while (xcurs % 8 == 0);
@@ -1384,9 +1377,9 @@ biosfn_load_text_user_pat(u8 AL, u16 ES, u16 BP, u16 CX, u16 DX, u8 BL,
     u16 blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
     u16 i;
     for (i = 0; i < CX; i++) {
-        void *src = (void*)(BP + i * BH);
-        void *dest = (void*)(blockaddr + (DX + i) * 32);
-        memcpy_far(0xA000, dest, ES, src, BH);
+        void *src_far = (void*)(BP + i * BH);
+        void *dest_far = (void*)(blockaddr + (DX + i) * 32);
+        memcpy_far(SEG_GRAPH, dest_far, ES, src_far, BH);
     }
     release_font_access();
     if (AL >= 0x10)
@@ -1401,8 +1394,8 @@ biosfn_load_text_8_14_pat(u8 AL, u8 BL)
     u16 i;
     for (i = 0; i < 0x100; i++) {
         u16 src = i * 14;
-        void *dest = (void*)(blockaddr + i * 32);
-        memcpy_far(0xA000, dest, 0xC000, &vgafont14[src], 14);
+        void *dest_far = (void*)(blockaddr + i * 32);
+        memcpy_far(SEG_GRAPH, dest_far, get_global_seg(), &vgafont14[src], 14);
     }
     release_font_access();
     if (AL >= 0x10)
@@ -1417,8 +1410,8 @@ biosfn_load_text_8_8_pat(u8 AL, u8 BL)
     u16 i;
     for (i = 0; i < 0x100; i++) {
         u16 src = i * 8;
-        void *dest = (void*)(blockaddr + i * 32);
-        memcpy_far(0xA000, dest, 0xC000, &vgafont8[src], 8);
+        void *dest_far = (void*)(blockaddr + i * 32);
+        memcpy_far(SEG_GRAPH, dest_far, get_global_seg(), &vgafont8[src], 8);
     }
     release_font_access();
     if (AL >= 0x10)
@@ -1441,8 +1434,8 @@ biosfn_load_text_8_16_pat(u8 AL, u8 BL)
     u16 i;
     for (i = 0; i < 0x100; i++) {
         u16 src = i * 16;
-        void *dest = (void*)(blockaddr + i * 32);
-        memcpy_far(0xA000, dest, 0xC000, &vgafont16[src], 16);
+        void *dest_far = (void*)(blockaddr + i * 32);
+        memcpy_far(SEG_GRAPH, dest_far, get_global_seg(), &vgafont16[src], 16);
     }
     release_font_access();
     if (AL >= 0x10)
@@ -1467,27 +1460,27 @@ biosfn_get_font_info(u8 BH, u16 *ES, u16 *BP, u16 *CX, u16 *DX)
         break;
     }
     case 0x02:
-        *ES = 0xC000;
+        *ES = get_global_seg();
         *BP = (u32)vgafont14;
         break;
     case 0x03:
-        *ES = 0xC000;
+        *ES = get_global_seg();
         *BP = (u32)vgafont8;
         break;
     case 0x04:
-        *ES = 0xC000;
+        *ES = get_global_seg();
         *BP = (u32)vgafont8 + 128 * 8;
         break;
     case 0x05:
-        *ES = 0xC000;
+        *ES = get_global_seg();
         *BP = (u32)vgafont14alt;
         break;
     case 0x06:
-        *ES = 0xC000;
+        *ES = get_global_seg();
         *BP = (u32)vgafont16;
         break;
     case 0x07:
-        *ES = 0xC000;
+        *ES = get_global_seg();
         *BP = (u32)vgafont16alt;
         break;
     default:
@@ -1588,8 +1581,7 @@ biosfn_write_string(u8 flag, u8 page, u8 attr, u16 count, u8 row, u8 col,
                     u16 seg, u8 *offset_far)
 {
     // Read curs info for the page
-    u16 oldcurs, dummy;
-    biosfn_get_cursor_pos(page, &dummy, &oldcurs);
+    u16 oldcurs = biosfn_get_cursor_pos(page);
 
     // if row=0xff special case : use current cursor position
     if (row == 0xff) {
@@ -1640,7 +1632,7 @@ biosfn_read_state_info(u16 BX, u16 ES, u16 DI)
 {
     // Address of static functionality table
     SET_FARVAR(ES, *(u16*)(DI + 0x00), (u32)static_functionality);
-    SET_FARVAR(ES, *(u16*)(DI + 0x02), 0xC000);
+    SET_FARVAR(ES, *(u16*)(DI + 0x02), get_global_seg());
 
     // Hard coded copy from BIOS area. Should it be cleaner ?
     memcpy_far(ES, (void*)(DI + 0x04), SEG_BDA, (void*)0x49, 30);
@@ -1767,14 +1759,10 @@ biosfn_save_video_state(u16 CX, u16 ES, u16 BX)
         SET_FARVAR(ES, *(u8*)(BX+0), GET_BDA(video_page));
         BX++;
         /* current font */
-        SET_FARVAR(ES, *(u16*)(BX+0), GET_FARVAR(0, *(u16*)(0x1f * 4)));
-        BX += 2;
-        SET_FARVAR(ES, *(u16*)(BX+0), GET_FARVAR(0, *(u16*)(0x1f * 4 + 2)));
-        BX += 2;
-        SET_FARVAR(ES, *(u16*)(BX+0), GET_FARVAR(0, *(u16*)(0x43 * 4)));
-        BX += 2;
-        SET_FARVAR(ES, *(u16*)(BX+0), GET_FARVAR(0, *(u16*)(0x43 * 4 + 2)));
-        BX += 2;
+        SET_FARVAR(ES, *(u32*)(BX+0), GET_IVT(0x1f).segoff);
+        BX += 4;
+        SET_FARVAR(ES, *(u32*)(BX+0), GET_IVT(0x43).segoff);
+        BX += 4;
     }
     if (CX & 4) {
         /* XXX: check this */
@@ -1965,7 +1953,8 @@ handle_1002(struct bregs *regs)
 static void
 handle_1003(struct bregs *regs)
 {
-    biosfn_get_cursor_pos(regs->bh, &regs->cx, &regs->dx);
+    regs->cx = biosfn_get_cursor_shape(regs->bh);
+    regs->dx = biosfn_get_cursor_pos(regs->bh);
 }
 
 // Read light pen pos (unimplemented)
@@ -2227,7 +2216,7 @@ static void
 handle_101100(struct bregs *regs)
 {
     // XXX - inline
-    biosfn_load_text_user_pat(regs->al, regs->es, 0 // XXX - regs->bp
+    biosfn_load_text_user_pat(regs->al, regs->es, regs->bp
                               , regs->cx, regs->dx, regs->bl, regs->bh);
 }
 
@@ -2287,7 +2276,7 @@ static void
 handle_101130(struct bregs *regs)
 {
     // XXX - inline
-    biosfn_get_font_info(regs->bh, &regs->es, 0 // &regs->bp
+    biosfn_get_font_info(regs->bh, &regs->es, &regs->bp
                          , &regs->cx, &regs->dx);
 }
 
@@ -2402,7 +2391,7 @@ handle_1013(struct bregs *regs)
 {
     // XXX - inline
     biosfn_write_string(regs->al, regs->bh, regs->bl, regs->cx
-                        , regs->dh, regs->dl, regs->es, 0); // regs->bp);
+                        , regs->dh, regs->dl, regs->es, (void*)(regs->bp + 0));
 }
 
 
@@ -2562,13 +2551,11 @@ handle_104fXX(struct bregs *regs)
 static void
 handle_104f(struct bregs *regs)
 {
-    if (! CONFIG_VBE) {
+    if (! CONFIG_VBE || !vbe_has_vbe_display()) {
         handle_104fXX(regs);
         return;
     }
 
-    // XXX - check vbe_has_vbe_display()?
-
     switch (regs->al) {
     case 0x00: handle_104f00(regs); break;
     case 0x01: handle_104f01(regs); break;
@@ -2675,10 +2662,11 @@ vga_post(struct bregs *regs)
 
     init_bios_area();
 
-    // vbe_init();
+    if (CONFIG_VBE)
+        vbe_init();
 
     extern void entry_10(void);
-    SET_IVT(0x10, 0xC000, (u32)entry_10);
+    SET_IVT(0x10, get_global_seg(), (u32)entry_10);
 
     if (CONFIG_CIRRUS)
         cirrus_init();
@@ -2687,11 +2675,11 @@ vga_post(struct bregs *regs)
 
     // XXX: fill it
     SET_VGA(video_save_pointer_table[0], (u32)video_param_table);
-    SET_VGA(video_save_pointer_table[1], 0xC000);
+    SET_VGA(video_save_pointer_table[1], get_global_seg());
 
     // Fixup checksum
     extern u8 _rom_header_size, _rom_header_checksum;
     SET_VGA(_rom_header_checksum, 0);
-    u8 sum = -checksum_far(0xC000, 0, _rom_header_size * 512);
+    u8 sum = -checksum_far(get_global_seg(), 0, _rom_header_size * 512);
     SET_VGA(_rom_header_checksum, sum);
 }