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:
OBattler
2025-03-30 04:53:48 +02:00
parent 19e01b8ddf
commit 3fc6d29462
5 changed files with 47 additions and 18 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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:

View File

@@ -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);

View File

@@ -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;