From 1651c33b4e176a5dc6e6f6f5d40ab9b51438bcb9 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Thu, 9 Jul 2015 17:50:53 +0200 Subject: [PATCH] spdodgeb.c: added save state support, configured banking (nw) --- src/mame/drivers/spdodgeb.c | 35 +++++++++++++++++--------- src/mame/includes/spdodgeb.h | 48 +++++++++++++++++++++--------------- src/mame/video/spdodgeb.c | 39 ++++++++++++++--------------- 3 files changed, 70 insertions(+), 52 deletions(-) diff --git a/src/mame/drivers/spdodgeb.c b/src/mame/drivers/spdodgeb.c index 637b619bdca..add856999d4 100644 --- a/src/mame/drivers/spdodgeb.c +++ b/src/mame/drivers/spdodgeb.c @@ -4,7 +4,7 @@ Super Dodge Ball / Nekketsu Koukou Dodgeball Bu -briver by Paul Hampson and Nicola Salmoria +driver by Paul Hampson and Nicola Salmoria TODO: - sprite lag (the real game has quite a bit of lag too) @@ -27,7 +27,6 @@ Notes: #include "cpu/m6502/m6502.h" #include "cpu/m6809/m6809.h" #include "sound/3812intf.h" -#include "sound/msm5205.h" #include "includes/spdodgeb.h" @@ -244,17 +243,17 @@ WRITE8_MEMBER(spdodgeb_state::mcu63701_w) static ADDRESS_MAP_START( spdodgeb_map, AS_PROGRAM, 8, spdodgeb_state ) AM_RANGE(0x0000, 0x0fff) AM_RAM AM_RANGE(0x1000, 0x10ff) AM_WRITEONLY AM_SHARE("spriteram") - AM_RANGE(0x2000, 0x2fff) AM_RAM_WRITE(spdodgeb_videoram_w) AM_SHARE("videoram") + AM_RANGE(0x2000, 0x2fff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram") AM_RANGE(0x3000, 0x3000) AM_READ_PORT("IN0") //AM_WRITENOP AM_RANGE(0x3001, 0x3001) AM_READ_PORT("DSW") //AM_WRITENOP AM_RANGE(0x3002, 0x3002) AM_WRITE(sound_command_w) // AM_RANGE(0x3003, 0x3003) AM_WRITENOP - AM_RANGE(0x3004, 0x3004) AM_WRITE(spdodgeb_scrollx_lo_w) + AM_RANGE(0x3004, 0x3004) AM_WRITE(scrollx_lo_w) // AM_RANGE(0x3005, 0x3005) AM_WRITENOP /* mcu63701_output_w */ - AM_RANGE(0x3006, 0x3006) AM_WRITE(spdodgeb_ctrl_w) /* scroll hi, flip screen, bank switch, palette select */ + AM_RANGE(0x3006, 0x3006) AM_WRITE(ctrl_w) /* scroll hi, flip screen, bank switch, palette select */ AM_RANGE(0x3800, 0x3800) AM_WRITE(mcu63701_w) AM_RANGE(0x3801, 0x3805) AM_READ(mcu63701_r) - AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1") + AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("mainbank") AM_RANGE(0x8000, 0xffff) AM_ROM ADDRESS_MAP_END @@ -380,6 +379,20 @@ static GFXDECODE_START( spdodgeb ) GFXDECODE_END +void spdodgeb_state::machine_start() +{ + save_item(NAME(m_toggle)); + save_item(NAME(m_adpcm_pos)); + save_item(NAME(m_adpcm_end)); + save_item(NAME(m_adpcm_idle)); + save_item(NAME(m_adpcm_data)); + save_item(NAME(m_mcu63701_command)); + save_item(NAME(m_inputs)); + save_item(NAME(m_tapc)); + save_item(NAME(m_last_port)); + save_item(NAME(m_last_dash)); +} + void spdodgeb_state::machine_reset() { m_toggle = 0; @@ -399,7 +412,7 @@ static MACHINE_CONFIG_START( spdodgeb, spdodgeb_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, XTAL_12MHz/6) /* 2MHz ? */ MCFG_CPU_PROGRAM_MAP(spdodgeb_map) - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", spdodgeb_state, spdodgeb_interrupt, "screen", 0, 1) /* 1 IRQ every 8 visible scanlines, plus NMI for vblank */ + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", spdodgeb_state, interrupt, "screen", 0, 1) /* 1 IRQ every 8 visible scanlines, plus NMI for vblank */ MCFG_CPU_ADD("audiocpu", M6809, XTAL_12MHz/6) /* 2MHz ? */ MCFG_CPU_PROGRAM_MAP(spdodgeb_sound_map) @@ -407,7 +420,7 @@ static MACHINE_CONFIG_START( spdodgeb, spdodgeb_state ) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(XTAL_12MHz/2, 384, 0, 256, 272, 0, 240) - MCFG_SCREEN_UPDATE_DRIVER(spdodgeb_state, screen_update_spdodgeb) + MCFG_SCREEN_UPDATE_DRIVER(spdodgeb_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", spdodgeb) @@ -561,6 +574,6 @@ ROM_END -GAME( 1987, spdodgeb, 0, spdodgeb, spdodgeb, driver_device, 0, ROT0, "Technos Japan", "Super Dodge Ball (US)", 0 ) -GAME( 1987, nkdodge, spdodgeb, spdodgeb, spdodgeb, driver_device, 0, ROT0, "Technos Japan", "Nekketsu Koukou Dodgeball Bu (Japan)", 0 ) -GAME( 1987, nkdodgeb, spdodgeb, spdodgeb, spdodgeb, driver_device, 0, ROT0, "bootleg", "Nekketsu Koukou Dodgeball Bu (Japan, bootleg)", 0 ) +GAME( 1987, spdodgeb, 0, spdodgeb, spdodgeb, driver_device, 0, ROT0, "Technos Japan", "Super Dodge Ball (US)", GAME_SUPPORTS_SAVE ) +GAME( 1987, nkdodge, spdodgeb, spdodgeb, spdodgeb, driver_device, 0, ROT0, "Technos Japan", "Nekketsu Koukou Dodgeball Bu (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1987, nkdodgeb, spdodgeb, spdodgeb, spdodgeb, driver_device, 0, ROT0, "bootleg", "Nekketsu Koukou Dodgeball Bu (Japan, bootleg)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/spdodgeb.h b/src/mame/includes/spdodgeb.h index 2dd4ad26571..54ec83d83df 100644 --- a/src/mame/includes/spdodgeb.h +++ b/src/mame/includes/spdodgeb.h @@ -13,15 +13,26 @@ class spdodgeb_state : public driver_device public: spdodgeb_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_videoram(*this, "videoram"), - m_spriteram(*this, "spriteram"), m_maincpu(*this,"maincpu"), m_audiocpu(*this, "audiocpu"), m_msm1(*this, "msm1"), m_msm2(*this, "msm2"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_videoram(*this, "videoram"), + m_spriteram(*this, "spriteram") { } + + required_device m_maincpu; + required_device m_audiocpu; + required_device m_msm1; + required_device m_msm2; + required_device m_gfxdecode; + required_device m_screen; + required_device m_palette; + + required_shared_ptr m_videoram; + required_shared_ptr m_spriteram; int m_toggle; int m_adpcm_pos[2]; @@ -41,38 +52,35 @@ public: int m_countdown[2][2]; int m_prev[2]; #endif - required_shared_ptr m_videoram; int m_tile_palbank; int m_sprite_palbank; tilemap_t *m_bg_tilemap; int m_lastscroll; - required_shared_ptr m_spriteram; - required_device m_maincpu; DECLARE_WRITE8_MEMBER(sound_command_w); DECLARE_WRITE8_MEMBER(spd_adpcm_w); DECLARE_READ8_MEMBER(mcu63701_r); DECLARE_WRITE8_MEMBER(mcu63701_w); - DECLARE_WRITE8_MEMBER(spdodgeb_scrollx_lo_w); - DECLARE_WRITE8_MEMBER(spdodgeb_ctrl_w); - DECLARE_WRITE8_MEMBER(spdodgeb_videoram_w); + DECLARE_WRITE8_MEMBER(scrollx_lo_w); + DECLARE_WRITE8_MEMBER(ctrl_w); + DECLARE_WRITE8_MEMBER(videoram_w); + DECLARE_WRITE_LINE_MEMBER(spd_adpcm_int_1); + DECLARE_WRITE_LINE_MEMBER(spd_adpcm_int_2); + TILEMAP_MAPPER_MEMBER(background_scan); TILE_GET_INFO_MEMBER(get_bg_tile_info); + + virtual void machine_start(); virtual void machine_reset(); virtual void video_start(); DECLARE_PALETTE_INIT(spdodgeb); - UINT32 screen_update_spdodgeb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_DEVICE_CALLBACK_MEMBER(spdodgeb_interrupt); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect ); - void mcu63705_update_inputs(); + + TIMER_DEVICE_CALLBACK_MEMBER(interrupt); DECLARE_CUSTOM_INPUT_MEMBER(mcu63705_busy_r); + + void mcu63705_update_inputs(); void spd_adpcm_int(msm5205_device *device, int chip); - DECLARE_WRITE_LINE_MEMBER(spd_adpcm_int_1); - DECLARE_WRITE_LINE_MEMBER(spd_adpcm_int_2); - required_device m_audiocpu; - required_device m_msm1; - required_device m_msm2; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; }; diff --git a/src/mame/video/spdodgeb.c b/src/mame/video/spdodgeb.c index 4c2ea801c7a..79fdef1cfa6 100644 --- a/src/mame/video/spdodgeb.c +++ b/src/mame/video/spdodgeb.c @@ -8,10 +8,8 @@ PALETTE_INIT_MEMBER(spdodgeb_state, spdodgeb) { const UINT8 *color_prom = memregion("proms")->base(); - int i; - - for (i = 0;i < palette.entries();i++) + for (int i = 0;i < palette.entries();i++) { int bit0,bit1,bit2,bit3,r,g,b; @@ -73,6 +71,12 @@ TILE_GET_INFO_MEMBER(spdodgeb_state::get_bg_tile_info) void spdodgeb_state::video_start() { m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(spdodgeb_state::get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(spdodgeb_state::background_scan),this),8,8,64,32); + + membank("mainbank")->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x4000); + + save_item(NAME(m_tile_palbank)); + save_item(NAME(m_sprite_palbank)); + save_item(NAME(m_lastscroll)); } @@ -83,7 +87,7 @@ void spdodgeb_state::video_start() ***************************************************************************/ -TIMER_DEVICE_CALLBACK_MEMBER(spdodgeb_state::spdodgeb_interrupt) +TIMER_DEVICE_CALLBACK_MEMBER(spdodgeb_state::interrupt) { int scanline = param; @@ -99,20 +103,18 @@ TIMER_DEVICE_CALLBACK_MEMBER(spdodgeb_state::spdodgeb_interrupt) } } -WRITE8_MEMBER(spdodgeb_state::spdodgeb_scrollx_lo_w) +WRITE8_MEMBER(spdodgeb_state::scrollx_lo_w) { m_lastscroll = (m_lastscroll & 0x100) | data; } -WRITE8_MEMBER(spdodgeb_state::spdodgeb_ctrl_w) +WRITE8_MEMBER(spdodgeb_state::ctrl_w) { - UINT8 *rom = memregion("maincpu")->base(); - /* bit 0 = flip screen */ flip_screen_set(data & 0x01); /* bit 1 = ROM bank switch */ - membank("bank1")->set_base(rom + 0x10000 + 0x4000 * ((~data & 0x02) >> 1)); + membank("mainbank")->set_entry((~data & 0x02) >> 1); /* bit 2 = scroll high bit */ m_lastscroll = (m_lastscroll & 0x0ff) | ((data & 0x04) << 6); @@ -128,7 +130,7 @@ WRITE8_MEMBER(spdodgeb_state::spdodgeb_ctrl_w) m_sprite_palbank = (data & 0xc0) >> 6; } -WRITE8_MEMBER(spdodgeb_state::spdodgeb_videoram_w) +WRITE8_MEMBER(spdodgeb_state::videoram_w) { m_videoram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); @@ -148,22 +150,17 @@ WRITE8_MEMBER(spdodgeb_state::spdodgeb_videoram_w) void spdodgeb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect ) { - UINT8 *spriteram = m_spriteram; gfx_element *gfx = m_gfxdecode->gfx(1); - UINT8 *src; - int i; - - src = spriteram; /* 240-SY Z|F|CLR|WCH WHICH SX xxxxxxxx x|x|xxx|xxx xxxxxxxx xxxxxxxx */ - for (i = 0;i < m_spriteram.bytes();i += 4) + for (int i = 0;i < m_spriteram.bytes();i += 4) { - int attr = src[i+1]; - int which = src[i+2]+((attr & 0x07)<<8); - int sx = src[i+3]; - int sy = 240 - src[i]; + int attr = m_spriteram[i+1]; + int which = m_spriteram[i+2]+((attr & 0x07)<<8); + int sx = m_spriteram[i+3]; + int sy = 240 - m_spriteram[i]; int size = (attr & 0x80) >> 7; int color = (attr & 0x38) >> 3; int flipx = ~attr & 0x40; @@ -203,7 +200,7 @@ void spdodgeb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec #undef DRAW_SPRITE -UINT32 spdodgeb_state::screen_update_spdodgeb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 spdodgeb_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { m_bg_tilemap->set_scrollx(0,m_lastscroll+5); m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);