mirror of
https://github.com/holub/mame
synced 2025-04-23 17:00:53 +03:00
spdodgeb.c: added save state support, configured banking (nw)
This commit is contained in:
parent
323028f4ec
commit
1651c33b4e
@ -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 )
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user