xxmissio.c: added save state support (nw)

This commit is contained in:
Ivan Vangelista 2015-02-16 18:00:43 +01:00
parent 409b0c9f6d
commit b31244ebf6
3 changed files with 78 additions and 64 deletions

View File

@ -14,18 +14,18 @@ XX Mission (c) 1986 UPL
#include "includes/xxmissio.h"
WRITE8_MEMBER(xxmissio_state::xxmissio_bank_sel_w)
WRITE8_MEMBER(xxmissio_state::bank_sel_w)
{
membank("bank1")->set_entry(data & 7);
}
CUSTOM_INPUT_MEMBER(xxmissio_state::xxmissio_status_r)
CUSTOM_INPUT_MEMBER(xxmissio_state::status_r)
{
int bit_mask = (FPTR)param;
return (m_status & bit_mask) ? 1 : 0;
}
WRITE8_MEMBER(xxmissio_state::xxmissio_status_m_w)
WRITE8_MEMBER(xxmissio_state::status_m_w)
{
switch (data)
{
@ -44,7 +44,7 @@ WRITE8_MEMBER(xxmissio_state::xxmissio_status_m_w)
}
}
WRITE8_MEMBER(xxmissio_state::xxmissio_status_s_w)
WRITE8_MEMBER(xxmissio_state::status_s_w)
{
switch (data)
{
@ -63,22 +63,24 @@ WRITE8_MEMBER(xxmissio_state::xxmissio_status_s_w)
}
}
INTERRUPT_GEN_MEMBER(xxmissio_state::xxmissio_interrupt_m)
INTERRUPT_GEN_MEMBER(xxmissio_state::interrupt_m)
{
m_status &= ~0x20;
device.execute().set_input_line(0, HOLD_LINE);
m_maincpu->set_input_line(0, HOLD_LINE);
}
INTERRUPT_GEN_MEMBER(xxmissio_state::xxmissio_interrupt_s)
INTERRUPT_GEN_MEMBER(xxmissio_state::interrupt_s)
{
m_status &= ~0x10;
device.execute().set_input_line(0, HOLD_LINE);
m_subcpu->set_input_line(0, HOLD_LINE);
}
void xxmissio_state::machine_start()
{
membank("bank1")->configure_entries(0, 8, memregion("user1")->base(), 0x4000);
membank("bank1")->set_entry(0);
save_item(NAME(m_status));
}
/****************************************************************************/
@ -92,11 +94,11 @@ static ADDRESS_MAP_START( map1, AS_PROGRAM, 8, xxmissio_state )
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1")
AM_RANGE(0xa001, 0xa001) AM_READ_PORT("P2")
AM_RANGE(0xa002, 0xa002) AM_READ_PORT("STATUS")
AM_RANGE(0xa002, 0xa002) AM_WRITE(xxmissio_status_m_w)
AM_RANGE(0xa003, 0xa003) AM_WRITE(xxmissio_flipscreen_w)
AM_RANGE(0xa002, 0xa002) AM_WRITE(status_m_w)
AM_RANGE(0xa003, 0xa003) AM_WRITE(flipscreen_w)
AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_SHARE("fgram")
AM_RANGE(0xc800, 0xcfff) AM_READWRITE(xxmissio_bgram_r, xxmissio_bgram_w) AM_SHARE("bgram")
AM_RANGE(0xc800, 0xcfff) AM_READWRITE(bgram_r, bgram_w) AM_SHARE("bgram")
AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0xd800, 0xdaff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
@ -112,16 +114,16 @@ static ADDRESS_MAP_START( map2, AS_PROGRAM, 8, xxmissio_state )
AM_RANGE(0x8000, 0x8001) AM_DEVREADWRITE("ym1", ym2203_device, read, write)
AM_RANGE(0x8002, 0x8003) AM_DEVREADWRITE("ym2", ym2203_device, read, write)
AM_RANGE(0x8006, 0x8006) AM_WRITE(xxmissio_bank_sel_w)
AM_RANGE(0x8006, 0x8006) AM_WRITE(bank_sel_w)
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1")
AM_RANGE(0xa001, 0xa001) AM_READ_PORT("P2")
AM_RANGE(0xa002, 0xa002) AM_READ_PORT("STATUS")
AM_RANGE(0xa002, 0xa002) AM_WRITE(xxmissio_status_s_w)
AM_RANGE(0xa003, 0xa003) AM_WRITE(xxmissio_flipscreen_w)
AM_RANGE(0xa002, 0xa002) AM_WRITE(status_s_w)
AM_RANGE(0xa003, 0xa003) AM_WRITE(flipscreen_w)
AM_RANGE(0xc000, 0xc7ff) AM_SHARE("fgram") AM_RAM
AM_RANGE(0xc800, 0xcfff) AM_SHARE("bgram") AM_READWRITE(xxmissio_bgram_r, xxmissio_bgram_w)
AM_RANGE(0xc800, 0xcfff) AM_SHARE("bgram") AM_READWRITE(bgram_r, bgram_w)
AM_RANGE(0xd000, 0xd7ff) AM_SHARE("spriteram") AM_RAM
AM_RANGE(0xd800, 0xdaff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
@ -196,14 +198,14 @@ static INPUT_PORTS_START( xxmissio )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" ) /* Shown as "Unused" in the manual */
PORT_START("STATUS")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state,xxmissio_status_r, (void *)0x01)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state, status_r, (void *)0x01)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state,xxmissio_status_r, (void *)0x04)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state,xxmissio_status_r, (void *)0x08)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state,xxmissio_status_r, (void *)0x10)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state,xxmissio_status_r, (void *)0x20)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state,xxmissio_status_r, (void *)0x40)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state,xxmissio_status_r, (void *)0x80)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state, status_r, (void *)0x04)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state, status_r, (void *)0x08)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state, status_r, (void *)0x10)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state, status_r, (void *)0x20)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state, status_r, (void *)0x40)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xxmissio_state, status_r, (void *)0x80)
INPUT_PORTS_END
/****************************************************************************/
@ -258,11 +260,11 @@ static MACHINE_CONFIG_START( xxmissio, xxmissio_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80,12000000/4) /* 3.0MHz */
MCFG_CPU_PROGRAM_MAP(map1)
MCFG_CPU_VBLANK_INT_DRIVER("screen", xxmissio_state, xxmissio_interrupt_m)
MCFG_CPU_VBLANK_INT_DRIVER("screen", xxmissio_state, interrupt_m)
MCFG_CPU_ADD("sub", Z80,12000000/4) /* 3.0MHz */
MCFG_CPU_PROGRAM_MAP(map2)
MCFG_CPU_PERIODIC_INT_DRIVER(xxmissio_state, xxmissio_interrupt_s, 2*60)
MCFG_CPU_PERIODIC_INT_DRIVER(xxmissio_state, interrupt_s, 2*60)
MCFG_QUANTUM_TIME(attotime::from_hz(6000))
@ -273,7 +275,7 @@ static MACHINE_CONFIG_START( xxmissio, xxmissio_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 4*8, 28*8-1)
MCFG_SCREEN_UPDATE_DRIVER(xxmissio_state, screen_update_xxmissio)
MCFG_SCREEN_UPDATE_DRIVER(xxmissio_state, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", xxmissio)
@ -293,8 +295,8 @@ static MACHINE_CONFIG_START( xxmissio, xxmissio_state )
MCFG_SOUND_ROUTE(3, "mono", 0.40)
MCFG_SOUND_ADD("ym2", YM2203, 12000000/8)
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(xxmissio_state, xxmissio_scroll_x_w))
MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(xxmissio_state, xxmissio_scroll_y_w))
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(xxmissio_state, scroll_x_w))
MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(xxmissio_state, scroll_y_w))
MCFG_SOUND_ROUTE(0, "mono", 0.15)
MCFG_SOUND_ROUTE(1, "mono", 0.15)
MCFG_SOUND_ROUTE(2, "mono", 0.15)
@ -326,4 +328,4 @@ ROM_START( xxmissio )
ROM_LOAD16_BYTE( "xx11.4b", 0x0001, 0x8000, CRC(d9dd827c) SHA1(aea3a5abd871adf7f75ad4d6cc57eff0833135c7) )
ROM_END
GAME( 1986, xxmissio, 0, xxmissio, xxmissio, driver_device, 0, ROT90, "UPL", "XX Mission", 0 )
GAME( 1986, xxmissio, 0, xxmissio, xxmissio, driver_device, 0, ROT90, "UPL", "XX Mission", GAME_SUPPORTS_SAVE )

