X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=vgasrc%2Fbochsvga.c;h=71f2cd4b53970bdb93b444a63b560b5ffd8d2dea;hb=c8845029a7d0b67ac5f37423deb3495c4397a3f9;hp=e40a1fd507eefa92a5a234d20dcd094711f93539;hpb=2bd4531436cc7bf32186b1bf469ed01810044c0b;p=seabios.git diff --git a/vgasrc/bochsvga.c b/vgasrc/bochsvga.c index e40a1fd..71f2cd4 100644 --- a/vgasrc/bochsvga.c +++ b/vgasrc/bochsvga.c @@ -171,7 +171,8 @@ static int mode_valid(struct vgamode_s *vmode_g) u16 width = GET_GLOBAL(vmode_g->width); u16 height = GET_GLOBAL(vmode_g->height); u8 depth = GET_GLOBAL(vmode_g->depth); - u32 mem = width * height * DIV_ROUND_UP(depth, 8); + u32 mem = (height * DIV_ROUND_UP(width * vga_bpp(vmode_g), 8) + * 4 / stdvga_bpp_factor(vmode_g)); return width <= max_xres && depth <= max_bpp && mem <= max_mem; } @@ -204,17 +205,6 @@ bochsvga_list_modes(u16 seg, u16 *dest, u16 *last) stdvga_list_modes(seg, dest, last); } -static void -bochsvga_hires_enable(int enable) -{ - u16 flags = enable ? - VBE_DISPI_ENABLED | - VBE_DISPI_LFB_ENABLED | - VBE_DISPI_NOCLEARMEM : 0; - - dispi_write(VBE_DISPI_INDEX_ENABLE, flags); -} - int bochsvga_get_window(struct vgamode_s *vmode_g, int window) { @@ -270,25 +260,12 @@ bochsvga_set_displaystart(struct vgamode_s *vmode_g, int val) return 0; } -static void -bochsvga_clear_scr(void) -{ - u16 en; - - en = dispi_read(VBE_DISPI_INDEX_ENABLE); - en &= ~VBE_DISPI_NOCLEARMEM; - dispi_write(VBE_DISPI_INDEX_ENABLE, en); -} - int bochsvga_set_mode(struct vgamode_s *vmode_g, int flags) { - if (! is_bochsvga_mode(vmode_g)) { - bochsvga_hires_enable(0); + dispi_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED); + if (! is_bochsvga_mode(vmode_g)) return stdvga_set_mode(vmode_g, flags); - } - - bochsvga_hires_enable(1); u8 depth = GET_GLOBAL(vmode_g->depth); if (depth == 4) @@ -303,13 +280,15 @@ bochsvga_set_mode(struct vgamode_s *vmode_g, int flags) dispi_write(VBE_DISPI_INDEX_XRES, width); dispi_write(VBE_DISPI_INDEX_YRES, height); dispi_write(VBE_DISPI_INDEX_BANK, 0); + u16 bf = ((flags & MF_NOCLEARMEM ? VBE_DISPI_NOCLEARMEM : 0) + | (flags & MF_LINEARFB ? VBE_DISPI_LFB_ENABLED : 0)); + dispi_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | bf); /* VGA compat setup */ - //XXX: This probably needs some reverse engineering u16 crtc_addr = VGAREG_VGA_CRTC_ADDRESS; stdvga_crtc_write(crtc_addr, 0x11, 0x00); stdvga_crtc_write(crtc_addr, 0x01, width / 8 - 1); - dispi_write(VBE_DISPI_INDEX_VIRT_WIDTH, width); + stdvga_set_linelength(vmode_g, width); stdvga_crtc_write(crtc_addr, 0x12, height - 1); u8 v = 0; if ((height - 1) & 0x0100) @@ -330,13 +309,5 @@ bochsvga_set_mode(struct vgamode_s *vmode_g, int flags) stdvga_grdc_mask(0x05, 0x20, 0x40); } - if (flags & MF_LINEARFB) { - /* Linear frame buffer */ - /* XXX: ??? */ - } - if (!(flags & MF_NOCLEARMEM)) { - bochsvga_clear_scr(); - } - return 0; }