diff --git a/src/mame/drivers/silkroad.cpp b/src/mame/drivers/silkroad.cpp index 0aaa509cd0a..2c973489e14 100644 --- a/src/mame/drivers/silkroad.cpp +++ b/src/mame/drivers/silkroad.cpp @@ -132,50 +132,51 @@ ROM15.BIN MX29F1610, SOP44 Surface Mounted Mask ROM / */ -WRITE32_MEMBER(silkroad_state::paletteram32_xRRRRRGGGGGBBBBB_dword_w) +WRITE8_MEMBER(silkroad_state::okibank_w) { - COMBINE_DATA(&m_generic_paletteram_32[offset]); - m_palette->set_pen_color(offset,pal5bit(m_generic_paletteram_32[offset] >> (10+16)),pal5bit(m_generic_paletteram_32[offset] >> (5+16)),pal5bit(m_generic_paletteram_32[offset] >> (0+16))); + int bank = (data & 0x3); + if(bank < 3) + m_okibank->set_entry(bank); } -WRITE32_MEMBER(silkroad_state::silk_6295_bank_w) +WRITE8_MEMBER(silkroad_state::coin_w) { - if (ACCESSING_BITS_24_31) - { - int bank = (data & 0x3000000) >> 24; - if(bank < 3) - m_oki1->set_rom_bank(bank); - } + machine().bookkeeping().coin_counter_w(0, data & 0x1); + machine().bookkeeping().coin_counter_w(1, data & 0x8); } -WRITE32_MEMBER(silkroad_state::silk_coin_counter_w) +template +WRITE32_MEMBER(silkroad_state::vram_w) { - if (ACCESSING_BITS_16_23) - { - machine().bookkeeping().coin_counter_w(0, data & 0x10000); - machine().bookkeeping().coin_counter_w(1, data & 0x80000); - } + COMBINE_DATA(&m_vram[Layer][offset]); + m_tilemap[Layer]->mark_tile_dirty(offset); } void silkroad_state::cpu_map(address_map &map) { map(0x000000, 0x1fffff).rom(); map(0x40c000, 0x40cfff).ram().share("sprram"); // sprites - map(0x600000, 0x603fff).ram().w(FUNC(silkroad_state::paletteram32_xRRRRRGGGGGBBBBB_dword_w)).share("paletteram"); // palette - map(0x800000, 0x803fff).ram().w(FUNC(silkroad_state::silkroad_fgram_w)).share("vidram"); // lower Layer - map(0x804000, 0x807fff).ram().w(FUNC(silkroad_state::silkroad_fgram2_w)).share("vidram2"); // mid layer - map(0x808000, 0x80bfff).ram().w(FUNC(silkroad_state::silkroad_fgram3_w)).share("vidram3"); // higher layer + map(0x600000, 0x603fff).rw(m_palette, FUNC(palette_device::read16), FUNC(palette_device::write16)).umask32(0xffff0000).share("palette"); // palette + map(0x800000, 0x803fff).ram().w(FUNC(silkroad_state::vram_w<0>)).share("vram1"); // lower Layer + map(0x804000, 0x807fff).ram().w(FUNC(silkroad_state::vram_w<1>)).share("vram2"); // mid layer + map(0x808000, 0x80bfff).ram().w(FUNC(silkroad_state::vram_w<2>)).share("vram3"); // higher layer map(0xc00000, 0xc00003).portr("INPUTS"); map(0xc00004, 0xc00007).portr("DSW"); - map(0xc00025, 0xc00025).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0xc00025, 0xc00025).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0xc00028, 0xc0002f).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask32(0x00ff0000); map(0xc00031, 0xc00031).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0xc00034, 0xc00037).w(FUNC(silkroad_state::silk_6295_bank_w)); - map(0xc00038, 0xc0003b).w(FUNC(silkroad_state::silk_coin_counter_w)); + map(0xc00034, 0xc00034).w(FUNC(silkroad_state::okibank_w)); + map(0xc00039, 0xc00039).w(FUNC(silkroad_state::coin_w)); map(0xc0010c, 0xc00123).writeonly().share("regs"); map(0xfe0000, 0xffffff).ram(); } +void silkroad_state::oki_map(address_map &map) +{ + map(0x00000, 0x1ffff).rom(); + map(0x20000, 0x3ffff).bankr("okibank"); +} + static INPUT_PORTS_START( silkroad ) PORT_START("INPUTS") @@ -274,6 +275,11 @@ static GFXDECODE_START( gfx_silkroad ) GFXDECODE_ENTRY( "gfx1", 0, tiles16x16x6_layout, 0x0000, 256 ) GFXDECODE_END +void silkroad_state::machine_start() +{ + m_okibank->configure_entries(0, 4, memregion("oki1")->base() + 0x20000, 0x20000); +} + MACHINE_CONFIG_START(silkroad_state::silkroad) /* basic machine hardware */ @@ -287,12 +293,13 @@ MACHINE_CONFIG_START(silkroad_state::silkroad) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(6*8+2, 64*8-1-(10*8)-2, 2*8, 32*8-1-(2*8)) - MCFG_SCREEN_UPDATE_DRIVER(silkroad_state, screen_update_silkroad) + MCFG_SCREEN_UPDATE_DRIVER(silkroad_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_silkroad) MCFG_PALETTE_ADD("palette", 0x2000) - + MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB) + MCFG_PALETTE_MEMBITS(16) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -303,6 +310,7 @@ MACHINE_CONFIG_START(silkroad_state::silkroad) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'000'000)/32, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified (was 1056000) + MCFG_DEVICE_ADDRESS_MAP(0, oki_map) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.45) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.45) @@ -341,20 +349,12 @@ ROM_START( silkroad ) ROM_LOAD( "rom11.rom11", 0x0e00000, 0x0200000, CRC(11abaf1c) SHA1(19e86f3ebfec518a96c0520f36cfc1b525e7e55c) ) // 3 ROM_LOAD( "rom15.rom15", 0x1600000, 0x0200000, CRC(26a3b168) SHA1(a4b7955cc4d4fbec7c975a9456f2219ef33f1166) ) // 3 - ROM_REGION( 0x080000, "user1", 0 ) - ROM_LOAD( "rom00.bin", 0x000000, 0x080000, CRC(b10ba7ab) SHA1(a6a3ae71b803af9c31d7e97dc86cfcc123ee9a40) ) - /* $00000-$20000 stays the same in all sound banks, */ /* the second half of the bank is what gets switched */ - ROM_REGION( 0xc0000, "oki1", 0 ) /* Samples */ - ROM_COPY( "user1", 0x000000, 0x000000, 0x020000) - ROM_COPY( "user1", 0x020000, 0x020000, 0x020000) - ROM_COPY( "user1", 0x000000, 0x040000, 0x020000) - ROM_COPY( "user1", 0x040000, 0x060000, 0x020000) - ROM_COPY( "user1", 0x000000, 0x080000, 0x020000) - ROM_COPY( "user1", 0x060000, 0x0a0000, 0x020000) + ROM_REGION( 0x080000, "oki1", 0 ) + ROM_LOAD( "rom00.bin", 0x000000, 0x080000, CRC(b10ba7ab) SHA1(a6a3ae71b803af9c31d7e97dc86cfcc123ee9a40) ) - ROM_REGION( 0x080000, "oki2", 0 ) + ROM_REGION( 0x040000, "oki2", 0 ) ROM_LOAD( "rom01.bin", 0x000000, 0x040000, CRC(db8cb455) SHA1(6723b4018208d554bd1bf1e0640b72d2f4f47302) ) ROM_END @@ -377,20 +377,12 @@ ROM_START( silkroada ) ROM_LOAD( "rom11.rom11", 0x0e00000, 0x0200000, CRC(11abaf1c) SHA1(19e86f3ebfec518a96c0520f36cfc1b525e7e55c) ) // 3 ROM_LOAD( "rom15.rom15", 0x1600000, 0x0200000, CRC(26a3b168) SHA1(a4b7955cc4d4fbec7c975a9456f2219ef33f1166) ) // 3 - ROM_REGION( 0x080000, "user1", 0 ) - ROM_LOAD( "rom00.bin", 0x000000, 0x080000, CRC(b10ba7ab) SHA1(a6a3ae71b803af9c31d7e97dc86cfcc123ee9a40) ) - /* $00000-$20000 stays the same in all sound banks, */ /* the second half of the bank is what gets switched */ - ROM_REGION( 0xc0000, "oki1", 0 ) /* Samples */ - ROM_COPY( "user1", 0x000000, 0x000000, 0x020000) - ROM_COPY( "user1", 0x020000, 0x020000, 0x020000) - ROM_COPY( "user1", 0x000000, 0x040000, 0x020000) - ROM_COPY( "user1", 0x040000, 0x060000, 0x020000) - ROM_COPY( "user1", 0x000000, 0x080000, 0x020000) - ROM_COPY( "user1", 0x060000, 0x0a0000, 0x020000) + ROM_REGION( 0x080000, "oki1", 0 ) + ROM_LOAD( "rom00.bin", 0x000000, 0x080000, CRC(b10ba7ab) SHA1(a6a3ae71b803af9c31d7e97dc86cfcc123ee9a40) ) - ROM_REGION( 0x080000, "oki2", 0 ) + ROM_REGION( 0x040000, "oki2", 0 ) ROM_LOAD( "rom01.bin", 0x000000, 0x040000, CRC(db8cb455) SHA1(6723b4018208d554bd1bf1e0640b72d2f4f47302) ) ROM_END diff --git a/src/mame/includes/silkroad.h b/src/mame/includes/silkroad.h index 79ccb07908e..597eb304dd8 100644 --- a/src/mame/includes/silkroad.h +++ b/src/mame/includes/silkroad.h @@ -9,49 +9,40 @@ public: silkroad_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_oki1(*this, "oki1"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), - m_generic_paletteram_32(*this, "paletteram"), - m_vidram(*this, "vidram"), - m_vidram2(*this, "vidram2"), - m_vidram3(*this, "vidram3"), + m_vram(*this, "vram%u", 1U), m_sprram(*this, "sprram"), - m_regs(*this, "regs") { } + m_regs(*this, "regs"), + m_okibank(*this, "okibank") + { } void silkroad(machine_config &config); private: required_device m_maincpu; - required_device m_oki1; required_device m_gfxdecode; required_device m_palette; - required_shared_ptr m_generic_paletteram_32; - required_shared_ptr m_vidram; - required_shared_ptr m_vidram2; - required_shared_ptr m_vidram3; + required_shared_ptr_array m_vram; required_shared_ptr m_sprram; required_shared_ptr m_regs; - tilemap_t *m_fg_tilemap; - tilemap_t *m_fg2_tilemap; - tilemap_t *m_fg3_tilemap; + required_memory_bank m_okibank; - DECLARE_WRITE32_MEMBER(paletteram32_xRRRRRGGGGGBBBBB_dword_w); - DECLARE_WRITE32_MEMBER(silk_coin_counter_w); - DECLARE_WRITE32_MEMBER(silkroad_fgram_w); - DECLARE_WRITE32_MEMBER(silkroad_fgram2_w); - DECLARE_WRITE32_MEMBER(silkroad_fgram3_w); - DECLARE_WRITE32_MEMBER(silk_6295_bank_w); + tilemap_t *m_tilemap[3]; - TILE_GET_INFO_MEMBER(get_fg_tile_info); - TILE_GET_INFO_MEMBER(get_fg2_tile_info); - TILE_GET_INFO_MEMBER(get_fg3_tile_info); + DECLARE_WRITE8_MEMBER(coin_w); + template DECLARE_WRITE32_MEMBER(vram_w); + DECLARE_WRITE8_MEMBER(okibank_w); + template TILE_GET_INFO_MEMBER(get_tile_info); + + virtual void machine_start() override; virtual void video_start() override; - uint32_t screen_update_silkroad(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void cpu_map(address_map &map); + void oki_map(address_map &map); }; diff --git a/src/mame/video/silkroad.cpp b/src/mame/video/silkroad.cpp index 722dbe03c52..f9c5b4653a5 100644 --- a/src/mame/video/silkroad.cpp +++ b/src/mame/video/silkroad.cpp @@ -54,12 +54,12 @@ void silkroad_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c } } - -TILE_GET_INFO_MEMBER(silkroad_state::get_fg_tile_info) +template +TILE_GET_INFO_MEMBER(silkroad_state::get_tile_info) { - int code = ((m_vidram[tile_index] & 0xffff0000) >> 16 ); - int color = ((m_vidram[tile_index] & 0x000001f)); - int flipx = ((m_vidram[tile_index] & 0x0000080) >> 7); + int code = ((m_vram[Layer][tile_index] & 0xffff0000) >> 16 ); + int color = ((m_vram[Layer][tile_index] & 0x000001f)); + int flipx = ((m_vram[Layer][tile_index] & 0x0000080) >> 7); code += 0x18000; @@ -69,82 +69,34 @@ TILE_GET_INFO_MEMBER(silkroad_state::get_fg_tile_info) TILE_FLIPYX(flipx)); } - - -WRITE32_MEMBER(silkroad_state::silkroad_fgram_w) -{ - COMBINE_DATA(&m_vidram[offset]); - m_fg_tilemap->mark_tile_dirty(offset); -} - -TILE_GET_INFO_MEMBER(silkroad_state::get_fg2_tile_info) -{ - int code = ((m_vidram2[tile_index] & 0xffff0000) >> 16 ); - int color = ((m_vidram2[tile_index] & 0x000001f)); - int flipx = ((m_vidram2[tile_index] & 0x0000080) >> 7); - code += 0x18000; - SET_TILE_INFO_MEMBER(0, - code, - color, - TILE_FLIPYX(flipx)); -} - - - -WRITE32_MEMBER(silkroad_state::silkroad_fgram2_w) -{ - COMBINE_DATA(&m_vidram2[offset]); - m_fg2_tilemap->mark_tile_dirty(offset); -} - -TILE_GET_INFO_MEMBER(silkroad_state::get_fg3_tile_info) -{ - int code = ((m_vidram3[tile_index] & 0xffff0000) >> 16 ); - int color = ((m_vidram3[tile_index] & 0x000001f)); - int flipx = ((m_vidram3[tile_index] & 0x0000080) >> 7); - code += 0x18000; - SET_TILE_INFO_MEMBER(0, - code, - color, - TILE_FLIPYX(flipx)); -} - - - -WRITE32_MEMBER(silkroad_state::silkroad_fgram3_w) -{ - COMBINE_DATA(&m_vidram3[offset]); - m_fg3_tilemap->mark_tile_dirty(offset); -} - void silkroad_state::video_start() { - m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silkroad_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 64, 64); - m_fg2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silkroad_state::get_fg2_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 64, 64); - m_fg3_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silkroad_state::get_fg3_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 64, 64); + m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silkroad_state::get_tile_info<0>),this), TILEMAP_SCAN_ROWS, 16, 16, 64, 64); + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silkroad_state::get_tile_info<1>),this), TILEMAP_SCAN_ROWS, 16, 16, 64, 64); + m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silkroad_state::get_tile_info<2>),this), TILEMAP_SCAN_ROWS, 16, 16, 64, 64); - m_fg_tilemap->set_transparent_pen(0); - m_fg2_tilemap->set_transparent_pen(0); - m_fg3_tilemap->set_transparent_pen(0); + m_tilemap[0]->set_transparent_pen(0); + m_tilemap[1]->set_transparent_pen(0); + m_tilemap[2]->set_transparent_pen(0); } -uint32_t silkroad_state::screen_update_silkroad(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t silkroad_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { screen.priority().fill(0, cliprect); bitmap.fill(0x7c0, cliprect); - m_fg_tilemap->set_scrollx(0, ((m_regs[0] & 0xffff0000) >> 16) ); - m_fg_tilemap->set_scrolly(0, (m_regs[0] & 0x0000ffff) >> 0 ); + m_tilemap[0]->set_scrollx(0, ((m_regs[0] & 0xffff0000) >> 16) ); + m_tilemap[0]->set_scrolly(0, (m_regs[0] & 0x0000ffff) >> 0 ); - m_fg3_tilemap->set_scrolly(0, (m_regs[1] & 0xffff0000) >> 16 ); - m_fg3_tilemap->set_scrollx(0, (m_regs[2] & 0xffff0000) >> 16 ); + m_tilemap[2]->set_scrolly(0, (m_regs[1] & 0xffff0000) >> 16 ); + m_tilemap[2]->set_scrollx(0, (m_regs[2] & 0xffff0000) >> 16 ); - m_fg2_tilemap->set_scrolly(0, ((m_regs[5] & 0xffff0000) >> 16)); - m_fg2_tilemap->set_scrollx(0, (m_regs[2] & 0x0000ffff) >> 0 ); + m_tilemap[1]->set_scrolly(0, ((m_regs[5] & 0xffff0000) >> 16)); + m_tilemap[1]->set_scrollx(0, (m_regs[2] & 0x0000ffff) >> 0 ); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0,0); - m_fg2_tilemap->draw(screen, bitmap, cliprect, 0,1); - m_fg3_tilemap->draw(screen, bitmap, cliprect, 0,2); + m_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); + m_tilemap[1]->draw(screen, bitmap, cliprect, 0,1); + m_tilemap[2]->draw(screen, bitmap, cliprect, 0,2); draw_sprites(screen,bitmap,cliprect); if (0)