spg renderer / gpl16250 - remove some palette bank hacks (nw)

This commit is contained in:
DavidHaywood 2020-06-05 09:35:22 +01:00
parent 3708071150
commit 2eea8ac568
2 changed files with 38 additions and 55 deletions

View File

@ -333,6 +333,12 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
// jak_s500 briely sets pen 0 of the layer to magenta, but then ends up erasing it
const uint32_t page0_addr = (m_page0_addr_msb << 16) | m_page0_addr_lsb;
const uint32_t page1_addr = (m_page1_addr_msb << 16) | m_page1_addr_lsb;
const uint32_t page2_addr = (m_page2_addr_msb << 16) | m_page2_addr_lsb;
const uint32_t page3_addr = (m_page3_addr_msb << 16) | m_page3_addr_lsb;
if (0)
{
uint16_t attr0 = m_tmap0_regs[0];
@ -345,24 +351,24 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
uint16_t ctrl3 = m_tmap3_regs[1];
popmessage(
"p0ctrl u:%02x Bl:%d HC:%d Ycmp:%d Hcmp:%d RS:%d E:%d WP:%d Rg:%d Bm:%d\n"
"p1ctrl u:%02x Bl:%d HC:%d Ycmp:%d Hcmp:%d RS:%d E:%d WP:%d Rg:%d Bm:%d\n"
"p2ctrl u:%02x Bl:%d HC:%d Ycmp:%d Hcmp:%d RS:%d E:%d WP:%d Rg:%d Bm:%d\n"
"p3ctrl u:%02x Bl:%d HC:%d Ycmp:%d Hcmp:%d RS:%d E:%d WP:%d Rg:%d Bm:%d\n"
"p0ct u:%02x Bl:%d HC:%d Ycmp:%d Hcmp:%d RS:%d E:%d WP:%d Rg:%d Bm:%d gfxadr: %08x\n"
"p1ct u:%02x Bl:%d HC:%d Ycmp:%d Hcmp:%d RS:%d E:%d WP:%d Rg:%d Bm:%d gfxadr: %08x\n"
"p2ct u:%02x Bl:%d HC:%d Ycmp:%d Hcmp:%d RS:%d E:%d WP:%d Rg:%d Bm:%d gfxadr: %08x\n"
"p3ct u:%02x Bl:%d HC:%d Ycmp:%d Hcmp:%d RS:%d E:%d WP:%d Rg:%d Bm:%d gfxadr: %08x\n"
"p0attr u:%01x Z:%d P:%d V:%d H:%d FY:%d FX:%d D:%d\n"
"p1attr u:%01x Z:%d P:%d V:%d H:%d FY:%d FX:%d D:%d\n"
"p2attr u:%01x Z:%d P:%d V:%d H:%d FY:%d FX:%d D:%d\n"
"p3attr u:%01x Z:%d P:%d V:%d H:%d FY:%d FX:%d D:%d\n"
"palbank %04x 707e: %04x 707f: %04x\n",
(ctrl0 & 0xfe00) >> 9, BIT(ctrl0, 8), BIT(ctrl0, 7), BIT(ctrl0, 6), BIT(ctrl0, 5), BIT(ctrl0, 4), BIT(ctrl0, 3), BIT(ctrl0, 2), BIT(ctrl0, 1), BIT(ctrl0, 0),
(ctrl1 & 0xfe00) >> 9, BIT(ctrl1, 8), BIT(ctrl1, 7), BIT(ctrl1, 6), BIT(ctrl1, 5), BIT(ctrl1, 4), BIT(ctrl1, 3), BIT(ctrl1, 2), BIT(ctrl1, 1), BIT(ctrl1, 0),
(ctrl2 & 0xfe00) >> 9, BIT(ctrl2, 8), BIT(ctrl2, 7), BIT(ctrl2, 6), BIT(ctrl2, 5), BIT(ctrl2, 4), BIT(ctrl2, 3), BIT(ctrl2, 2), BIT(ctrl2, 1), BIT(ctrl2, 0),
(ctrl3 & 0xfe00) >> 9, BIT(ctrl3, 8), BIT(ctrl3, 7), BIT(ctrl3, 6), BIT(ctrl3, 5), BIT(ctrl3, 4), BIT(ctrl3, 3), BIT(ctrl3, 2), BIT(ctrl3, 1), BIT(ctrl3, 0),
"palbank %04x 707e: %04x 707f: %04x tvc703c: %04x spr7042: %04x\n",
(ctrl0 & 0xfe00) >> 9, BIT(ctrl0, 8), BIT(ctrl0, 7), BIT(ctrl0, 6), BIT(ctrl0, 5), BIT(ctrl0, 4), BIT(ctrl0, 3), BIT(ctrl0, 2), BIT(ctrl0, 1), BIT(ctrl0, 0), page0_addr,
(ctrl1 & 0xfe00) >> 9, BIT(ctrl1, 8), BIT(ctrl1, 7), BIT(ctrl1, 6), BIT(ctrl1, 5), BIT(ctrl1, 4), BIT(ctrl1, 3), BIT(ctrl1, 2), BIT(ctrl1, 1), BIT(ctrl1, 0), page1_addr,
(ctrl2 & 0xfe00) >> 9, BIT(ctrl2, 8), BIT(ctrl2, 7), BIT(ctrl2, 6), BIT(ctrl2, 5), BIT(ctrl2, 4), BIT(ctrl2, 3), BIT(ctrl2, 2), BIT(ctrl2, 1), BIT(ctrl2, 0), page2_addr,
(ctrl3 & 0xfe00) >> 9, BIT(ctrl3, 8), BIT(ctrl3, 7), BIT(ctrl3, 6), BIT(ctrl3, 5), BIT(ctrl3, 4), BIT(ctrl3, 3), BIT(ctrl3, 2), BIT(ctrl3, 1), BIT(ctrl3, 0), page3_addr,
(attr0 & 0xc000) >> 14, (attr0 >> 12) & 3, (attr0 >> 8) & 15, 8 << ((attr0 >> 6) & 3), 8 << ((attr0 >> 4) & 3), BIT(attr0, 3), BIT(attr0, 2), 2 * ((attr0 & 3) + 1),
(attr1 & 0xc000) >> 14, (attr1 >> 12) & 3, (attr1 >> 8) & 15, 8 << ((attr1 >> 6) & 3), 8 << ((attr1 >> 4) & 3), BIT(attr1, 3), BIT(attr1, 2), 2 * ((attr1 & 3) + 1),
(attr2 & 0xc000) >> 14, (attr2 >> 12) & 3, (attr2 >> 8) & 15, 8 << ((attr2 >> 6) & 3), 8 << ((attr2 >> 4) & 3), BIT(attr2, 3), BIT(attr2, 2), 2 * ((attr2 & 3) + 1),
(attr3 & 0xc000) >> 14, (attr3 >> 12) & 3, (attr3 >> 8) & 15, 8 << ((attr3 >> 6) & 3), 8 << ((attr3 >> 4) & 3), BIT(attr3, 3), BIT(attr3, 2), 2 * ((attr3 & 3) + 1),
m_703a_palettebank, m_707e_spritebank, m_707f
m_703a_palettebank, m_707e_spritebank, m_707f, m_703c_tvcontrol1, m_7042_sprite
);
}
@ -382,10 +388,6 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
address_space &mem = m_cpu->space(AS_PROGRAM);
const uint32_t page0_addr = (m_page0_addr_msb << 16) | m_page0_addr_lsb;
const uint32_t page1_addr = (m_page1_addr_msb << 16) | m_page1_addr_lsb;
const uint32_t page2_addr = (m_page2_addr_msb << 16) | m_page2_addr_lsb;
const uint32_t page3_addr = (m_page3_addr_msb << 16) | m_page3_addr_lsb;
const uint32_t sprites_addr = (m_sprite_702d_gfxbase_msb << 16) | m_sprite_7022_gfxbase_lsb;

