From ae15cc274503a3d1e18fcfbb9886409f0b6f624e Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sun, 22 Feb 2015 08:52:05 +0100 Subject: [PATCH] shadfrce.c: added save state support (nw) --- src/mame/drivers/shadfrce.c | 55 +++++++++++----------- src/mame/includes/shadfrce.h | 91 +++++++++++++++++++----------------- src/mame/video/shadfrce.c | 37 +++++++++------ 3 files changed, 97 insertions(+), 86 deletions(-) diff --git a/src/mame/drivers/shadfrce.c b/src/mame/drivers/shadfrce.c index e1bd1e3e46a..45d05f883a2 100644 --- a/src/mame/drivers/shadfrce.c +++ b/src/mame/drivers/shadfrce.c @@ -8,7 +8,7 @@ Stephh's notes : - As for some other M68000 Technos games (or games running on similar hardware such as 'mugsmash'), the Inputs and the Dip Switches are mangled, so you need - a specific read handler so end-uers can see them in a "standard" order. + a specific read handler so end-users can see them in a "standard" order. 01-Sept-2008 - Pierpaolo Prazzoli - Added irqs ack @@ -141,7 +141,6 @@ lev 7 : 0x7c : 0000 11d0 - just rte #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" #include "sound/2151intf.h" -#include "sound/okim6295.h" #include "includes/shadfrce.h" @@ -149,7 +148,7 @@ lev 7 : 0x7c : 0000 11d0 - just rte #define CPU_CLOCK MASTER_CLOCK / 2 #define PIXEL_CLOCK MASTER_CLOCK / 4 -WRITE16_MEMBER(shadfrce_state::shadfrce_flip_screen) +WRITE16_MEMBER(shadfrce_state::flip_screen) { flip_screen_set(data & 0x01); } @@ -234,7 +233,7 @@ WRITE16_MEMBER(shadfrce_state::shadfrce_flip_screen) */ -READ16_MEMBER(shadfrce_state::shadfrce_input_ports_r) +READ16_MEMBER(shadfrce_state::input_ports_r) { UINT16 data = 0xffff; @@ -258,7 +257,7 @@ READ16_MEMBER(shadfrce_state::shadfrce_input_ports_r) } -WRITE16_MEMBER(shadfrce_state::shadfrce_sound_brt_w) +WRITE16_MEMBER(shadfrce_state::sound_brt_w) { if (ACCESSING_BITS_8_15) { @@ -275,12 +274,12 @@ WRITE16_MEMBER(shadfrce_state::shadfrce_sound_brt_w) } } -WRITE16_MEMBER(shadfrce_state::shadfrce_irq_ack_w) +WRITE16_MEMBER(shadfrce_state::irq_ack_w) { m_maincpu->set_input_line(offset ^ 3, CLEAR_LINE); } -WRITE16_MEMBER(shadfrce_state::shadfrce_irq_w) +WRITE16_MEMBER(shadfrce_state::irq_w) { m_irqs_enable = data & 1; /* maybe, it's set/unset inside every trap instruction which is executed */ m_video_enable = data & 8; /* probably */ @@ -300,12 +299,12 @@ WRITE16_MEMBER(shadfrce_state::shadfrce_irq_w) m_prev_value = data; } -WRITE16_MEMBER(shadfrce_state::shadfrce_scanline_w) +WRITE16_MEMBER(shadfrce_state::scanline_w) { m_raster_scanline = data; /* guess, 0 is always written */ } -TIMER_DEVICE_CALLBACK_MEMBER(shadfrce_state::shadfrce_scanline) +TIMER_DEVICE_CALLBACK_MEMBER(shadfrce_state::scanline) { int scanline = param; @@ -360,29 +359,29 @@ TIMER_DEVICE_CALLBACK_MEMBER(shadfrce_state::shadfrce_scanline) static ADDRESS_MAP_START( shadfrce_map, AS_PROGRAM, 16, shadfrce_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM - AM_RANGE(0x100000, 0x100fff) AM_RAM_WRITE(shadfrce_bg0videoram_w) AM_SHARE("bg0videoram") /* video */ + AM_RANGE(0x100000, 0x100fff) AM_RAM_WRITE(bg0videoram_w) AM_SHARE("bg0videoram") /* video */ AM_RANGE(0x101000, 0x101fff) AM_RAM - AM_RANGE(0x102000, 0x1027ff) AM_RAM_WRITE(shadfrce_bg1videoram_w) AM_SHARE("bg1videoram") /* bg 2 */ + AM_RANGE(0x102000, 0x1027ff) AM_RAM_WRITE(bg1videoram_w) AM_SHARE("bg1videoram") /* bg 2 */ AM_RANGE(0x102800, 0x103fff) AM_RAM - AM_RANGE(0x140000, 0x141fff) AM_RAM_WRITE(shadfrce_fgvideoram_w) AM_SHARE("fgvideoram") + AM_RANGE(0x140000, 0x141fff) AM_RAM_WRITE(fgvideoram_w) AM_SHARE("fgvideoram") AM_RANGE(0x142000, 0x143fff) AM_RAM AM_SHARE("spvideoram") /* sprites */ AM_RANGE(0x180000, 0x187fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") - AM_RANGE(0x1c0000, 0x1c0001) AM_WRITE(shadfrce_bg0scrollx_w) /* SCROLL X */ - AM_RANGE(0x1c0002, 0x1c0003) AM_WRITE(shadfrce_bg0scrolly_w) /* SCROLL Y */ - AM_RANGE(0x1c0004, 0x1c0005) AM_WRITE(shadfrce_bg1scrollx_w) /* SCROLL X */ - AM_RANGE(0x1c0006, 0x1c0007) AM_WRITE(shadfrce_bg1scrolly_w) /* SCROLL Y */ + AM_RANGE(0x1c0000, 0x1c0001) AM_WRITE(bg0scrollx_w) /* SCROLL X */ + AM_RANGE(0x1c0002, 0x1c0003) AM_WRITE(bg0scrolly_w) /* SCROLL Y */ + AM_RANGE(0x1c0004, 0x1c0005) AM_WRITE(bg1scrollx_w) /* SCROLL X */ + AM_RANGE(0x1c0006, 0x1c0007) AM_WRITE(bg1scrolly_w) /* SCROLL Y */ AM_RANGE(0x1c0008, 0x1c0009) AM_WRITENOP /* ?? */ - AM_RANGE(0x1c000a, 0x1c000b) AM_READNOP AM_WRITE(shadfrce_flip_screen) + AM_RANGE(0x1c000a, 0x1c000b) AM_READNOP AM_WRITE(flip_screen) AM_RANGE(0x1c000c, 0x1c000d) AM_WRITENOP /* ?? */ - AM_RANGE(0x1d0000, 0x1d0005) AM_WRITE(shadfrce_irq_ack_w) - AM_RANGE(0x1d0006, 0x1d0007) AM_WRITE(shadfrce_irq_w) - AM_RANGE(0x1d0008, 0x1d0009) AM_WRITE(shadfrce_scanline_w) - AM_RANGE(0x1d000c, 0x1d000d) AM_READNOP AM_WRITE(shadfrce_sound_brt_w) /* sound command + screen brightness */ + AM_RANGE(0x1d0000, 0x1d0005) AM_WRITE(irq_ack_w) + AM_RANGE(0x1d0006, 0x1d0007) AM_WRITE(irq_w) + AM_RANGE(0x1d0008, 0x1d0009) AM_WRITE(scanline_w) + AM_RANGE(0x1d000c, 0x1d000d) AM_READNOP AM_WRITE(sound_brt_w) /* sound command + screen brightness */ AM_RANGE(0x1d0010, 0x1d0011) AM_WRITENOP /* ?? */ AM_RANGE(0x1d0012, 0x1d0013) AM_WRITENOP /* ?? */ AM_RANGE(0x1d0014, 0x1d0015) AM_WRITENOP /* ?? */ AM_RANGE(0x1d0016, 0x1d0017) AM_WRITE(watchdog_reset16_w) - AM_RANGE(0x1d0020, 0x1d0027) AM_READ(shadfrce_input_ports_r) + AM_RANGE(0x1d0020, 0x1d0027) AM_READ(input_ports_r) AM_RANGE(0x1f0000, 0x1fffff) AM_RAM ADDRESS_MAP_END @@ -544,15 +543,15 @@ static MACHINE_CONFIG_START( shadfrce, shadfrce_state ) MCFG_CPU_ADD("maincpu", M68000, CPU_CLOCK) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(shadfrce_map) - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", shadfrce_state, shadfrce_scanline, "screen", 0, 1) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", shadfrce_state, scanline, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, XTAL_3_579545MHz) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(shadfrce_sound_map) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 432, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */ - MCFG_SCREEN_UPDATE_DRIVER(shadfrce_state, screen_update_shadfrce) - MCFG_SCREEN_VBLANK_DRIVER(shadfrce_state, screen_eof_shadfrce) + MCFG_SCREEN_UPDATE_DRIVER(shadfrce_state, screen_update) + MCFG_SCREEN_VBLANK_DRIVER(shadfrce_state, screen_eof) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", shadfrce) @@ -662,6 +661,6 @@ ROM_START( shadfrcejv2 ) ROM_END -GAME( 1993, shadfrce, 0, shadfrce, shadfrce, driver_device, 0, ROT0, "Technos Japan", "Shadow Force (US Version 2)", GAME_NO_COCKTAIL ) -GAME( 1993, shadfrcej, shadfrce, shadfrce, shadfrce, driver_device, 0, ROT0, "Technos Japan", "Shadow Force (Japan Version 3)", GAME_NO_COCKTAIL ) -GAME( 1993, shadfrcejv2, shadfrce, shadfrce, shadfrce, driver_device, 0, ROT0, "Technos Japan", "Shadow Force (Japan Version 2)", GAME_NO_COCKTAIL ) +GAME( 1993, shadfrce, 0, shadfrce, shadfrce, driver_device, 0, ROT0, "Technos Japan", "Shadow Force (US Version 2)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1993, shadfrcej, shadfrce, shadfrce, shadfrce, driver_device, 0, ROT0, "Technos Japan", "Shadow Force (Japan Version 3)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1993, shadfrcejv2, shadfrce, shadfrce, shadfrce, driver_device, 0, ROT0, "Technos Japan", "Shadow Force (Japan Version 2)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/shadfrce.h b/src/mame/includes/shadfrce.h index 9ac154bc107..e2e12198cb8 100644 --- a/src/mame/includes/shadfrce.h +++ b/src/mame/includes/shadfrce.h @@ -5,59 +5,64 @@ class shadfrce_state : public driver_device public: shadfrce_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_fgvideoram(*this, "fgvideoram"), - m_bg0videoram(*this, "bg0videoram"), - m_bg1videoram(*this, "bg1videoram"), - m_spvideoram(*this, "spvideoram"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_oki(*this, "oki"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_fgvideoram(*this, "fgvideoram"), + m_bg0videoram(*this, "bg0videoram"), + m_bg1videoram(*this, "bg1videoram"), + m_spvideoram(*this, "spvideoram") { } - tilemap_t *m_fgtilemap; - tilemap_t *m_bg0tilemap; - tilemap_t *m_bg1tilemap; - - required_shared_ptr m_fgvideoram; - required_shared_ptr m_bg0videoram; - required_shared_ptr m_bg1videoram; - required_shared_ptr m_spvideoram; - UINT16 *m_spvideoram_old; - - int m_video_enable; - int m_irqs_enable; - int m_raster_scanline; - int m_raster_irq_enable; - int m_vblank; - int m_prev_value; - DECLARE_WRITE16_MEMBER(shadfrce_flip_screen); - DECLARE_READ16_MEMBER(shadfrce_input_ports_r); - DECLARE_WRITE16_MEMBER(shadfrce_sound_brt_w); - DECLARE_WRITE16_MEMBER(shadfrce_irq_ack_w); - DECLARE_WRITE16_MEMBER(shadfrce_irq_w); - DECLARE_WRITE16_MEMBER(shadfrce_scanline_w); - DECLARE_WRITE16_MEMBER(shadfrce_fgvideoram_w); - DECLARE_WRITE16_MEMBER(shadfrce_bg0videoram_w); - DECLARE_WRITE16_MEMBER(shadfrce_bg1videoram_w); - DECLARE_WRITE16_MEMBER(shadfrce_bg0scrollx_w); - DECLARE_WRITE16_MEMBER(shadfrce_bg0scrolly_w); - DECLARE_WRITE16_MEMBER(shadfrce_bg1scrollx_w); - DECLARE_WRITE16_MEMBER(shadfrce_bg1scrolly_w); - DECLARE_WRITE8_MEMBER(oki_bankswitch_w); - TILE_GET_INFO_MEMBER(get_shadfrce_fgtile_info); - TILE_GET_INFO_MEMBER(get_shadfrce_bg0tile_info); - TILE_GET_INFO_MEMBER(get_shadfrce_bg1tile_info); - virtual void video_start(); - UINT32 screen_update_shadfrce(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void screen_eof_shadfrce(screen_device &screen, bool state); - TIMER_DEVICE_CALLBACK_MEMBER(shadfrce_scanline); - void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ); required_device m_maincpu; required_device m_audiocpu; required_device m_oki; required_device m_gfxdecode; required_device m_screen; required_device m_palette; + + required_shared_ptr m_fgvideoram; + required_shared_ptr m_bg0videoram; + required_shared_ptr m_bg1videoram; + required_shared_ptr m_spvideoram; + + UINT16 *m_spvideoram_old; + tilemap_t *m_fgtilemap; + tilemap_t *m_bg0tilemap; + tilemap_t *m_bg1tilemap; + int m_video_enable; + int m_irqs_enable; + int m_raster_scanline; + int m_raster_irq_enable; + int m_vblank; + int m_prev_value; + + DECLARE_WRITE16_MEMBER(flip_screen); + DECLARE_READ16_MEMBER(input_ports_r); + DECLARE_WRITE16_MEMBER(sound_brt_w); + DECLARE_WRITE16_MEMBER(irq_ack_w); + DECLARE_WRITE16_MEMBER(irq_w); + DECLARE_WRITE16_MEMBER(scanline_w); + DECLARE_WRITE16_MEMBER(fgvideoram_w); + DECLARE_WRITE16_MEMBER(bg0videoram_w); + DECLARE_WRITE16_MEMBER(bg1videoram_w); + DECLARE_WRITE16_MEMBER(bg0scrollx_w); + DECLARE_WRITE16_MEMBER(bg0scrolly_w); + DECLARE_WRITE16_MEMBER(bg1scrollx_w); + DECLARE_WRITE16_MEMBER(bg1scrolly_w); + DECLARE_WRITE8_MEMBER(oki_bankswitch_w); + + TILE_GET_INFO_MEMBER(get_fgtile_info); + TILE_GET_INFO_MEMBER(get_bg0tile_info); + TILE_GET_INFO_MEMBER(get_bg1tile_info); + + virtual void video_start(); + + TIMER_DEVICE_CALLBACK_MEMBER(scanline); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void screen_eof(screen_device &screen, bool state); + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ); }; diff --git a/src/mame/video/shadfrce.c b/src/mame/video/shadfrce.c index 8a6910bb0f0..f9c49ecc1ca 100644 --- a/src/mame/video/shadfrce.c +++ b/src/mame/video/shadfrce.c @@ -1,7 +1,7 @@ #include "emu.h" #include "includes/shadfrce.h" -TILE_GET_INFO_MEMBER(shadfrce_state::get_shadfrce_fgtile_info) +TILE_GET_INFO_MEMBER(shadfrce_state::get_fgtile_info) { /* ---- ---- tttt tttt ---- ---- pppp TTTT */ int tileno, colour; @@ -12,13 +12,13 @@ TILE_GET_INFO_MEMBER(shadfrce_state::get_shadfrce_fgtile_info) SET_TILE_INFO_MEMBER(0,tileno,colour*4,0); } -WRITE16_MEMBER(shadfrce_state::shadfrce_fgvideoram_w) +WRITE16_MEMBER(shadfrce_state::fgvideoram_w) { m_fgvideoram[offset] = data; m_fgtilemap->mark_tile_dirty(offset/2); } -TILE_GET_INFO_MEMBER(shadfrce_state::get_shadfrce_bg0tile_info) +TILE_GET_INFO_MEMBER(shadfrce_state::get_bg0tile_info) { /* ---- ---- ---- cccc --TT TTTT TTTT TTTT */ int tileno, colour,fyx; @@ -31,13 +31,13 @@ TILE_GET_INFO_MEMBER(shadfrce_state::get_shadfrce_bg0tile_info) SET_TILE_INFO_MEMBER(2,tileno,colour,TILE_FLIPYX(fyx)); } -WRITE16_MEMBER(shadfrce_state::shadfrce_bg0videoram_w) +WRITE16_MEMBER(shadfrce_state::bg0videoram_w) { m_bg0videoram[offset] = data; m_bg0tilemap->mark_tile_dirty(offset/2); } -TILE_GET_INFO_MEMBER(shadfrce_state::get_shadfrce_bg1tile_info) +TILE_GET_INFO_MEMBER(shadfrce_state::get_bg1tile_info) { int tileno, colour; @@ -47,7 +47,7 @@ TILE_GET_INFO_MEMBER(shadfrce_state::get_shadfrce_bg1tile_info) SET_TILE_INFO_MEMBER(2,tileno,colour+64,0); } -WRITE16_MEMBER(shadfrce_state::shadfrce_bg1videoram_w) +WRITE16_MEMBER(shadfrce_state::bg1videoram_w) { m_bg1videoram[offset] = data; m_bg1tilemap->mark_tile_dirty(offset); @@ -58,33 +58,40 @@ WRITE16_MEMBER(shadfrce_state::shadfrce_bg1videoram_w) void shadfrce_state::video_start() { - m_fgtilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(shadfrce_state::get_shadfrce_fgtile_info),this),TILEMAP_SCAN_ROWS, 8, 8,64,32); + m_fgtilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(shadfrce_state::get_fgtile_info),this),TILEMAP_SCAN_ROWS, 8, 8,64,32); m_fgtilemap->set_transparent_pen(0); - m_bg0tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(shadfrce_state::get_shadfrce_bg0tile_info),this),TILEMAP_SCAN_ROWS, 16, 16,32,32); + m_bg0tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(shadfrce_state::get_bg0tile_info),this),TILEMAP_SCAN_ROWS, 16, 16,32,32); m_bg0tilemap->set_transparent_pen(0); - m_bg1tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(shadfrce_state::get_shadfrce_bg1tile_info),this),TILEMAP_SCAN_ROWS, 16, 16,32,32); + m_bg1tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(shadfrce_state::get_bg1tile_info),this),TILEMAP_SCAN_ROWS, 16, 16,32,32); m_spvideoram_old = auto_alloc_array(machine(), UINT16, m_spvideoram.bytes()/2); + + save_item(NAME(m_video_enable)); + save_item(NAME(m_irqs_enable)); + save_item(NAME(m_raster_scanline)); + save_item(NAME(m_raster_irq_enable)); + save_item(NAME(m_vblank)); + save_item(NAME(m_prev_value)); } -WRITE16_MEMBER(shadfrce_state::shadfrce_bg0scrollx_w) +WRITE16_MEMBER(shadfrce_state::bg0scrollx_w) { m_bg0tilemap->set_scrollx(0, data & 0x1ff ); } -WRITE16_MEMBER(shadfrce_state::shadfrce_bg0scrolly_w) +WRITE16_MEMBER(shadfrce_state::bg0scrolly_w) { m_bg0tilemap->set_scrolly(0, data & 0x1ff ); } -WRITE16_MEMBER(shadfrce_state::shadfrce_bg1scrollx_w) +WRITE16_MEMBER(shadfrce_state::bg1scrollx_w) { m_bg1tilemap->set_scrollx(0, data & 0x1ff ); } -WRITE16_MEMBER(shadfrce_state::shadfrce_bg1scrolly_w) +WRITE16_MEMBER(shadfrce_state::bg1scrolly_w) { m_bg1tilemap->set_scrolly(0, data & 0x1ff ); } @@ -139,7 +146,7 @@ void shadfrce_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c } } -UINT32 shadfrce_state::screen_update_shadfrce(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 shadfrce_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { screen.priority().fill(0, cliprect); @@ -158,7 +165,7 @@ UINT32 shadfrce_state::screen_update_shadfrce(screen_device &screen, bitmap_ind1 return 0; } -void shadfrce_state::screen_eof_shadfrce(screen_device &screen, bool state) +void shadfrce_state::screen_eof(screen_device &screen, bool state) { // rising edge if (state)