From 2eea8ac56833c52dfb7709294649edffc09a1ecd Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Fri, 5 Jun 2020 09:35:22 +0100 Subject: [PATCH] spg renderer / gpl16250 - remove some palette bank hacks (nw) --- .../machine/generalplus_gpl16250soc_video.cpp | 30 ++++----- src/devices/machine/spg_renderer.cpp | 63 +++++++------------ 2 files changed, 38 insertions(+), 55 deletions(-) diff --git a/src/devices/machine/generalplus_gpl16250soc_video.cpp b/src/devices/machine/generalplus_gpl16250soc_video.cpp index 3967898d637..1c7b373fce3 100644 --- a/src/devices/machine/generalplus_gpl16250soc_video.cpp +++ b/src/devices/machine/generalplus_gpl16250soc_video.cpp @@ -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; diff --git a/src/devices/machine/spg_renderer.cpp b/src/devices/machine/spg_renderer.cpp index b2700968b72..c9156585441 100644 --- a/src/devices/machine/spg_renderer.cpp +++ b/src/devices/machine/spg_renderer.cpp @@ -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;