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;
|
ega->y_add *= ega->vres + 1;
|
||||||
for (y = 0; y <= ega->vres; y++) {
|
for (y = 0; y <= ega->vres; y++) {
|
||||||
/* Render scanline */
|
/* Render scanline */
|
||||||
if (ega->render_override)
|
ega->render(ega);
|
||||||
ega->render_override(ega->priv_parent);
|
|
||||||
else
|
|
||||||
ega->render(ega);
|
|
||||||
|
|
||||||
/* Render overscan */
|
/* Render overscan */
|
||||||
ega->x_add = (overscan_x >> 1);
|
ega->x_add = (overscan_x >> 1);
|
||||||
|
|||||||
@@ -107,6 +107,11 @@ ega_render_overscan_right(ega_t *ega)
|
|||||||
void
|
void
|
||||||
ega_render_text(ega_t *ega)
|
ega_render_text(ega_t *ega)
|
||||||
{
|
{
|
||||||
|
if (ega->render_override) {
|
||||||
|
ega->render_override(ega->priv_parent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((ega->displine + ega->y_add) < 0)
|
if ((ega->displine + ega->y_add) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -464,21 +464,40 @@ jega_out(uint16_t addr, uint8_t val, void *priv)
|
|||||||
case 0x3d5:
|
case 0x3d5:
|
||||||
/* Data */
|
/* Data */
|
||||||
if (jega->regs_index != RINVALID_INDEX) {
|
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->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);
|
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) {
|
switch (jega->regs_index) {
|
||||||
case RMOD1:
|
case RMOD1:
|
||||||
/* if the value is changed */
|
/* if the value is changed */
|
||||||
if (jega->is_vga) {
|
/*
|
||||||
if (val & 0x40)
|
Do not allow override toggling unless it's on master and
|
||||||
jega->vga.svga.render_override = NULL;
|
only override the text renderer - the AX Windows 3.0 386
|
||||||
else
|
Enhanced Mode DOS grabber relies on this for the grabbing
|
||||||
jega->vga.svga.render_override = jega_render_text;
|
to behave correctly.
|
||||||
} else {
|
*/
|
||||||
if (val & 0x40)
|
if (val & 0x08) {
|
||||||
jega->ega.render_override = NULL;
|
if (jega->is_vga) {
|
||||||
else
|
if (val & 0x40)
|
||||||
jega->ega.render_override = jega_render_text;
|
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;
|
break;
|
||||||
case RDAGS:
|
case RDAGS:
|
||||||
|
|||||||
@@ -1176,10 +1176,7 @@ svga_do_render(svga_t *svga)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!svga->override) {
|
if (!svga->override) {
|
||||||
if (svga->render_override)
|
svga->render(svga);
|
||||||
svga->render_override(svga->priv_parent);
|
|
||||||
else
|
|
||||||
svga->render(svga);
|
|
||||||
|
|
||||||
svga->x_add = (svga->monitor->mon_overscan_x >> 1);
|
svga->x_add = (svga->monitor->mon_overscan_x >> 1);
|
||||||
svga_render_overscan_left(svga);
|
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
|
/* Block resolution changes while in DPMS mode to avoid getting a bogus
|
||||||
screen width (320). We're already rendering a blank screen anyway. */
|
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)
|
if (!svga->dpms)
|
||||||
set_screen_size_monitor(svga->monitor->mon_xsize + x_add, svga->monitor->mon_ysize + y_add, svga->monitor_index);
|
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;
|
int bg;
|
||||||
uint32_t addr = 0;
|
uint32_t addr = 0;
|
||||||
|
|
||||||
|
if (svga->render_override) {
|
||||||
|
svga->render_override(svga->priv_parent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((svga->displine + svga->y_add) < 0)
|
if ((svga->displine + svga->y_add) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -225,6 +230,11 @@ svga_render_text_80(svga_t *svga)
|
|||||||
int bg;
|
int bg;
|
||||||
uint32_t addr = 0;
|
uint32_t addr = 0;
|
||||||
|
|
||||||
|
if (svga->render_override) {
|
||||||
|
svga->render_override(svga->priv_parent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((svga->displine + svga->y_add) < 0)
|
if ((svga->displine + svga->y_add) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user