confirmed + implemented flip bits

This commit is contained in:
David Haywood 2013-02-21 17:49:55 +00:00
parent 4b8450162c
commit d413fbba24

View File

@ -419,6 +419,8 @@ public:
UINT32 m_b3romoffset; // UINT32 m_b3romoffset; //
UINT32 m_blit4_unused; UINT32 m_blit4_unused;
UINT32 m_blit4; // ? UINT32 m_blit4; // ?
UINT32 m_b4flipx;
UINT32 m_b4flipy;
UINT32 m_blit5_unused; // indirection enable + other bits? UINT32 m_blit5_unused; // indirection enable + other bits?
int m_indirect_tile_enable; // from m_blit5 int m_indirect_tile_enable; // from m_blit5
@ -489,7 +491,7 @@ public:
}; };
#define PRINT_BLIT_STUFF \ #define PRINT_BLIT_STUFF \
printf("type blit %08x %08x(%d, %03x) %08x(%02x, %03x) %08x(%06x) %08x(%08x) %08x(%d,%d) %04x %04x %04x %04x %08x %08x %d %d\n", m_blit0, m_blit1_unused,m_b1mode,m_b1colorNumber, m_blit2_unused,m_b2tpen,m_b2colorNumber, m_blit3_unused,m_b3romoffset, m_blit4_unused, m_blit4, m_blit5_unused, m_indirect_tile_enable, m_indirect_zoom_enable, m_vCellCount, m_hCellCount, m_vZoom, m_hZoom, m_blit10, data, m_vPosition, m_hPosition); \ printf("type blit %08x %08x(%d, %03x) %08x(%02x, %03x) %08x(%06x) %08x(%08x, %d, %d) %08x(%d,%d) %04x %04x %04x %04x %08x %08x %d %d\n", m_blit0, m_blit1_unused,m_b1mode,m_b1colorNumber, m_blit2_unused,m_b2tpen,m_b2colorNumber, m_blit3_unused,m_b3romoffset, m_blit4_unused, m_blit4, m_b4flipy, m_b4flipx, m_blit5_unused, m_indirect_tile_enable, m_indirect_zoom_enable, m_vCellCount, m_hCellCount, m_vZoom, m_hZoom, m_blit10, data, m_vPosition, m_hPosition); \
/* video */ /* video */
@ -871,15 +873,16 @@ WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w)
if (!(m_blit0 & 1)) // don't bother for non-sprites if (!(m_blit0 & 1)) // don't bother for non-sprites
{ {
m_blit4_unused = data & 0xf8fefefe; m_blit4_unused = data & 0xf8fefefe;
m_blit4 = data & 0x07010101; m_blit4 = data & 0x07010000;
m_b4flipx = data & 0x00000001;
m_b4flipy = (data & 0x00000100)>>8;
if (m_blit4_unused) printf("unknown bits in blit word %d - %08x\n", m_blitterSerialCount, m_blit4_unused); if (m_blit4_unused) printf("unknown bits in blit word %d - %08x\n", m_blitterSerialCount, m_blit4_unused);
// ---- -111 ---- ---v ---- ---u ---- ---x // ---- -111 ---- ---r ---- ---y ---- ---x
// 1 = used bits? (unknown purpose.. might be object colour mode) // 1 = used bits? (unknown purpose.. might be object colour mode)
// x = x-flip? // x = x-flip
// u = probably y-flip? used on a few objects here and there... // y = y-flip
// v = unknown, not used much, occasional object // r = unknown, not used much, occasional object - rotate
} }
} }
else if (m_blitterSerialCount == 5) else if (m_blitterSerialCount == 5)
@ -1201,6 +1204,7 @@ investigate this sprite
} }
} }
#endif #endif
UINT32 lastSpriteNumber = 0xffffffff;
// Splat some sprites // Splat some sprites
for (int v = 0; v < m_vCellCount; v++) for (int v = 0; v < m_vCellCount; v++)
@ -1224,69 +1228,91 @@ investigate this sprite
continue; continue;
} }
int lookupnum = h + (v*m_hCellCount); int lookupnum;
// with this bit enabled the tile numbers gets looked up using 'data' (which would be m_blit11) (eg 03f40000 for startup text) // with this bit enabled the tile numbers gets looked up using 'data' (which would be m_blit11) (eg 03f40000 for startup text)
// this allows text strings to be written as 8-bit ascii in one area (using command 0x10), and drawn using multi-width sprites // this allows text strings to be written as 8-bit ascii in one area (using command 0x10), and drawn using multi-width sprites
if (m_indirect_tile_enable) if (m_indirect_tile_enable)
{ {
const UINT32 memOffset = data; lookupnum = space.read_byte(data + h + (v*m_hCellCount));
lookupnum = space.read_byte(memOffset + h + (v*m_hCellCount));
} }
else
// these should be 'cell numbers' (tile numbers) which look up RLE data?
UINT32 spriteNumber = (m_expanded_10bit_gfx[ (m_b3romoffset << 3) + (lookupnum<<1) +0 ] << 10) | (m_expanded_10bit_gfx[ (m_b3romoffset << 3) + (lookupnum<<1) + 1 ]);
int i = 1;// skip first 10 bits for now
int data_written = 0;
while (data_written<256)
{ {
if (!m_b4flipy)
UINT16 compdata = m_expanded_10bit_gfx[ (m_b3romoffset << 3) + spriteNumber + i];
if (((compdata & 0x300) == 0x000) || ((compdata & 0x300) == 0x100))
{ {
// mm ccrr rrr0 if (!m_b4flipx)
int encodelength = (compdata & 0x03e)>>1; lookupnum = h + (v*m_hCellCount);
int data = (compdata & 0x3c0) >> 6; else
lookupnum = (m_hCellCount-h-1) + (v*m_hCellCount);
// guess, blank tiles have the following form
// 00120 (00000024,0) | 010 03f
if (compdata&1) encodelength = 255;
while (data_written<256 && encodelength >=0)
{
m_tempshape[data_written] = data;
encodelength--;
data_written++;
}
}
else if ((compdata & 0x300) == 0x200)
{
// mm cccc ccrr
int encodelength = (compdata & 0x003);
int data = (compdata & 0x3fc) >> 6;
while (data_written<256 && encodelength >=0)
{
m_tempshape[data_written] = data;
encodelength--;
data_written++;
}
} }
else else
{ {
// mm cccc cccc if (!m_b4flipx)
m_tempshape[data_written] = data&0xff; lookupnum = h + ((m_vCellCount-v-1)*m_hCellCount);
data_written++; else
} lookupnum = (m_hCellCount-h-1) + ((m_vCellCount-v-1)*m_hCellCount);
i++; }
} }
// these should be 'cell numbers' (tile numbers) which look up RLE data?
UINT32 spriteNumber = (m_expanded_10bit_gfx[ (m_b3romoffset << 3) + (lookupnum<<1) +0 ] << 10) | (m_expanded_10bit_gfx[ (m_b3romoffset << 3) + (lookupnum<<1) + 1 ]);
// skip the decoding if it's the same tile as last time!
if (spriteNumber != lastSpriteNumber)
{
lastSpriteNumber = spriteNumber;
int i = 1;// skip first 10 bits for now
int data_written = 0;
while (data_written<256)
{
UINT16 compdata = m_expanded_10bit_gfx[ (m_b3romoffset << 3) + spriteNumber + i];
if (((compdata & 0x300) == 0x000) || ((compdata & 0x300) == 0x100))
{
// mm ccrr rrr0
int encodelength = (compdata & 0x03e)>>1;
int data = (compdata & 0x3c0) >> 6;
// guess, blank tiles have the following form
// 00120 (00000024,0) | 010 03f
if (compdata&1) encodelength = 255;
while (data_written<256 && encodelength >=0)
{
m_tempshape[data_written] = data;
encodelength--;
data_written++;
}
}
else if ((compdata & 0x300) == 0x200)
{
// mm cccc ccrr
int encodelength = (compdata & 0x003);
int data = (compdata & 0x3fc) >> 6;
while (data_written<256 && encodelength >=0)
{
m_tempshape[data_written] = data;
encodelength--;
data_written++;
}
}
else
{
// mm cccc cccc
m_tempshape[data_written] = data&0xff;
data_written++;
}
i++;
}
}
@ -1300,20 +1326,72 @@ investigate this sprite
// DEBUG: Draw 16x16 block // DEBUG: Draw 16x16 block
UINT32* line; UINT32* line;
for (int y = 0; y < 16; y++) if (m_b4flipy)
{ {
const int drawy = pixelOffsetY+y; for (int y = 0; y < 16; y++)
if ((drawy>383) || (drawy<0)) continue;
line = &drawbitmap->pix32(drawy);
for (int x = 0; x < 16; x++)
{ {
const int drawx = pixelOffsetX+x; const int drawy = pixelOffsetY+y;
if ((drawx>=495 || drawx<0)) continue; if ((drawy>383) || (drawy<0)) continue;
line = &drawbitmap->pix32(drawy);
UINT16 pix = m_tempshape[y*16+x]; if (m_b4flipx)
if (pix ) {
if (line[drawx]==0) line[drawx] = clut[pix+0x4000]; for (int x = 0; x < 16; x++)
{
const int drawx = pixelOffsetX+x;
if ((drawx>=495 || drawx<0)) continue;
UINT16 pix = m_tempshape[(15-y)*16+(15-x)];
if (pix )
if (line[drawx]==0) line[drawx] = clut[pix+0x4000];
}
}
else
{
for (int x = 0; x < 16; x++)
{
const int drawx = pixelOffsetX+x;
if ((drawx>=495 || drawx<0)) continue;
UINT16 pix = m_tempshape[(15-y)*16+x];
if (pix )
if (line[drawx]==0) line[drawx] = clut[pix+0x4000];
}
}
}
}
else
{
for (int y = 0; y < 16; y++)
{
const int drawy = pixelOffsetY+y;
if ((drawy>383) || (drawy<0)) continue;
line = &drawbitmap->pix32(drawy);
if (m_b4flipx)
{
for (int x = 0; x < 16; x++)
{
const int drawx = pixelOffsetX+x;
if ((drawx>=495 || drawx<0)) continue;
UINT16 pix = m_tempshape[y*16+(15-x)];
if (pix )
if (line[drawx]==0) line[drawx] = clut[pix+0x4000];
}
}
else
{
for (int x = 0; x < 16; x++)
{
const int drawx = pixelOffsetX+x;
if ((drawx>=495 || drawx<0)) continue;
UINT16 pix = m_tempshape[y*16+x];
if (pix )
if (line[drawx]==0) line[drawx] = clut[pix+0x4000];
}
}
} }
} }