Apply vsync_offset during scanline rendering instead of the final blit; clean up code

This commit is contained in:
pixel-jupiter
2025-09-25 15:42:17 +03:00
parent 4583092751
commit aa7cb72c93

View File

@@ -27,8 +27,6 @@
#include <wchar.h>
#include <math.h>
#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