cybertnk.cpp : Cleanup duplicates, Reduce runtime tag lookups, Fix sound output(related to OST), Add notes

This commit is contained in:
cam900 2018-06-03 00:51:59 +09:00 committed by Vas Crabb
parent ad2f22acb9
commit 032aba9d4a

View File

@ -182,21 +182,22 @@ lev 7 : 0x7c : 0000 07e0 - input device clear?
class cybertnk_state : public driver_device class cybertnk_state : public driver_device
{ {
public: public:
cybertnk_state(const machine_config &mconfig, device_type type, const char *tag) cybertnk_state(const machine_config &mconfig, device_type type, const char *tag) :
: driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"), m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"), m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"), m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch"), m_soundlatch(*this, "soundlatch"),
m_spr_ram(*this, "spr_ram"), m_spr_ram(*this, "spr_ram"),
m_tilemap0_vram(*this, "tilemap0_vram"), m_vram(*this, "tilemap%u_vram", 0U),
m_tilemap1_vram(*this, "tilemap1_vram"), m_scroll(*this, "tilemap%u_scroll", 0U),
m_tilemap2_vram(*this, "tilemap2_vram"), m_roadram(*this, "roadram"),
m_tilemap0scroll(*this, "tilemap1_scroll"), m_spr_gfx(*this, "spr_gfx"),
m_tilemap1scroll(*this, "tilemap1_scroll"), m_traverse_io(*this, "TRAVERSE"),
m_tilemap2scroll(*this, "tilemap2_scroll"), m_elevate_io(*this, "ELEVATE"),
m_roadram(*this, "roadram") { } m_accel_io(*this, "ACCEL"),
m_handle_io(*this, "HANDLE") { }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu; required_device<cpu_device> m_audiocpu;
@ -205,33 +206,29 @@ public:
required_device<generic_latch_8_device> m_soundlatch; required_device<generic_latch_8_device> m_soundlatch;
required_shared_ptr<uint16_t> m_spr_ram; required_shared_ptr<uint16_t> m_spr_ram;
required_shared_ptr<uint16_t> m_tilemap0_vram; required_shared_ptr_array<uint16_t, 3> m_vram;
required_shared_ptr<uint16_t> m_tilemap1_vram; required_shared_ptr_array<uint16_t, 3> m_scroll;
required_shared_ptr<uint16_t> m_tilemap2_vram;
required_shared_ptr<uint16_t> m_tilemap0scroll;
required_shared_ptr<uint16_t> m_tilemap1scroll;
required_shared_ptr<uint16_t> m_tilemap2scroll;
required_shared_ptr<uint16_t> m_roadram; required_shared_ptr<uint16_t> m_roadram;
tilemap_t *m_tilemap0_tilemap; required_memory_region m_spr_gfx;
tilemap_t *m_tilemap1_tilemap; required_ioport m_traverse_io;
tilemap_t *m_tilemap2_tilemap; required_ioport m_elevate_io;
required_ioport m_accel_io;
required_ioport m_handle_io;
DECLARE_WRITE16_MEMBER(tilemap0_vram_w); tilemap_t *m_tilemap[3];
DECLARE_WRITE16_MEMBER(tilemap1_vram_w);
DECLARE_WRITE16_MEMBER(tilemap2_vram_w); template<int Layer> DECLARE_WRITE16_MEMBER(vram_w);
uint8_t m_mux_data; uint8_t m_mux_data;
DECLARE_WRITE8_MEMBER(cybertnk_sound_cmd_w); DECLARE_WRITE8_MEMBER(sound_cmd_w);
DECLARE_WRITE8_MEMBER(cybertnk_mux_w); DECLARE_WRITE8_MEMBER(mux_w);
DECLARE_READ8_MEMBER(cybertnk_io_rdy_r); DECLARE_READ8_MEMBER(io_rdy_r);
DECLARE_READ8_MEMBER(cybertnk_mux_r); DECLARE_READ8_MEMBER(mux_r);
DECLARE_WRITE8_MEMBER(cybertnk_irq_ack_w); DECLARE_WRITE8_MEMBER(irq_ack_w);
DECLARE_WRITE8_MEMBER(cybertnk_cnt_w); DECLARE_WRITE8_MEMBER(cnt_w);
void init_cybertnk(); void init_cybertnk();
TILE_GET_INFO_MEMBER(get_tilemap0_tile_info); template<int Layer> TILE_GET_INFO_MEMBER(get_tile_info);
TILE_GET_INFO_MEMBER(get_tilemap1_tile_info);
TILE_GET_INFO_MEMBER(get_tilemap2_tile_info);
virtual void video_start() override; virtual void video_start() override;
void draw_road(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int screen_shift, int pri); 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); 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) template<int Layer>
TILE_GET_INFO_MEMBER(cybertnk_state::get_tile_info)
{ {
int code = m_tilemap0_vram[tile_index]; int code = m_vram[Layer][tile_index];
int pal = (code & 0xe000) >> 13; int pal = (code & 0xe000) >> 13;
pal |=(code & 0x1c00) >> 7; pal |=(code & 0x1c00) >> 7;
SET_TILE_INFO_MEMBER(0, SET_TILE_INFO_MEMBER(Layer,
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)
{
int code = m_tilemap2_vram[tile_index];
int pal = (code & 0xe000) >> 13;
pal |=(code & 0x1c00) >> 7;
SET_TILE_INFO_MEMBER(2,
code & 0x1fff, code & 0x1fff,
pal, pal,
0); 0);
@ -293,14 +267,14 @@ TILE_GET_INFO_MEMBER(cybertnk_state::get_tilemap2_tile_info)
void cybertnk_state::video_start() 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_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_tilemap0_tilemap->set_transparent_pen(0); 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_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_tilemap1_tilemap->set_transparent_pen(0); 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_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_tilemap2_tilemap->set_transparent_pen(0); 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 // 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) 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(); const pen_t *paldata = m_palette->pens();
int miny = cliprect.min_y; 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) 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_tilemap[0]->set_scrolldx(screen_shift, screen_shift);
m_tilemap1_tilemap->set_scrolldx(screen_shift, screen_shift); m_tilemap[1]->set_scrolldx(screen_shift, screen_shift);
m_tilemap2_tilemap->set_scrolldx(screen_shift, screen_shift); m_tilemap[2]->set_scrolldx(screen_shift, screen_shift);
m_tilemap1_tilemap->set_scrolly(m_tilemap1scroll[2]); m_tilemap[1]->set_scrolly(m_scroll[1][2]);
m_tilemap2_tilemap->set_scrolly(m_tilemap2scroll[2]); m_tilemap[2]->set_scrolly(m_scroll[2][2]);
m_tilemap1_tilemap->set_scrollx(m_tilemap1scroll[0]); m_tilemap[1]->set_scrollx(m_scroll[1][0]);
m_tilemap2_tilemap->set_scrollx(m_tilemap2scroll[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); draw_road(screen,bitmap,cliprect,screen_shift, 0x00);
m_tilemap2_tilemap->draw(screen, bitmap, cliprect, 0,0); m_tilemap[2]->draw(screen, bitmap, cliprect, 0,0);
m_tilemap1_tilemap->draw(screen, bitmap, cliprect, 0,0); m_tilemap[1]->draw(screen, bitmap, cliprect, 0,0);
draw_road(screen,bitmap,cliprect,screen_shift, 0x80); draw_road(screen,bitmap,cliprect,screen_shift, 0x80);
draw_sprites(screen,bitmap,cliprect,screen_shift); 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; 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_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); } uint32_t cybertnk_state::screen_update_cybertnk_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect){ return update_screen(screen, bitmap, cliprect, -256); }
template<int Layer>
WRITE16_MEMBER(cybertnk_state::tilemap0_vram_w) WRITE16_MEMBER(cybertnk_state::vram_w)
{ {
COMBINE_DATA(&m_tilemap0_vram[offset]); COMBINE_DATA(&m_vram[Layer][offset]);
m_tilemap0_tilemap->mark_tile_dirty(offset); m_tilemap[Layer]->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)
{
COMBINE_DATA(&m_tilemap2_vram[offset]);
m_tilemap2_tilemap->mark_tile_dirty(offset);
} }
WRITE8_MEMBER( cybertnk_state::sound_cmd_w )
WRITE8_MEMBER( cybertnk_state::cybertnk_sound_cmd_w )
{ {
if (offset == 0) 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) else if (offset == 1)
{ {
m_soundlatch->write(space, offset, data & 0xff); 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) if (offset == 0)
{ {
// printf("cybertnk_mux_w offset 0 %02x\n", data); // printf("mux_w offset 0 %02x\n", data);
} }
else if (offset == 1) 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; m_mux_data = data & 0x60;
/* Other bits are unknown */ /* 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? // bit 0: i/o controller busy?
return 0; return 0;
} }
READ8_MEMBER( cybertnk_state::cybertnk_mux_r ) READ8_MEMBER( cybertnk_state::mux_r )
{ {
const char *const innames[] = { "TRAVERSE", "ELEVATE", "ACCEL", "HANDLE" }; switch (m_mux_data & 0x60)
return ioport(innames[(m_mux_data & 0x60) >> 5])->read(); {
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) */ /* 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) if (offset == 0)
{ {
// unused? // unused?
logerror("cybertnk_irq_ack_w offset 0 %02x\n", data); logerror("irq_ack_w offset 0 %02x\n", data);
} }
else if (offset == 1) 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) if (offset == 0)
{ {
@ -602,7 +576,7 @@ WRITE8_MEMBER( cybertnk_state::cybertnk_cnt_w )
else if (offset == 1) else if (offset == 1)
{ {
// unused? // 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(0x000000, 0x03ffff).rom();
map(0x080000, 0x087fff).ram(); /*Work RAM*/ map(0x080000, 0x087fff).ram(); /*Work RAM*/
map(0x0a0000, 0x0a0fff).ram().share("spr_ram"); // non-tile based sprite 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(0x0c0000, 0x0c1fff).ram().w(this, FUNC(cybertnk_state::vram_w<0>)).share("tilemap0_vram");
map(0x0c4000, 0x0c5fff).ram().w(this, FUNC(cybertnk_state::tilemap1_vram_w)).share("tilemap1_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::tilemap2_vram_w)).share("tilemap2_vram"); map(0x0c8000, 0x0c9fff).ram().w(this, FUNC(cybertnk_state::vram_w<2>)).share("tilemap2_vram");
map(0x0e0000, 0x0e0fff).ram().share("sharedram"); 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(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(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).portr("IN0");
map(0x110006, 0x110007).w(this, FUNC(cybertnk_state::cybertnk_mux_w)); map(0x110006, 0x110007).w(this, FUNC(cybertnk_state::mux_w));
map(0x110008, 0x110009).portr("IN1").w(this, FUNC(cybertnk_state::cybertnk_cnt_w)); map(0x110008, 0x110009).portr("IN1").w(this, FUNC(cybertnk_state::cnt_w));
map(0x11000a, 0x11000b).portr("DSW2"); 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(0x110040, 0x110045).ram().share("tilemap0_scroll");
map(0x110048, 0x11004d).ram().share("tilemap1_scroll"); map(0x110048, 0x11004d).ram().share("tilemap1_scroll");
map(0x110080, 0x110085).ram().share("tilemap2_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) void cybertnk_state::slave_mem(address_map &map)
@ -880,13 +854,13 @@ MACHINE_CONFIG_START(cybertnk_state::cybertnk)
SPEAKER(config, "rspeaker").front_right(); SPEAKER(config, "rspeaker").front_right();
MCFG_GENERIC_LATCH_8_ADD("soundlatch") 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_DEVICE_ADD("ym1", Y8950, XTAL(3'579'545))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) 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_DEVICE_ADD("ym2", Y8950, XTAL(3'579'545))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -983,7 +957,7 @@ ROM_END
void cybertnk_state::init_cybertnk() 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++) for (int x = 0; x< 0x200000/4;x++)
{ {
// reorder the data to simplify sprite drawing // reorder the data to simplify sprite drawing