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
{
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<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
@ -205,33 +206,29 @@ public:
required_device<generic_latch_8_device> m_soundlatch;
required_shared_ptr<uint16_t> m_spr_ram;
required_shared_ptr<uint16_t> m_tilemap0_vram;
required_shared_ptr<uint16_t> m_tilemap1_vram;
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_array<uint16_t, 3> m_vram;
required_shared_ptr_array<uint16_t, 3> m_scroll;
required_shared_ptr<uint16_t> 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<int Layer> 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<int Layer> 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)
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;
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)
{
int code = m_tilemap2_vram[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)
template<int Layer>
WRITE16_MEMBER(cybertnk_state::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)
{
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