diff options
author | 2018-01-14 13:50:23 +0000 | |
---|---|---|
committer | 2018-01-14 08:50:23 -0500 | |
commit | cea7ff08ace1cadc22d80074c6c734568a2ad93e (patch) | |
tree | e20d8f812d2091e72034974cdcd30fcee8467bf3 | |
parent | e6fd52b6bf788beb9f7e2035f16f3ce724536578 (diff) |
Radica6502 : use palette selection bits in 4bpp mode, format still wrong tho. (#3063)
* radica 6502 tvgames: identify where gfx are coming from in each of the games in the space invaders pack so we can attempt to find the register that controls it, or dma etc.
new NOT WORKING
Tetris (Radica, Arcade Legends TV Game) [Sean Riddle, Incog]
* this seems to be gfx base (nw)
* latest findings (nw)
* trying to work out what these are (nw)
* typo (nw)
* this looks like some kind of dma or sound (nw)
* this seems to be mode select (nw)
* qix isn't so special, m_hackmode no longer needed (nw)
* pretty sure these are the palettes.. format is a mystery tho
* palette select bits in 4bpp mode (taito logo, game selection) palette format is still wrong tho.
* palette/tilemap dma, improves tetris (nw)
-rw-r--r-- | src/mame/drivers/radicasi.cpp | 176 |
1 files changed, 143 insertions, 33 deletions
diff --git a/src/mame/drivers/radicasi.cpp b/src/mame/drivers/radicasi.cpp index ee7b7063d54..7371daf5545 100644 --- a/src/mame/drivers/radicasi.cpp +++ b/src/mame/drivers/radicasi.cpp @@ -46,6 +46,7 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_ram(*this, "ram"), + m_palram(*this, "palram"), m_pixram(*this, "pixram"), m_bank(*this, "bank"), m_gfxdecode(*this, "gfxdecode"), @@ -58,11 +59,22 @@ public: DECLARE_WRITE8_MEMBER(radicasi_500c_w); DECLARE_WRITE8_MEMBER(radicasi_500d_w); - // palette bases - DECLARE_WRITE8_MEMBER(radicasi_palbase_lo_w); - DECLARE_WRITE8_MEMBER(radicasi_palbase_hi_w); - DECLARE_READ8_MEMBER(radicasi_palbase_lo_r); - DECLARE_READ8_MEMBER(radicasi_palbase_hi_r); + // DMA + DECLARE_WRITE8_MEMBER(radicasi_dmasrc_lo_w); + DECLARE_WRITE8_MEMBER(radicasi_dmasrc_hi_w); + DECLARE_READ8_MEMBER(radicasi_dmasrc_lo_r); + DECLARE_READ8_MEMBER(radicasi_dmasrc_hi_r); + DECLARE_WRITE8_MEMBER(radicasi_dmadst_lo_w); + DECLARE_WRITE8_MEMBER(radicasi_dmadst_hi_w); + DECLARE_READ8_MEMBER(radicasi_dmadst_lo_r); + DECLARE_READ8_MEMBER(radicasi_dmadst_hi_r); + DECLARE_WRITE8_MEMBER(radicasi_dmasize_lo_w); + DECLARE_WRITE8_MEMBER(radicasi_dmasize_hi_w); + DECLARE_READ8_MEMBER(radicasi_dmasize_lo_r); + DECLARE_READ8_MEMBER(radicasi_dmasize_hi_r); + DECLARE_READ8_MEMBER(radicasi_dmatrg_r); + DECLARE_WRITE8_MEMBER(radicasi_dmatrg_w); + // tile bases @@ -123,6 +135,7 @@ protected: private: required_device<cpu_device> m_maincpu; required_shared_ptr<uint8_t> m_ram; + required_shared_ptr<uint8_t> m_palram; required_shared_ptr<uint8_t> m_pixram; required_device<address_map_bank_device> m_bank; required_device<gfxdecode_device> m_gfxdecode; @@ -132,8 +145,13 @@ private: uint8_t m_500d_data; uint8_t m_5027_data; - uint8_t m_palbase_lo_data; - uint8_t m_palbase_hi_data; + uint8_t m_dmasrc_lo_data; + uint8_t m_dmasrc_hi_data; + uint8_t m_dmadst_lo_data; + uint8_t m_dmadst_hi_data; + uint8_t m_dmasize_lo_data; + uint8_t m_dmasize_hi_data; + uint8_t m_tile_gfxbase_lo_data; uint8_t m_tile_gfxbase_hi_data; @@ -180,15 +198,15 @@ uint32_t radica_6502_state::screen_update(screen_device &screen, bitmap_ind16 &b address_space& fullbankspace = m_bank->space(AS_PROGRAM); - int offset = (m_palbase_lo_data | (m_palbase_hi_data <<8)) * 0x100; - - for (int i = 0; i < 1024; i++) + int offset = 0; + for (int i = 0; i < 256; i++) { - uint16_t dat = fullbankspace.read_byte(offset++); - dat |= fullbankspace.read_byte(offset++) << 8; + uint16_t dat = m_palram[offset++]; + dat |= m_palram[offset++] << 8; // wrong format, does seem to be 13-bit tho. - m_palette->set_pen_color(i, pal4bit(dat >> 0), pal4bit(dat >> 4), pal5bit(dat >> 8)); + // the palette for the Taito logo is at 27f00 in ROM, 4bpp, 16 colours. + m_palette->set_pen_color(i, pal4bit(dat >> 0), pal4bit(dat >> 4), pal4bit(dat >> 8)); } @@ -200,6 +218,7 @@ uint32_t radica_6502_state::screen_update(screen_device &screen, bitmap_ind16 &b { int tile = m_ram[offs] + (m_ram[offs + 1] << 8); //int attr = (m_ram[offs + 3]); // set to 0x07 on the radica logo, 0x00 on the game select screen + int attr = m_ram[offs+2]; if (m_5027_data & 0x20) // 4bpp mode @@ -225,8 +244,8 @@ uint32_t radica_6502_state::screen_update(screen_device &screen, bitmap_ind16 &b { int realaddr = ((tile + i * 16) << 3) + (xx >> 1); uint8_t pix = fullbankspace.read_byte(realaddr); - row[x * 16 + xx + 0] = (pix & 0xf0) >> 4; - row[x * 16 + xx + 1] = (pix & 0x0f) >> 0; + row[x * 16 + xx + 0] = ((pix & 0xf0) >> 4)+attr; + row[x * 16 + xx + 1] = ((pix & 0x0f) >> 0)+attr; } } else // 8bpp @@ -235,7 +254,7 @@ uint32_t radica_6502_state::screen_update(screen_device &screen, bitmap_ind16 &b { int realaddr = ((tile + i * 32) << 3) + xx; uint8_t pix = fullbankspace.read_byte(realaddr); - row[x * 16 + xx] = pix; + row[x * 16 + xx] = pix;// + attr; } } } @@ -250,7 +269,8 @@ uint32_t radica_6502_state::screen_update(screen_device &screen, bitmap_ind16 &b { for (int x = 0; x < 32; x++) { - int tile = (m_ram[offs] + (m_ram[offs + 1] << 8)); + int tile = (m_ram[offs] + (m_ram[offs + 1] << 8)); + //int attr = m_ram[offs+2]; tile = (tile & 0x1f) + ((tile & ~0x1f) * 8); tile += ((m_tile_gfxbase_lo_data | m_tile_gfxbase_hi_data << 8) << 5); @@ -263,7 +283,7 @@ uint32_t radica_6502_state::screen_update(screen_device &screen, bitmap_ind16 &b { int realaddr = ((tile + i * 32) << 3) + xx; uint8_t pix = fullbankspace.read_byte(realaddr); - row[x * 8 + xx] = pix; + row[x * 8 + xx] = pix;// + attr; } } offs += 4; @@ -358,30 +378,112 @@ READ8_MEMBER(radica_6502_state::radicasi_sprite_gfxbase_hi_r) // Palette bases -WRITE8_MEMBER(radica_6502_state::radicasi_palbase_lo_w) +WRITE8_MEMBER(radica_6502_state::radicasi_dmasrc_lo_w) +{ + logerror("%s: radicasi_dmasrc_lo_w (select DMA source lower) %02x\n", machine().describe_context().c_str(), data); + m_dmasrc_lo_data = data; +} + +WRITE8_MEMBER(radica_6502_state::radicasi_dmasrc_hi_w) +{ + logerror("%s: radicasi_dmasrc_hi_w (select DMA source upper) %02x\n", machine().describe_context().c_str(), data); + m_dmasrc_hi_data = data; +} + +READ8_MEMBER(radica_6502_state::radicasi_dmasrc_lo_r) +{ + logerror("%s: radicasi_dmasrc_lo_r (DMA source lower)\n", machine().describe_context().c_str()); + return m_dmasrc_lo_data; +} + +READ8_MEMBER(radica_6502_state::radicasi_dmasrc_hi_r) +{ + logerror("%s: radicasi_dmasrc_hi_r (DMA source upper)\n", machine().describe_context().c_str()); + return m_dmasrc_hi_data; +} + + + +WRITE8_MEMBER(radica_6502_state::radicasi_dmadst_lo_w) +{ + logerror("%s: radicasi_dmadst_lo_w (select DMA Dest lower) %02x\n", machine().describe_context().c_str(), data); + m_dmadst_lo_data = data; +} + +WRITE8_MEMBER(radica_6502_state::radicasi_dmadst_hi_w) +{ + logerror("%s: radicasi_dmadst_hi_w (select DMA Dest upper) %02x\n", machine().describe_context().c_str(), data); + m_dmadst_hi_data = data; +} + +READ8_MEMBER(radica_6502_state::radicasi_dmadst_lo_r) +{ + logerror("%s: radicasi_dmadst_lo_r (DMA Dest lower)\n", machine().describe_context().c_str()); + return m_dmadst_lo_data; +} + +READ8_MEMBER(radica_6502_state::radicasi_dmadst_hi_r) { - logerror("%s: radicasi_palbase_lo_w (select Palette base lower) %02x\n", machine().describe_context().c_str(), data); - m_palbase_lo_data = data; + logerror("%s: radicasi_dmadst_hi_r (DMA Dest upper)\n", machine().describe_context().c_str()); + return m_dmadst_hi_data; } -WRITE8_MEMBER(radica_6502_state::radicasi_palbase_hi_w) + +WRITE8_MEMBER(radica_6502_state::radicasi_dmasize_lo_w) { - logerror("%s: radicasi_palbase_hi_w (select Palette base upper) %02x\n", machine().describe_context().c_str(), data); - m_palbase_hi_data = data; + logerror("%s: radicasi_dmasize_lo_w (select DMA Size lower) %02x\n", machine().describe_context().c_str(), data); + m_dmasize_lo_data = data; } -READ8_MEMBER(radica_6502_state::radicasi_palbase_lo_r) +WRITE8_MEMBER(radica_6502_state::radicasi_dmasize_hi_w) { - logerror("%s: radicasi_palbase_lo_r (Palette base lower)\n", machine().describe_context().c_str()); - return m_palbase_lo_data; + logerror("%s: radicasi_dmasize_hi_w (select DMA Size upper) %02x\n", machine().describe_context().c_str(), data); + m_dmasize_hi_data = data; } -READ8_MEMBER(radica_6502_state::radicasi_palbase_hi_r) +READ8_MEMBER(radica_6502_state::radicasi_dmasize_lo_r) { - logerror("%s: radicasi_palbase_hi_r (Palette base upper)\n", machine().describe_context().c_str()); - return m_palbase_hi_data; + logerror("%s: radicasi_dmasize_lo_r (DMA Size lower)\n", machine().describe_context().c_str()); + return m_dmasize_lo_data; } +READ8_MEMBER(radica_6502_state::radicasi_dmasize_hi_r) +{ + logerror("%s: radicasi_dmasize_hi_r (DMA Size upper)\n", machine().describe_context().c_str()); + return m_dmasize_hi_data; +} + +READ8_MEMBER(radica_6502_state::radicasi_dmatrg_r) +{ + logerror("%s: radicasi_dmasize_hi_r (DMA operation state?)\n", machine().describe_context().c_str()); + return 0x00;//m_dmatrg_data; +} + + +WRITE8_MEMBER(radica_6502_state::radicasi_dmatrg_w) +{ + logerror("%s: radicasi_dmasize_lo_w (trigger DMA operation) %02x\n", machine().describe_context().c_str(), data); + //m_dmatrg_data = data; + + address_space& fullbankspace = m_bank->space(AS_PROGRAM); + address_space& destspace = m_maincpu->space(AS_PROGRAM); + + int src = (m_dmasrc_lo_data | (m_dmasrc_hi_data <<8)) * 0x100; + uint16_t dest = (m_dmadst_lo_data | (m_dmadst_hi_data <<8)); + uint16_t size = (m_dmasize_lo_data | (m_dmasize_hi_data <<8)); + + logerror(" Doing DMA %06x to %04x size %04x\n", src, dest, size); + + for (int i = 0; i < size; i++) + { + uint8_t dat = fullbankspace.read_byte(src+i); + destspace.write_byte(dest+i, dat); + } +} + + + + // unknown regs that seem to also be pointers // seem to get set to sound data? @@ -638,14 +740,22 @@ WRITE8_MEMBER(radica_6502_state::radicasi_5027_w) static ADDRESS_MAP_START( radicasi_map, AS_PROGRAM, 8, radica_6502_state ) AM_RANGE(0x0000, 0x3fff) AM_RAM AM_SHARE("ram") // ends up copying code to ram, but could be due to banking issues - AM_RANGE(0x4800, 0x49ff) AM_RAM + AM_RANGE(0x4800, 0x49ff) AM_RAM AM_SHARE("palram") AM_RANGE(0x500b, 0x500b) AM_READ(radicasi_500b_r) // PAL / NTSC flag at least AM_RANGE(0x500c, 0x500c) AM_WRITE(radicasi_500c_w) AM_RANGE(0x500d, 0x500d) AM_READWRITE(radicasi_500d_r, radicasi_500d_w) - AM_RANGE(0x5010, 0x5010) AM_READWRITE(radicasi_palbase_lo_r, radicasi_palbase_lo_w) // palettebase - AM_RANGE(0x5011, 0x5011) AM_READWRITE(radicasi_palbase_hi_r, radicasi_palbase_hi_w) // palettebase + AM_RANGE(0x5010, 0x5010) AM_READWRITE(radicasi_dmasrc_lo_r, radicasi_dmasrc_lo_w) + AM_RANGE(0x5011, 0x5011) AM_READWRITE(radicasi_dmasrc_hi_r, radicasi_dmasrc_hi_w) + + AM_RANGE(0x5012, 0x5012) AM_READWRITE(radicasi_dmadst_lo_r, radicasi_dmadst_lo_w) + AM_RANGE(0x5013, 0x5013) AM_READWRITE(radicasi_dmadst_hi_r, radicasi_dmadst_hi_w) + + AM_RANGE(0x5014, 0x5014) AM_READWRITE(radicasi_dmasize_lo_r, radicasi_dmasize_lo_w) + AM_RANGE(0x5015, 0x5015) AM_READWRITE(radicasi_dmasize_hi_r, radicasi_dmasize_hi_w) + + AM_RANGE(0x5016, 0x5016) AM_READWRITE(radicasi_dmatrg_r, radicasi_dmatrg_w) AM_RANGE(0x5027, 0x5027) AM_WRITE(radicasi_5027_w) |