Cirrus VGA fixes to make original VGABIOS work correctly with XP (#319).
- Allow BitBlt start after BitBlt reset with one register write. - Using dstpitch = 0 is valid if bltheight = 1. Skip redraw to avoid division by zero error. Win2k and XP are using these settings at startup and expect a small piece of memory to be set to 0xff. That's why the LGPL'd VGABIOS for Cirrus still has the Win2k hack clearing all memory with 0xff.
This commit is contained in:
parent
9c356c4f2e
commit
426bd50b90
@ -20,6 +20,8 @@ Detailed change log :
|
||||
extension "gui_debug:globalini" (sdl, sdl2, win32, x11)
|
||||
|
||||
- I/O Devices
|
||||
- VGA
|
||||
- Cirrus: Fixes to make original VGABIOS work correctly with WinXP
|
||||
- USB
|
||||
- Now includes the USB Debugger support for the xHCI and UHCI controllers
|
||||
- Sound
|
||||
|
@ -2122,7 +2122,7 @@ void bx_svga_cirrus_c::svga_write_control(Bit32u address, unsigned index, Bit8u
|
||||
((value & CIRRUS_BLT_RESET) == 0)) {
|
||||
svga_reset_bitblt();
|
||||
}
|
||||
else if (((old_value & CIRRUS_BLT_START) == 0) &&
|
||||
if (((old_value & CIRRUS_BLT_START) == 0) &&
|
||||
((value & CIRRUS_BLT_START) != 0)) {
|
||||
BX_CIRRUS_THIS control.reg[0x31] |= CIRRUS_BLT_BUSY;
|
||||
svga_bitblt();
|
||||
@ -2566,8 +2566,13 @@ void bx_svga_cirrus_c::svga_bitblt()
|
||||
BX_CIRRUS_THIS bitblt.bltmodeext = BX_CIRRUS_THIS control.reg[0x33];
|
||||
BX_CIRRUS_THIS bitblt.bltrop = BX_CIRRUS_THIS control.reg[0x32];
|
||||
offset = dstaddr - (Bit32u)(BX_CIRRUS_THIS disp_ptr - BX_CIRRUS_THIS s.memory);
|
||||
BX_CIRRUS_THIS redraw.x = (offset % BX_CIRRUS_THIS bitblt.dstpitch) / (BX_CIRRUS_THIS svga_bpp >> 3);
|
||||
BX_CIRRUS_THIS redraw.y = offset / BX_CIRRUS_THIS bitblt.dstpitch;
|
||||
if (BX_CIRRUS_THIS bitblt.dstpitch > 0) {
|
||||
BX_CIRRUS_THIS redraw.x = (offset % BX_CIRRUS_THIS bitblt.dstpitch) / (BX_CIRRUS_THIS svga_bpp >> 3);
|
||||
BX_CIRRUS_THIS redraw.y = offset / BX_CIRRUS_THIS bitblt.dstpitch;
|
||||
} else {
|
||||
BX_CIRRUS_THIS redraw.x = 0;
|
||||
BX_CIRRUS_THIS redraw.y = 0;
|
||||
}
|
||||
BX_CIRRUS_THIS redraw.w = BX_CIRRUS_THIS bitblt.bltwidth / (BX_CIRRUS_THIS svga_bpp >> 3);
|
||||
BX_CIRRUS_THIS redraw.h = BX_CIRRUS_THIS bitblt.bltheight;
|
||||
if (BX_CIRRUS_THIS s.y_doublescan) {
|
||||
|
Loading…
Reference in New Issue
Block a user