View File

@ -179,6 +179,12 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang
linebase = linebase | (palette << 16);
int upperpalselect = 0;
if (has_extended_tilemaps && (tilegfxdata_addr & 0x80000000))
upperpalselect = 1;
tilegfxdata_addr &= 0x7ffffff;
// this logic works for jak_s500 and the test modes to get the correct base, doesn't seem to work for jak_car2 ingame, maybe data is copied to wrong place?
int gfxbase = (tilegfxdata_addr&0x7ffffff) + (linebase&0x7ffffff);
@ -205,6 +211,9 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang
pal = (pix & 0xff) | 0x100;
if (upperpalselect)
pal |= 0x200;
if (xx >= 0 && xx <= cliprect.max_x)
{
uint16_t rgb = paletteram[pal];
@ -216,7 +225,10 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang
}
xx = (i * 2)+1;
pal = (pix >> 8) + 0x100;
pal = (pix >> 8) | 0x100;
if (upperpalselect)
pal |= 0x200;
if (xx >= 0 && xx <= cliprect.max_x)
{
@ -465,6 +477,13 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti
const int upperscrollbits = (realxscroll >> (tile_width + 3));
const int endpos = (screenwidth + tile_w) / tile_w;
int upperpalselect = 0;
if (has_extended_tilemaps && (tilegfxdata_addr & 0x80000000))
upperpalselect = 1;
tilegfxdata_addr &= 0x7ffffff;
for (uint32_t x0 = 0; x0 < endpos; x0++)
{
spg_renderer_device::blend_enable_t blend;
@ -525,46 +544,8 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti
palette_offset = (tileattr & 0x0f00) >> 4;
// got tile info
if (1)
{
// HACKS
// There must be a select bit for the tilemap palettes somewhere, but where?!
// the different games in paccon also expect a variety of different configs here, maybe a good place to look
if (palbank & 1) // this actually seems to be the sprite palette bank enable, but for myac220 / tkmag220 (where everything is from a single palette) it gives us an easy way to ignore the logic below
{
if (which == 0) // tilemap 0
{
if (ctrl & 0x0002) // RegSet:1
{
// smartfp has a conflict between the bootlogos and the first screen, it's in regset mode, no obvious difference in registers but needs palette from different places?
// not even m_video_regs_7f changes here, which makes the m_video_regs_7f case specific hacks for jak_s500 below very unlikely to actually be related
if ((bpp + 1) * 2 == 4)
if (use_alt_tile_addressing == true)
palette_offset |= 0x200;
}
}
if (which == 1)
{
// can't do this for jak_s500 logos
// jak_s500 also uses this tilemap in both 4 and 6bpp modes expecting the same palette base, so the hack used for smartfp on tilemap 0 is not applicable here
// m_video_regs_7f != 0x2d3 for jak_S500 main menu
if ((m_video_regs_7f != 0x53) && (m_video_regs_7f != 0x63) && (m_video_regs_7f != 0x2d3))
palette_offset |= 0x200;
}
// jak_car2 screen transitions use layers 2 and 3 the same way, alternating each frame
if (which == 2)
{
// jak_s500 title screen + loading screen before race
if ((m_video_regs_7f == 0x2d3) || (m_video_regs_7f == 0x2db))
palette_offset |= 0x200;
}
}
}
if (upperpalselect)
palette_offset |= 0x200;
palette_offset >>= nc_bpp;
palette_offset <<= nc_bpp;