mirror of
https://github.com/86Box/86Box.git
synced 2026-02-23 01:48:21 -07:00
Apply vsync_offset during scanline rendering instead of the final blit; clean up code
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user