8514/A: Pitch no longer hardcoded to 1024, fixes 640x480x256 resolutions.

8514/A: More fixes to the accelerated engine, mainly in paintbrush (blackness brush).
SVGA: Preparation of the next batch.
This commit is contained in:
TC1995
2022-06-12 17:31:54 +02:00
parent 92c3768a48
commit da273446d1
2 changed files with 357 additions and 422 deletions

View File

@@ -11,11 +11,9 @@
*
*
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
* Authors: TheCollector1995.
*
* Copyright 2008-2019 Sarah Walker.
* Copyright 2016-2019 Miran Grca.
* Copyright 2022 TheCollector1995.
*/
#include <stdarg.h>
#include <stdint.h>
@@ -37,7 +35,6 @@
#include <86box/video.h>
#include <86box/vid_svga.h>
#include <86box/vid_svga_render.h>
#include <86box/vid_8514a.h>
#include "cpu.h"
#define INT_VSY (1 << 0)
@@ -67,8 +64,8 @@ static void ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint
#define READ_PIXTRANS_WORD(cx, n) \
if (cmd <= 1) { \
temp = dev->vram[((dev->accel.cy * 1024) + (cx) + (n)) & dev->vram_mask]; \
temp |= (dev->vram[((dev->accel.cy * 1024) + (cx) + (n + 1)) & dev->vram_mask] << 8); \
temp = dev->vram[((dev->accel.cy * dev->h_disp) + (cx) + (n)) & dev->vram_mask]; \
temp |= (dev->vram[((dev->accel.cy * dev->h_disp) + (cx) + (n + 1)) & dev->vram_mask] << 8); \
} else { \
temp = dev->vram[(dev->accel.dest + (cx) + (n)) & dev->vram_mask]; \
temp |= (dev->vram[(dev->accel.dest + (cx) + (n + 1)) & dev->vram_mask] << 8); \
@@ -513,6 +510,8 @@ ibm8514_accel_out_fifo(ibm8514_t *dev, uint16_t port, uint32_t val, int len)
dev->accel.short_stroke = (dev->accel.short_stroke & 0xff00) | val;
else {
dev->accel.short_stroke = val;
dev->accel.cx = dev->accel.cur_x;
dev->accel.cy = dev->accel.cur_y;
if (dev->accel.cur_x & 0x400)
dev->accel.cx |= ~0x3ff;
if (dev->accel.cur_y & 0x400)
@@ -959,6 +958,7 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len)
case 0x4ae8:
dev->accel.advfunc_cntl = val & 7;
vga_on = ((dev->accel.advfunc_cntl & 1) == 0) ? 1 : 0;
ibm8514_on = !vga_on;
//pclog("IBM 8514/A: VGA ON = %i, val = %02x\n", vga_on, val);
svga_recalctimings(svga);
break;
@@ -1257,7 +1257,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
case 2: src_dat = cpu_dat & 0xff; break;
case 3: src_dat = 0; break;
}
READ((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -1269,7 +1269,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
MIX(mix_dat & mix_mask, dest_dat, src_dat);
if (dev->accel.ssv_draw) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
}
}
}
@@ -1333,13 +1333,13 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
mix_dat = mix_mask; /* Mix data = forced to foreground register. */
} else if (ibm8514_cpu_dest(dev) && (pixcntl == 3)) {
/* Mix data = current video memory value. */
READ((dev->accel.cy * 1024) + dev->accel.cx, mix_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, mix_dat);
mix_dat = ((mix_dat & rd_mask) == rd_mask);
mix_dat = mix_dat ? mix_mask : 0;
}
if (ibm8514_cpu_dest(dev)) {
READ((dev->accel.cy * 1024) + dev->accel.cx, src_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, src_dat);
if (pixcntl == 3)
src_dat = ((src_dat & rd_mask) == rd_mask);
} else switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
@@ -1349,7 +1349,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
case 3: src_dat = 0; break;
}
READ((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -1361,10 +1361,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
old_dest_dat = dest_dat;
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
if (ibm8514_cpu_src(dev) || !cpu_input) {
if ((dev->accel.cmd & 4) && dev->accel.sy) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
} else if (!(dev->accel.cmd & 4)) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
}
}
}
}
@@ -1403,7 +1405,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
if ((dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r &&
dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b)) {
if (ibm8514_cpu_dest(dev)) {
READ((dev->accel.cy * 1024) + dev->accel.cx, src_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, src_dat);
} else switch ((mix_dat & 1) ? frgd_mix : bkgd_mix) {
case 0: src_dat = bkgd_color; break;
case 1: src_dat = frgd_color; break;
@@ -1411,7 +1413,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
case 3: src_dat = 0; break;
}
READ((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -1424,9 +1426,9 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
MIX(mix_dat & 1, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
if ((dev->accel.cmd & 4) && dev->accel.sy) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
} else if (!(dev->accel.cmd & 4)) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
}
}
}
@@ -1477,13 +1479,13 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
mix_dat = mix_mask; /* Mix data = forced to foreground register. */
} else if (ibm8514_cpu_dest(dev) && (pixcntl == 3)) {
/* Mix data = current video memory value. */
READ((dev->accel.cy * 1024) + dev->accel.cx, mix_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, mix_dat);
mix_dat = ((mix_dat & rd_mask) == rd_mask);
mix_dat = mix_dat ? mix_mask : 0;
}
if (ibm8514_cpu_dest(dev)) {
READ((dev->accel.cy * 1024) + dev->accel.cx, src_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, src_dat);
if (pixcntl == 3)
src_dat = ((src_dat & rd_mask) == rd_mask);
} else switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
@@ -1493,7 +1495,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
case 3: src_dat = 0; break;
}
READ((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -1506,9 +1508,9 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
if ((dev->accel.cmd & 4) && dev->accel.sy) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
} else if (!(dev->accel.cmd & 4)) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
}
}
}
@@ -1582,7 +1584,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
dev->accel.cy |= ~0x3ff;
dev->accel.fill_state = 0;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
if (cmd == 4)
dev->accel.cmd |= 2;
@@ -1600,60 +1602,28 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
} else {
if (and3 == 1) {
dev->accel.sx += 4;
switch (dev->accel.cmd & 0xe0) {
case 0x00:
case 0x20:
case 0xe0:
dev->accel.cx -= 4;
break;
case 0x60:
case 0x80:
case 0xa0:
if (dev->accel.cmd & 0x20)
dev->accel.cx += 4;
break;
}
else
dev->accel.cx -= 4;
} else if (and3 == 2) {
dev->accel.sx += 5;
switch (dev->accel.cmd & 0xe0) {
case 0x00:
case 0x20:
case 0xe0:
dev->accel.cx -= 5;
break;
case 0x60:
case 0x80:
case 0xa0:
if (dev->accel.cmd & 0x20)
dev->accel.cx += 5;
break;
}
else
dev->accel.cx -= 5;
} else if (and3 == 3) {
dev->accel.sx += 6;
switch (dev->accel.cmd & 0xe0) {
case 0x00:
case 0x20:
case 0xe0:
dev->accel.cx -= 6;
break;
case 0x60:
case 0x80:
case 0xa0:
if (dev->accel.cmd & 0x20)
dev->accel.cx += 6;
break;
}
else
dev->accel.cx -= 6;
} else {
dev->accel.sx += 3;
switch (dev->accel.cmd & 0xe0) {
case 0x00:
case 0x20:
case 0xe0:
dev->accel.cx -= 3;
break;
case 0x60:
case 0x80:
case 0xa0:
if (dev->accel.cmd & 0x20)
dev->accel.cx += 3;
break;
}
else
dev->accel.cx -= 3;
}
}
}
@@ -1661,7 +1631,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
if (!(dev->accel.cmd & 0x40) && (frgd_mix == 2) && (bkgd_mix == 2) && (pixcntl == 0) && (cmd == 2)) {
if (!(dev->accel.sx & 1)) {
dev->accel.output = 1;
dev->accel.newdest_out = (dev->accel.cy + 1) * 1024;
dev->accel.newdest_out = (dev->accel.cy + 1) * dev->h_disp;
}
}
}
@@ -1672,7 +1642,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
if (!(dev->accel.cmd & 2) && (frgd_mix == 2) && (pixcntl == 0) && (cmd == 2)) {
if (!(dev->accel.sx & 1)) {
dev->accel.input = 1;
dev->accel.newdest_in = (dev->accel.cy + 1) * 1024;
dev->accel.newdest_in = (dev->accel.cy + 1) * dev->h_disp;
}
}
dev->data_available = 1;
@@ -1690,7 +1660,7 @@ rect_fill_pix:
if ((dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r &&
dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b)) {
if (ibm8514_cpu_dest(dev) && (pixcntl == 0)) {
mix_dat = mix_dat; /* Mix data = forced to foreground register. */
mix_dat = mix_mask; /* Mix data = forced to foreground register. */
} else if (ibm8514_cpu_dest(dev) && (pixcntl == 3)) {
/* Mix data = current video memory value. */
READ(dev->accel.dest + dev->accel.cx, mix_dat);
@@ -1786,16 +1756,12 @@ rect_fill_pix:
cpu_dat >>= 8;
switch (dev->accel.cmd & 0xe0) {
case 0x00:
case 0x20:
case 0xe0:
dev->accel.cx++;
break;
case 0x60:
case 0x80:
case 0xa0:
dev->accel.cx--;
break;
case 0x00: dev->accel.cx++; break;
case 0x20: dev->accel.cx++; break;
case 0x60: dev->accel.cx--; break;
case 0x80: dev->accel.cx--; break;
case 0xa0: dev->accel.cx--; break;
case 0xe0: dev->accel.cx++; break;
}
dev->accel.sx--;
@@ -1811,33 +1777,21 @@ rect_fill_pix:
dev->accel.sx += 3;
}
switch (dev->accel.cmd & 0xe0) {
case 0x00:
case 0x20:
case 0xe0:
if (dev->accel.cmd & 0x20)
dev->accel.cx -= (dev->accel.sx + 1);
break;
case 0x60:
case 0x80:
case 0xa0:
else
dev->accel.cx += (dev->accel.sx + 1);
break;
}
switch (dev->accel.cmd & 0xe0) {
case 0x20:
case 0x40:
case 0x60:
dev->accel.cy--;
break;
case 0xa0:
case 0xc0:
case 0xe0:
dev->accel.cy++;
break;
case 0x20: dev->accel.cy--; break;
case 0x40: dev->accel.cy--; break;
case 0x60: dev->accel.cy--; break;
case 0xa0: dev->accel.cy++; break;
case 0xc0: dev->accel.cy++; break;
case 0xe0: dev->accel.cy++; break;
}
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -1911,7 +1865,7 @@ rect_fill_pix:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -1992,7 +1946,7 @@ rect_fill_pix:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -2035,7 +1989,6 @@ rect_fill_pix:
}
}
}
mix_dat <<= 1;
mix_dat |= 1;
@@ -2054,9 +2007,8 @@ rect_fill_pix:
dev->accel.cy++;
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.newdest_in = (dev->accel.cy + 1) * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.newdest_in = (dev->accel.cy + 1) * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -2070,14 +2022,12 @@ rect_fill_pix:
dev->accel.cx++;
else
dev->accel.cx--;
if (dev->accel.cmd & 0x80)
dev->accel.cy++;
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.newdest_in = (dev->accel.cy + 1) * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.newdest_in = (dev->accel.cy + 1) * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -2111,7 +2061,6 @@ rect_fill_pix:
}
}
}
mix_dat <<= 1;
mix_dat |= 1;
cpu_dat >>= 8;
@@ -2132,8 +2081,8 @@ rect_fill_pix:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.newdest_out = (dev->accel.cy + 1) * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.newdest_out = (dev->accel.cy + 1) * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -2152,8 +2101,8 @@ rect_fill_pix:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.newdest_out = (dev->accel.cy + 1) * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.newdest_out = (dev->accel.cy + 1) * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -2229,7 +2178,7 @@ rect_fill_pix:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -2298,7 +2247,7 @@ rect_fill:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
dev->accel.cur_x = dev->accel.cx;
@@ -2361,7 +2310,7 @@ rect_fill:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
if (dev->accel.sy < 0) {
@@ -2435,7 +2384,7 @@ rect_fill:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
if (dev->accel.sy < 0) {
@@ -2494,7 +2443,7 @@ rect_fill:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
if (dev->accel.sy < 0) {
@@ -2550,13 +2499,13 @@ rect_fill:
mix_dat = mix_mask; /* Mix data = forced to foreground register. */
} else if (ibm8514_cpu_dest(dev) && (pixcntl == 3)) {
/* Mix data = current video memory value. */
READ((dev->accel.cy * 1024) + dev->accel.cx, mix_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, mix_dat);
mix_dat = ((mix_dat & rd_mask) == rd_mask);
mix_dat = mix_dat ? mix_mask : 0;
}
if (ibm8514_cpu_dest(dev)) {
READ((dev->accel.cy * 1024) + dev->accel.cx, src_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, src_dat);
if (pixcntl == 3)
src_dat = ((src_dat & rd_mask) == rd_mask);
} else switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
@@ -2566,7 +2515,7 @@ rect_fill:
case 3: src_dat = 0; break;
}
READ((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -2580,13 +2529,12 @@ rect_fill:
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
if ((dev->accel.cmd & 4) && dev->accel.sy) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
} else if (!(dev->accel.cmd & 4)) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
}
}
}
mix_dat <<= 1;
mix_dat |= 1;
cpu_dat >>= 8;
@@ -2621,7 +2569,7 @@ rect_fill:
if ((dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r &&
dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b)) {
if (ibm8514_cpu_dest(dev)) {
READ((dev->accel.cy * 1024) + dev->accel.cx, src_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, src_dat);
} else switch ((mix_dat & 1) ? frgd_mix : bkgd_mix) {
case 0: src_dat = bkgd_color; break;
case 1: src_dat = frgd_color; break;
@@ -2629,7 +2577,7 @@ rect_fill:
case 3: src_dat = 0; break;
}
READ((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -2642,13 +2590,12 @@ rect_fill:
MIX(mix_dat & 1, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
if ((dev->accel.cmd & 4) && dev->accel.sy) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
} else if (!(dev->accel.cmd & 4)) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
}
}
}
dev->accel.temp_cnt--;
mix_dat >>= 1;
cpu_dat >>= 8;
@@ -2702,13 +2649,13 @@ rect_fill:
mix_dat = mix_mask; /* Mix data = forced to foreground register. */
} else if (ibm8514_cpu_dest(dev) && (pixcntl == 3)) {
/* Mix data = current video memory value. */
READ((dev->accel.cy * 1024) + dev->accel.cx, mix_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, mix_dat);
mix_dat = ((mix_dat & rd_mask) == rd_mask);
mix_dat = mix_dat ? mix_mask : 0;
}
if (ibm8514_cpu_dest(dev)) {
READ((dev->accel.cy * 1024) + dev->accel.cx, src_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, src_dat);
if (pixcntl == 3)
src_dat = ((src_dat & rd_mask) == rd_mask);
} else switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
@@ -2718,7 +2665,7 @@ rect_fill:
case 3: src_dat = 0; break;
}
READ((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
READ((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -2731,13 +2678,12 @@ rect_fill:
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
if ((dev->accel.cmd & 4) && dev->accel.sy) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
} else if (!(dev->accel.cmd & 4)) {
WRITE((dev->accel.cy * 1024) + dev->accel.cx, dest_dat);
WRITE((dev->accel.cy * dev->h_disp) + dev->accel.cx, dest_dat);
}
}
}
mix_dat <<= 1;
mix_dat |= 1;
cpu_dat >>= 8;
@@ -2807,8 +2753,8 @@ rect_fill:
if (dev->accel.cur_y & 0x400)
dev->accel.cy |= ~0x3ff;
dev->accel.src = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.dy * 1024;
dev->accel.src = dev->accel.cy * dev->h_disp;
dev->accel.dest = dev->accel.dy * dev->h_disp;
if (ibm8514_cpu_src(dev)) {
if (dev->accel.cmd & 2) {
@@ -2903,7 +2849,7 @@ bitblt_pix:
else
dev->accel.cy--;
dev->accel.dest = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -2998,8 +2944,8 @@ bitblt_pix:
dev->accel.cy--;
}
dev->accel.dest = dev->accel.dy * 1024;
dev->accel.src = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.dy * dev->h_disp;
dev->accel.src = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -3055,7 +3001,6 @@ bitblt_pix:
WRITE(dev->accel.dest + dev->accel.dx, dest_dat);
}
}
mix_dat <<= 1;
mix_dat |= 1;
cpu_dat >>= 8;
@@ -3088,8 +3033,8 @@ bitblt_pix:
dev->accel.cy--;
}
dev->accel.dest = dev->accel.dy * 1024;
dev->accel.src = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.dy * dev->h_disp;
dev->accel.src = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -3167,8 +3112,8 @@ bitblt:
dev->accel.cy--;
}
dev->accel.dest = dev->accel.dy * 1024;
dev->accel.src = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.dy * dev->h_disp;
dev->accel.src = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
return;
}
@@ -3206,7 +3151,6 @@ bitblt:
WRITE(dev->accel.dest + dev->accel.dx, dest_dat);
}
}
dev->accel.temp_cnt--;
mix_dat >>= 1;
@@ -3238,8 +3182,8 @@ bitblt:
dev->accel.cy--;
}
dev->accel.dest = dev->accel.dy * 1024;
dev->accel.src = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.dy * dev->h_disp;
dev->accel.src = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
if (dev->accel.sy < 0) {
@@ -3292,7 +3236,6 @@ bitblt:
WRITE(dev->accel.dest + dev->accel.dx, dest_dat);
}
}
mix_dat <<= 1;
mix_dat |= 1;
@@ -3324,8 +3267,8 @@ bitblt:
dev->accel.cy--;
}
dev->accel.dest = dev->accel.dy * 1024;
dev->accel.src = dev->accel.cy * 1024;
dev->accel.dest = dev->accel.dy * dev->h_disp;
dev->accel.src = dev->accel.cy * dev->h_disp;
dev->accel.sy--;
if (dev->accel.sy < 0) {
@@ -3606,9 +3549,6 @@ ibm8514_recalctimings(svga_t *svga)
dev->v_syncstart = (dev->vsyncstart + 1);
dev->rowcount = !!(dev->disp_cntl & 0x08);
if (((dev->disp_cntl & 0x60) == 0) || ((dev->disp_cntl & 0x60) >= 0x40))
return;
if (dev->accel.advfunc_cntl & 4) {
if (dev->hdisp == 0) {
dev->rowoffset = 128;
@@ -3669,14 +3609,17 @@ ibm8514_mca_write(int port, uint8_t val, void *priv)
static uint8_t
ibm8514_mca_feedb(void *priv)
{
return 1;
svga_t *svga = (svga_t *)priv;
ibm8514_t *dev = &svga->dev8514;
return dev->pos_regs[2] & 1;
}
static void
*ibm8514_init(const device_t *info)
{
svga_t *svga = svga_8514;
svga_t *svga = svga_get_pri();
ibm8514_t *dev = &svga->dev8514;
dev->vram_size = 1024 << 10;
@@ -3687,7 +3630,6 @@ static void
dev->type = info->flags;
ibm8514_io_remove(svga);
ibm8514_io_set(svga);
if (info->flags & DEVICE_MCA) {
@@ -3715,7 +3657,6 @@ static void
ibm8514_speed_changed(void *p)
{
svga_t *svga = (svga_t *)p;
ibm8514_t *dev = &svga->dev8514;
svga_recalctimings(svga);
}
@@ -3724,9 +3665,8 @@ static void
ibm8514_force_redraw(void *p)
{
svga_t *svga = (svga_t *)p;
ibm8514_t *dev = &svga->dev8514;
dev->fullchange = changeframecount;
svga->fullchange = changeframecount;
}
// clang-format off

View File

@@ -9,7 +9,7 @@
* Generic SVGA handling.
*
* This is intended to be used by another SVGA driver,
* and not as a card in it's own right.
* and not as a card in its own right.
*
*
*
@@ -40,7 +40,6 @@
#include <86box/vid_svga.h>
#include <86box/vid_svga_render.h>
void svga_doblit(int wx, int wy, svga_t *svga);
svga_t *svga_8514;
@@ -53,7 +52,7 @@ uint8_t svga_rotate[8][256];
/*Primary SVGA device. As multiple video cards are not yet supported this is the
only SVGA device.*/
static svga_t *svga_pri;
int vga_on;
int vga_on, ibm8514_on;
svga_t
*svga_get_pri()
@@ -559,6 +558,7 @@ svga_recalctimings(svga_t *svga)
svga->recalctimings_ex(svga);
}
} else {
if (ibm8514_on && ibm8514_enabled)
ibm8514_recalctimings(svga);
}
@@ -657,7 +657,7 @@ svga_poll(void *p)
int wx, wy;
int ret, old_ma;
if (!vga_on) {
if (!vga_on && ibm8514_enabled && ibm8514_on) {
ibm8514_poll(&svga->dev8514, svga);
return;
}
@@ -991,11 +991,6 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize,
svga_pri = svga;
if (ibm8514_enabled)
svga_8514 = svga;
else
svga_8514 = NULL;
svga->ramdac_type = RAMDAC_6BIT;
svga->map8 = svga->pallook;