Merge pull request #2031 from 86Box/tc1995
Added FastLine accel command to the TGUI96xx family of chips (TGUI944…
This commit is contained in:
@@ -1249,7 +1249,8 @@ enum
|
|||||||
TGUI_BITBLT = 1,
|
TGUI_BITBLT = 1,
|
||||||
TGUI_SCANLINE = 3,
|
TGUI_SCANLINE = 3,
|
||||||
TGUI_BRESENHAMLINE = 4,
|
TGUI_BRESENHAMLINE = 4,
|
||||||
TGUI_SHORTVECTOR = 5
|
TGUI_SHORTVECTOR = 5,
|
||||||
|
TGUI_FASTLINE = 6
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -1480,7 +1481,7 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
|
|||||||
tgui->accel.right >>= 2;
|
tgui->accel.right >>= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (tgui->accel.flags & (TGUI_SRCMONO|TGUI_SRCDISP))
|
switch (tgui->accel.flags & (TGUI_SRCMONO|TGUI_SRCDISP))
|
||||||
{
|
{
|
||||||
case TGUI_SRCCPU:
|
case TGUI_SRCCPU:
|
||||||
@@ -1572,31 +1573,36 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (count--) {
|
while (count--) {
|
||||||
src_dat = ((cpu_dat >> 31) ? tgui->accel.fg_col : tgui->accel.bg_col);
|
if ((tgui->type == TGUI_9440) || ((tgui->type >= TGUI_9660) && tgui->accel.dx >= tgui->accel.left && tgui->accel.dx <= tgui->accel.right &&
|
||||||
if (tgui->accel.bpp == 0)
|
tgui->accel.dy >= tgui->accel.top && tgui->accel.dy <= tgui->accel.bottom)) {
|
||||||
src_dat &= 0xff;
|
src_dat = ((cpu_dat >> 31) ? tgui->accel.fg_col : tgui->accel.bg_col);
|
||||||
else if (tgui->accel.bpp == 1)
|
if (tgui->accel.bpp == 0)
|
||||||
src_dat &= 0xffff;
|
src_dat &= 0xff;
|
||||||
|
else if (tgui->accel.bpp == 1)
|
||||||
|
src_dat &= 0xffff;
|
||||||
|
|
||||||
READ(tgui->accel.dst, dst_dat);
|
READ(tgui->accel.dst, dst_dat);
|
||||||
|
|
||||||
pat_dat = pattern_data[((tgui->accel.pat_y & 7)*8) + (tgui->accel.pat_x & 7)];
|
pat_dat = pattern_data[((tgui->accel.pat_y & 7)*8) + (tgui->accel.pat_x & 7)];
|
||||||
|
|
||||||
if (tgui->accel.bpp == 0)
|
if (tgui->accel.bpp == 0)
|
||||||
pat_dat &= 0xff;
|
pat_dat &= 0xff;
|
||||||
else if (tgui->accel.bpp == 1)
|
else if (tgui->accel.bpp == 1)
|
||||||
pat_dat &= 0xffff;
|
pat_dat &= 0xffff;
|
||||||
|
|
||||||
if (!(tgui->accel.flags & TGUI_TRANSENA) || (src_dat != trans_col)) {
|
if (!(tgui->accel.flags & TGUI_TRANSENA) || (src_dat != trans_col)) {
|
||||||
MIX();
|
MIX();
|
||||||
|
|
||||||
WRITE(tgui->accel.dst, out);
|
WRITE(tgui->accel.dst, out);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu_dat <<= 1;
|
cpu_dat <<= 1;
|
||||||
tgui->accel.src += xdir;
|
tgui->accel.src += xdir;
|
||||||
tgui->accel.dst += xdir;
|
tgui->accel.dst += xdir;
|
||||||
tgui->accel.pat_x += xdir;
|
tgui->accel.pat_x += xdir;
|
||||||
|
if (tgui->type >= TGUI_9660)
|
||||||
|
tgui->accel.dx += xdir;
|
||||||
|
|
||||||
tgui->accel.x++;
|
tgui->accel.x++;
|
||||||
if (tgui->accel.x > tgui->accel.size_x) {
|
if (tgui->accel.x > tgui->accel.size_x) {
|
||||||
@@ -1605,6 +1611,11 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
|
|||||||
tgui->accel.pat_x = tgui->accel.dst_x;
|
tgui->accel.pat_x = tgui->accel.dst_x;
|
||||||
tgui->accel.pat_y += ydir;
|
tgui->accel.pat_y += ydir;
|
||||||
|
|
||||||
|
if (tgui->type >= TGUI_9660) {
|
||||||
|
tgui->accel.dx = tgui->accel.dst_x & 0xfff;
|
||||||
|
tgui->accel.dy += ydir;
|
||||||
|
}
|
||||||
|
|
||||||
tgui->accel.src = tgui->accel.src_old = tgui->accel.src_old + (ydir * tgui->accel.pitch);
|
tgui->accel.src = tgui->accel.src_old = tgui->accel.src_old + (ydir * tgui->accel.pitch);
|
||||||
tgui->accel.dst = tgui->accel.dst_old = tgui->accel.dst_old + (ydir * tgui->accel.pitch);
|
tgui->accel.dst = tgui->accel.dst_old = tgui->accel.dst_old + (ydir * tgui->accel.pitch);
|
||||||
|
|
||||||
@@ -1891,6 +1902,88 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TGUI_FASTLINE:
|
||||||
|
{
|
||||||
|
if (tgui->type < TGUI_9660)
|
||||||
|
break;
|
||||||
|
|
||||||
|
int16_t dx, dy;
|
||||||
|
|
||||||
|
dx = tgui->accel.dst_x & 0xfff;
|
||||||
|
dy = tgui->accel.dst_y & 0xfff;
|
||||||
|
|
||||||
|
tgui->accel.left = tgui->accel.src_x_clip & 0xfff;
|
||||||
|
tgui->accel.right = tgui->accel.dst_x_clip & 0xfff;
|
||||||
|
tgui->accel.top = tgui->accel.src_y_clip & 0xfff;
|
||||||
|
tgui->accel.bottom = tgui->accel.dst_y_clip & 0xfff;
|
||||||
|
|
||||||
|
if (tgui->accel.bpp == 1) {
|
||||||
|
tgui->accel.left >>= 1;
|
||||||
|
tgui->accel.right >>= 1;
|
||||||
|
} else if (tgui->accel.bpp == 3) {
|
||||||
|
tgui->accel.left >>= 2;
|
||||||
|
tgui->accel.right >>= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (count--) {
|
||||||
|
READ(tgui->accel.src_x + (tgui->accel.src_y * tgui->accel.pitch), src_dat);
|
||||||
|
|
||||||
|
/*Note by TC1995: I suppose the x/y clipping max is always more than 0 in the TGUI 96xx, but the TGUI 9440 lacks clipping*/
|
||||||
|
if ((tgui->type == TGUI_9440) || ((tgui->type >= TGUI_9660) && dx >= tgui->accel.left && dx <= tgui->accel.right &&
|
||||||
|
dy >= tgui->accel.top && dy <= tgui->accel.bottom)) {
|
||||||
|
READ(dx + (dy * tgui->accel.pitch), dst_dat);
|
||||||
|
|
||||||
|
pat_dat = tgui->accel.fg_col;
|
||||||
|
|
||||||
|
if (tgui->accel.bpp == 0)
|
||||||
|
pat_dat &= 0xff;
|
||||||
|
else if (tgui->accel.bpp == 1)
|
||||||
|
pat_dat &= 0xffff;
|
||||||
|
|
||||||
|
MIX();
|
||||||
|
|
||||||
|
WRITE(dx + (dy * tgui->accel.pitch), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tgui->accel.y == (tgui->accel.size_y & 0xfff))
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch ((tgui->accel.size_y >> 8) & 0xe0) {
|
||||||
|
case 0x00:
|
||||||
|
dx++;
|
||||||
|
break;
|
||||||
|
case 0x20:
|
||||||
|
dx++;
|
||||||
|
dy--;
|
||||||
|
break;
|
||||||
|
case 0x40:
|
||||||
|
dy--;
|
||||||
|
break;
|
||||||
|
case 0x60:
|
||||||
|
dx--;
|
||||||
|
dy--;
|
||||||
|
break;
|
||||||
|
case 0x80:
|
||||||
|
dx--;
|
||||||
|
break;
|
||||||
|
case 0xa0:
|
||||||
|
dx--;
|
||||||
|
dy++;
|
||||||
|
break;
|
||||||
|
case 0xc0:
|
||||||
|
dy++;
|
||||||
|
break;
|
||||||
|
case 0xe0:
|
||||||
|
dx++;
|
||||||
|
dy++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
tgui->accel.y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user