mirror of
https://github.com/holub/mame
synced 2025-07-06 02:18:09 +03:00
voodoo: Added Voodoo3-specific targets for cmdfifo packet type 5. (nw)
This commit is contained in:
parent
eec76306a0
commit
41253cab7b
@ -1710,14 +1710,21 @@ struct banshee_info
|
|||||||
UINT8 attff; /* VGA attribute flip-flop */
|
UINT8 attff; /* VGA attribute flip-flop */
|
||||||
|
|
||||||
UINT32 blt_regs[0x20]; /* 2D Blitter registers */
|
UINT32 blt_regs[0x20]; /* 2D Blitter registers */
|
||||||
UINT32 blt_base;
|
UINT32 blt_dst_base;
|
||||||
UINT32 blt_x;
|
UINT32 blt_dst_x;
|
||||||
UINT32 blt_y;
|
UINT32 blt_dst_y;
|
||||||
UINT32 blt_width;
|
UINT32 blt_dst_width;
|
||||||
UINT32 blt_height;
|
UINT32 blt_dst_height;
|
||||||
UINT32 blt_stride;
|
UINT32 blt_dst_stride;
|
||||||
UINT32 blt_bpp;
|
UINT32 blt_dst_bpp;
|
||||||
UINT32 blt_cmd;
|
UINT32 blt_cmd;
|
||||||
|
UINT32 blt_src_base;
|
||||||
|
UINT32 blt_src_x;
|
||||||
|
UINT32 blt_src_y;
|
||||||
|
UINT32 blt_src_width;
|
||||||
|
UINT32 blt_src_height;
|
||||||
|
UINT32 blt_src_stride;
|
||||||
|
UINT32 blt_src_bpp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ bits(7:4) and bit(24)), X, and Y:
|
|||||||
#define LOG_RASTERIZERS (0)
|
#define LOG_RASTERIZERS (0)
|
||||||
#define LOG_CMDFIFO (0)
|
#define LOG_CMDFIFO (0)
|
||||||
#define LOG_CMDFIFO_VERBOSE (0)
|
#define LOG_CMDFIFO_VERBOSE (0)
|
||||||
#define LOG_BANSHEE_2D (1)
|
#define LOG_BANSHEE_2D (0)
|
||||||
|
|
||||||
#define MODIFY_PIXEL(VV)
|
#define MODIFY_PIXEL(VV)
|
||||||
|
|
||||||
@ -1947,22 +1947,63 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f)
|
|||||||
target = *src++ / 4;
|
target = *src++ / 4;
|
||||||
|
|
||||||
/* handle LFB writes */
|
/* handle LFB writes */
|
||||||
if ((command >> 30) == 2)
|
switch (command >> 30)
|
||||||
{
|
{
|
||||||
if (LOG_CMDFIFO) logerror(" PACKET TYPE 5: LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
|
case 0: // Linear FB
|
||||||
|
{
|
||||||
|
if (LOG_CMDFIFO) logerror(" PACKET TYPE 5: FB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
|
||||||
|
|
||||||
|
UINT32 addr = target * 4;
|
||||||
|
for (i=0; i < count; i++)
|
||||||
|
{
|
||||||
|
UINT32 data = *src++;
|
||||||
|
|
||||||
|
v->fbi.ram[BYTE_XOR_LE(addr + 0)] = (UINT8)(data);
|
||||||
|
v->fbi.ram[BYTE_XOR_LE(addr + 1)] = (UINT8)(data >> 8);
|
||||||
|
v->fbi.ram[BYTE_XOR_LE(addr + 2)] = (UINT8)(data >> 16);
|
||||||
|
v->fbi.ram[BYTE_XOR_LE(addr + 3)] = (UINT8)(data >> 24);
|
||||||
|
|
||||||
|
addr += 4;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: // 3D LFB
|
||||||
|
{
|
||||||
|
if (LOG_CMDFIFO) logerror(" PACKET TYPE 5: 3D LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
|
||||||
|
|
||||||
/* loop over words */
|
/* loop over words */
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
cycles += lfb_w(v, target++, *src++, 0xffffffff, FALSE);
|
cycles += lfb_w(v, target++, *src++, 0xffffffff, FALSE);
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if ((command >> 30) == 3)
|
|
||||||
|
case 1: // Planar YUV
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
/* just update the pointers for now */
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
target++;
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 3: // Texture Port
|
||||||
{
|
{
|
||||||
if (LOG_CMDFIFO) logerror(" PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
|
if (LOG_CMDFIFO) logerror(" PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
|
||||||
|
|
||||||
/* loop over words */
|
/* loop over words */
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
cycles += texture_w(v, target++, *src++);
|
cycles += texture_w(v, target++, *src++);
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -4283,46 +4324,46 @@ static void blit_2d(voodoo_state *v, UINT32 data)
|
|||||||
|
|
||||||
case 3: // Host-to-screen blit
|
case 3: // Host-to-screen blit
|
||||||
{
|
{
|
||||||
UINT32 addr = v->banshee.blt_base;
|
UINT32 addr = v->banshee.blt_dst_base;
|
||||||
|
|
||||||
addr += (v->banshee.blt_y * v->banshee.blt_stride) + (v->banshee.blt_x * v->banshee.blt_bpp);
|
addr += (v->banshee.blt_dst_y * v->banshee.blt_dst_stride) + (v->banshee.blt_dst_x * v->banshee.blt_dst_bpp);
|
||||||
|
|
||||||
#if LOG_BANSHEE_2D
|
#if LOG_BANSHEE_2D
|
||||||
logerror(" blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, v->banshee.blt_x, v->banshee.blt_y);
|
logerror(" blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, v->banshee.blt_dst_x, v->banshee.blt_dst_y);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (v->banshee.blt_bpp)
|
switch (v->banshee.blt_dst_bpp)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
v->fbi.ram[addr+0] = data & 0xff;
|
v->fbi.ram[addr+0] = data & 0xff;
|
||||||
v->fbi.ram[addr+1] = (data >> 8) & 0xff;
|
v->fbi.ram[addr+1] = (data >> 8) & 0xff;
|
||||||
v->fbi.ram[addr+2] = (data >> 16) & 0xff;
|
v->fbi.ram[addr+2] = (data >> 16) & 0xff;
|
||||||
v->fbi.ram[addr+3] = (data >> 24) & 0xff;
|
v->fbi.ram[addr+3] = (data >> 24) & 0xff;
|
||||||
v->banshee.blt_x += 4;
|
v->banshee.blt_dst_x += 4;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
v->fbi.ram[addr+1] = data & 0xff;
|
v->fbi.ram[addr+1] = data & 0xff;
|
||||||
v->fbi.ram[addr+0] = (data >> 8) & 0xff;
|
v->fbi.ram[addr+0] = (data >> 8) & 0xff;
|
||||||
v->fbi.ram[addr+3] = (data >> 16) & 0xff;
|
v->fbi.ram[addr+3] = (data >> 16) & 0xff;
|
||||||
v->fbi.ram[addr+2] = (data >> 24) & 0xff;
|
v->fbi.ram[addr+2] = (data >> 24) & 0xff;
|
||||||
v->banshee.blt_x += 2;
|
v->banshee.blt_dst_x += 2;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
v->banshee.blt_x += 1;
|
v->banshee.blt_dst_x += 1;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
v->fbi.ram[addr+3] = data & 0xff;
|
v->fbi.ram[addr+3] = data & 0xff;
|
||||||
v->fbi.ram[addr+2] = (data >> 8) & 0xff;
|
v->fbi.ram[addr+2] = (data >> 8) & 0xff;
|
||||||
v->fbi.ram[addr+1] = (data >> 16) & 0xff;
|
v->fbi.ram[addr+1] = (data >> 16) & 0xff;
|
||||||
v->fbi.ram[addr+0] = (data >> 24) & 0xff;
|
v->fbi.ram[addr+0] = (data >> 24) & 0xff;
|
||||||
v->banshee.blt_x += 1;
|
v->banshee.blt_dst_x += 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->banshee.blt_x >= v->banshee.blt_width)
|
if (v->banshee.blt_dst_x >= v->banshee.blt_dst_width)
|
||||||
{
|
{
|
||||||
v->banshee.blt_x = 0;
|
v->banshee.blt_dst_x = 0;
|
||||||
v->banshee.blt_y++;
|
v->banshee.blt_dst_y++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -4360,25 +4401,44 @@ static INT32 banshee_2d_w(voodoo_state *v, offs_t offset, UINT32 data)
|
|||||||
{
|
{
|
||||||
case banshee2D_command:
|
case banshee2D_command:
|
||||||
#if LOG_BANSHEE_2D
|
#if LOG_BANSHEE_2D
|
||||||
logerror(" 2D:command: cmd %d, ROP0 %02X\n", data & 0x3, data >> 24);
|
logerror(" 2D:command: cmd %d, ROP0 %02X\n", data & 0xf, data >> 24);
|
||||||
#endif
|
#endif
|
||||||
v->banshee.blt_x = v->banshee.blt_regs[banshee2D_srcXY] & 0xfff;
|
|
||||||
v->banshee.blt_y = (v->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff;
|
v->banshee.blt_src_x = v->banshee.blt_regs[banshee2D_srcXY] & 0xfff;
|
||||||
v->banshee.blt_base = v->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff;
|
v->banshee.blt_src_y = (v->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff;
|
||||||
v->banshee.blt_stride = v->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff;
|
v->banshee.blt_src_base = v->banshee.blt_regs[banshee2D_srcBaseAddr] & 0xffffff;
|
||||||
v->banshee.blt_width = v->banshee.blt_regs[banshee2D_dstSize] & 0xfff;
|
v->banshee.blt_src_stride = v->banshee.blt_regs[banshee2D_srcFormat] & 0x3fff;
|
||||||
v->banshee.blt_height = (v->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff;
|
v->banshee.blt_src_width = v->banshee.blt_regs[banshee2D_srcSize] & 0xfff;
|
||||||
|
v->banshee.blt_src_height = (v->banshee.blt_regs[banshee2D_srcSize] >> 16) & 0xfff;
|
||||||
|
|
||||||
|
switch ((v->banshee.blt_regs[banshee2D_srcFormat] >> 16) & 0xf)
|
||||||
|
{
|
||||||
|
case 1: v->banshee.blt_src_bpp = 1; break;
|
||||||
|
case 3: v->banshee.blt_src_bpp = 2; break;
|
||||||
|
case 4: v->banshee.blt_src_bpp = 3; break;
|
||||||
|
case 5: v->banshee.blt_src_bpp = 4; break;
|
||||||
|
case 8: v->banshee.blt_src_bpp = 2; break;
|
||||||
|
case 9: v->banshee.blt_src_bpp = 2; break;
|
||||||
|
default: v->banshee.blt_src_bpp = 1; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
v->banshee.blt_dst_x = v->banshee.blt_regs[banshee2D_dstXY] & 0xfff;
|
||||||
|
v->banshee.blt_dst_y = (v->banshee.blt_regs[banshee2D_dstXY] >> 16) & 0xfff;
|
||||||
|
v->banshee.blt_dst_base = v->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff;
|
||||||
|
v->banshee.blt_dst_stride = v->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff;
|
||||||
|
v->banshee.blt_dst_width = v->banshee.blt_regs[banshee2D_dstSize] & 0xfff;
|
||||||
|
v->banshee.blt_dst_height = (v->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff;
|
||||||
|
|
||||||
switch ((v->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7)
|
switch ((v->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7)
|
||||||
{
|
{
|
||||||
case 1: v->banshee.blt_bpp = 1; break;
|
case 1: v->banshee.blt_dst_bpp = 1; break;
|
||||||
case 3: v->banshee.blt_bpp = 2; break;
|
case 3: v->banshee.blt_dst_bpp = 2; break;
|
||||||
case 4: v->banshee.blt_bpp = 3; break;
|
case 4: v->banshee.blt_dst_bpp = 3; break;
|
||||||
case 5: v->banshee.blt_bpp = 4; break;
|
case 5: v->banshee.blt_dst_bpp = 4; break;
|
||||||
default: v->banshee.blt_bpp = 1; break;
|
default: v->banshee.blt_dst_bpp = 1; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
v->banshee.blt_cmd = data & 0x3;
|
v->banshee.blt_cmd = data & 0xf;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case banshee2D_colorBack:
|
case banshee2D_colorBack:
|
||||||
|
Loading…
Reference in New Issue
Block a user