From aa7cb72c933cadaa0319b2651958aeeeae3557f0 Mon Sep 17 00:00:00 2001 From: pixel-jupiter <180155003+pixel-jupiter@users.noreply.github.com> Date: Thu, 25 Sep 2025 15:42:17 +0300 Subject: [PATCH] Apply vsync_offset during scanline rendering instead of the final blit; clean up code --- src/video/vid_tandy.c | 88 +++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 46 deletions(-) diff --git a/src/video/vid_tandy.c b/src/video/vid_tandy.c index 602b7d0d9..978a03c8d 100644 --- a/src/video/vid_tandy.c +++ b/src/video/vid_tandy.c @@ -27,8 +27,6 @@ #include #include #define HAVE_STDARG_H -#define HOS 16 -#define HOS_SIDE 8 #include <86box/86box.h> #include <86box/timer.h> #include <86box/io.h> @@ -418,7 +416,7 @@ vid_render(tandy_t *dev, int line, int hos_offs) } } - for (c = 0; c < HOS_SIDE - vid->hsync_offset; c++) { + for (c = 0; c < 8 - vid->hsync_offset; c++) { if (vid->array[3] & 4) { if (vid->mode & 1) buffer32->line[line][c + (vid->crtc[1] << 3) + hos_offs] = cols[0]; @@ -606,16 +604,16 @@ vid_render_blank(tandy_t *dev, int line) if (vid->array[3] & 4) { if (vid->mode & 1) - hline(buffer32, 0, line, (vid->crtc[1] << 3) + HOS, (vid->array[2] & 0xf) + 16); + hline(buffer32, 0, line, (vid->crtc[1] << 3) + 16, (vid->array[2] & 0xf) + 16); else - hline(buffer32, 0, line, (vid->crtc[1] << 4) + HOS, (vid->array[2] & 0xf) + 16); + hline(buffer32, 0, line, (vid->crtc[1] << 4) + 16, (vid->array[2] & 0xf) + 16); } else { int cols = ((vid->mode & 0x12) == 0x12) ? 0 : (vid->col & 0xf) + 16; if (vid->mode & 1) - hline(buffer32, 0, line, (vid->crtc[1] << 3) + HOS, cols); + hline(buffer32, 0, line, (vid->crtc[1] << 3) + 16, cols); else - hline(buffer32, 0, line, (vid->crtc[1] << 4) + HOS, cols); + hline(buffer32, 0, line, (vid->crtc[1] << 4) + 16, cols); } } @@ -626,9 +624,9 @@ vid_render_process(tandy_t *dev, int line) int x; if (vid->mode & 1) - x = (vid->crtc[1] << 3) + HOS; + x = (vid->crtc[1] << 3) + 16; else - x = (vid->crtc[1] << 4) + HOS; + x = (vid->crtc[1] << 4) + 16; if (!dev->is_sl2 && vid->composite) Composite_Process(vid->mode, 0, x >> 2, buffer32->line[line]); @@ -647,7 +645,9 @@ vid_poll(void *priv) int oldvc; int scanline_old; int old_ma; - int hos_offs = HOS_SIDE + vid->hsync_offset; + int hos_offs = 8 + vid->hsync_offset; + int displine_offs = vid->displine - vid->vsync_offset; + int displine_offs_double = (vid->displine << 1) - (vid->vsync_offset << 1); if (!vid->linepos) { timer_advance_u64(&vid->timer, vid->dispofftime); @@ -664,39 +664,51 @@ vid_poll(void *priv) vid->lastline = vid->displine; switch (vid->double_type) { default: - vid_render(dev, vid->displine << 1, hos_offs); - vid_render_blank(dev, (vid->displine << 1) + 1); + if (displine_offs_double >= 0) { + vid_render(dev, displine_offs_double, hos_offs); + vid_render_blank(dev, displine_offs_double + 1); + } break; case DOUBLE_NONE: - vid_render(dev, vid->displine, hos_offs); + if (displine_offs >= 0) + vid_render(dev, displine_offs, hos_offs); break; case DOUBLE_SIMPLE: - old_ma = vid->memaddr; - vid_render(dev, vid->displine << 1, hos_offs); - vid->memaddr = old_ma; - vid_render(dev, (vid->displine << 1) + 1, hos_offs); + if (displine_offs_double >= 0) { + old_ma = vid->memaddr; + vid_render(dev, displine_offs_double, hos_offs); + vid->memaddr = old_ma; + vid_render(dev, displine_offs_double + 1, hos_offs); + } break; } } else switch (vid->double_type) { default: - vid_render_blank(dev, vid->displine << 1); + if (displine_offs_double >= 0) + vid_render_blank(dev, displine_offs_double); break; case DOUBLE_NONE: - vid_render_blank(dev, vid->displine); + if (displine_offs >= 0) + vid_render_blank(dev, displine_offs); break; case DOUBLE_SIMPLE: - vid_render_blank(dev, vid->displine << 1); - vid_render_blank(dev, (vid->displine << 1) + 1); + if (displine_offs_double >= 0) { + vid_render_blank(dev, displine_offs_double); + vid_render_blank(dev, displine_offs_double + 1); + } break; } switch (vid->double_type) { default: - vid_render_process(dev, vid->displine << 1); - vid_render_process(dev, (vid->displine << 1) + 1); + if (displine_offs_double >= 0) { + vid_render_process(dev, displine_offs_double); + vid_render_process(dev, displine_offs_double + 1); + } break; case DOUBLE_NONE: - vid_render_process(dev, vid->displine); + if (displine_offs >= 0) + vid_render_process(dev, displine_offs); break; } @@ -766,9 +778,9 @@ vid_poll(void *priv) picint(1 << 5); if (vid->crtc[7]) { if (vid->mode & 1) - x = (vid->crtc[1] << 3) + HOS; + x = (vid->crtc[1] << 3) + 16; else - x = (vid->crtc[1] << 4) + HOS; + x = (vid->crtc[1] << 4) + 16; vid->lastline++; xs_temp = x; @@ -780,7 +792,7 @@ vid_poll(void *priv) if (ys_temp < 32) ys_temp = 400; if (!enable_overscan) - xs_temp -= HOS; + xs_temp -= 16; if ((xs_temp != xsize) || (ys_temp != ysize) || video_force_resize_get()) { xsize = xs_temp; @@ -791,24 +803,9 @@ vid_poll(void *priv) video_force_resize_set(0); } - if (vid->double_type > DOUBLE_NONE) { - if (enable_overscan) - cga_blit_memtoscreen(0, ((vid->firstline - 4) << 1) - (vid->vsync_offset << 1), - xsize, ((vid->lastline - vid->firstline) << 1) + 16, - vid->double_type); - else - cga_blit_memtoscreen(HOS_SIDE, (vid->firstline << 1) - (vid->vsync_offset << 1), - xsize, (vid->lastline - vid->firstline) << 1, - vid->double_type); - } else { - if (enable_overscan) - video_blit_memtoscreen(0, (vid->firstline - 4) - vid->vsync_offset, - xsize, (vid->lastline - vid->firstline) + 8); - else - video_blit_memtoscreen(HOS_SIDE, vid->firstline - vid->vsync_offset, - xsize, vid->lastline - vid->firstline); - } + cga_do_blit(xsize, vid->firstline, vid->lastline, vid->double_type); } + frames++; video_res_x = xsize; @@ -893,8 +890,7 @@ tandy_vid_init(tandy_t *dev) if (dev->is_sl2) { vid->b8000_limit = 0x8000; vid->planar_ctrl = 4; - overscan_x = HOS_SIDE; - overscan_y = 16; + overscan_x = overscan_y = 16; io_sethandler(0x0065, 1, tandy_vid_in, NULL, NULL, tandy_vid_out, NULL, NULL, dev); } else