JEGA/JVGA: Only update renderer override on master, do not update CRTC cursor location unless it's either master or slave, and only override the text mode renderer - fixes AX Windows 3.0 386 enhanced mode returning from DOS box to full screen.
This commit is contained in:
@@ -783,10 +783,7 @@ ega_poll(void *priv)
|
||||
ega->y_add *= ega->vres + 1;
|
||||
for (y = 0; y <= ega->vres; y++) {
|
||||
/* Render scanline */
|
||||
if (ega->render_override)
|
||||
ega->render_override(ega->priv_parent);
|
||||
else
|
||||
ega->render(ega);
|
||||
ega->render(ega);
|
||||
|
||||
/* Render overscan */
|
||||
ega->x_add = (overscan_x >> 1);
|
||||
|
||||
@@ -107,6 +107,11 @@ ega_render_overscan_right(ega_t *ega)
|
||||
void
|
||||
ega_render_text(ega_t *ega)
|
||||
{
|
||||
if (ega->render_override) {
|
||||
ega->render_override(ega->priv_parent);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((ega->displine + ega->y_add) < 0)
|
||||
return;
|
||||
|
||||
|
||||
@@ -464,21 +464,40 @@ jega_out(uint16_t addr, uint8_t val, void *priv)
|
||||
case 0x3d5:
|
||||
/* Data */
|
||||
if (jega->regs_index != RINVALID_INDEX) {
|
||||
if ((jega->regs_index < 7) && (jega->regs[0x11] & 0x80))
|
||||
return;
|
||||
if ((jega->regs_index == 7) && (jega->regs[0x11] & 0x80))
|
||||
val = (jega->regs[7] & ~0x10) | (val & 0x10);
|
||||
/*
|
||||
Do not allow cursor updates if neither master nor slave is
|
||||
active - the AX Windows 3.0 386 Enhanced Mode DOS grabber
|
||||
relies on this for the cursor position to behave correctly.
|
||||
*/
|
||||
if ((jega->regs_index >= 0x0e) && (jega->regs_index <= 0x0f) && !(jega->regs[RMOD1] & 0x0c))
|
||||
return;
|
||||
jega->regs[jega->regs_index] = val;
|
||||
jega_log("JEGA Out %04X(%02X) %02Xh(%d) %04X:%04X\n", addr, jega->regs_index, val, val, cs >> 4, cpu_state.pc);
|
||||
switch (jega->regs_index) {
|
||||
case RMOD1:
|
||||
/* if the value is changed */
|
||||
if (jega->is_vga) {
|
||||
if (val & 0x40)
|
||||
jega->vga.svga.render_override = NULL;
|
||||
else
|
||||
jega->vga.svga.render_override = jega_render_text;
|
||||
} else {
|
||||
if (val & 0x40)
|
||||
jega->ega.render_override = NULL;
|
||||
else
|
||||
jega->ega.render_override = jega_render_text;
|
||||
/*
|
||||
Do not allow override toggling unless it's on master and
|
||||
only override the text renderer - the AX Windows 3.0 386
|
||||
Enhanced Mode DOS grabber relies on this for the grabbing
|
||||
to behave correctly.
|
||||
*/
|
||||
if (val & 0x08) {
|
||||
if (jega->is_vga) {
|
||||
if (val & 0x40)
|
||||
jega->vga.svga.render_override = NULL;
|
||||
else
|
||||
jega->vga.svga.render_override = jega_render_text;
|
||||
} else {
|
||||
if (val & 0x40)
|
||||
jega->ega.render_override = NULL;
|
||||
else
|
||||
jega->ega.render_override = jega_render_text;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RDAGS:
|
||||
|
||||
@@ -1176,10 +1176,7 @@ svga_do_render(svga_t *svga)
|
||||
}
|
||||
|
||||
if (!svga->override) {
|
||||
if (svga->render_override)
|
||||
svga->render_override(svga->priv_parent);
|
||||
else
|
||||
svga->render(svga);
|
||||
svga->render(svga);
|
||||
|
||||
svga->x_add = (svga->monitor->mon_overscan_x >> 1);
|
||||
svga_render_overscan_left(svga);
|
||||
@@ -2019,6 +2016,7 @@ svga_doblit(int wx, int wy, svga_t *svga)
|
||||
|
||||
/* Block resolution changes while in DPMS mode to avoid getting a bogus
|
||||
screen width (320). We're already rendering a blank screen anyway. */
|
||||
pclog("%i + %i, %i + %i\n", svga->monitor->mon_xsize, x_add, svga->monitor->mon_ysize, y_add);
|
||||
if (!svga->dpms)
|
||||
set_screen_size_monitor(svga->monitor->mon_xsize + x_add, svga->monitor->mon_ysize + y_add, svga->monitor_index);
|
||||
|
||||
|
||||
@@ -147,6 +147,11 @@ svga_render_text_40(svga_t *svga)
|
||||
int bg;
|
||||
uint32_t addr = 0;
|
||||
|
||||
if (svga->render_override) {
|
||||
svga->render_override(svga->priv_parent);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((svga->displine + svga->y_add) < 0)
|
||||
return;
|
||||
|
||||
@@ -225,6 +230,11 @@ svga_render_text_80(svga_t *svga)
|
||||
int bg;
|
||||
uint32_t addr = 0;
|
||||
|
||||
if (svga->render_override) {
|
||||
svga->render_override(svga->priv_parent);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((svga->displine + svga->y_add) < 0)
|
||||
return;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user