ssozumo.c: added save state support (nw)

This commit is contained in:
Ivan Vangelista 2015-03-11 18:59:26 +01:00
parent 4af85db0a1
commit b0583d30fa
3 changed files with 62 additions and 52 deletions

View File

@ -14,7 +14,13 @@ Driver by Takahiro Nogi (nogi@kt.rim.or.jp) 1999/10/04
#include "sound/dac.h" #include "sound/dac.h"
#include "includes/ssozumo.h" #include "includes/ssozumo.h"
WRITE8_MEMBER(ssozumo_state::ssozumo_sh_command_w)
void ssozumo_state::machine_start()
{
save_item(NAME(m_sound_nmi_mask));
}
WRITE8_MEMBER(ssozumo_state::sh_command_w)
{ {
soundlatch_byte_w(space, 0, data); soundlatch_byte_w(space, 0, data);
m_audiocpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE); m_audiocpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE);
@ -24,18 +30,18 @@ WRITE8_MEMBER(ssozumo_state::ssozumo_sh_command_w)
static ADDRESS_MAP_START( ssozumo_map, AS_PROGRAM, 8, ssozumo_state ) static ADDRESS_MAP_START( ssozumo_map, AS_PROGRAM, 8, ssozumo_state )
AM_RANGE(0x0000, 0x077f) AM_RAM AM_RANGE(0x0000, 0x077f) AM_RAM
AM_RANGE(0x0780, 0x07ff) AM_RAM AM_SHARE("spriteram") AM_RANGE(0x0780, 0x07ff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x2000, 0x23ff) AM_RAM_WRITE(ssozumo_videoram2_w) AM_SHARE("videoram2") AM_RANGE(0x2000, 0x23ff) AM_RAM_WRITE(videoram2_w) AM_SHARE("videoram2")
AM_RANGE(0x2400, 0x27ff) AM_RAM_WRITE(ssozumo_colorram2_w) AM_SHARE("colorram2") AM_RANGE(0x2400, 0x27ff) AM_RAM_WRITE(colorram2_w) AM_SHARE("colorram2")
AM_RANGE(0x3000, 0x31ff) AM_RAM_WRITE(ssozumo_videoram_w) AM_SHARE("videoram") AM_RANGE(0x3000, 0x31ff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram")
AM_RANGE(0x3200, 0x33ff) AM_RAM_WRITE(ssozumo_colorram_w) AM_SHARE("colorram") AM_RANGE(0x3200, 0x33ff) AM_RAM_WRITE(colorram_w) AM_SHARE("colorram")
AM_RANGE(0x3400, 0x35ff) AM_RAM AM_RANGE(0x3400, 0x35ff) AM_RAM
AM_RANGE(0x3600, 0x37ff) AM_RAM AM_RANGE(0x3600, 0x37ff) AM_RAM
AM_RANGE(0x4000, 0x4000) AM_READ_PORT("P1") AM_WRITE(ssozumo_flipscreen_w) AM_RANGE(0x4000, 0x4000) AM_READ_PORT("P1") AM_WRITE(flipscreen_w)
AM_RANGE(0x4010, 0x4010) AM_READ_PORT("P2") AM_WRITE(ssozumo_sh_command_w) AM_RANGE(0x4010, 0x4010) AM_READ_PORT("P2") AM_WRITE(sh_command_w)
AM_RANGE(0x4020, 0x4020) AM_READ_PORT("DSW2") AM_WRITE(ssozumo_scroll_w) AM_RANGE(0x4020, 0x4020) AM_READ_PORT("DSW2") AM_WRITE(scroll_w)
AM_RANGE(0x4030, 0x4030) AM_READ_PORT("DSW1") AM_RANGE(0x4030, 0x4030) AM_READ_PORT("DSW1")
// AM_RANGE(0x4030, 0x4030) AM_WRITEONLY // AM_RANGE(0x4030, 0x4030) AM_WRITEONLY
AM_RANGE(0x4050, 0x407f) AM_RAM_WRITE(ssozumo_paletteram_w) AM_SHARE("paletteram") AM_RANGE(0x4050, 0x407f) AM_RAM_WRITE(paletteram_w) AM_SHARE("paletteram")
AM_RANGE(0x6000, 0xffff) AM_ROM AM_RANGE(0x6000, 0xffff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -202,7 +208,7 @@ static MACHINE_CONFIG_START( ssozumo, ssozumo_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8 - 1, 1*8, 31*8 - 1) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8 - 1, 1*8, 31*8 - 1)
MCFG_SCREEN_UPDATE_DRIVER(ssozumo_state, screen_update_ssozumo) MCFG_SCREEN_UPDATE_DRIVER(ssozumo_state, screen_update)
MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", ssozumo) MCFG_GFXDECODE_ADD("gfxdecode", "palette", ssozumo)
@ -281,4 +287,4 @@ ROM_END
GAME( 1984, ssozumo, 0, ssozumo, ssozumo, driver_device, 0, ROT270, "Technos Japan", "Syusse Oozumou (Japan)", 0 ) GAME( 1984, ssozumo, 0, ssozumo, ssozumo, driver_device, 0, ROT270, "Technos Japan", "Syusse Oozumou (Japan)", GAME_SUPPORTS_SAVE )

View File

@ -3,16 +3,21 @@ class ssozumo_state : public driver_device
public: public:
ssozumo_state(const machine_config &mconfig, device_type type, const char *tag) ssozumo_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_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_spriteram(*this, "spriteram"), m_spriteram(*this, "spriteram"),
m_paletteram(*this, "paletteram"), m_paletteram(*this, "paletteram"),
m_videoram(*this, "videoram"), m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"), m_colorram(*this, "colorram"),
m_videoram2(*this, "videoram2"), m_videoram2(*this, "videoram2"),
m_colorram2(*this, "colorram2"), m_colorram2(*this, "colorram2") { }
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"), required_device<cpu_device> m_maincpu;
m_gfxdecode(*this, "gfxdecode"), required_device<cpu_device> m_audiocpu;
m_palette(*this, "palette") { } required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<UINT8> m_spriteram; required_shared_ptr<UINT8> m_spriteram;
required_shared_ptr<UINT8> m_paletteram; required_shared_ptr<UINT8> m_paletteram;
@ -23,27 +28,29 @@ public:
tilemap_t *m_bg_tilemap; tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap; tilemap_t *m_fg_tilemap;
UINT8 m_sound_nmi_mask; UINT8 m_sound_nmi_mask;
DECLARE_WRITE8_MEMBER(ssozumo_sh_command_w);
DECLARE_WRITE8_MEMBER(sh_command_w);
DECLARE_WRITE8_MEMBER(sound_nmi_mask_w); DECLARE_WRITE8_MEMBER(sound_nmi_mask_w);
DECLARE_WRITE8_MEMBER(ssozumo_videoram_w); DECLARE_WRITE8_MEMBER(videoram_w);
DECLARE_WRITE8_MEMBER(ssozumo_colorram_w); DECLARE_WRITE8_MEMBER(colorram_w);
DECLARE_WRITE8_MEMBER(ssozumo_videoram2_w); DECLARE_WRITE8_MEMBER(videoram2_w);
DECLARE_WRITE8_MEMBER(ssozumo_colorram2_w); DECLARE_WRITE8_MEMBER(colorram2_w);
DECLARE_WRITE8_MEMBER(ssozumo_paletteram_w); DECLARE_WRITE8_MEMBER(paletteram_w);
DECLARE_WRITE8_MEMBER(ssozumo_scroll_w); DECLARE_WRITE8_MEMBER(scroll_w);
DECLARE_WRITE8_MEMBER(ssozumo_flipscreen_w); DECLARE_WRITE8_MEMBER(flipscreen_w);
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
INTERRUPT_GEN_MEMBER(sound_timer_irq);
TILE_GET_INFO_MEMBER(get_bg_tile_info); TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info); TILE_GET_INFO_MEMBER(get_fg_tile_info);
virtual void machine_start();
virtual void video_start(); virtual void video_start();
DECLARE_PALETTE_INIT(ssozumo); DECLARE_PALETTE_INIT(ssozumo);
UINT32 screen_update_ssozumo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(sound_timer_irq); UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
}; };

