m107.c: added save state support (nw)

This commit is contained in:
Ivan Vangelista 2015-03-31 20:42:26 +02:00
parent 5881b5caad
commit 73ee1e9042
4 changed files with 86 additions and 68 deletions

View File

@ -80,6 +80,7 @@ void iremga20_device::device_start()
save_item(NAME(m_channel[i].size), i);
save_item(NAME(m_channel[i].start), i);
save_item(NAME(m_channel[i].pos), i);
save_item(NAME(m_channel[i].frac), i);
save_item(NAME(m_channel[i].end), i);
save_item(NAME(m_channel[i].volume), i);
save_item(NAME(m_channel[i].pan), i);

View File

@ -43,12 +43,12 @@ confirmed for m107 games as well.
void m107_state::machine_start()
{
// TODO: state save registrations
save_item(NAME(m_sound_status));
}
/*****************************************************************************/
TIMER_DEVICE_CALLBACK_MEMBER(m107_state::m107_scanline_interrupt)
TIMER_DEVICE_CALLBACK_MEMBER(m107_state::scanline_interrupt)
{
int scanline = param;
@ -69,7 +69,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(m107_state::m107_scanline_interrupt)
/*****************************************************************************/
WRITE16_MEMBER(m107_state::m107_coincounter_w)
WRITE16_MEMBER(m107_state::coincounter_w)
{
if (ACCESSING_BITS_0_7)
{
@ -78,7 +78,7 @@ WRITE16_MEMBER(m107_state::m107_coincounter_w)
}
}
WRITE16_MEMBER(m107_state::m107_bankswitch_w)
WRITE16_MEMBER(m107_state::bankswitch_w)
{
if (ACCESSING_BITS_0_7)
{
@ -88,36 +88,36 @@ WRITE16_MEMBER(m107_state::m107_bankswitch_w)
}
}
WRITE16_MEMBER(m107_state::m107_soundlatch_w)
WRITE16_MEMBER(m107_state::soundlatch_w)
{
m_soundcpu->set_input_line(NEC_INPUT_LINE_INTP1, ASSERT_LINE);
soundlatch_byte_w(space, 0, data & 0xff);
// logerror("soundlatch_byte_w %02x\n",data);
}
READ16_MEMBER(m107_state::m107_sound_status_r)
READ16_MEMBER(m107_state::sound_status_r)
{
return m_sound_status;
}
READ16_MEMBER(m107_state::m107_soundlatch_r)
READ16_MEMBER(m107_state::soundlatch_r)
{
m_soundcpu->set_input_line(NEC_INPUT_LINE_INTP1, CLEAR_LINE);
return soundlatch_byte_r(space, offset) | 0xff00;
}
WRITE16_MEMBER(m107_state::m107_sound_irq_ack_w)
WRITE16_MEMBER(m107_state::sound_irq_ack_w)
{
m_soundcpu->set_input_line(NEC_INPUT_LINE_INTP1, CLEAR_LINE);
}
WRITE16_MEMBER(m107_state::m107_sound_status_w)
WRITE16_MEMBER(m107_state::sound_status_w)
{
COMBINE_DATA(&m_sound_status);
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, M107_IRQ_3);
}
WRITE16_MEMBER(m107_state::m107_sound_reset_w)
WRITE16_MEMBER(m107_state::sound_reset_w)
{
m_soundcpu->set_input_line(INPUT_LINE_RESET, (data) ? CLEAR_LINE : ASSERT_LINE);
}
@ -127,7 +127,7 @@ WRITE16_MEMBER(m107_state::m107_sound_reset_w)
static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, m107_state )
AM_RANGE(0x00000, 0x9ffff) AM_ROM
AM_RANGE(0xa0000, 0xbffff) AM_ROMBANK("bank1")
AM_RANGE(0xd0000, 0xdffff) AM_RAM_WRITE(m107_vram_w) AM_SHARE("vram_data")
AM_RANGE(0xd0000, 0xdffff) AM_RAM_WRITE(vram_w) AM_SHARE("vram_data")
AM_RANGE(0xe0000, 0xeffff) AM_RAM /* System ram */
AM_RANGE(0xf8000, 0xf8fff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0xf9000, 0xf9fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
@ -139,15 +139,15 @@ static ADDRESS_MAP_START( main_portmap, AS_IO, 16, m107_state )
AM_RANGE(0x02, 0x03) AM_READ_PORT("COINS_DSW3")
AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW")
AM_RANGE(0x06, 0x07) AM_READ_PORT("P3_P4")
AM_RANGE(0x08, 0x09) AM_READ(m107_sound_status_r) /* answer from sound CPU */
AM_RANGE(0x00, 0x01) AM_WRITE(m107_soundlatch_w)
AM_RANGE(0x02, 0x03) AM_WRITE(m107_coincounter_w)
AM_RANGE(0x08, 0x09) AM_READ(sound_status_r) /* answer from sound CPU */
AM_RANGE(0x00, 0x01) AM_WRITE(soundlatch_w)
AM_RANGE(0x02, 0x03) AM_WRITE(coincounter_w)
AM_RANGE(0x04, 0x05) AM_WRITENOP /* ??? 0008 */
AM_RANGE(0x80, 0x9f) AM_WRITE(m107_control_w)
AM_RANGE(0x80, 0x9f) AM_WRITE(control_w)
AM_RANGE(0xa0, 0xaf) AM_WRITENOP /* Written with 0's in interrupt */
AM_RANGE(0xb0, 0xb1) AM_WRITE(m107_spritebuffer_w)
AM_RANGE(0xb0, 0xb1) AM_WRITE(spritebuffer_w)
AM_RANGE(0xc0, 0xc3) AM_READNOP /* Only wpksoc: ticket related? */
AM_RANGE(0xc0, 0xc1) AM_WRITE(m107_sound_reset_w)
AM_RANGE(0xc0, 0xc1) AM_WRITE(sound_reset_w)
ADDRESS_MAP_END
/* same as M107 but with an extra i/o board */
@ -182,8 +182,8 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 16, m107_state )
AM_RANGE(0xa0000, 0xa3fff) AM_RAM
AM_RANGE(0xa8000, 0xa803f) AM_DEVREADWRITE8("irem", iremga20_device, irem_ga20_r, irem_ga20_w, 0x00ff)
AM_RANGE(0xa8040, 0xa8043) AM_DEVREADWRITE8("ymsnd", ym2151_device, read, write, 0x00ff)
AM_RANGE(0xa8044, 0xa8045) AM_READWRITE(m107_soundlatch_r, m107_sound_irq_ack_w)
AM_RANGE(0xa8046, 0xa8047) AM_WRITE(m107_sound_status_w)
AM_RANGE(0xa8044, 0xa8045) AM_READWRITE(soundlatch_r, sound_irq_ack_w)
AM_RANGE(0xa8046, 0xa8047) AM_WRITE(sound_status_w)
AM_RANGE(0xffff0, 0xfffff) AM_ROM AM_REGION("soundcpu", 0x1fff0)
ADDRESS_MAP_END
@ -765,7 +765,7 @@ static MACHINE_CONFIG_START( firebarr, m107_state )
MCFG_V25_CONFIG(rtypeleo_decryption_table)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", m107_state, m107_scanline_interrupt, "screen", 0, 1)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", m107_state, scanline_interrupt, "screen", 0, 1)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -773,7 +773,7 @@ static MACHINE_CONFIG_START( firebarr, m107_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(512, 256)
MCFG_SCREEN_VISIBLE_AREA(80, 511-112, 8, 247) /* 320 x 240 */
MCFG_SCREEN_UPDATE_DRIVER(m107_state, screen_update_m107)
MCFG_SCREEN_UPDATE_DRIVER(m107_state, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", firebarr)
@ -996,7 +996,7 @@ DRIVER_INIT_MEMBER(m107_state,dsoccr94)
UINT8 *ROM = memregion("maincpu")->base();
membank("bank1")->configure_entries(0, 4, &ROM[0x80000], 0x20000);
m_maincpu->space(AS_IO).install_write_handler(0x06, 0x07, write16_delegate(FUNC(m107_state::m107_bankswitch_w),this));
m_maincpu->space(AS_IO).install_write_handler(0x06, 0x07, write16_delegate(FUNC(m107_state::bankswitch_w),this));
m_irq_vectorbase = 0x80;
m_spritesystem = 0;
@ -1010,10 +1010,10 @@ DRIVER_INIT_MEMBER(m107_state,wpksoc)
/***************************************************************************/
GAME( 1993, airass, 0, airass, firebarr, m107_state, firebarr, ROT270, "Irem", "Air Assault (World)", GAME_NO_COCKTAIL ) // possible location test, but sound code is newer than Japan version
GAME( 1993, firebarr, airass, firebarr, firebarr, m107_state, firebarr, ROT270, "Irem", "Fire Barrel (Japan)", GAME_NO_COCKTAIL )
GAME( 1993, airass, 0, airass, firebarr, m107_state, firebarr, ROT270, "Irem", "Air Assault (World)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) // possible location test, but sound code is newer than Japan version
GAME( 1993, firebarr, airass, firebarr, firebarr, m107_state, firebarr, ROT270, "Irem", "Fire Barrel (Japan)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
GAME( 1994, dsoccr94, 0, dsoccr94, dsoccr94, m107_state, dsoccr94, ROT0, "Irem (Data East Corporation license)", "Dream Soccer '94 (World, M107 hardware)", GAME_NO_COCKTAIL )
GAME( 1994, dsoccr94, 0, dsoccr94, dsoccr94, m107_state, dsoccr94, ROT0, "Irem (Data East Corporation license)", "Dream Soccer '94 (World, M107 hardware)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
GAME( 1995, wpksoc, 0, wpksoc, wpksoc, m107_state, wpksoc, ROT0, "Jaleco", "World PK Soccer", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL | GAME_MECHANICAL )
GAME( 1994, kftgoal, wpksoc, wpksoc, wpksoc, m107_state, wpksoc, ROT0, "Jaleco", "Kick for the Goal", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL | GAME_MECHANICAL )
GAME( 1995, wpksoc, 0, wpksoc, wpksoc, m107_state, wpksoc, ROT0, "Jaleco", "World PK Soccer", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL | GAME_MECHANICAL | GAME_SUPPORTS_SAVE )
GAME( 1994, kftgoal, wpksoc, wpksoc, wpksoc, m107_state, wpksoc, ROT0, "Jaleco", "Kick for the Goal", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL | GAME_MECHANICAL | GAME_SUPPORTS_SAVE )

View File

@ -9,7 +9,6 @@ struct pf_layer_info
{
tilemap_t * tmap;
UINT16 vram_base;
UINT16 control[4];
};
class m107_state : public driver_device
@ -17,52 +16,60 @@ class m107_state : public driver_device
public:
m107_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_spriteram(*this, "spriteram"),
m_vram_data(*this, "vram_data"),
m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette") { }
m_palette(*this, "palette"),
m_spriteram(*this, "spriteram"),
m_vram_data(*this, "vram_data") { }
required_shared_ptr<UINT16> m_spriteram;
required_shared_ptr<UINT16> m_vram_data;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_shared_ptr<UINT16> m_spriteram;
required_shared_ptr<UINT16> m_vram_data;
// driver init
UINT8 m_irq_vectorbase;
int m_sound_status;
UINT8 m_spritesystem;
int m_sound_status;
UINT8 m_sprite_display;
UINT16 m_raster_irq_position;
pf_layer_info m_pf_layer[4];
UINT16 m_control[0x10];
UINT16 *m_buffered_spriteram;
DECLARE_WRITE16_MEMBER(m107_coincounter_w);
DECLARE_WRITE16_MEMBER(m107_bankswitch_w);
DECLARE_WRITE16_MEMBER(m107_soundlatch_w);
DECLARE_READ16_MEMBER(m107_sound_status_r);
DECLARE_READ16_MEMBER(m107_soundlatch_r);
DECLARE_WRITE16_MEMBER(m107_sound_irq_ack_w);
DECLARE_WRITE16_MEMBER(m107_sound_status_w);
DECLARE_WRITE16_MEMBER(m107_sound_reset_w);
DECLARE_WRITE16_MEMBER(coincounter_w);
DECLARE_WRITE16_MEMBER(bankswitch_w);
DECLARE_WRITE16_MEMBER(soundlatch_w);
DECLARE_READ16_MEMBER(sound_status_r);
DECLARE_READ16_MEMBER(soundlatch_r);
DECLARE_WRITE16_MEMBER(sound_irq_ack_w);
DECLARE_WRITE16_MEMBER(sound_status_w);
DECLARE_WRITE16_MEMBER(sound_reset_w);
DECLARE_WRITE16_MEMBER(wpksoc_output_w);
DECLARE_WRITE16_MEMBER(m107_vram_w);
DECLARE_WRITE16_MEMBER(m107_control_w);
DECLARE_WRITE16_MEMBER(m107_spritebuffer_w);
DECLARE_WRITE16_MEMBER(vram_w);
DECLARE_WRITE16_MEMBER(control_w);
DECLARE_WRITE16_MEMBER(spritebuffer_w);
TILE_GET_INFO_MEMBER(get_pf_tile_info);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_interrupt);
DECLARE_DRIVER_INIT(firebarr);
DECLARE_DRIVER_INIT(dsoccr94);
DECLARE_DRIVER_INIT(wpksoc);
TILE_GET_INFO_MEMBER(get_pf_tile_info);
virtual void machine_start();
virtual void video_start();
UINT32 screen_update_m107(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(m107_scanline_interrupt);
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void m107_update_scroll_positions();
void m107_tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int laynum, int category,int opaque);
void m107_screenrefresh(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void update_scroll_positions();
void tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int laynum, int category,int opaque);
void screenrefresh(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};

View File

@ -62,7 +62,7 @@ TILE_GET_INFO_MEMBER(m107_state::get_pf_tile_info)
/*****************************************************************************/
WRITE16_MEMBER(m107_state::m107_vram_w)
WRITE16_MEMBER(m107_state::vram_w)
{
int laynum;
@ -74,7 +74,7 @@ WRITE16_MEMBER(m107_state::m107_vram_w)
/*****************************************************************************/
WRITE16_MEMBER(m107_state::m107_control_w)
WRITE16_MEMBER(m107_state::control_w)
{
UINT16 old = m_control[offset];
pf_layer_info *layer;
@ -141,6 +141,16 @@ void m107_state::video_start()
}
m_buffered_spriteram = auto_alloc_array_clear(machine(), UINT16, 0x1000/2);
save_item(NAME(m_sprite_display));
save_item(NAME(m_raster_irq_position));
save_item(NAME(m_control));
save_pointer(NAME(m_buffered_spriteram), 0x1000/2);
for (int i = 0; i < 4; i++)
{
save_item(NAME(m_pf_layer[i].vram_base), i);
}
}
/*****************************************************************************/
@ -267,7 +277,7 @@ void m107_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const
/*****************************************************************************/
void m107_state::m107_update_scroll_positions()
void m107_state::update_scroll_positions()
{
int laynum;
int i;
@ -306,7 +316,7 @@ void m107_state::m107_update_scroll_positions()
/*****************************************************************************/
void m107_state::m107_tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int laynum, int category,int opaque)
void m107_state::tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int laynum, int category,int opaque)
{
int line;
rectangle clip;
@ -331,25 +341,25 @@ void m107_state::m107_tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap,
}
void m107_state::m107_screenrefresh(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
void m107_state::screenrefresh(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
if ((~m_control[0x0b] >> 7) & 1)
{
m107_tilemap_draw(screen, bitmap, cliprect, 3, 0,0);
m107_tilemap_draw(screen, bitmap, cliprect, 3, 1,0);
tilemap_draw(screen, bitmap, cliprect, 3, 0,0);
tilemap_draw(screen, bitmap, cliprect, 3, 1,0);
}
else
bitmap.fill(0, cliprect);
/* note: the opaque flag is used if layer 3 is disabled, noticeable in World PK Soccer title and gameplay screens */
m107_tilemap_draw(screen, bitmap, cliprect, 2, 0,(((m_control[0x0b] >> 7) & 1) ? TILEMAP_DRAW_OPAQUE : 0));
m107_tilemap_draw(screen, bitmap, cliprect, 1, 0,0);
m107_tilemap_draw(screen, bitmap, cliprect, 0, 0,0);
m107_tilemap_draw(screen, bitmap, cliprect, 2, 1,0);
m107_tilemap_draw(screen, bitmap, cliprect, 1, 1,0);
m107_tilemap_draw(screen, bitmap, cliprect, 0, 1,0);
tilemap_draw(screen, bitmap, cliprect, 2, 0,(((m_control[0x0b] >> 7) & 1) ? TILEMAP_DRAW_OPAQUE : 0));
tilemap_draw(screen, bitmap, cliprect, 1, 0,0);
tilemap_draw(screen, bitmap, cliprect, 0, 0,0);
tilemap_draw(screen, bitmap, cliprect, 2, 1,0);
tilemap_draw(screen, bitmap, cliprect, 1, 1,0);
tilemap_draw(screen, bitmap, cliprect, 0, 1,0);
if(m_sprite_display)
draw_sprites(screen, bitmap, cliprect);
@ -360,7 +370,7 @@ void m107_state::m107_screenrefresh(screen_device &screen, bitmap_ind16 &bitmap,
/*****************************************************************************/
WRITE16_MEMBER(m107_state::m107_spritebuffer_w)
WRITE16_MEMBER(m107_state::spritebuffer_w)
{
if (ACCESSING_BITS_0_7) {
/*
@ -375,9 +385,9 @@ WRITE16_MEMBER(m107_state::m107_spritebuffer_w)
/*****************************************************************************/
UINT32 m107_state::screen_update_m107(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
UINT32 m107_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m107_update_scroll_positions();
m107_screenrefresh(screen, bitmap, cliprect);
update_scroll_positions();
screenrefresh(screen, bitmap, cliprect);
return 0;
}