diff options
-rw-r--r-- | src/std/bda.h | 7 | ||||
-rw-r--r-- | vgasrc/vbe.c | 8 | ||||
-rw-r--r-- | vgasrc/vgabios.c | 8 | ||||
-rw-r--r-- | vgasrc/vgabios.h | 13 |
4 files changed, 22 insertions, 14 deletions
diff --git a/src/std/bda.h b/src/std/bda.h index 948bdbf..c321266 100644 --- a/src/std/bda.h +++ b/src/std/bda.h @@ -95,12 +95,7 @@ struct bios_data_area_s { struct segoff_s video_savetable; u8 other_ac[4]; // 40:B0 - u8 other_b0[9]; - u8 vbe_flag; - u16 vbe_mode; - u8 other_bc[4]; - // 40:C0 - u8 other_c0[4*16]; + u8 other_b0[5*16]; } PACKED; // BDA floppy_recalibration_status bitdefs diff --git a/vgasrc/vbe.c b/vgasrc/vbe.c index 12bd981..06ec22e 100644 --- a/vgasrc/vbe.c +++ b/vgasrc/vbe.c @@ -217,7 +217,7 @@ vbe_104f02(struct bregs *regs) static void vbe_104f03(struct bregs *regs) { - regs->bx = GET_BDA(vbe_mode); + regs->bx = GET_BDA_EXT(vbe_mode); dprintf(1, "VBE current mode=%x\n", regs->bx); regs->ax = 0x004f; } @@ -247,7 +247,7 @@ vbe_104f05(struct bregs *regs) { if (regs->bh > 1 || regs->bl > 1) goto fail; - if (GET_BDA(vbe_mode) & MF_LINEARFB) { + if (GET_BDA_EXT(vbe_mode) & MF_LINEARFB) { regs->ah = VBE_RETURN_STATUS_INVALID; return; } @@ -382,10 +382,10 @@ vbe_104f10(struct bregs *regs) regs->bx = 0x0f30; break; case 0x01: - SET_BDA(vbe_flag, regs->bh); + SET_BDA_EXT(vbe_flag, regs->bh); break; case 0x02: - regs->bh = GET_BDA(vbe_flag); + regs->bh = GET_BDA_EXT(vbe_flag); break; default: regs->ax = 0x014f; diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c index e87b7eb..d36b62a 100644 --- a/vgasrc/vgabios.c +++ b/vgasrc/vgabios.c @@ -252,7 +252,7 @@ bda_save_restore(int cmd, u16 seg, void *data) , sizeof(info->bda_0x49)); memcpy_far(seg, info->bda_0x84, SEG_BDA, (void*)0x84 , sizeof(info->bda_0x84)); - SET_FARVAR(seg, info->vbe_mode, GET_BDA(vbe_mode)); + SET_FARVAR(seg, info->vbe_mode, GET_BDA_EXT(vbe_mode)); SET_FARVAR(seg, info->font0, GET_IVT(0x1f)); SET_FARVAR(seg, info->font1, GET_IVT(0x43)); } @@ -261,7 +261,7 @@ bda_save_restore(int cmd, u16 seg, void *data) , sizeof(info->bda_0x49)); memcpy_far(SEG_BDA, (void*)0x84, seg, info->bda_0x84 , sizeof(info->bda_0x84)); - SET_BDA(vbe_mode, GET_FARVAR(seg, info->vbe_mode)); + SET_BDA_EXT(vbe_mode, GET_FARVAR(seg, info->vbe_mode)); SET_IVT(0x1f, GET_FARVAR(seg, info->font0)); SET_IVT(0x43, GET_FARVAR(seg, info->font1)); } @@ -276,7 +276,7 @@ bda_save_restore(int cmd, u16 seg, void *data) struct vgamode_s * get_current_mode(void) { - return vgahw_find_mode(GET_BDA(vbe_mode) & ~MF_VBEFLAGS); + return vgahw_find_mode(GET_BDA_EXT(vbe_mode) & ~MF_VBEFLAGS); } // Setup BDA after a mode switch. @@ -301,7 +301,7 @@ vga_set_mode(int mode, int flags) SET_BDA(video_mode, mode); else SET_BDA(video_mode, 0xff); - SET_BDA(vbe_mode, mode | (flags & MF_VBEFLAGS)); + SET_BDA_EXT(vbe_mode, mode | (flags & MF_VBEFLAGS)); if (memmodel == MM_TEXT) { SET_BDA(video_cols, width); SET_BDA(video_rows, height-1); diff --git a/vgasrc/vgabios.h b/vgasrc/vgabios.h index 02cf3e3..70682c9 100644 --- a/vgasrc/vgabios.h +++ b/vgasrc/vgabios.h @@ -75,6 +75,19 @@ struct gfx_op { #define GO_MEMSET 3 #define GO_MEMMOVE 4 +// Custom internal storage in BDA +#define VGA_CUSTOM_BDA 0xb9 + +struct vga_bda_s { + u8 vbe_flag; + u16 vbe_mode; +} PACKED; + +#define GET_BDA_EXT(var) \ + GET_FARVAR(SEG_BDA, ((struct vga_bda_s *)VGA_CUSTOM_BDA)->var) +#define SET_BDA_EXT(var, val) \ + SET_FARVAR(SEG_BDA, ((struct vga_bda_s *)VGA_CUSTOM_BDA)->var, (val)) + // Debug settings #define DEBUG_VGA_POST 1 #define DEBUG_VGA_10 3 |