mirror of
https://github.com/86Box/86Box.git
synced 2026-02-24 02:18:20 -07:00
Replace dynamic horizontal overscan with fixed constants, fix character clock width calculation and remove vid_get_char_width()
This commit is contained in:
@@ -27,6 +27,8 @@
|
||||
#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>
|
||||
@@ -165,18 +167,6 @@ vid_update_latch(t1kvid_t *vid)
|
||||
vid->crtc[0x11] = lp_latch & 0xff;
|
||||
}
|
||||
|
||||
static int
|
||||
vid_get_char_width(t1kvid_t *vid)
|
||||
{
|
||||
if ((vid->mode & 2) && !(vid->mode & 1) && (vid->array[3] & 0x10)) { /*160x200*/
|
||||
return 32;
|
||||
} else if (!(vid->mode & 16) && ((vid->mode & 2) || (vid->mode & 4))) { /*320x200 + 40-column text*/
|
||||
return 16;
|
||||
} else { /*640x200 + 80-column text*/
|
||||
return 8;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
baseline_calib_start(t1kvid_t *vid)
|
||||
{
|
||||
@@ -200,7 +190,7 @@ baseline_calib_finish(void *priv)
|
||||
static void
|
||||
vid_update_display_offset(t1kvid_t *vid, uint8_t reg)
|
||||
{
|
||||
int hsync_scale = vid_get_char_width(vid);
|
||||
int hsync_scale = (vid->mode & 1) ? 8 : 16;
|
||||
int vsync_scale = vid->crtc[9] + 1;
|
||||
|
||||
if (reg == 1 || reg == 6) {
|
||||
@@ -403,7 +393,7 @@ vid_read(uint32_t addr, void *priv)
|
||||
}
|
||||
|
||||
static void
|
||||
vid_render(tandy_t *dev, int line, int hos, int hos_offs)
|
||||
vid_render(tandy_t *dev, int line, int hos_offs)
|
||||
{
|
||||
t1kvid_t *vid = dev->vid;
|
||||
uint16_t cursoraddr = (vid->crtc[15] | (vid->crtc[14] << 8)) & 0x3fff;
|
||||
@@ -428,7 +418,7 @@ vid_render(tandy_t *dev, int line, int hos, int hos_offs)
|
||||
}
|
||||
}
|
||||
|
||||
for (c = 0; c < hos - vid->hsync_offset; c++) {
|
||||
for (c = 0; c < HOS_SIDE - 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];
|
||||
@@ -610,35 +600,35 @@ vid_render(tandy_t *dev, int line, int hos, int hos_offs)
|
||||
}
|
||||
|
||||
static void
|
||||
vid_render_blank(tandy_t *dev, int line, int hos_tot)
|
||||
vid_render_blank(tandy_t *dev, int line)
|
||||
{
|
||||
t1kvid_t *vid = dev->vid;
|
||||
|
||||
if (vid->array[3] & 4) {
|
||||
if (vid->mode & 1)
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 3) + hos_tot, (vid->array[2] & 0xf) + 16);
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 3) + HOS, (vid->array[2] & 0xf) + 16);
|
||||
else
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 4) + hos_tot, (vid->array[2] & 0xf) + 16);
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 4) + HOS, (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_tot, cols);
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 3) + HOS, cols);
|
||||
else
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 4) + hos_tot, cols);
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 4) + HOS, cols);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
vid_render_process(tandy_t *dev, int line, int hos_tot)
|
||||
vid_render_process(tandy_t *dev, int line)
|
||||
{
|
||||
t1kvid_t *vid = dev->vid;
|
||||
int x;
|
||||
|
||||
if (vid->mode & 1)
|
||||
x = (vid->crtc[1] << 3) + hos_tot;
|
||||
x = (vid->crtc[1] << 3) + HOS;
|
||||
else
|
||||
x = (vid->crtc[1] << 4) + hos_tot;
|
||||
x = (vid->crtc[1] << 4) + HOS;
|
||||
|
||||
if (!dev->is_sl2 && vid->composite)
|
||||
Composite_Process(vid->mode, 0, x >> 2, buffer32->line[line]);
|
||||
@@ -657,9 +647,7 @@ vid_poll(void *priv)
|
||||
int oldvc;
|
||||
int scanline_old;
|
||||
int old_ma;
|
||||
int hos = vid_get_char_width(vid);
|
||||
int hos_tot = hos << 1;
|
||||
int hos_offs = hos + vid->hsync_offset;
|
||||
int hos_offs = HOS_SIDE + vid->hsync_offset;
|
||||
|
||||
if (!vid->linepos) {
|
||||
timer_advance_u64(&vid->timer, vid->dispofftime);
|
||||
@@ -676,39 +664,39 @@ vid_poll(void *priv)
|
||||
vid->lastline = vid->displine;
|
||||
switch (vid->double_type) {
|
||||
default:
|
||||
vid_render(dev, vid->displine << 1, hos, hos_offs);
|
||||
vid_render_blank(dev, (vid->displine << 1) + 1, hos_tot);
|
||||
vid_render(dev, vid->displine << 1, hos_offs);
|
||||
vid_render_blank(dev, (vid->displine << 1) + 1);
|
||||
break;
|
||||
case DOUBLE_NONE:
|
||||
vid_render(dev, vid->displine, hos, hos_offs);
|
||||
vid_render(dev, vid->displine, hos_offs);
|
||||
break;
|
||||
case DOUBLE_SIMPLE:
|
||||
old_ma = vid->memaddr;
|
||||
vid_render(dev, vid->displine << 1, hos, hos_offs);
|
||||
vid_render(dev, vid->displine << 1, hos_offs);
|
||||
vid->memaddr = old_ma;
|
||||
vid_render(dev, (vid->displine << 1) + 1, hos, hos_offs);
|
||||
vid_render(dev, (vid->displine << 1) + 1, hos_offs);
|
||||
break;
|
||||
}
|
||||
} else switch (vid->double_type) {
|
||||
default:
|
||||
vid_render_blank(dev, vid->displine << 1, hos_tot);
|
||||
vid_render_blank(dev, vid->displine << 1);
|
||||
break;
|
||||
case DOUBLE_NONE:
|
||||
vid_render_blank(dev, vid->displine, hos_tot);
|
||||
vid_render_blank(dev, vid->displine);
|
||||
break;
|
||||
case DOUBLE_SIMPLE:
|
||||
vid_render_blank(dev, vid->displine << 1, hos_tot);
|
||||
vid_render_blank(dev, (vid->displine << 1) + 1, hos_tot);
|
||||
vid_render_blank(dev, vid->displine << 1);
|
||||
vid_render_blank(dev, (vid->displine << 1) + 1);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (vid->double_type) {
|
||||
default:
|
||||
vid_render_process(dev, vid->displine << 1, hos_tot);
|
||||
vid_render_process(dev, (vid->displine << 1) + 1, hos_tot);
|
||||
vid_render_process(dev, vid->displine << 1);
|
||||
vid_render_process(dev, (vid->displine << 1) + 1);
|
||||
break;
|
||||
case DOUBLE_NONE:
|
||||
vid_render_process(dev, vid->displine, hos_tot);
|
||||
vid_render_process(dev, vid->displine);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -778,9 +766,9 @@ vid_poll(void *priv)
|
||||
picint(1 << 5);
|
||||
if (vid->crtc[7]) {
|
||||
if (vid->mode & 1)
|
||||
x = (vid->crtc[1] << 3) + hos_tot;
|
||||
x = (vid->crtc[1] << 3) + HOS;
|
||||
else
|
||||
x = (vid->crtc[1] << 4) + hos_tot;
|
||||
x = (vid->crtc[1] << 4) + HOS;
|
||||
vid->lastline++;
|
||||
|
||||
xs_temp = x;
|
||||
@@ -792,7 +780,7 @@ vid_poll(void *priv)
|
||||
if (ys_temp < 32)
|
||||
ys_temp = 400;
|
||||
if (!enable_overscan)
|
||||
xs_temp -= hos_tot;
|
||||
xs_temp -= HOS;
|
||||
|
||||
if ((xs_temp != xsize) || (ys_temp != ysize) || video_force_resize_get()) {
|
||||
xsize = xs_temp;
|
||||
@@ -809,7 +797,7 @@ vid_poll(void *priv)
|
||||
xsize, ((vid->lastline - vid->firstline) << 1) + 16,
|
||||
vid->double_type);
|
||||
else
|
||||
cga_blit_memtoscreen(hos, (vid->firstline << 1) - (vid->vsync_offset << 1),
|
||||
cga_blit_memtoscreen(HOS_SIDE, (vid->firstline << 1) - (vid->vsync_offset << 1),
|
||||
xsize, (vid->lastline - vid->firstline) << 1,
|
||||
vid->double_type);
|
||||
} else {
|
||||
@@ -817,7 +805,7 @@ vid_poll(void *priv)
|
||||
video_blit_memtoscreen(0, (vid->firstline - 4) - vid->vsync_offset,
|
||||
xsize, (vid->lastline - vid->firstline) + 8);
|
||||
else
|
||||
video_blit_memtoscreen(hos, vid->firstline - vid->vsync_offset,
|
||||
video_blit_memtoscreen(HOS_SIDE, vid->firstline - vid->vsync_offset,
|
||||
xsize, vid->lastline - vid->firstline);
|
||||
}
|
||||
}
|
||||
@@ -905,7 +893,7 @@ tandy_vid_init(tandy_t *dev)
|
||||
if (dev->is_sl2) {
|
||||
vid->b8000_limit = 0x8000;
|
||||
vid->planar_ctrl = 4;
|
||||
overscan_x = vid_get_char_width(vid) << 1;
|
||||
overscan_x = HOS_SIDE;
|
||||
overscan_y = 16;
|
||||
|
||||
io_sethandler(0x0065, 1, tandy_vid_in, NULL, NULL, tandy_vid_out, NULL, NULL, dev);
|
||||
|
||||
Reference in New Issue
Block a user