View File

@ -3,42 +3,50 @@ class xxmissio_state : public driver_device
public:
xxmissio_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_bgram(*this, "bgram"),
m_fgram(*this, "fgram"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_subcpu(*this, "sub"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette") { }
m_palette(*this, "palette"),
m_bgram(*this, "bgram"),
m_fgram(*this, "fgram"),
m_spriteram(*this, "spriteram") { }
UINT8 m_status;
required_shared_ptr<UINT8> m_bgram;
required_shared_ptr<UINT8> m_fgram;
required_shared_ptr<UINT8> m_spriteram;
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
UINT8 m_xscroll;
UINT8 m_yscroll;
UINT8 m_flipscreen;
DECLARE_WRITE8_MEMBER(xxmissio_bank_sel_w);
DECLARE_WRITE8_MEMBER(xxmissio_status_m_w);
DECLARE_WRITE8_MEMBER(xxmissio_status_s_w);
DECLARE_WRITE8_MEMBER(xxmissio_flipscreen_w);
DECLARE_WRITE8_MEMBER(xxmissio_bgram_w);
DECLARE_READ8_MEMBER(xxmissio_bgram_r);
DECLARE_CUSTOM_INPUT_MEMBER(xxmissio_status_r);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
virtual void machine_start();
virtual void video_start();
UINT32 screen_update_xxmissio(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(xxmissio_interrupt_m);
INTERRUPT_GEN_MEMBER(xxmissio_interrupt_s);
DECLARE_WRITE8_MEMBER(xxmissio_scroll_x_w);
DECLARE_WRITE8_MEMBER(xxmissio_scroll_y_w);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<UINT8> m_bgram;
required_shared_ptr<UINT8> m_fgram;
required_shared_ptr<UINT8> m_spriteram;
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
UINT8 m_status;
UINT8 m_xscroll;
UINT8 m_yscroll;
UINT8 m_flipscreen;
DECLARE_WRITE8_MEMBER(bank_sel_w);
DECLARE_WRITE8_MEMBER(status_m_w);
DECLARE_WRITE8_MEMBER(status_s_w);
DECLARE_WRITE8_MEMBER(flipscreen_w);
DECLARE_WRITE8_MEMBER(bgram_w);
DECLARE_READ8_MEMBER(bgram_r);
DECLARE_WRITE8_MEMBER(scroll_x_w);
DECLARE_WRITE8_MEMBER(scroll_y_w);
DECLARE_CUSTOM_INPUT_MEMBER(status_r);
INTERRUPT_GEN_MEMBER(interrupt_m);
INTERRUPT_GEN_MEMBER(interrupt_s);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
virtual void machine_start();
virtual void video_start();
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx);
};

View File

@ -12,28 +12,28 @@ Video hardware driver by Uki
#include "includes/xxmissio.h"
WRITE8_MEMBER(xxmissio_state::xxmissio_scroll_x_w)
WRITE8_MEMBER(xxmissio_state::scroll_x_w)
{
m_xscroll = data;
}
WRITE8_MEMBER(xxmissio_state::xxmissio_scroll_y_w)
WRITE8_MEMBER(xxmissio_state::scroll_y_w)
{
m_yscroll = data;
}
WRITE8_MEMBER(xxmissio_state::xxmissio_flipscreen_w)
WRITE8_MEMBER(xxmissio_state::flipscreen_w)
{
m_flipscreen = data & 0x01;
}
WRITE8_MEMBER(xxmissio_state::xxmissio_bgram_w)
WRITE8_MEMBER(xxmissio_state::bgram_w)
{
int x = (offset + (m_xscroll >> 3)) & 0x1f;
offset = (offset & 0x7e0) | x;
m_bgram[offset] = data;
}
READ8_MEMBER(xxmissio_state::xxmissio_bgram_r)
READ8_MEMBER(xxmissio_state::bgram_r)
{
int x = (offset + (m_xscroll >> 3)) & 0x1f;
offset = (offset & 0x7e0) | x;
@ -69,6 +69,10 @@ void xxmissio_state::video_start()
m_bg_tilemap->set_scrolldx(2, 12);
m_fg_tilemap->set_transparent_pen(0);
save_item(NAME(m_xscroll));
save_item(NAME(m_yscroll));
save_item(NAME(m_flipscreen));
}
@ -122,7 +126,7 @@ void xxmissio_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec
}
UINT32 xxmissio_state::screen_update_xxmissio(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
UINT32 xxmissio_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
machine().tilemap().mark_all_dirty();
machine().tilemap().set_flip_all(m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);