mirror of
https://github.com/86Box/86Box.git
synced 2026-02-22 17:45:31 -07:00
Add bounds checking for negative line and horizontal coordinates in the rendering functions
This commit is contained in:
@@ -396,35 +396,36 @@ vid_render(tandy_t *dev, int line, int hos_offs)
|
||||
uint16_t dat;
|
||||
int col;
|
||||
int cols[4];
|
||||
int out_x;
|
||||
|
||||
cols[0] = (vid->array[2] & 0xf) + 16;
|
||||
|
||||
for (c = 0; c < hos_offs; c++) {
|
||||
if (vid->array[3] & 4) {
|
||||
buffer32->line[line][c] = cols[0];
|
||||
} else if ((vid->mode & 0x12) == 0x12) {
|
||||
buffer32->line[line][c] = 0;
|
||||
} else {
|
||||
buffer32->line[line][c] = buffer32->line[(line) + 1][c] = (vid->col & 15) + 16;
|
||||
if (line >= 0) {
|
||||
for (c = 0; c < hos_offs; c++) {
|
||||
if (vid->array[3] & 4) {
|
||||
buffer32->line[line][c] = cols[0];
|
||||
} else if ((vid->mode & 0x12) == 0x12) {
|
||||
buffer32->line[line][c] = 0;
|
||||
} else {
|
||||
buffer32->line[line][c] = buffer32->line[(line) + 1][c] = (vid->col & 15) + 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (c = 0; c < 8 - vid->hsync_offset; c++) {
|
||||
if (vid->array[3] & 4) {
|
||||
for (c = 0; c < 8 - vid->hsync_offset; c++) {
|
||||
if (vid->mode & 1)
|
||||
buffer32->line[line][c + (vid->crtc[1] << 3) + hos_offs] = cols[0];
|
||||
out_x = c + (vid->crtc[1] << 3) + hos_offs;
|
||||
else
|
||||
buffer32->line[line][c + (vid->crtc[1] << 4) + hos_offs] = cols[0];
|
||||
} else if ((vid->mode & 0x12) == 0x12) {
|
||||
if (vid->mode & 1)
|
||||
buffer32->line[line][c + (vid->crtc[1] << 3) + hos_offs] = 0;
|
||||
else
|
||||
buffer32->line[line][c + (vid->crtc[1] << 4) + hos_offs] = 0;
|
||||
} else {
|
||||
if (vid->mode & 1)
|
||||
buffer32->line[line][c + (vid->crtc[1] << 3) + hos_offs] = (vid->col & 15) + 16;
|
||||
else
|
||||
buffer32->line[line][c + (vid->crtc[1] << 4) + hos_offs] = (vid->col & 15) + 16;
|
||||
out_x = c + (vid->crtc[1] << 4) + hos_offs;
|
||||
|
||||
if (out_x >= 0) {
|
||||
if (vid->array[3] & 4) {
|
||||
buffer32->line[line][out_x] = cols[0];
|
||||
} else if ((vid->mode & 0x12) == 0x12) {
|
||||
buffer32->line[line][out_x] = 0;
|
||||
} else {
|
||||
buffer32->line[line][out_x] = (vid->col & 15) + 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -432,24 +433,30 @@ vid_render(tandy_t *dev, int line, int hos_offs)
|
||||
for (x = 0; x < vid->crtc[1] * 2; x++) {
|
||||
dat = (vid->vram[(vid->memaddr << 1) & 0xffff] << 8) | vid->vram[((vid->memaddr << 1) + 1) & 0xffff];
|
||||
vid->memaddr++;
|
||||
buffer32->line[line][(x << 2) + hos_offs] = vid->array[((dat >> 12) & 0xf) + 16] + 16;
|
||||
buffer32->line[line][(x << 2) + hos_offs + 1] = vid->array[((dat >> 8) & 0xf) + 16] + 16;
|
||||
buffer32->line[line][(x << 2) + hos_offs + 2] = vid->array[((dat >> 4) & 0xf) + 16] + 16;
|
||||
buffer32->line[line][(x << 2) + hos_offs + 3] = vid->array[(dat & 0xf) + 16] + 16;
|
||||
out_x = (x << 2) + hos_offs;
|
||||
if (line >= 0) {
|
||||
if (out_x >= 0) buffer32->line[line][out_x] = vid->array[((dat >> 12) & 0xf) + 16] + 16;
|
||||
if (out_x + 1 >= 0) buffer32->line[line][out_x + 1] = vid->array[((dat >> 8) & 0xf) + 16] + 16;
|
||||
if (out_x + 2 >= 0) buffer32->line[line][out_x + 2] = vid->array[((dat >> 4) & 0xf) + 16] + 16;
|
||||
if (out_x + 3 >= 0) buffer32->line[line][out_x + 3] = vid->array[(dat & 0xf) + 16] + 16;
|
||||
}
|
||||
}
|
||||
} else if ((vid->array[3] & 0x10) && (vid->mode & 1)) { /*320x200x16*/
|
||||
for (x = 0; x < vid->crtc[1]; x++) {
|
||||
dat = (vid->vram[((vid->memaddr << 1) & 0x1fff) + ((vid->scanline & 3) * 0x2000)] << 8) |
|
||||
vid->vram[((vid->memaddr << 1) & 0x1fff) + ((vid->scanline & 3) * 0x2000) + 1];
|
||||
vid->memaddr++;
|
||||
buffer32->line[line][(x << 3) + hos_offs] = buffer32->line[line][(x << 3) + hos_offs + 1] =
|
||||
vid->array[((dat >> 12) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[line][(x << 3) + hos_offs + 2] = buffer32->line[line][(x << 3) + hos_offs + 3] =
|
||||
vid->array[((dat >> 8) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[line][(x << 3) + hos_offs + 4] = buffer32->line[line][(x << 3) + hos_offs + 5] =
|
||||
vid->array[((dat >> 4) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[line][(x << 3) + hos_offs + 6] = buffer32->line[line][(x << 3) + hos_offs + 7] =
|
||||
vid->array[(dat & vid->array[1] & 0x0f) + 16] + 16;
|
||||
out_x = (x << 3) + hos_offs;
|
||||
if (line >= 0) {
|
||||
if (out_x >= 0) buffer32->line[line][out_x] = buffer32->line[line][out_x + 1] =
|
||||
vid->array[((dat >> 12) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
if (out_x + 2 >= 0) buffer32->line[line][out_x + 2] = buffer32->line[line][out_x + 3] =
|
||||
vid->array[((dat >> 8) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
if (out_x + 4 >= 0) buffer32->line[line][out_x + 4] = buffer32->line[line][out_x + 5] =
|
||||
vid->array[((dat >> 4) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
if (out_x + 6 >= 0) buffer32->line[line][out_x + 6] = buffer32->line[line][out_x + 7] =
|
||||
vid->array[(dat & vid->array[1] & 0x0f) + 16] + 16;
|
||||
}
|
||||
}
|
||||
} else if (vid->array[3] & 0x10) { /*160x200x16*/
|
||||
for (x = 0; x < vid->crtc[1]; x++) {
|
||||
@@ -460,18 +467,21 @@ vid_render(tandy_t *dev, int line, int hos_offs)
|
||||
dat = (vid->vram[((vid->memaddr << 1) & 0x1fff) + ((vid->scanline & 3) * 0x2000)] << 8) |
|
||||
vid->vram[((vid->memaddr << 1) & 0x1fff) + ((vid->scanline & 3) * 0x2000) + 1];
|
||||
vid->memaddr++;
|
||||
buffer32->line[line][(x << 4) + hos_offs] = buffer32->line[line][(x << 4) + hos_offs + 1] =
|
||||
buffer32->line[line][(x << 4) + hos_offs + 2] = buffer32->line[line][(x << 4) + hos_offs + 3] =
|
||||
vid->array[((dat >> 12) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[line][(x << 4) + hos_offs + 4] = buffer32->line[line][(x << 4) + hos_offs + 5] =
|
||||
buffer32->line[line][(x << 4) + hos_offs + 6] = buffer32->line[line][(x << 4) + hos_offs + 7] =
|
||||
vid->array[((dat >> 8) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[line][(x << 4) + hos_offs + 8] = buffer32->line[line][(x << 4) + hos_offs + 9] =
|
||||
buffer32->line[line][(x << 4) + hos_offs + 10] = buffer32->line[line][(x << 4) + hos_offs + 11] =
|
||||
vid->array[((dat >> 4) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[line][(x << 4) + hos_offs + 12] = buffer32->line[line][(x << 4) + hos_offs + 13] =
|
||||
buffer32->line[line][(x << 4) + hos_offs + 14] = buffer32->line[line][(x << 4) + hos_offs + 15] =
|
||||
vid->array[(dat & vid->array[1] & 0x0f) + 16] + 16;
|
||||
out_x = (x << 4) + hos_offs;
|
||||
if (line >= 0) {
|
||||
if (out_x >= 0) buffer32->line[line][out_x] = buffer32->line[line][out_x + 1] =
|
||||
buffer32->line[line][out_x + 2] = buffer32->line[line][out_x + 3] =
|
||||
vid->array[((dat >> 12) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
if (out_x + 4 >= 0) buffer32->line[line][out_x + 4] = buffer32->line[line][out_x + 5] =
|
||||
buffer32->line[line][out_x + 6] = buffer32->line[line][out_x + 7] =
|
||||
vid->array[((dat >> 8) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
if (out_x + 8 >= 0) buffer32->line[line][out_x + 8] = buffer32->line[line][out_x + 9] =
|
||||
buffer32->line[line][out_x + 10] = buffer32->line[line][out_x + 11] =
|
||||
vid->array[((dat >> 4) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
if (out_x + 12 >= 0) buffer32->line[line][out_x + 12] = buffer32->line[line][out_x + 13] =
|
||||
buffer32->line[line][out_x + 14] = buffer32->line[line][out_x + 15] =
|
||||
vid->array[(dat & vid->array[1] & 0x0f) + 16] + 16;
|
||||
}
|
||||
}
|
||||
} else if (vid->array[3] & 0x08) { /*640x200x4 - this implementation is a complete guess!*/
|
||||
for (x = 0; x < vid->crtc[1]; x++) {
|
||||
@@ -481,8 +491,10 @@ vid_render(tandy_t *dev, int line, int hos_offs)
|
||||
for (c = 0; c < 8; c++) {
|
||||
chr = (dat >> 6) & 2;
|
||||
chr |= ((dat >> 15) & 1);
|
||||
buffer32->line[line][(x << 3) + hos_offs + c] =
|
||||
vid->array[(chr & vid->array[1]) + 16] + 16;
|
||||
out_x = (x << 3) + hos_offs + c;
|
||||
if (out_x >= 0 && line >= 0)
|
||||
buffer32->line[line][out_x] =
|
||||
vid->array[(chr & vid->array[1]) + 16] + 16;
|
||||
dat <<= 1;
|
||||
}
|
||||
}
|
||||
@@ -500,17 +512,27 @@ vid_render(tandy_t *dev, int line, int hos_offs)
|
||||
cols[1] = vid->array[((attr & 15) & vid->array[1]) + 16] + 16;
|
||||
cols[0] = vid->array[((attr >> 4) & vid->array[1]) + 16] + 16;
|
||||
}
|
||||
if (vid->scanline & 8) for (c = 0; c < 8; c++)
|
||||
buffer32->line[line][(x << 3) + c + hos_offs] =
|
||||
((chr >= 0xb3) && (chr <= 0xdf)) ? cols[(fontdat[chr][7] & (1 << (c ^ 7))) ? 1 : 0] : cols[0];
|
||||
else for (c = 0; c < 8; c++) {
|
||||
if (vid->scanline == 8)
|
||||
buffer32->line[line][(x << 3) + c + hos_offs] = cols[(fontdat[chr][7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
else
|
||||
buffer32->line[line][(x << 3) + c + hos_offs] = cols[(fontdat[chr][vid->scanline & 7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
if (line >= 0) {
|
||||
if (vid->scanline & 8) for (c = 0; c < 8; c++) {
|
||||
out_x = (x << 3) + c + hos_offs;
|
||||
if (out_x >= 0)
|
||||
buffer32->line[line][out_x] =
|
||||
((chr >= 0xb3) && (chr <= 0xdf)) ? cols[(fontdat[chr][7] & (1 << (c ^ 7))) ? 1 : 0] : cols[0];
|
||||
} else for (c = 0; c < 8; c++) {
|
||||
out_x = (x << 3) + c + hos_offs;
|
||||
if (out_x >= 0) {
|
||||
if (vid->scanline == 8)
|
||||
buffer32->line[line][out_x] = cols[(fontdat[chr][7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
else
|
||||
buffer32->line[line][out_x] = cols[(fontdat[chr][vid->scanline & 7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
}
|
||||
}
|
||||
if (drawcursor) for (c = 0; c < 8; c++) {
|
||||
out_x = (x << 3) + c + hos_offs;
|
||||
if (out_x >= 0)
|
||||
buffer32->line[line][out_x] ^= 15;
|
||||
}
|
||||
}
|
||||
if (drawcursor) for (c = 0; c < 8; c++)
|
||||
buffer32->line[line][(x << 3) + c + hos_offs] ^= 15;
|
||||
vid->memaddr++;
|
||||
}
|
||||
} else if (!(vid->mode & 2)) {
|
||||
@@ -528,22 +550,30 @@ vid_render(tandy_t *dev, int line, int hos_offs)
|
||||
cols[0] = vid->array[((attr >> 4) & vid->array[1]) + 16] + 16;
|
||||
}
|
||||
vid->memaddr++;
|
||||
if (vid->scanline & 8) for (c = 0; c < 8; c++)
|
||||
buffer32->line[line][(x << 4) + (c << 1) + hos_offs] =
|
||||
buffer32->line[line][(x << 4) + (c << 1) + 1 + hos_offs] =
|
||||
((chr >= 0xb3) && (chr <= 0xdf)) ? cols[(fontdat[chr][7] & (1 << (c ^ 7))) ? 1 : 0] : cols[0];
|
||||
else for (c = 0; c < 8; c++) {
|
||||
if (vid->scanline == 8)
|
||||
buffer32->line[line][(x << 4) + (c << 1) + hos_offs] =
|
||||
buffer32->line[line][(x << 4) + (c << 1) + 1 + hos_offs] =
|
||||
cols[(fontdat[chr][7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
else
|
||||
buffer32->line[line][(x << 4) + (c << 1) + hos_offs] =
|
||||
buffer32->line[line][(x << 4) + (c << 1) + 1 + hos_offs] =
|
||||
cols[(fontdat[chr][vid->scanline & 7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
if (line >= 0) {
|
||||
if (vid->scanline & 8) for (c = 0; c < 8; c++) {
|
||||
out_x = (x << 4) + (c << 1) + hos_offs;
|
||||
if (out_x >= 0) buffer32->line[line][out_x] =
|
||||
buffer32->line[line][out_x + 1] =
|
||||
((chr >= 0xb3) && (chr <= 0xdf)) ? cols[(fontdat[chr][7] & (1 << (c ^ 7))) ? 1 : 0] : cols[0];
|
||||
} else for (c = 0; c < 8; c++) {
|
||||
out_x = (x << 4) + (c << 1) + hos_offs;
|
||||
if (vid->scanline == 8) {
|
||||
if (out_x >= 0) buffer32->line[line][out_x] =
|
||||
buffer32->line[line][out_x + 1] =
|
||||
cols[(fontdat[chr][7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
} else {
|
||||
if (out_x >= 0) buffer32->line[line][out_x] =
|
||||
buffer32->line[line][out_x + 1] =
|
||||
cols[(fontdat[chr][vid->scanline & 7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
}
|
||||
}
|
||||
if (drawcursor) for (c = 0; c < 16; c++) {
|
||||
out_x = (x << 4) + c + hos_offs;
|
||||
if (out_x >= 0)
|
||||
buffer32->line[line][out_x] ^= 15;
|
||||
}
|
||||
}
|
||||
if (drawcursor) for (c = 0; c < 16; c++)
|
||||
buffer32->line[line][(x << 4) + c + hos_offs] ^= 15;
|
||||
}
|
||||
} else if (!(vid->mode & 16)) {
|
||||
cols[0] = (vid->col & 15);
|
||||
@@ -570,8 +600,9 @@ vid_render(tandy_t *dev, int line, int hos_offs)
|
||||
vid->vram[((vid->memaddr << 1) & 0x1fff) + ((vid->scanline & 1) * 0x2000) + 1];
|
||||
vid->memaddr++;
|
||||
for (c = 0; c < 8; c++) {
|
||||
buffer32->line[line][(x << 4) + (c << 1) + hos_offs] =
|
||||
buffer32->line[line][(x << 4) + (c << 1) + 1 + hos_offs] = cols[dat >> 14];
|
||||
out_x = (x << 4) + (c << 1) + hos_offs;
|
||||
if (out_x >= 0 && line >= 0) buffer32->line[line][out_x] =
|
||||
buffer32->line[line][out_x + 1] = cols[dat >> 14];
|
||||
dat <<= 2;
|
||||
}
|
||||
}
|
||||
@@ -583,7 +614,9 @@ vid_render(tandy_t *dev, int line, int hos_offs)
|
||||
vid->vram[((vid->memaddr << 1) & 0x1fff) + ((vid->scanline & 1) * 0x2000) + 1];
|
||||
vid->memaddr++;
|
||||
for (c = 0; c < 16; c++) {
|
||||
buffer32->line[line][(x << 4) + c + hos_offs] = buffer32->line[(line) + 1][(x << 4) + c + hos_offs] = cols[dat >> 15];
|
||||
out_x = (x << 4) + c + hos_offs;
|
||||
if (out_x >= 0 && line >= 0)
|
||||
buffer32->line[line][out_x] = buffer32->line[(line) + 1][out_x] = cols[dat >> 15];
|
||||
dat <<= 1;
|
||||
}
|
||||
}
|
||||
@@ -595,18 +628,20 @@ 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) + 16, (vid->array[2] & 0xf) + 16);
|
||||
else
|
||||
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 (line >= 0) {
|
||||
if (vid->array[3] & 4) {
|
||||
if (vid->mode & 1)
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 3) + 16, (vid->array[2] & 0xf) + 16);
|
||||
else
|
||||
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) + 16, cols);
|
||||
else
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 4) + 16, cols);
|
||||
if (vid->mode & 1)
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 3) + 16, cols);
|
||||
else
|
||||
hline(buffer32, 0, line, (vid->crtc[1] << 4) + 16, cols);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -621,10 +656,12 @@ vid_render_process(tandy_t *dev, int line)
|
||||
else
|
||||
x = (vid->crtc[1] << 4) + 16;
|
||||
|
||||
if (!dev->is_sl2 && vid->composite)
|
||||
Composite_Process(vid->mode, 0, x >> 2, buffer32->line[line]);
|
||||
else
|
||||
video_process_8(x, line);
|
||||
if (line >= 0) {
|
||||
if (!dev->is_sl2 && vid->composite)
|
||||
Composite_Process(vid->mode, 0, x >> 2, buffer32->line[line]);
|
||||
else
|
||||
video_process_8(x, line);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -639,8 +676,8 @@ vid_poll(void *priv)
|
||||
int scanline_old;
|
||||
int old_ma;
|
||||
int hos_offs = 8 + vid->hsync_offset;
|
||||
int displine_offs = (vid->displine + vid->vsync_offset < 0) ? 0 : vid->displine + vid->vsync_offset;
|
||||
int displine_offs_double = displine_offs << 1;
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user