grchamp.c: added save state support (nw)

This commit is contained in:
Ivan Vangelista 2015-06-09 14:41:23 +02:00
parent 01eef6ee90
commit 7ff62b4b45
3 changed files with 73 additions and 55 deletions

View File

@ -78,7 +78,20 @@
*
*************************************/
void grchamp_state::machine_reset()
void grchamp_state::machine_start()
{
save_item(NAME(m_cpu0_out));
save_item(NAME(m_cpu1_out));
save_item(NAME(m_comm_latch));
save_item(NAME(m_comm_latch2));
save_item(NAME(m_ledlatch));
save_item(NAME(m_ledaddr));
save_item(NAME(m_ledram));
save_item(NAME(m_collide));
save_item(NAME(m_collmode));
}
void grchamp_state::machine_reset()
{
/* if the coin system is 1 way, lock Coin B (Page 40) */
coin_lockout_w(machine(), 1, (ioport("DSWB")->read() & 0x10) ? 1 : 0);
@ -92,14 +105,14 @@ void grchamp_state::machine_reset()
*
*************************************/
INTERRUPT_GEN_MEMBER(grchamp_state::grchamp_cpu0_interrupt)
INTERRUPT_GEN_MEMBER(grchamp_state::cpu0_interrupt)
{
if (m_cpu0_out[0] & 0x01)
device.execute().set_input_line(0, ASSERT_LINE);
}
INTERRUPT_GEN_MEMBER(grchamp_state::grchamp_cpu1_interrupt)
INTERRUPT_GEN_MEMBER(grchamp_state::cpu1_interrupt)
{
if (m_cpu1_out[4] & 0x01)
device.execute().set_input_line(0, ASSERT_LINE);
@ -409,22 +422,22 @@ READ8_MEMBER(grchamp_state::main_to_sub_comm_r)
*
*************************************/
WRITE8_MEMBER(grchamp_state::grchamp_portA_0_w)
WRITE8_MEMBER(grchamp_state::portA_0_w)
{
m_discrete->write(space, GRCHAMP_A_DATA, data);
}
WRITE8_MEMBER(grchamp_state::grchamp_portB_0_w)
WRITE8_MEMBER(grchamp_state::portB_0_w)
{
m_discrete->write(space, GRCHAMP_B_DATA, 255-data);
}
WRITE8_MEMBER(grchamp_state::grchamp_portA_2_w)
WRITE8_MEMBER(grchamp_state::portA_2_w)
{
/* A0/A1 modify the output of AY8910 #2 */
/* A7 contributes to the discrete logic hanging off of AY8910 #0 */
}
WRITE8_MEMBER(grchamp_state::grchamp_portB_2_w)
WRITE8_MEMBER(grchamp_state::portB_2_w)
{
/* B0 connects elsewhere */
}
@ -505,9 +518,9 @@ ADDRESS_MAP_END
/* complete memory map derived from schematics */
static ADDRESS_MAP_START( sub_map, AS_PROGRAM, 8, grchamp_state )
AM_RANGE(0x0000, 0x1fff) AM_ROM
AM_RANGE(0x2000, 0x27ff) AM_RAM_WRITE(grchamp_left_w) AM_SHARE("leftram")
AM_RANGE(0x2800, 0x2fff) AM_RAM_WRITE(grchamp_right_w) AM_SHARE("rightram")
AM_RANGE(0x3000, 0x37ff) AM_RAM_WRITE(grchamp_center_w) AM_SHARE("centerram")
AM_RANGE(0x2000, 0x27ff) AM_RAM_WRITE(left_w) AM_SHARE("leftram")
AM_RANGE(0x2800, 0x2fff) AM_RAM_WRITE(right_w) AM_SHARE("rightram")
AM_RANGE(0x3000, 0x37ff) AM_RAM_WRITE(center_w) AM_SHARE("centerram")
AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0x0400) AM_RAM
AM_RANGE(0x5000, 0x6fff) AM_ROM
ADDRESS_MAP_END
@ -636,13 +649,13 @@ static MACHINE_CONFIG_START( grchamp, grchamp_state )
MCFG_CPU_ADD("maincpu", Z80, PIXEL_CLOCK/2)
MCFG_CPU_PROGRAM_MAP(main_map)
MCFG_CPU_IO_MAP(main_portmap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", grchamp_state, grchamp_cpu0_interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("screen", grchamp_state, cpu0_interrupt)
/* GAME BOARD */
MCFG_CPU_ADD("sub", Z80, PIXEL_CLOCK/2)
MCFG_CPU_PROGRAM_MAP(sub_map)
MCFG_CPU_IO_MAP(sub_portmap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", grchamp_state, grchamp_cpu1_interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("screen", grchamp_state, cpu1_interrupt)
/* SOUND BOARD */
MCFG_CPU_ADD("audiocpu", Z80, SOUND_CLOCK/2)
@ -660,23 +673,23 @@ static MACHINE_CONFIG_START( grchamp, grchamp_state )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
MCFG_SCREEN_UPDATE_DRIVER(grchamp_state, screen_update_grchamp)
MCFG_SCREEN_UPDATE_DRIVER(grchamp_state, screen_update)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ay1", AY8910, SOUND_CLOCK/4) /* 3B */
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(grchamp_state, grchamp_portA_0_w))
MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(grchamp_state, grchamp_portB_0_w))
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(grchamp_state, portA_0_w))
MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(grchamp_state, portB_0_w))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2)
MCFG_SOUND_ADD("ay2", AY8910, SOUND_CLOCK/4)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2)
MCFG_SOUND_ADD("ay3", AY8910, SOUND_CLOCK/4) /* 1B */
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(grchamp_state, grchamp_portA_2_w))
MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(grchamp_state, grchamp_portB_2_w))
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(grchamp_state, portA_2_w))
MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(grchamp_state, portB_2_w))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2)
MCFG_SOUND_ADD("discrete", DISCRETE, 0)
@ -747,4 +760,4 @@ ROM_END
*
*************************************/
GAMEL( 1981, grchamp, 0, grchamp, grchamp, driver_device, 0, ROT270, "Taito", "Grand Champion", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS, layout_grchamp )
GAMEL( 1981, grchamp, 0, grchamp, grchamp, driver_device, 0, ROT270, "Taito", "Grand Champion", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE, layout_grchamp )