View File

@ -41,31 +41,31 @@ PALETTE_INIT_MEMBER(ssozumo_state, ssozumo)
} }
} }
WRITE8_MEMBER(ssozumo_state::ssozumo_videoram_w) WRITE8_MEMBER(ssozumo_state::videoram_w)
{ {
m_videoram[offset] = data; m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset); m_bg_tilemap->mark_tile_dirty(offset);
} }
WRITE8_MEMBER(ssozumo_state::ssozumo_colorram_w) WRITE8_MEMBER(ssozumo_state::colorram_w)
{ {
m_colorram[offset] = data; m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset); m_bg_tilemap->mark_tile_dirty(offset);
} }
WRITE8_MEMBER(ssozumo_state::ssozumo_videoram2_w) WRITE8_MEMBER(ssozumo_state::videoram2_w)
{ {
m_videoram2[offset] = data; m_videoram2[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset); m_fg_tilemap->mark_tile_dirty(offset);
} }
WRITE8_MEMBER(ssozumo_state::ssozumo_colorram2_w) WRITE8_MEMBER(ssozumo_state::colorram2_w)
{ {
m_colorram2[offset] = data; m_colorram2[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset); m_fg_tilemap->mark_tile_dirty(offset);
} }
WRITE8_MEMBER(ssozumo_state::ssozumo_paletteram_w) WRITE8_MEMBER(ssozumo_state::paletteram_w)
{ {
int bit0, bit1, bit2, bit3, val; int bit0, bit1, bit2, bit3, val;
int r, g, b; int r, g, b;
@ -98,12 +98,12 @@ WRITE8_MEMBER(ssozumo_state::ssozumo_paletteram_w)
m_palette->set_pen_color(offs2 + 64, rgb_t(r, g, b)); m_palette->set_pen_color(offs2 + 64, rgb_t(r, g, b));
} }
WRITE8_MEMBER(ssozumo_state::ssozumo_scroll_w) WRITE8_MEMBER(ssozumo_state::scroll_w)
{ {
m_bg_tilemap->set_scrolly(0, data); m_bg_tilemap->set_scrolly(0, data);
} }
WRITE8_MEMBER(ssozumo_state::ssozumo_flipscreen_w) WRITE8_MEMBER(ssozumo_state::flipscreen_w)
{ {
flip_screen_set(data & 0x80); flip_screen_set(data & 0x80);
} }
@ -138,19 +138,16 @@ void ssozumo_state::video_start()
void ssozumo_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) void ssozumo_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
UINT8 *spriteram = m_spriteram; for (int offs = 0; offs < m_spriteram.bytes(); offs += 4)
int offs;
for (offs = 0; offs < m_spriteram.bytes(); offs += 4)
{ {
if (spriteram[offs] & 0x01) if (m_spriteram[offs] & 0x01)
{ {
int code = spriteram[offs + 1] + ((spriteram[offs] & 0xf0) << 4); int code = m_spriteram[offs + 1] + ((m_spriteram[offs] & 0xf0) << 4);
int color = (spriteram[offs] & 0x08) >> 3; int color = (m_spriteram[offs] & 0x08) >> 3;
int flipx = spriteram[offs] & 0x04; int flipx = m_spriteram[offs] & 0x04;
int flipy = spriteram[offs] & 0x02; int flipy = m_spriteram[offs] & 0x02;
int sx = 239 - spriteram[offs + 3]; int sx = 239 - m_spriteram[offs + 3];
int sy = (240 - spriteram[offs + 2]) & 0xff; int sy = (240 - m_spriteram[offs + 2]) & 0xff;
if (flip_screen()) if (flip_screen())
{ {
@ -169,7 +166,7 @@ void ssozumo_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
} }
} }
UINT32 ssozumo_state::screen_update_ssozumo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) UINT32 ssozumo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);