Copper demo wobbling effects now show up correctly

This commit is contained in:
Cacodemon345
2025-06-30 23:09:29 +06:00
parent fe3ad0000b
commit c537e61453
4 changed files with 59 additions and 2 deletions

View File

@@ -892,6 +892,9 @@ et4000_init(const device_t *info)
if (dev->type >= ET4000_TYPE_ISA)
dev->svga.ramdac = device_add(&sc1502x_ramdac_device);
if (dev->type == ET4000_TYPE_TC6058AF)
dev->svga.adv_flags |= FLAG_PRECISETIME;
dev->vram_mask = dev->vram_size - 1;
rom_init(&dev->bios_rom, fn,

View File

@@ -703,6 +703,13 @@ svga_recalctimings(svga_t *svga)
int old_monitor_overscan_x = svga->monitor->mon_overscan_x;
int old_monitor_overscan_y = svga->monitor->mon_overscan_y;
if (svga->adv_flags & FLAG_PRECISETIME) {
#ifdef USE_DYNAREC
if (cpu_use_dynarec)
update_tsc();
#endif
}
svga->vtotal = svga->crtc[6];
svga->dispend = svga->crtc[0x12];
svga->vsyncstart = svga->crtc[0x10];
@@ -1253,6 +1260,7 @@ svga_do_render(svga_t *svga)
}
if (!svga->override) {
svga->render_line_offset = svga->start_retrace_latch - svga->crtc[0x4];
svga->render(svga);
svga->x_add = svga->left_overscan;
@@ -1514,6 +1522,8 @@ svga_poll(void *priv)
if (svga->vsync_callback)
svga->vsync_callback(svga);
svga->start_retrace_latch = svga->crtc[0x4];
}
#if 0
if (svga->vc == lines_num) {

View File

@@ -744,6 +744,13 @@ svga_render_indexed_gfx(svga_t *svga, bool highres, bool combine8bits)
return;
p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add];
if (svga->render_line_offset) {
if (svga->render_line_offset > 0) {
memset(p, svga->overscan_color, charwidth * svga->render_line_offset * sizeof(uint32_t));
p += charwidth * svga->render_line_offset;
}
}
if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine;
svga->lastline_draw = svga->displine;
@@ -900,6 +907,12 @@ svga_render_indexed_gfx(svga_t *svga, bool highres, bool combine8bits)
else
p += charwidth;
}
if (svga->render_line_offset < 0) {
uint32_t *orig_line = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add];
memmove(orig_line, orig_line + (charwidth * -svga->render_line_offset), (svga->hdisp) * 4);
memset((orig_line + svga->hdisp) - (charwidth * -svga->render_line_offset), svga->overscan_color, charwidth * -svga->render_line_offset * 4);
}
}
/*
@@ -1279,17 +1292,26 @@ svga_render_8bpp_tseng_lowres(svga_t *svga)
{
uint32_t *p;
uint32_t dat;
int x = 0;
if ((svga->displine + svga->y_add) < 0)
return;
if (svga->changedvram[svga->memaddr >> 12] || svga->changedvram[(svga->memaddr >> 12) + 1] || svga->fullchange) {
if (svga->changedvram[svga->memaddr >> 12] || svga->changedvram[(svga->memaddr >> 12) + 1] || svga->fullchange || svga->render_line_offset) {
int end = svga->hdisp + svga->scrollcache;
p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add];
if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine;
svga->lastline_draw = svga->displine;
if (svga->render_line_offset) {
if (svga->render_line_offset > 0) {
memset(p, svga->overscan_color, 8 * svga->render_line_offset * sizeof(uint32_t));
p += 8 * svga->render_line_offset;
}
}
for (int x = 0; x <= (svga->hdisp + svga->scrollcache); x += 8) {
dat = *(uint32_t *) (&svga->vram[svga->memaddr & svga->vram_display_mask]);
if (svga->attrregs[0x10] & 0x80)
@@ -1311,6 +1333,11 @@ svga_render_8bpp_tseng_lowres(svga_t *svga)
svga->memaddr += 4;
p += 8;
}
if (svga->render_line_offset < 0) {
uint32_t *orig_line = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add];
memmove(orig_line, orig_line + (8 * -svga->render_line_offset), (svga->hdisp) * 4);
memset((orig_line + svga->hdisp) - (8 * -svga->render_line_offset), svga->overscan_color, 8 * -svga->render_line_offset * 4);
}
svga->memaddr &= svga->vram_display_mask;
}
}
@@ -1324,13 +1351,20 @@ svga_render_8bpp_tseng_highres(svga_t *svga)
if ((svga->displine + svga->y_add) < 0)
return;
if (svga->changedvram[svga->memaddr >> 12] || svga->changedvram[(svga->memaddr >> 12) + 1] || svga->fullchange) {
if (svga->changedvram[svga->memaddr >> 12] || svga->changedvram[(svga->memaddr >> 12) + 1] || svga->fullchange || svga->render_line_offset) {
p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add];
if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine;
svga->lastline_draw = svga->displine;
if (svga->render_line_offset) {
if (svga->render_line_offset > 0) {
memset(p, svga->overscan_color, 8 * svga->render_line_offset * sizeof(uint32_t));
p += 8 * svga->render_line_offset;
}
}
for (int x = 0; x <= (svga->hdisp /* + svga->scrollcache*/); x += 8) {
dat = *(uint32_t *) (&svga->vram[svga->memaddr & svga->vram_display_mask]);
if (svga->attrregs[0x10] & 0x80)
@@ -1369,6 +1403,13 @@ svga_render_8bpp_tseng_highres(svga_t *svga)
svga->memaddr += 8;
p += 8;
}
if (svga->render_line_offset < 0) {
uint32_t *orig_line = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add];
memmove(orig_line, orig_line + (8 * -svga->render_line_offset), (svga->hdisp) * 4);
memset((orig_line + svga->hdisp) - (8 * -svga->render_line_offset), svga->overscan_color, 8 * -svga->render_line_offset * 4);
}
svga->memaddr &= svga->vram_display_mask;
}
}