notes on flip flags etc.

This commit is contained in:
David Haywood 2013-02-20 19:06:10 +00:00
parent 4430365da5
commit 0580ac36e1

View File

@ -413,9 +413,10 @@ public:
UINT32 m_blit1; // ? UINT32 m_blit1; // ?
UINT32 m_blit2; // ? UINT32 m_blit2; // ?
UINT32 m_blit3; // ? UINT32 m_blit3; // ?
UINT32 m_blit4_unused;
UINT32 m_blit4; // ? UINT32 m_blit4; // ?
UINT32 m_blit5; // 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
int m_indirect_zoom_enable; // from m_blit5 int m_indirect_zoom_enable; // from m_blit5
@ -695,7 +696,10 @@ WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w)
// 1: xxxxxxxx - "Color Number" (all bits or just lower 16/8?) // 1: xxxxxxxx - "Color Number" (all bits or just lower 16/8?)
// 2: 00000000 - unknown : OT flag? (transparency) // 2: 00000000 - unknown : OT flag? (transparency)
// 3: 00000000 - unknown : RF flag? (90 degree rotation) // 3: 00000000 - unknown : RF flag? (90 degree rotation)
// 4: 07000000 - unknown : VF flag? (vertically flipped) // 4: 07000000 - unknown (draw mode?)
// 4: 00010000 - unknown (set on a few object)
// 4: 00000100 - y-flip?
// 4: 00000001 - x-flip?
// 5: 00010000 - enable indirect text tile lookup // 5: 00010000 - enable indirect text tile lookup
// 5: 00000001 - enable line-zoom(?) lookup (road) // 5: 00000001 - enable line-zoom(?) lookup (road)
// 6: vvvv---- - "Vertical Cell Count" // 6: vvvv---- - "Vertical Cell Count"
@ -731,7 +735,7 @@ WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w)
// 00??0uuu // 00??0uuu
// ?? seems to be 00 or 7f // ?? seems to be 00 or 7f
// uuu, at least 11 bits used, maybe 12 // uuu, at least 11 bits used, maybe 12 usually the same as m_blit1? leftover?
} }
else if (m_blitterSerialCount == 3) else if (m_blitterSerialCount == 3)
@ -743,22 +747,26 @@ WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w)
} }
else if (m_blitterSerialCount == 4) else if (m_blitterSerialCount == 4)
{ {
m_blit4 = data; m_blit4_unused = data & 0xf8fefefe;
m_blit4 = data & 0x07010101;
//0x000y0z if (m_blit4_unused) printf("unknown bits in blit word %d - %08x\n", m_blitterSerialCount, m_blit4_unused);
// x = 1, 2, 3 or 7
// y = 0 or 1 // ---- -111 ---- ---v ---- ---u ---- ---x
// z = 0 or 1 // 1 = used bits? (unknown purpose.. might be object colour mode)
// x = x-flip?
// u = probably y-flip? used on a few objects here and there...
// v = unknown, not used much, occasional object
} }
else if (m_blitterSerialCount == 5) else if (m_blitterSerialCount == 5)
{ {
m_blit5 = data&0xfffefffe; m_blit5_unused = data&0xfffefffe;
// this might enable the text indirection thing? // this might enable the text indirection thing?
m_indirect_tile_enable = (data & 0x00010000)>>16; m_indirect_tile_enable = (data & 0x00010000)>>16;
m_indirect_zoom_enable = (data & 0x00000001); m_indirect_zoom_enable = (data & 0x00000001);
if (m_blit5) printf("unknown bits in blit word %d - %08x\n", m_blitterSerialCount, m_blit5); if (m_blit5_unused) printf("unknown bits in blit word %d - %08x\n", m_blitterSerialCount, m_blit5_unused);
// 00010000 (text) // 00010000 (text)
// 00000001 (other) // 00000001 (other)
@ -815,7 +823,7 @@ WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w)
{ {
// with this bit enabled m_blit10 is a look up to the zoom(?) value eg. 03f42600 // with this bit enabled m_blit10 is a look up to the zoom(?) value eg. 03f42600
//UINT32 temp = space.read_dword(m_blit10); //UINT32 temp = space.read_dword(m_blit10);
//printf("road type blit %08x %08x %08x %08x %08x %08x %04x %04x %04x %04x %08x %08x (TEMP %08x) %d %d\n", m_blit0, m_blit1, m_blit2, m_blit3, m_blit4, m_blit5, m_vCellCount, m_hCellCount, m_vZoom, m_hZoom, m_blit10, data, temp, m_vPosition, m_hPosition); //printf("road type blit %08x %08x %08x %08x %08x(%08x) %08x %04x %04x %04x %04x %08x %08x (TEMP %08x) %d %d\n", m_blit0, m_blit1, m_blit2, m_blit3, m_blit4_unused, m_blit4, m_blit5_unused, m_vCellCount, m_hCellCount, m_vZoom, m_hZoom, m_blit10, data, temp, m_vPosition, m_hPosition);
/* for the horizontal road during attract there are tables 0x480 bytes long (0x120 dwords) and the value passed points to the start of them */ /* for the horizontal road during attract there are tables 0x480 bytes long (0x120 dwords) and the value passed points to the start of them */
/* cell sizes for those are are 0011 (v) 0007 (h) with zoom factors of 0020 (half v) 0040 (normal h) */ /* cell sizes for those are are 0011 (v) 0007 (h) with zoom factors of 0020 (half v) 0040 (normal h) */
@ -823,7 +831,23 @@ WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w)
} }
int random;
random = 0;
// not used much..
if (m_blit4 &0x00010000)
{
// printf("type blit %08x %08x %08x %08x %08x(%08x) %08x %04x %04x %04x %04x %08x %08x %d %d\n", m_blit0, m_blit1, m_blit2, m_blit3, m_blit4_unused, m_blit4, m_blit5_unused, m_vCellCount, m_hCellCount, m_vZoom, m_hZoom, m_blit10, data, m_vPosition, m_hPosition);
m_colorNumber = machine().rand() | 0xff000000;
random = 1;
}
else
{
}
bitmap_rgb32* drawbitmap; bitmap_rgb32* drawbitmap;
// 0x30 - 0x60 are definitely the left screen, 0x90 - 0xc0 are definitely the right screen.. the modes seem priority related // 0x30 - 0x60 are definitely the left screen, 0x90 - 0xc0 are definitely the right screen.. the modes seem priority related
@ -873,6 +897,7 @@ WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w)
break; break;
} }
// Splat some sprites // Splat some sprites
for (int h = 0; h < m_hCellCount; h++) for (int h = 0; h < m_hCellCount; h++)
{ {
@ -908,41 +933,47 @@ WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w)
if (blockwide<=0) blockwide = 1; if (blockwide<=0) blockwide = 1;
if (blockhigh<=0) blockhigh = 1; if (blockhigh<=0) blockhigh = 1;
// DEBUG: Draw 16x16 block
for (int x = 0; x < blockwide; x++) UINT32 color = 0xffffffff;
// HACKS to draw coloured blocks in easy to distinguish colours
if (m_blitterMode == 0x30 || m_blitterMode == 0x90)
{ {
for (int y = 0; y < blockhigh; y++) if (m_colorNumber == 0x5b)
color = 0xffff0000;
else if (m_colorNumber == 0x5d)
color = 0xff00ff00;
else if (m_colorNumber == 0x5e)
color = 0xff0000ff;
else
color = 0xff00ffff;
}
else if (m_blitterMode == 0x40 || m_blitterMode == 0xa0)
{
color = 0xff000000 | (((m_colorNumber & 0xff) | 0x80)-0x40);
}
else if (m_blitterMode == 0x50 || m_blitterMode == 0xb0)
{
color = 0xff000000 | ((((m_colorNumber & 0xff) | 0x80)-0x40) << 8);
}
else if (m_blitterMode == 0x60 || m_blitterMode == 0xc0)
{
color = 0xff000000 | ((((m_colorNumber & 0xff) | 0x80)-0x40) << 16);
}
if (random == 1)
color = m_colorNumber;
// DEBUG: Draw 16x16 block
for (int y = 0; y < blockhigh; y++)
{
int drawy = pixelOffsetY+y;
if ((drawy>383) || (drawy<0)) continue;
for (int x = 0; x < blockwide; x++)
{ {
int drawx = pixelOffsetX+x;
if ((drawx>=495 || drawx<0)) continue;
UINT32 color = 0xffffffff; if (drawbitmap->pix32(drawy,drawx)==0) drawbitmap->pix32(drawy, drawx) = color;
// HACKS to draw coloured blocks in easy to distinguish colours
if (m_blitterMode == 0x30 || m_blitterMode == 0x90)
{
if (m_colorNumber == 0x5b)
color = 0xffff0000;
else if (m_colorNumber == 0x5d)
color = 0xff00ff00;
else if (m_colorNumber == 0x5e)
color = 0xff0000ff;
else
color = 0xff00ffff;
}
else if (m_blitterMode == 0x40 || m_blitterMode == 0xa0)
{
color = 0xff000000 | (((m_colorNumber & 0xff) | 0x80)-0x40);
}
else if (m_blitterMode == 0x50 || m_blitterMode == 0xb0)
{
color = 0xff000000 | ((((m_colorNumber & 0xff) | 0x80)-0x40) << 8);
}
else if (m_blitterMode == 0x60 || m_blitterMode == 0xc0)
{
color = 0xff000000 | ((((m_colorNumber & 0xff) | 0x80)-0x40) << 16);
}
if (drawbitmap->cliprect().contains(pixelOffsetX+x, pixelOffsetY+y))
if (drawbitmap->pix32(pixelOffsetY+y, pixelOffsetX+x)==0) drawbitmap->pix32(pixelOffsetY+y, pixelOffsetX+x) = color;
} }
} }
} }