spdodgeb.c: added save state support, configured banking (nw)

This commit is contained in:
Ivan Vangelista 2015-07-09 17:50:53 +02:00
parent 323028f4ec
commit 1651c33b4e
3 changed files with 70 additions and 52 deletions

View File

@ -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 )

View File

@ -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<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<msm5205_device> m_msm1;
required_device<msm5205_device> m_msm2;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_shared_ptr<UINT8> m_videoram;
required_shared_ptr<UINT8> 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<UINT8> m_videoram;
int m_tile_palbank;
int m_sprite_palbank;
tilemap_t *m_bg_tilemap;
int m_lastscroll;
required_shared_ptr<UINT8> m_spriteram;
required_device<cpu_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<cpu_device> m_audiocpu;
required_device<msm5205_device> m_msm1;
required_device<msm5205_device> m_msm2;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
};

View File

@ -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);