Merge pull request #6146 from 86Box/tc1995

Overriding changes (September 9th, 2025)
This commit is contained in:
Miran Grča
2025-09-09 23:24:06 +02:00
committed by GitHub
2 changed files with 236 additions and 228 deletions

View File

@@ -3674,143 +3674,147 @@ ibm8514_poll(void *priv)
ibm8514_log("IBM 8514/A poll=%x offtime=%" PRIu64 ", ontime=%" PRIu64 ".\n", dev->on, dev->dispofftime, dev->dispontime);
if (dev->on) {
ibm8514_log("ON!\n");
if (!dev->linepos) {
if ((dev->displine == ((dev->hwcursor_latch.y < 0) ? 0 : dev->hwcursor_latch.y)) && dev->hwcursor_latch.ena) {
dev->hwcursor_on = dev->hwcursor_latch.cur_ysize - dev->hwcursor_latch.yoff;
dev->hwcursor_oddeven = 0;
}
if ((dev->displine == (((dev->hwcursor_latch.y < 0) ? 0 : dev->hwcursor_latch.y) + 1)) && dev->hwcursor_latch.ena && dev->interlace) {
dev->hwcursor_on = dev->hwcursor_latch.cur_ysize - (dev->hwcursor_latch.yoff + 1);
dev->hwcursor_oddeven = 1;
}
timer_advance_u64(&svga->timer, dev->dispofftime);
svga->cgastat |= 1;
dev->linepos = 1;
if (dev->dispon) {
dev->hdisp_on = 1;
dev->memaddr &= dev->vram_mask;
if (dev->firstline == 2000) {
dev->firstline = dev->displine;
video_wait_for_buffer_monitor(svga->monitor_index);
if (svga->override)
svga_set_poll(svga);
else {
if (!dev->linepos) {
if ((dev->displine == ((dev->hwcursor_latch.y < 0) ? 0 : dev->hwcursor_latch.y)) && dev->hwcursor_latch.ena) {
dev->hwcursor_on = dev->hwcursor_latch.cur_ysize - dev->hwcursor_latch.yoff;
dev->hwcursor_oddeven = 0;
}
if (dev->hwcursor_on)
dev->changedvram[dev->memaddr >> 12] = dev->changedvram[(dev->memaddr >> 12) + 1] = dev->interlace ? 3 : 2;
if ((dev->displine == (((dev->hwcursor_latch.y < 0) ? 0 : dev->hwcursor_latch.y) + 1)) && dev->hwcursor_latch.ena && dev->interlace) {
dev->hwcursor_on = dev->hwcursor_latch.cur_ysize - (dev->hwcursor_latch.yoff + 1);
dev->hwcursor_oddeven = 1;
}
svga->render8514(svga);
timer_advance_u64(&svga->timer, dev->dispofftime);
svga->cgastat |= 1;
dev->linepos = 1;
svga->x_add = svga->left_overscan;
ibm8514_render_overscan_left(dev, svga);
ibm8514_render_overscan_right(dev, svga);
svga->x_add = svga->left_overscan;
if (dev->dispon) {
dev->hdisp_on = 1;
if (dev->hwcursor_on) {
if (svga->hwcursor_draw)
svga->hwcursor_draw(svga, (dev->displine + svga->y_add + ((dev->hwcursor_latch.y >= 0) ? 0 : dev->hwcursor_latch.y)) & 2047);
dev->hwcursor_on--;
if (dev->hwcursor_on && dev->interlace)
dev->memaddr &= dev->vram_mask;
if (dev->firstline == 2000) {
dev->firstline = dev->displine;
video_wait_for_buffer_monitor(svga->monitor_index);
}
if (dev->hwcursor_on)
dev->changedvram[dev->memaddr >> 12] = dev->changedvram[(dev->memaddr >> 12) + 1] = dev->interlace ? 3 : 2;
svga->render8514(svga);
svga->x_add = svga->left_overscan;
ibm8514_render_overscan_left(dev, svga);
ibm8514_render_overscan_right(dev, svga);
svga->x_add = svga->left_overscan;
if (dev->hwcursor_on) {
if (svga->hwcursor_draw)
svga->hwcursor_draw(svga, (dev->displine + svga->y_add + ((dev->hwcursor_latch.y >= 0) ? 0 : dev->hwcursor_latch.y)) & 2047);
dev->hwcursor_on--;
if (dev->hwcursor_on && dev->interlace)
dev->hwcursor_on--;
}
if (dev->lastline < dev->displine)
dev->lastline = dev->displine;
}
if (dev->lastline < dev->displine)
dev->lastline = dev->displine;
}
dev->displine++;
if (dev->interlace)
dev->displine++;
if ((svga->cgastat & 8) && ((dev->displine & 0x0f) == (svga->crtc[0x11] & 0x0f)) && svga->vslines)
svga->cgastat &= ~8;
svga->vslines++;
if (dev->displine > 2000)
dev->displine = 0;
} else {
timer_advance_u64(&svga->timer, dev->dispontime);
if (dev->dispon)
svga->cgastat &= ~1;
dev->hdisp_on = 0;
if (dev->interlace)
dev->displine++;
if ((svga->cgastat & 8) && ((dev->displine & 0x0f) == (svga->crtc[0x11] & 0x0f)) && svga->vslines)
svga->cgastat &= ~8;
svga->vslines++;
if (dev->displine > 2000)
dev->displine = 0;
} else {
timer_advance_u64(&svga->timer, dev->dispontime);
if (dev->dispon)
svga->cgastat &= ~1;
dev->hdisp_on = 0;
dev->linepos = 0;
if (dev->dispon) {
if (dev->scanline == dev->rowcount) {
dev->scanline = 0;
dev->memaddr_backup += (dev->rowoffset << 3);
if (dev->interlace)
dev->linepos = 0;
if (dev->dispon) {
if (dev->scanline == dev->rowcount) {
dev->scanline = 0;
dev->memaddr_backup += (dev->rowoffset << 3);
if (dev->interlace)
dev->memaddr_backup += (dev->rowoffset << 3);
dev->memaddr_backup &= dev->vram_mask;
dev->memaddr = dev->memaddr_backup;
} else {
dev->scanline++;
dev->scanline &= 0x1f;
dev->memaddr = dev->memaddr_backup;
}
}
dev->vc++;
dev->vc &= 0xfff;
if (dev->vc == dev->dispend) {
dev->vblank_start(svga);
ibm8514_log("VBLANK irq.\n");
dev->dispon = 0;
for (x = 0; x < ((dev->vram_mask + 1) >> 12); x++) {
if (dev->changedvram[x])
dev->changedvram[x]--;
dev->memaddr_backup &= dev->vram_mask;
dev->memaddr = dev->memaddr_backup;
} else {
dev->scanline++;
dev->scanline &= 0x1f;
dev->memaddr = dev->memaddr_backup;
}
}
if (svga->fullchange)
svga->fullchange--;
}
if (dev->vc == dev->v_syncstart) {
dev->dispon = 0;
svga->cgastat |= 8;
x = dev->h_disp;
dev->vc++;
dev->vc &= 0xfff;
if (dev->interlace && !dev->oddeven)
dev->lastline++;
if (dev->interlace && dev->oddeven)
dev->firstline--;
if (dev->vc == dev->dispend) {
dev->vblank_start(svga);
ibm8514_log("VBLANK irq.\n");
dev->dispon = 0;
wx = x;
wy = dev->lastline - dev->firstline;
svga_doblit(wx, wy, svga);
for (x = 0; x < ((dev->vram_mask + 1) >> 12); x++) {
if (dev->changedvram[x])
dev->changedvram[x]--;
}
dev->firstline = 2000;
dev->lastline = 0;
if (svga->fullchange)
svga->fullchange--;
}
if (dev->vc == dev->v_syncstart) {
dev->dispon = 0;
svga->cgastat |= 8;
x = dev->h_disp;
dev->firstline_draw = 2000;
dev->lastline_draw = 0;
if (dev->interlace && !dev->oddeven)
dev->lastline++;
if (dev->interlace && dev->oddeven)
dev->firstline--;
dev->oddeven ^= 1;
wx = x;
wy = dev->lastline - dev->firstline;
svga_doblit(wx, wy, svga);
svga->monitor->mon_changeframecount = dev->interlace ? 3 : 2;
svga->vslines = 0;
dev->firstline = 2000;
dev->lastline = 0;
if (dev->interlace && dev->oddeven)
dev->memaddr = dev->memaddr_backup = (dev->rowoffset << 1);
else
dev->memaddr = dev->memaddr_backup = 0;
dev->firstline_draw = 2000;
dev->lastline_draw = 0;
dev->memaddr = (dev->memaddr << 2);
dev->memaddr_backup = (dev->memaddr_backup << 2);
}
if (dev->vc == dev->v_total) {
dev->vc = 0;
dev->scanline = (svga->crtc[0x8] & 0x1f);
dev->dispon = 1;
dev->displine = (dev->interlace && dev->oddeven) ? 1 : 0;
dev->oddeven ^= 1;
svga->x_add = svga->left_overscan;
svga->monitor->mon_changeframecount = dev->interlace ? 3 : 2;
svga->vslines = 0;
dev->hwcursor_on = 0;
dev->hwcursor_latch = dev->hwcursor;
if (dev->interlace && dev->oddeven)
dev->memaddr = dev->memaddr_backup = (dev->rowoffset << 1);
else
dev->memaddr = dev->memaddr_backup = 0;
dev->memaddr = (dev->memaddr << 2);
dev->memaddr_backup = (dev->memaddr_backup << 2);
}
if (dev->vc == dev->v_total) {
dev->vc = 0;
dev->scanline = (svga->crtc[0x8] & 0x1f);
dev->dispon = 1;
dev->displine = (dev->interlace && dev->oddeven) ? 1 : 0;
svga->x_add = svga->left_overscan;
dev->hwcursor_on = 0;
dev->hwcursor_latch = dev->hwcursor;
}
}
}
}

View File

@@ -3303,152 +3303,156 @@ xga_poll(void *priv)
xga_log("XGA Poll=%d.\n", xga->on);
if (xga->on) {
if (!xga->linepos) {
if (xga->displine == xga->hwcursor_latch.y && xga->hwcursor_latch.ena) {
xga->hwcursor_on = xga->hwcursor_latch.cur_ysize - ((xga->hwcursor_latch.yoff & 0x20) ? 32 : 0);
xga->hwcursor_oddeven = 0;
}
if (xga->displine == (xga->hwcursor_latch.y + 1) && xga->hwcursor_latch.ena && xga->interlace) {
xga->hwcursor_on = xga->hwcursor_latch.cur_ysize - ((xga->hwcursor_latch.yoff & 0x20) ? 33 : 1);
xga->hwcursor_oddeven = 1;
}
timer_advance_u64(&svga->timer, xga->dispofftime);
svga->cgastat |= 1;
xga->linepos = 1;
if (xga->dispon) {
xga->h_disp_on = 1;
xga->memaddr &= xga->vram_mask;
if (xga->firstline == 2000) {
xga->firstline = xga->displine;
video_wait_for_buffer_monitor(svga->monitor_index);
if (svga->override)
svga_set_poll(svga);
else {
if (!xga->linepos) {
if (xga->displine == xga->hwcursor_latch.y && xga->hwcursor_latch.ena) {
xga->hwcursor_on = xga->hwcursor_latch.cur_ysize - ((xga->hwcursor_latch.yoff & 0x20) ? 32 : 0);
xga->hwcursor_oddeven = 0;
}
if (xga->hwcursor_on)
xga->changedvram[xga->memaddr >> 12] = xga->changedvram[(xga->memaddr >> 12) + 1] = xga->interlace ? 3 : 2;
if (xga->displine == (xga->hwcursor_latch.y + 1) && xga->hwcursor_latch.ena && xga->interlace) {
xga->hwcursor_on = xga->hwcursor_latch.cur_ysize - ((xga->hwcursor_latch.yoff & 0x20) ? 33 : 1);
xga->hwcursor_oddeven = 1;
}
svga->render_xga(svga);
timer_advance_u64(&svga->timer, xga->dispofftime);
svga->cgastat |= 1;
xga->linepos = 1;
svga->x_add = svga->left_overscan;
xga_render_overscan_left(xga, svga);
xga_render_overscan_right(xga, svga);
svga->x_add = svga->left_overscan;
if (xga->dispon) {
xga->h_disp_on = 1;
if (xga->hwcursor_on) {
xga_hwcursor_draw(svga, xga->displine + svga->y_add);
xga->hwcursor_on--;
if (xga->hwcursor_on && xga->interlace)
xga->memaddr &= xga->vram_mask;
if (xga->firstline == 2000) {
xga->firstline = xga->displine;
video_wait_for_buffer_monitor(svga->monitor_index);
}
if (xga->hwcursor_on)
xga->changedvram[xga->memaddr >> 12] = xga->changedvram[(xga->memaddr >> 12) + 1] = xga->interlace ? 3 : 2;
svga->render_xga(svga);
svga->x_add = svga->left_overscan;
xga_render_overscan_left(xga, svga);
xga_render_overscan_right(xga, svga);
svga->x_add = svga->left_overscan;
if (xga->hwcursor_on) {
xga_hwcursor_draw(svga, xga->displine + svga->y_add);
xga->hwcursor_on--;
if (xga->hwcursor_on && xga->interlace)
xga->hwcursor_on--;
}
if (xga->lastline < xga->displine)
xga->lastline = xga->displine;
}
if (xga->lastline < xga->displine)
xga->lastline = xga->displine;
}
xga->displine++;
if (xga->interlace)
xga->displine++;
if ((svga->cgastat & 8) && ((xga->displine & 0x0f) == (svga->crtc[0x11] & 0x0f)) && svga->vslines)
svga->cgastat &= ~8;
if (xga->displine > 1500)
xga->displine = 0;
} else {
timer_advance_u64(&svga->timer, xga->dispontime);
if (xga->dispon)
svga->cgastat &= ~1;
if (xga->interlace)
xga->displine++;
if ((svga->cgastat & 8) && ((xga->displine & 0x0f) == (svga->crtc[0x11] & 0x0f)) && svga->vslines)
svga->cgastat &= ~8;
if (xga->displine > 1500)
xga->displine = 0;
} else {
timer_advance_u64(&svga->timer, xga->dispontime);
if (xga->dispon)
svga->cgastat &= ~1;
xga->h_disp_on = 0;
xga->h_disp_on = 0;
xga->linepos = 0;
if (xga->dispon) {
if (xga->scanline == xga->rowcount) {
xga->scanline = 0;
xga->linepos = 0;
if (xga->dispon) {
if (xga->scanline == xga->rowcount) {
xga->scanline = 0;
xga_log("MA=%08x, MALATCH=%x.\n", xga->memaddr, xga->memaddr_latch);
xga->memaddr_backup += (xga->rowoffset << 3);
if (xga->interlace)
xga_log("MA=%08x, MALATCH=%x.\n", xga->memaddr, xga->memaddr_latch);
xga->memaddr_backup += (xga->rowoffset << 3);
if (xga->interlace)
xga->memaddr_backup += (xga->rowoffset << 3);
xga->memaddr_backup &= xga->vram_mask;
xga->memaddr = xga->memaddr_backup;
} else {
xga->scanline++;
xga->scanline &= 0x1f;
xga->memaddr = xga->memaddr_backup;
xga->memaddr_backup &= xga->vram_mask;
xga->memaddr = xga->memaddr_backup;
} else {
xga->scanline++;
xga->scanline &= 0x1f;
xga->memaddr = xga->memaddr_backup;
}
}
}
xga->vc++;
xga->vc &= 0x7ff;
xga->vc++;
xga->vc &= 0x7ff;
if (xga->vc == xga->split) {
if (xga->interlace && xga->oddeven)
xga->memaddr = xga->memaddr_backup = (xga->rowoffset << 1);
else
xga->memaddr = xga->memaddr_backup = 0;
if (xga->vc == xga->split) {
if (xga->interlace && xga->oddeven)
xga->memaddr = xga->memaddr_backup = (xga->rowoffset << 1);
else
xga->memaddr = xga->memaddr_backup = 0;
xga->memaddr = (xga->memaddr << 2);
xga->memaddr_backup = (xga->memaddr_backup << 2);
xga->memaddr = (xga->memaddr << 2);
xga->memaddr_backup = (xga->memaddr_backup << 2);
xga->scanline = 0;
}
if (xga->vc == xga->dispend) {
xga->dispon = 0;
for (x = 0; x < ((xga->vram_mask + 1) >> 12); x++) {
if (xga->changedvram[x])
xga->changedvram[x]--;
xga->scanline = 0;
}
if (svga->fullchange)
svga->fullchange--;
}
if (xga->vc == xga->v_syncstart) {
xga->dispon = 0;
svga->cgastat |= 8;
x = xga->h_disp;
if (xga->vc == xga->dispend) {
xga->dispon = 0;
if (xga->interlace && !xga->oddeven)
xga->lastline++;
if (xga->interlace && xga->oddeven)
xga->firstline--;
for (x = 0; x < ((xga->vram_mask + 1) >> 12); x++) {
if (xga->changedvram[x])
xga->changedvram[x]--;
}
if (svga->fullchange)
svga->fullchange--;
}
if (xga->vc == xga->v_syncstart) {
xga->dispon = 0;
svga->cgastat |= 8;
x = xga->h_disp;
wx = x;
if (xga->interlace && !xga->oddeven)
xga->lastline++;
if (xga->interlace && xga->oddeven)
xga->firstline--;
wy = xga->lastline - xga->firstline;
svga_doblit(wx, wy, svga);
wx = x;
xga->firstline = 2000;
xga->lastline = 0;
wy = xga->lastline - xga->firstline;
svga_doblit(wx, wy, svga);
xga->firstline_draw = 2000;
xga->lastline_draw = 0;
xga->firstline = 2000;
xga->lastline = 0;
xga->oddeven ^= 1;
xga->firstline_draw = 2000;
xga->lastline_draw = 0;
svga->monitor->mon_changeframecount = xga->interlace ? 3 : 2;
xga->oddeven ^= 1;
if (xga->interlace && xga->oddeven)
xga->memaddr = xga->memaddr_backup = xga->memaddr_latch + (xga->rowoffset << 1);
else
xga->memaddr = xga->memaddr_backup = xga->memaddr_latch;
svga->monitor->mon_changeframecount = xga->interlace ? 3 : 2;
xga->memaddr = (xga->memaddr << 2);
xga->memaddr_backup = (xga->memaddr_backup << 2);
}
if (xga->vc == xga->v_total) {
xga->vc = 0;
xga->scanline = 0;
xga->dispon = 1;
xga->displine = (xga->interlace && xga->oddeven) ? 1 : 0;
if (xga->interlace && xga->oddeven)
xga->memaddr = xga->memaddr_backup = xga->memaddr_latch + (xga->rowoffset << 1);
else
xga->memaddr = xga->memaddr_backup = xga->memaddr_latch;
svga->x_add = svga->left_overscan;
xga->memaddr = (xga->memaddr << 2);
xga->memaddr_backup = (xga->memaddr_backup << 2);
}
if (xga->vc == xga->v_total) {
xga->vc = 0;
xga->scanline = 0;
xga->dispon = 1;
xga->displine = (xga->interlace && xga->oddeven) ? 1 : 0;
xga->hwcursor_on = 0;
xga->hwcursor_latch = xga->hwcursor;
svga->x_add = svga->left_overscan;
xga->hwcursor_on = 0;
xga->hwcursor_latch = xga->hwcursor;
}
}
}
} else