From d647c54046f172787acc4f7b89b4cd3cf82cd544 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Sat, 25 May 2019 21:16:03 +0100 Subject: my1stddr / trkfldch progress (nw) (#5110) * my1stddr - 8x8 decode (nw) * make trkfldch show stuff (nw) * misplace (nw) --- src/mame/drivers/trkfldch.cpp | 138 ++++++++++++++++++++++++++++-------------- 1 file changed, 94 insertions(+), 44 deletions(-) diff --git a/src/mame/drivers/trkfldch.cpp b/src/mame/drivers/trkfldch.cpp index 40e8e2e895c..6ece66806a8 100644 --- a/src/mame/drivers/trkfldch.cpp +++ b/src/mame/drivers/trkfldch.cpp @@ -40,7 +40,8 @@ public: m_maincpu(*this, "maincpu"), m_screen(*this, "screen"), m_gfxdecode(*this, "gfxdecode"), - m_mainram(*this, "mainram") + m_mainram(*this, "mainram"), + m_palette(*this, "palette") { } void trkfldch(machine_config &config); @@ -57,6 +58,7 @@ private: required_device m_screen; required_device m_gfxdecode; required_shared_ptr m_mainram; + required_device m_palette; uint32_t screen_update_trkfldch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void trkfldch_map(address_map &map); @@ -89,48 +91,73 @@ uint32_t trkfldch_state::screen_update_trkfldch(screen_device &screen, bitmap_in // at 0xe9c (actually 0x0d0c when fully populated) in trkfldch // 7861 / 7860 point here most of the time in both games (so maybe DMA source, or just uses a direct pointer) - //for (int i = 0x0d0c+0x100*5; i >= 0x0d0c; i -= 5) - for (int i = 0x1189+0x100*5; i >= 0x1189; i -= 5) + int spritelistbase = (m_unkregs[0x61] << 8) | (m_unkregs[0x60] << 0); + int spritelistend = spritelistbase+0x100*5; + + spritelistbase &= 0x3fff; + spritelistend &= 0x3fff; + + gfx_element* gfx; + + + if (spritelistend >= spritelistbase) { - // printf("entry %02x %02x %02x %02x %02x\n", m_mainram[i + 0], m_mainram[i + 1], m_mainram[i + 2], m_mainram[i + 3], m_mainram[i + 4]); - // int tilegfxbase = 0x1f80; // select mode - // int tilegfxbase = 0x2780; // 2nd demo (+0x800 from above) - // int tilegfxbase = 0x3780; // 1st demo and 'letters' minigame (+0x1000 from above) - int tilegfxbase = (m_unkregs[0x15] * 0x800) - 0x80; + for (int i = spritelistend; i >= spritelistbase; i -= 5) + { + // printf("entry %02x %02x %02x %02x %02x\n", m_mainram[i + 0], m_mainram[i + 1], m_mainram[i + 2], m_mainram[i + 3], m_mainram[i + 4]); + // int tilegfxbase = 0x1f80; // select mode + // int tilegfxbase = 0x2780; // 2nd demo (+0x800 from above) + // int tilegfxbase = 0x3780; // 1st demo and 'letters' minigame (+0x1000 from above) + int tilegfxbase = (m_unkregs[0x15] * 0x800); - int y = m_mainram[i + 1]; - int x = m_mainram[i + 3]; - int tile = m_mainram[i + 2]; + int y = m_mainram[i + 1]; + int x = m_mainram[i + 3]; + int tile = m_mainram[i + 2]; - int tilehigh = m_mainram[i + 4] & 0x04; - int tilehigh2 = m_mainram[i + 0] & 0x04; - int tilehigh3 = m_mainram[i + 0] & 0x08; + int tilehigh = m_mainram[i + 4] & 0x04; + int tilehigh2 = m_mainram[i + 0] & 0x04; + int tilehigh3 = m_mainram[i + 0] & 0x08; + //int unk = m_mainram[i + 4] & 0x20; - if (tilehigh) - tile += 0x100; + if (tilehigh) + tile += 0x100; - if (tilehigh2) - tile += 0x200; + if (tilehigh2) + tile += 0x200; - if (tilehigh3) - tile += 0x400; + if (tilehigh3) + tile += 0x400; + //if (unk) // set on score + 'press start' in ddr, priority? palette select? + // tile = machine().rand(); - int xhigh = m_mainram[i + 4] & 0x01; - int yhigh = m_mainram[i + 0] & 0x01; // or enable bit? - x = x | (xhigh << 8); - y = y | (yhigh << 8); + int xhigh = m_mainram[i + 4] & 0x01; + int yhigh = m_mainram[i + 0] & 0x01; // or enable bit? - y -= 0x100; - y -= 16; - x -= 16; + x = x | (xhigh << 8); + y = y | (yhigh << 8); - gfx_element *gfx = m_gfxdecode->gfx(1); - gfx->transpen(bitmap,cliprect,tile+tilegfxbase,0,0,0,x,y,0); - } + y -= 0x100; + y -= 16; + x -= 16; + if (m_unkregs[0x10] & 1) // seems to change something at least (trkfldch events) + { + gfx = m_gfxdecode->gfx(1); + tilegfxbase -= 0x80; + } + else + { + gfx = m_gfxdecode->gfx(2); + tilegfxbase -= 0x80; + } + + + gfx->transpen(bitmap, cliprect, tile + tilegfxbase, 0, 0, 0, x, y, 0); + } + } return 0; } @@ -267,31 +294,48 @@ static INPUT_PORTS_START( trkfldch ) INPUT_PORTS_END // dummy, doesn't appear to be tile based -static const gfx_layout tiles8x8_layout = +static const gfx_layout tiles8x8x8_layout = { 8,8, RGN_FRAC(1,1), 8, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0, 8, 16, 24, 32, 40, 48, 56 }, - { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64 }, - 64*8 + { 0, 1, 16, 17, 32, 33, 48, 49 }, + { 8,10,12, 14, 0,2,4,6 }, + { 0,0 + 64, + 128,128 + 64, + 256,256 + 64, + 384, 384 + 64 }, + 512, }; -static const gfx_layout tiles16x16_layout = +static const gfx_layout tiles16x16x8_layout = { 16,16, RGN_FRAC(1,1), 8, { 0, 1, 32, 33, 64, 65, 96, 97 }, - { 8,10,12,14, 0,2,4,6, 24,26,28,30, 16,18,20,22,}, + { 8,10,12,14, 0,2,4,6, 24,26,28,30, 16,18,20,22 }, { STEP16(0,128) }, 128*16, }; +// not correct +static const gfx_layout tiles16x16x4_layout = +{ + 16,16, + RGN_FRAC(1,1), + 4, + { 0, 1, 32, 33 }, + { 8,10,12,14, 0,2,4,6, 24,26,28,30, 16,18,20,22 }, + { STEP16(0,64) }, + 64*16, +}; + + static GFXDECODE_START( gfx_trkfldch ) - GFXDECODE_ENTRY( "maincpu", 0, tiles8x8_layout, 0, 1 ) - GFXDECODE_ENTRY( "maincpu", 0, tiles16x16_layout, 0, 1 ) + GFXDECODE_ENTRY( "maincpu", 0, tiles8x8x8_layout, 0, 1 ) + GFXDECODE_ENTRY( "maincpu", 0, tiles16x16x8_layout, 0, 1 ) + GFXDECODE_ENTRY( "maincpu", 0, tiles16x16x4_layout, 0, 1 ) GFXDECODE_END /* @@ -474,7 +518,7 @@ WRITE8_MEMBER(trkfldch_state::unkregs_w) // is it significant that 0x10 goes up to 0x1a, 0x20 to 0x2b, 0x30 to 0x3b could be 3 sets of similar things? - case 0x10: + case 0x10: // gfxmode select (4bpp / 8bpp) for sprites? maybe //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; @@ -494,7 +538,7 @@ WRITE8_MEMBER(trkfldch_state::unkregs_w) //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x15: + case 0x15: // gfxbank select for sprites //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; @@ -636,15 +680,15 @@ WRITE8_MEMBER(trkfldch_state::unkregs_w) - case 0x60: + case 0x60: // sprite list location (dma source?) //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x61: + case 0x61: // sprite list location (dma source?) //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x62: + case 0x62: //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; @@ -789,6 +833,12 @@ void trkfldch_state::machine_start() { save_item(NAME(m_unkdata_addr)); save_item(NAME(m_unkdata)); + + for (int i = 0; i < 256; i++) + { + m_palette->set_pen_color(i, machine().rand(), machine().rand(), machine().rand()); + } + } void trkfldch_state::machine_reset() -- cgit v1.2.3