View File

@ -13,19 +13,34 @@ class grchamp_state : public driver_device
public:
grchamp_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_radarram(*this, "radarram"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
m_leftram(*this, "leftram"),
m_rightram(*this, "rightram"),
m_centerram(*this, "centerram"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_subcpu(*this, "sub"),
m_discrete(*this, "discrete"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_screen(*this, "screen") { }
m_screen(*this, "screen"),
m_radarram(*this, "radarram"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
m_leftram(*this, "leftram"),
m_rightram(*this, "rightram"),
m_centerram(*this, "centerram") { }
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_subcpu;
required_device<discrete_device> m_discrete;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
required_shared_ptr<UINT8> m_radarram;
required_shared_ptr<UINT8> m_videoram;
required_shared_ptr<UINT8> m_spriteram;
required_shared_ptr<UINT8> m_leftram;
required_shared_ptr<UINT8> m_rightram;
required_shared_ptr<UINT8> m_centerram;
UINT8 m_cpu0_out[16];
UINT8 m_cpu1_out[16];
@ -40,13 +55,6 @@ public:
UINT16 m_collide;
UINT8 m_collmode;
required_shared_ptr<UINT8> m_radarram;
required_shared_ptr<UINT8> m_videoram;
required_shared_ptr<UINT8> m_spriteram;
required_shared_ptr<UINT8> m_leftram;
required_shared_ptr<UINT8> m_rightram;
required_shared_ptr<UINT8> m_centerram;
bitmap_ind16 m_work_bitmap;
tilemap_t * m_text_tilemap;
tilemap_t * m_left_tilemap;
@ -64,37 +72,34 @@ public:
DECLARE_WRITE8_MEMBER(main_to_sub_comm_w);
DECLARE_READ8_MEMBER(main_to_sub_comm_r);
UINT8 get_pc3259_bits(int offs);
DECLARE_WRITE8_MEMBER(grchamp_left_w);
DECLARE_WRITE8_MEMBER(grchamp_center_w);
DECLARE_WRITE8_MEMBER(grchamp_right_w);
DECLARE_WRITE8_MEMBER(grchamp_portA_0_w);
DECLARE_WRITE8_MEMBER(grchamp_portB_0_w);
DECLARE_WRITE8_MEMBER(grchamp_portA_2_w);
DECLARE_WRITE8_MEMBER(grchamp_portB_2_w);
DECLARE_WRITE8_MEMBER(left_w);
DECLARE_WRITE8_MEMBER(center_w);
DECLARE_WRITE8_MEMBER(right_w);
DECLARE_WRITE8_MEMBER(portA_0_w);
DECLARE_WRITE8_MEMBER(portB_0_w);
DECLARE_WRITE8_MEMBER(portA_2_w);
DECLARE_WRITE8_MEMBER(portB_2_w);
TILE_GET_INFO_MEMBER(get_text_tile_info);
TILE_GET_INFO_MEMBER(get_left_tile_info);
TILE_GET_INFO_MEMBER(get_right_tile_info);
TILE_GET_INFO_MEMBER(get_center_tile_info);
DECLARE_PALETTE_INIT(grchamp);
TILEMAP_MAPPER_MEMBER(get_memory_offset);
DECLARE_PALETTE_INIT(grchamp);
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
void palette_generate();
UINT32 screen_update_grchamp(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(grchamp_cpu0_interrupt);
INTERRUPT_GEN_MEMBER(grchamp_cpu1_interrupt);
INTERRUPT_GEN_MEMBER(cpu0_interrupt);
INTERRUPT_GEN_MEMBER(cpu1_interrupt);
TIMER_CALLBACK_MEMBER(main_to_sub_comm_sync_w);
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void draw_objects(int y, UINT8 *objdata);
int collision_check(bitmap_ind16 &bitmap, int which );
void draw_fog(bitmap_ind16 &bitmap, const rectangle &cliprect, int fog);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_subcpu;
required_device<discrete_device> m_discrete;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
};
/* Discrete Sound Input Nodes */

View File

@ -53,19 +53,19 @@ PALETTE_INIT_MEMBER(grchamp_state, grchamp)
}
WRITE8_MEMBER(grchamp_state::grchamp_left_w)
WRITE8_MEMBER(grchamp_state::left_w)
{
m_leftram[offset] = data;
m_left_tilemap->mark_tile_dirty(offset);
}
WRITE8_MEMBER(grchamp_state::grchamp_center_w)
WRITE8_MEMBER(grchamp_state::center_w)
{
m_centerram[offset] = data;
m_center_tilemap->mark_tile_dirty(offset);
}
WRITE8_MEMBER(grchamp_state::grchamp_right_w)
WRITE8_MEMBER(grchamp_state::right_w)
{
m_rightram[offset] = data;
m_right_tilemap->mark_tile_dirty(offset);
@ -343,7 +343,7 @@ void grchamp_state::draw_objects(int y, UINT8 *objdata)
}
UINT32 grchamp_state::screen_update_grchamp(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
UINT32 grchamp_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
static const rgb_t objpix_lookup[8] =
{