[Dosemu-cvs] dosemu/src/env/video vga.c,1.17,1.18 vbe.c,1.7,1.8
Brought to you by:
bartoldeman
From: Stas S. <st...@us...> - 2005-05-06 11:23:24
|
Update of /cvsroot/dosemu/dosemu/src/env/video In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11564/src/env/video Modified Files: vga.c vbe.c Log Message: - Make do_int10_setmode() to do something more than just locking up the video bios. - Disabled the "special memory mode" - Matrox G550 doesn't honour the bit15 (even for that mode!), so the memory was cleared before saving. By the way, Matrox can handle our banked saving/restoring very well, but Radeon 7500 miserably fails on our bankswitching code. - Disabled the "set mode before restore" hack - that never worked because of the both the above bugs, it only makes problems. - Restoring the ext regs is necessary after saving/restoring the video memory (well, without using the "special memory mode" it may not be necessary, but I added it to stay safe). This makes the console VESA driver pretty much usable. Index: vga.c =================================================================== RCS file: /cvsroot/dosemu/dosemu/src/env/video/vga.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- vga.c 4 May 2005 17:11:45 -0000 1.17 +++ vga.c 6 May 2005 11:22:35 -0000 1.18 @@ -221,7 +221,8 @@ static void do_int10_setmode(int mode) { struct vm86_regs r; - r.eax = mode; + r.eax = 0x4f02; + r.ebx = mode; do_int10_callback(&r); } @@ -275,9 +276,6 @@ int cbank, plane, planar; char *vmem = (char *)GRAPH_BASE; -#if 0 - dump_video_regs(); -#endif if (config.chipset == VESA && banks > 1) vmem = vesa_get_lfb(); else if (config.chipset == ET4000) { @@ -339,10 +337,6 @@ int plane, cbank, planar; char *vmem = (char *)GRAPH_BASE; -#if 0 - dump_video_regs(); -#endif - if (config.chipset == VESA && banks > 1) vmem = vesa_get_lfb(); else if (config.chipset == ET4000) @@ -425,6 +419,7 @@ } dosemu_vga_getpalvec(0, 256, save_regs->pal); restore_vga_regs(save_regs->regs, save_regs->xregs, save_regs->xregs16); + restore_ext_regs(save_regs->xregs, save_regs->xregs16); enable_vga_card(); port_leave_critical_section(); @@ -437,18 +432,27 @@ v_printf("Restoring data for %s\n", save_regs->video_name); port_enter_critical_section(__FUNCTION__); + /* my Matrox G550 seem to completely ignore the bit15, so + * lets disable the below trick. Are there any cards that + * really need this? */ +#if 0 /* do a BIOS setmode to the original mode before restoring registers. This helps if we don't restore all registers ourselves or if the VESA BIOS is buggy */ if (config.chipset == PLAINVGA || config.chipset == VESA) { char bios_data_area[0x100]; + int mode = save_regs->video_mode; + if (config.chipset == VESA && !config.gfxmemsize) + mode |= 0x8000; /* preserve video memory */ memcpy(bios_data_area, (void *)BIOS_DATA_SEG, 0x100); - do_int10_setmode(save_regs->video_mode); + do_int10_setmode(mode); memcpy((void *)BIOS_DATA_SEG, bios_data_area, 0x100); } +#endif dosemu_vga_screenoff(); disable_vga_card(); restore_vga_regs(save_regs->regs, save_regs->xregs, save_regs->xregs16); + restore_ext_regs(save_regs->xregs, save_regs->xregs16); if (save_regs->banks) restore_vga_mem(save_regs->mem, save_regs->banks); if (save_regs->release_video) { @@ -458,6 +462,7 @@ } dosemu_vga_setpalvec(0, 256, save_regs->pal); restore_vga_regs(save_regs->regs, save_regs->xregs, save_regs->xregs16); + restore_ext_regs(save_regs->xregs, save_regs->xregs16); v_printf("Permissions=%d\n", permissions); enable_vga_card(); dosemu_vga_screenon(); Index: vbe.c =================================================================== RCS file: /cvsroot/dosemu/dosemu/src/env/video/vbe.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- vbe.c 4 May 2005 17:11:45 -0000 1.7 +++ vbe.c 6 May 2005 11:22:37 -0000 1.8 @@ -196,11 +196,21 @@ char *vesa_get_lfb(void) { + /* + * The below trick doesn't seem to work on my Matrox G550 - + * looks like it ignores the bit15 and clears the video memory. + * We don't really need that special mode after all, so + * it is disabled. + */ +#if 0 vesa_r.eax = 0x4f02; /* 0x81ff | 0x4000 is the special "all memory access mode" + LFB */ vesa_r.ebx = vesa_linear_vbase ? 0xc1ff : vesa_version >= 0x200 ? 0x81ff : 0x101; do_int10_callback(&vesa_r); + if ((vesa_r.eax & 0xffff) != 0x4f) + return (char *)GRAPH_BASE; +#endif if (vesa_linear_vbase) return (char *)vesa_linear_vbase; return (char *)GRAPH_BASE; |