From 032aba9d4a271202a81221ee510951aa8a4d606c Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 3 Jun 2018 00:51:59 +0900 Subject: cybertnk.cpp : Cleanup duplicates, Reduce runtime tag lookups, Fix sound output(related to OST), Add notes --- src/mame/drivers/cybertnk.cpp | 208 ++++++++++++++++++------------------------ 1 file changed, 91 insertions(+), 117 deletions(-) diff --git a/src/mame/drivers/cybertnk.cpp b/src/mame/drivers/cybertnk.cpp index 8d02b41ce71..31a54caa26a 100644 --- a/src/mame/drivers/cybertnk.cpp +++ b/src/mame/drivers/cybertnk.cpp @@ -182,21 +182,22 @@ lev 7 : 0x7c : 0000 07e0 - input device clear? class cybertnk_state : public driver_device { public: - cybertnk_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + cybertnk_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_soundlatch(*this, "soundlatch"), m_spr_ram(*this, "spr_ram"), - m_tilemap0_vram(*this, "tilemap0_vram"), - m_tilemap1_vram(*this, "tilemap1_vram"), - m_tilemap2_vram(*this, "tilemap2_vram"), - m_tilemap0scroll(*this, "tilemap1_scroll"), - m_tilemap1scroll(*this, "tilemap1_scroll"), - m_tilemap2scroll(*this, "tilemap2_scroll"), - m_roadram(*this, "roadram") { } + m_vram(*this, "tilemap%u_vram", 0U), + m_scroll(*this, "tilemap%u_scroll", 0U), + m_roadram(*this, "roadram"), + m_spr_gfx(*this, "spr_gfx"), + m_traverse_io(*this, "TRAVERSE"), + m_elevate_io(*this, "ELEVATE"), + m_accel_io(*this, "ACCEL"), + m_handle_io(*this, "HANDLE") { } required_device m_maincpu; required_device m_audiocpu; @@ -205,33 +206,29 @@ public: required_device m_soundlatch; required_shared_ptr m_spr_ram; - required_shared_ptr m_tilemap0_vram; - required_shared_ptr m_tilemap1_vram; - required_shared_ptr m_tilemap2_vram; - required_shared_ptr m_tilemap0scroll; - required_shared_ptr m_tilemap1scroll; - required_shared_ptr m_tilemap2scroll; + required_shared_ptr_array m_vram; + required_shared_ptr_array m_scroll; required_shared_ptr m_roadram; - tilemap_t *m_tilemap0_tilemap; - tilemap_t *m_tilemap1_tilemap; - tilemap_t *m_tilemap2_tilemap; + required_memory_region m_spr_gfx; + required_ioport m_traverse_io; + required_ioport m_elevate_io; + required_ioport m_accel_io; + required_ioport m_handle_io; - DECLARE_WRITE16_MEMBER(tilemap0_vram_w); - DECLARE_WRITE16_MEMBER(tilemap1_vram_w); - DECLARE_WRITE16_MEMBER(tilemap2_vram_w); + tilemap_t *m_tilemap[3]; + + template DECLARE_WRITE16_MEMBER(vram_w); uint8_t m_mux_data; - DECLARE_WRITE8_MEMBER(cybertnk_sound_cmd_w); - DECLARE_WRITE8_MEMBER(cybertnk_mux_w); - DECLARE_READ8_MEMBER(cybertnk_io_rdy_r); - DECLARE_READ8_MEMBER(cybertnk_mux_r); - DECLARE_WRITE8_MEMBER(cybertnk_irq_ack_w); - DECLARE_WRITE8_MEMBER(cybertnk_cnt_w); + DECLARE_WRITE8_MEMBER(sound_cmd_w); + DECLARE_WRITE8_MEMBER(mux_w); + DECLARE_READ8_MEMBER(io_rdy_r); + DECLARE_READ8_MEMBER(mux_r); + DECLARE_WRITE8_MEMBER(irq_ack_w); + DECLARE_WRITE8_MEMBER(cnt_w); void init_cybertnk(); - TILE_GET_INFO_MEMBER(get_tilemap0_tile_info); - TILE_GET_INFO_MEMBER(get_tilemap1_tile_info); - TILE_GET_INFO_MEMBER(get_tilemap2_tile_info); + template TILE_GET_INFO_MEMBER(get_tile_info); virtual void video_start() override; void draw_road(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int screen_shift, int pri); void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int screen_shift); @@ -255,37 +252,14 @@ public: */ -TILE_GET_INFO_MEMBER(cybertnk_state::get_tilemap0_tile_info) -{ - int code = m_tilemap0_vram[tile_index]; - int pal = (code & 0xe000) >> 13; - pal |=(code & 0x1c00) >> 7; - - SET_TILE_INFO_MEMBER(0, - code & 0x1fff, - pal, - 0); -} - -TILE_GET_INFO_MEMBER(cybertnk_state::get_tilemap1_tile_info) -{ - int code = m_tilemap1_vram[tile_index]; - int pal = (code & 0xe000) >> 13; - pal |=(code & 0x1c00) >> 7; - - SET_TILE_INFO_MEMBER(1, - code & 0x1fff, - pal, - 0); -} - -TILE_GET_INFO_MEMBER(cybertnk_state::get_tilemap2_tile_info) +template +TILE_GET_INFO_MEMBER(cybertnk_state::get_tile_info) { - int code = m_tilemap2_vram[tile_index]; + int code = m_vram[Layer][tile_index]; int pal = (code & 0xe000) >> 13; pal |=(code & 0x1c00) >> 7; - SET_TILE_INFO_MEMBER(2, + SET_TILE_INFO_MEMBER(Layer, code & 0x1fff, pal, 0); @@ -293,14 +267,14 @@ TILE_GET_INFO_MEMBER(cybertnk_state::get_tilemap2_tile_info) void cybertnk_state::video_start() { - m_tilemap0_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cybertnk_state::get_tilemap0_tile_info),this),TILEMAP_SCAN_ROWS,8,8,128,32); - m_tilemap0_tilemap->set_transparent_pen(0); + m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cybertnk_state::get_tile_info<0>),this),TILEMAP_SCAN_ROWS,8,8,128,32); + m_tilemap[0]->set_transparent_pen(0); - m_tilemap1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cybertnk_state::get_tilemap1_tile_info),this),TILEMAP_SCAN_ROWS,8,8,128,32); - m_tilemap1_tilemap->set_transparent_pen(0); + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cybertnk_state::get_tile_info<1>),this),TILEMAP_SCAN_ROWS,8,8,128,32); + m_tilemap[1]->set_transparent_pen(0); - m_tilemap2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cybertnk_state::get_tilemap2_tile_info),this),TILEMAP_SCAN_ROWS,8,8,128,32); - m_tilemap2_tilemap->set_transparent_pen(0); + m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cybertnk_state::get_tile_info<2>),this),TILEMAP_SCAN_ROWS,8,8,128,32); + m_tilemap[2]->set_transparent_pen(0); } @@ -331,7 +305,7 @@ void cybertnk_state::draw_road(screen_device &screen, bitmap_ind16 &bitmap, cons // check if these are similar / the same as weclemans void cybertnk_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int screen_shift) { - const uint32_t *sprrom = (uint32_t*)memregion("spr_gfx")->base(); + const uint32_t *sprrom = (uint32_t*)m_spr_gfx->base(); const pen_t *paldata = m_palette->pens(); int miny = cliprect.min_y; @@ -483,15 +457,15 @@ void cybertnk_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c uint32_t cybertnk_state::update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int screen_shift) { - m_tilemap0_tilemap->set_scrolldx(screen_shift, screen_shift); - m_tilemap1_tilemap->set_scrolldx(screen_shift, screen_shift); - m_tilemap2_tilemap->set_scrolldx(screen_shift, screen_shift); + m_tilemap[0]->set_scrolldx(screen_shift, screen_shift); + m_tilemap[1]->set_scrolldx(screen_shift, screen_shift); + m_tilemap[2]->set_scrolldx(screen_shift, screen_shift); - m_tilemap1_tilemap->set_scrolly(m_tilemap1scroll[2]); - m_tilemap2_tilemap->set_scrolly(m_tilemap2scroll[2]); + m_tilemap[1]->set_scrolly(m_scroll[1][2]); + m_tilemap[2]->set_scrolly(m_scroll[2][2]); - m_tilemap1_tilemap->set_scrollx(m_tilemap1scroll[0]); - m_tilemap2_tilemap->set_scrollx(m_tilemap2scroll[0]); + m_tilemap[1]->set_scrollx(m_scroll[1][0]); + m_tilemap[2]->set_scrollx(m_scroll[2][0]); @@ -500,14 +474,14 @@ uint32_t cybertnk_state::update_screen(screen_device &screen, bitmap_ind16 &bitm draw_road(screen,bitmap,cliprect,screen_shift, 0x00); - m_tilemap2_tilemap->draw(screen, bitmap, cliprect, 0,0); - m_tilemap1_tilemap->draw(screen, bitmap, cliprect, 0,0); + m_tilemap[2]->draw(screen, bitmap, cliprect, 0,0); + m_tilemap[1]->draw(screen, bitmap, cliprect, 0,0); draw_road(screen,bitmap,cliprect,screen_shift, 0x80); draw_sprites(screen,bitmap,cliprect,screen_shift); - m_tilemap0_tilemap->draw(screen, bitmap, cliprect, 0,0); + m_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); return 0; @@ -516,74 +490,74 @@ uint32_t cybertnk_state::update_screen(screen_device &screen, bitmap_ind16 &bitm uint32_t cybertnk_state::screen_update_cybertnk_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect){ return update_screen(screen, bitmap, cliprect, 0); } uint32_t cybertnk_state::screen_update_cybertnk_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect){ return update_screen(screen, bitmap, cliprect, -256); } - -WRITE16_MEMBER(cybertnk_state::tilemap0_vram_w) -{ - COMBINE_DATA(&m_tilemap0_vram[offset]); - m_tilemap0_tilemap->mark_tile_dirty(offset); -} - -WRITE16_MEMBER(cybertnk_state::tilemap1_vram_w) -{ - COMBINE_DATA(&m_tilemap1_vram[offset]); - m_tilemap1_tilemap->mark_tile_dirty(offset); -} - -WRITE16_MEMBER(cybertnk_state::tilemap2_vram_w) +template +WRITE16_MEMBER(cybertnk_state::vram_w) { - COMBINE_DATA(&m_tilemap2_vram[offset]); - m_tilemap2_tilemap->mark_tile_dirty(offset); + COMBINE_DATA(&m_vram[Layer][offset]); + m_tilemap[Layer]->mark_tile_dirty(offset); } - -WRITE8_MEMBER( cybertnk_state::cybertnk_sound_cmd_w ) +WRITE8_MEMBER( cybertnk_state::sound_cmd_w ) { if (offset == 0) { - printf("cybertnk_sound_cmd_w offset 0 %02x\n", data); + printf("sound_cmd_w offset 0 %02x\n", data); } else if (offset == 1) { m_soundlatch->write(space, offset, data & 0xff); - m_audiocpu->set_input_line(0, HOLD_LINE); } } -WRITE8_MEMBER( cybertnk_state::cybertnk_mux_w ) +WRITE8_MEMBER( cybertnk_state::mux_w ) { if (offset == 0) { -// printf("cybertnk_mux_w offset 0 %02x\n", data); +// printf("mux_w offset 0 %02x\n", data); } else if (offset == 1) { -// printf("cybertnk_mux_w offset 1 %02x\n", data); +// printf("mux_w offset 1 %02x\n", data); m_mux_data = data & 0x60; /* Other bits are unknown */ } } -READ8_MEMBER( cybertnk_state::cybertnk_io_rdy_r ) +READ8_MEMBER( cybertnk_state::io_rdy_r ) { // bit 0: i/o controller busy? return 0; } -READ8_MEMBER( cybertnk_state::cybertnk_mux_r ) +READ8_MEMBER( cybertnk_state::mux_r ) { - const char *const innames[] = { "TRAVERSE", "ELEVATE", "ACCEL", "HANDLE" }; - return ioport(innames[(m_mux_data & 0x60) >> 5])->read(); + switch (m_mux_data & 0x60) + { + case 0x00: + return m_traverse_io->read(); + break; + case 0x20: + return m_elevate_io->read(); + break; + case 0x40: + return m_accel_io->read(); + break; + case 0x60: + return m_handle_io->read(); + break; + } + return 0; } /* Amusingly the data written here is pretty weird, it seems suited for an unused protection device (attract = coin count, in-game = return status of some inputs) */ -WRITE8_MEMBER( cybertnk_state::cybertnk_irq_ack_w ) +WRITE8_MEMBER( cybertnk_state::irq_ack_w ) { if (offset == 0) { // unused? - logerror("cybertnk_irq_ack_w offset 0 %02x\n", data); + logerror("irq_ack_w offset 0 %02x\n", data); } else if (offset == 1) { @@ -591,7 +565,7 @@ WRITE8_MEMBER( cybertnk_state::cybertnk_irq_ack_w ) } } -WRITE8_MEMBER( cybertnk_state::cybertnk_cnt_w ) +WRITE8_MEMBER( cybertnk_state::cnt_w ) { if (offset == 0) { @@ -602,7 +576,7 @@ WRITE8_MEMBER( cybertnk_state::cybertnk_cnt_w ) else if (offset == 1) { // unused? - logerror("cybertnk_cnt_w offset 1 %02x\n", data); + logerror("cnt_w offset 1 %02x\n", data); } } @@ -612,26 +586,26 @@ void cybertnk_state::master_mem(address_map &map) map(0x000000, 0x03ffff).rom(); map(0x080000, 0x087fff).ram(); /*Work RAM*/ map(0x0a0000, 0x0a0fff).ram().share("spr_ram"); // non-tile based sprite ram - map(0x0c0000, 0x0c1fff).ram().w(this, FUNC(cybertnk_state::tilemap0_vram_w)).share("tilemap0_vram"); - map(0x0c4000, 0x0c5fff).ram().w(this, FUNC(cybertnk_state::tilemap1_vram_w)).share("tilemap1_vram"); - map(0x0c8000, 0x0c9fff).ram().w(this, FUNC(cybertnk_state::tilemap2_vram_w)).share("tilemap2_vram"); + map(0x0c0000, 0x0c1fff).ram().w(this, FUNC(cybertnk_state::vram_w<0>)).share("tilemap0_vram"); + map(0x0c4000, 0x0c5fff).ram().w(this, FUNC(cybertnk_state::vram_w<1>)).share("tilemap1_vram"); + map(0x0c8000, 0x0c9fff).ram().w(this, FUNC(cybertnk_state::vram_w<2>)).share("tilemap2_vram"); map(0x0e0000, 0x0e0fff).ram().share("sharedram"); map(0x100000, 0x107fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); /* 2x palettes, one for each screen */ - map(0x110000, 0x110001).w(this, FUNC(cybertnk_state::cybertnk_sound_cmd_w)); + map(0x110000, 0x110001).w(this, FUNC(cybertnk_state::sound_cmd_w)); map(0x110002, 0x110003).portr("DSW1").nopw();// watchdog? - map(0x110004, 0x110004).r(this, FUNC(cybertnk_state::cybertnk_io_rdy_r)); + map(0x110004, 0x110004).r(this, FUNC(cybertnk_state::io_rdy_r)); map(0x110006, 0x110007).portr("IN0"); - map(0x110006, 0x110007).w(this, FUNC(cybertnk_state::cybertnk_mux_w)); - map(0x110008, 0x110009).portr("IN1").w(this, FUNC(cybertnk_state::cybertnk_cnt_w)); + map(0x110006, 0x110007).w(this, FUNC(cybertnk_state::mux_w)); + map(0x110008, 0x110009).portr("IN1").w(this, FUNC(cybertnk_state::cnt_w)); map(0x11000a, 0x11000b).portr("DSW2"); - map(0x11000c, 0x11000d).w(this, FUNC(cybertnk_state::cybertnk_irq_ack_w)); + map(0x11000c, 0x11000d).w(this, FUNC(cybertnk_state::irq_ack_w)); map(0x110040, 0x110045).ram().share("tilemap0_scroll"); map(0x110048, 0x11004d).ram().share("tilemap1_scroll"); map(0x110080, 0x110085).ram().share("tilemap2_scroll"); - map(0x1100d5, 0x1100d5).r(this, FUNC(cybertnk_state::cybertnk_mux_r)); + map(0x1100d5, 0x1100d5).r(this, FUNC(cybertnk_state::mux_r)); } void cybertnk_state::slave_mem(address_map &map) @@ -880,13 +854,13 @@ MACHINE_CONFIG_START(cybertnk_state::cybertnk) SPEAKER(config, "rspeaker").front_right(); MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(HOLDLINE("audiocpu", 0)) + // Splited output per chip MCFG_DEVICE_ADD("ym1", Y8950, XTAL(3'579'545)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) MCFG_DEVICE_ADD("ym2", Y8950, XTAL(3'579'545)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) MACHINE_CONFIG_END @@ -983,7 +957,7 @@ ROM_END void cybertnk_state::init_cybertnk() { - uint32_t *spr = (uint32_t*)memregion("spr_gfx")->base(); + uint32_t *spr = (uint32_t*)m_spr_gfx->base(); for (int x = 0; x< 0x200000/4;x++) { // reorder the data to simplify sprite drawing -- cgit v1.2.3