diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2011-12-31 18:19:22 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2011-12-31 18:19:22 -0500 |
commit | 821d6b410e02897f84c4b732f3678f64e396c9cf (patch) | |
tree | c77eff40c3098d16f76c29f7332a2a367eb6afa7 /vgasrc/vgabios.c | |
parent | cecbc5da2c5826e35ba402b448f736fe3fa5008d (diff) | |
download | seabios-821d6b410e02897f84c4b732f3678f64e396c9cf.tar.gz |
vgabios: Refactor vga_set_mode and stdvga_set_mode.
Split out the BDA setup part of vga_set_mode to new function
modeswitch_set_bda. Move the remaining parts (palette loading, screen
clearing, font loading) of vga_set_mode into stdvga_set_mode.
Add new mode switching flags and pass them to stdvga_set_mode, so it
does not need to inspect modeset_ctl directly.
Move code needed by stdvga_set_mode (perform_gray_scale_summing,
clear_screen) to stdvga.c.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'vgasrc/vgabios.c')
-rw-r--r-- | vgasrc/vgabios.c | 89 |
1 files changed, 16 insertions, 73 deletions
diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c index cb8793e6..d7c559a0 100644 --- a/vgasrc/vgabios.c +++ b/vgasrc/vgabios.c @@ -17,7 +17,7 @@ #include "vgabios.h" // find_vga_entry #include "optionroms.h" // struct pci_data #include "config.h" // CONFIG_* -#include "stdvga.h" // stdvga_screen_disable +#include "stdvga.h" // stdvga_set_mode #include "geodelx.h" // geodelx_init #include "bochsvga.h" // bochsvga_init @@ -47,25 +47,6 @@ struct pci_data rom_pci_data VAR16VISIBLE = { ****************************************************************/ static void -perform_gray_scale_summing(u16 start, u16 count) -{ - stdvga_screen_disable(); - int i; - for (i = start; i < start+count; i++) { - u8 rgb[3]; - stdvga_get_dac_regs(GET_SEG(SS), rgb, i, 1); - - // intensity = ( 0.3 * Red ) + ( 0.59 * Green ) + ( 0.11 * Blue ) - u16 intensity = ((77 * rgb[0] + 151 * rgb[1] + 28 * rgb[2]) + 0x80) >> 8; - if (intensity > 0x3f) - intensity = 0x3f; - - stdvga_set_dac_regs(GET_SEG(SS), rgb, i, 1); - } - stdvga_screen_enable(); -} - -static void set_cursor_shape(u8 start, u8 end) { start &= 0x3f; @@ -341,57 +322,10 @@ restore_bda_state(u16 seg, struct saveBDAstate *info) SET_IVT(0x43, GET_FARVAR(seg, info->font1)); } - -/**************************************************************** - * VGA int 10 handler - ****************************************************************/ - -// set video mode +// Setup BDA after a mode switch. void -vga_set_mode(u8 mode, u8 noclearmem) +modeswitch_set_bda(int mode, int flags, struct vgamode_s *vmode_g) { - // find the entry in the video modes - struct vgamode_s *vmode_g = find_vga_entry(mode); - dprintf(1, "mode search %02x found %p\n", mode, vmode_g); - if (!vmode_g) - return; - - // Read the bios mode set control - u8 modeset_ctl = GET_BDA(modeset_ctl); - - // Then we know the number of lines -// FIXME - - // if palette loading (bit 3 of modeset ctl = 0) - if ((modeset_ctl & 0x08) == 0) { // Set the PEL mask - stdvga_set_pel_mask(GET_GLOBAL(vmode_g->pelmask)); - - // From which palette - u8 *palette_g = GET_GLOBAL(vmode_g->dac); - u16 palsize = GET_GLOBAL(vmode_g->dacsize) / 3; - - // Always 256*3 values - stdvga_set_dac_regs(get_global_seg(), palette_g, 0, palsize); - u16 i; - for (i = palsize; i < 0x0100; i++) { - static u8 rgb[3] VAR16; - stdvga_set_dac_regs(get_global_seg(), rgb, i, 1); - } - - if ((modeset_ctl & 0x02) == 0x02) - perform_gray_scale_summing(0x00, 0x100); - } - - stdvga_set_mode(vmode_g); - - if (noclearmem == 0x00) - clear_screen(vmode_g); - - // 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); @@ -400,10 +334,10 @@ vga_set_mode(u8 mode, u8 noclearmem) 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_ctl, 0x60 | (flags & MF_NOCLEARMEM ? 0x80 : 0x00)); SET_BDA(video_switches, 0xF9); SET_BDA(modeset_ctl, GET_BDA(modeset_ctl) & 0x7f); - SET_BDA(cursor_type, memmodel & TEXT ? 0x0607 : 0x0000); + SET_BDA(cursor_type, GET_GLOBAL(vmode_g->memmodel) & TEXT ? 0x0607 : 0x0000); int i; for (i=0; i<8; i++) SET_BDA(cursor_pos[i], 0x0000); @@ -435,6 +369,11 @@ vga_set_mode(u8 mode, u8 noclearmem) } } + +/**************************************************************** + * VGA int 10 handler + ****************************************************************/ + static void handle_1000(struct bregs *regs) { @@ -458,7 +397,11 @@ handle_1000(struct bregs *regs) if (bochsvga_enabled()) bochsvga_hires_enable(0); - vga_set_mode(mode, noclearmem); + int flags = GET_BDA(modeset_ctl) & (MF_NOPALETTE|MF_GRAYSUM); + if (noclearmem) + flags |= MF_NOCLEARMEM; + + stdvga_set_mode(mode, flags); } static void @@ -731,7 +674,7 @@ handle_10101a(struct bregs *regs) static void handle_10101b(struct bregs *regs) { - perform_gray_scale_summing(regs->bx, regs->cx); + stdvga_perform_gray_scale_summing(regs->bx, regs->cx); } static void |