victory.c: added save state support (nw)

This commit is contained in:
Ivan Vangelista 2015-04-08 19:34:57 +02:00
parent 590f20477c
commit 01559364d6
4 changed files with 69 additions and 36 deletions

View File

@ -947,6 +947,8 @@ void victory_sound_device::device_config_complete()
void victory_sound_device::device_start()
{
save_item(NAME(m_victory_sound_response_ack_clk));
save_item(NAME(m_pia1_ca1));
save_item(NAME(m_pia1_cb1));
common_sh_start();

View File

@ -128,9 +128,9 @@ WRITE8_MEMBER(victory_state::lamp_control_w)
static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, victory_state )
AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc0ff) AM_READ(victory_video_control_r)
AM_RANGE(0xc100, 0xc1ff) AM_WRITE(victory_video_control_w)
AM_RANGE(0xc200, 0xc3ff) AM_WRITE(victory_paletteram_w)
AM_RANGE(0xc000, 0xc0ff) AM_READ(video_control_r)
AM_RANGE(0xc100, 0xc1ff) AM_WRITE(video_control_w)
AM_RANGE(0xc200, 0xc3ff) AM_WRITE(paletteram_w)
AM_RANGE(0xc400, 0xc7ff) AM_RAM AM_SHARE("videoram")
AM_RANGE(0xc800, 0xdfff) AM_RAM AM_SHARE("charram")
AM_RANGE(0xe000, 0xefff) AM_RAM
@ -216,7 +216,7 @@ static MACHINE_CONFIG_START( victory, victory_state )
MCFG_CPU_ADD("maincpu", Z80, VICTORY_MAIN_CPU_CLOCK)
MCFG_CPU_PROGRAM_MAP(main_map)
MCFG_CPU_IO_MAP(main_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", victory_state, victory_vblank_interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("screen", victory_state, vblank_interrupt)
MCFG_NVRAM_ADD_0FILL("nvram")
@ -225,7 +225,7 @@ static MACHINE_CONFIG_START( victory, victory_state )
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK | VIDEO_ALWAYS_UPDATE)
/* using the standard Exidy video parameters for now, needs to be confirmed */
MCFG_SCREEN_RAW_PARAMS(VICTORY_PIXEL_CLOCK, VICTORY_HTOTAL, VICTORY_HBEND, VICTORY_HBSTART, VICTORY_VTOTAL, VICTORY_VBEND, VICTORY_VBSTART)
MCFG_SCREEN_UPDATE_DRIVER(victory_state, screen_update_victory)
MCFG_SCREEN_UPDATE_DRIVER(victory_state, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 64)
@ -317,5 +317,5 @@ ROM_END
*
*************************************/
GAME( 1982, victory, 0, victory, victory, driver_device, 0, ROT0, "Exidy", "Victory", 0 )
GAME( 1982, victorba, victory, victory, victory, driver_device, 0, ROT0, "Exidy", "Victor Banana", 0 )
GAME( 1982, victory, 0, victory, victory, driver_device, 0, ROT0, "Exidy", "Victory", GAME_SUPPORTS_SAVE )
GAME( 1982, victorba, victory, victory, victory, driver_device, 0, ROT0, "Exidy", "Victor Banana", GAME_SUPPORTS_SAVE )

View File

@ -24,7 +24,7 @@ struct micro_t
UINT16 i;
UINT16 pc;
UINT8 r,g,b;
UINT8 x,xp,y,yp;
UINT8 xp,yp;
UINT8 cmd,cmdlo;
emu_timer * timer;
UINT8 timer_active;
@ -36,14 +36,19 @@ class victory_state : public driver_device
public:
victory_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_charram(*this, "charram") ,
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
m_palette(*this, "palette") { }
m_palette(*this, "palette"),
m_videoram(*this, "videoram"),
m_charram(*this, "charram") { }
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_shared_ptr<UINT8> m_videoram;
required_shared_ptr<UINT8> m_charram;
UINT16 m_paletteram[0x40];
UINT8 *m_bgbitmap;
UINT8 *m_fgbitmap;
@ -61,15 +66,20 @@ public:
UINT8 m_scrolly;
UINT8 m_video_control;
struct micro_t m_micro;
DECLARE_WRITE8_MEMBER(lamp_control_w);
DECLARE_WRITE8_MEMBER(victory_paletteram_w);
DECLARE_READ8_MEMBER(victory_video_control_r);
DECLARE_WRITE8_MEMBER(victory_video_control_w);
DECLARE_WRITE8_MEMBER(paletteram_w);
DECLARE_READ8_MEMBER(video_control_r);
DECLARE_WRITE8_MEMBER(video_control_w);
virtual void video_start();
UINT32 screen_update_victory(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(victory_vblank_interrupt);
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(vblank_interrupt);
TIMER_CALLBACK_MEMBER(bgcoll_irq_callback);
void victory_update_irq();
void update_irq();
void set_palette();
int command2();
int command3();
@ -79,7 +89,4 @@ public:
int command7();
void update_background();
void update_foreground();
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
};

View File

@ -51,6 +51,30 @@ void victory_state::video_start()
/* register for state saving */
save_item(NAME(m_paletteram));
save_pointer(NAME(m_rram), 0x4000);
save_pointer(NAME(m_gram), 0x4000);
save_pointer(NAME(m_bram), 0x4000);
save_item(NAME(m_vblank_irq));
save_item(NAME(m_fgcoll));
save_item(NAME(m_fgcollx));
save_item(NAME(m_fgcolly));
save_item(NAME(m_bgcoll));
save_item(NAME(m_bgcollx));
save_item(NAME(m_bgcolly));
save_item(NAME(m_scrollx));
save_item(NAME(m_scrolly));
save_item(NAME(m_video_control));
save_item(NAME(m_micro.i));
save_item(NAME(m_micro.pc));
save_item(NAME(m_micro.r));
save_item(NAME(m_micro.g));
save_item(NAME(m_micro.b));
save_item(NAME(m_micro.xp));
save_item(NAME(m_micro.yp));
save_item(NAME(m_micro.cmd));
save_item(NAME(m_micro.cmdlo));
save_item(NAME(m_micro.timer_active));
save_item(NAME(m_micro.endtime));
}
@ -61,7 +85,7 @@ void victory_state::video_start()
*
*************************************/
void victory_state::victory_update_irq()
void victory_state::update_irq()
{
if (m_vblank_irq || m_fgcoll || (m_bgcoll && (m_video_control & 0x20)))
m_maincpu->set_input_line(0, ASSERT_LINE);
@ -70,11 +94,11 @@ void victory_state::victory_update_irq()
}
INTERRUPT_GEN_MEMBER(victory_state::victory_vblank_interrupt)
INTERRUPT_GEN_MEMBER(victory_state::vblank_interrupt)
{
m_vblank_irq = 1;
victory_update_irq();
update_irq();
}
@ -85,7 +109,7 @@ INTERRUPT_GEN_MEMBER(victory_state::victory_vblank_interrupt)
*
*************************************/
WRITE8_MEMBER(victory_state::victory_paletteram_w)
WRITE8_MEMBER(victory_state::paletteram_w)
{
m_paletteram[offset & 0x3f] = ((offset & 0x80) << 1) | data;
}
@ -111,7 +135,7 @@ void victory_state::set_palette()
*
*************************************/
READ8_MEMBER(victory_state::victory_video_control_r)
READ8_MEMBER(victory_state::video_control_r)
{
int result = 0;
@ -127,7 +151,7 @@ READ8_MEMBER(victory_state::victory_video_control_r)
if (m_fgcoll)
{
m_fgcoll = 0;
victory_update_irq();
update_irq();
}
if (LOG_COLLISION) logerror("%04X:5CLFIQ read = %02X\n", space.device().safe_pcbase(), result);
return result;
@ -142,7 +166,7 @@ READ8_MEMBER(victory_state::victory_video_control_r)
if (m_bgcoll)
{
m_bgcoll = 0;
victory_update_irq();
update_irq();
}
if (LOG_COLLISION) logerror("%04X:5BACKY read = %02X\n", space.device().safe_pcbase(), result);
return result;
@ -163,7 +187,7 @@ READ8_MEMBER(victory_state::victory_video_control_r)
return result;
default:
logerror("%04X:victory_video_control_r(%02X)\n", space.device().safe_pcbase(), offset);
logerror("%04X:video_control_r(%02X)\n", space.device().safe_pcbase(), offset);
break;
}
return 0;
@ -177,7 +201,7 @@ READ8_MEMBER(victory_state::victory_video_control_r)
*
*************************************/
WRITE8_MEMBER(victory_state::victory_video_control_w)
WRITE8_MEMBER(victory_state::video_control_w)
{
struct micro_t &micro = m_micro;
switch (offset)
@ -282,11 +306,11 @@ WRITE8_MEMBER(victory_state::victory_video_control_w)
case 0x0b: /* CLRVIRQ */
if (LOG_MICROCODE) logerror("%04X:CLRVIRQ write = %02X\n", space.device().safe_pcbase(), data);
m_vblank_irq = 0;
victory_update_irq();
update_irq();
break;
default:
if (LOG_MICROCODE) logerror("%04X:victory_video_control_w(%02X) = %02X\n", space.device().safe_pcbase(), offset, data);
if (LOG_MICROCODE) logerror("%04X:video_control_w(%02X) = %02X\n", space.device().safe_pcbase(), offset, data);
break;
}
}
@ -637,7 +661,7 @@ int victory_state::command3()
m_rram[dstoffs + 0] ^= src >> shift;
m_rram[dstoffs + 1] ^= src << nshift;
}
if (m_fgcoll) victory_update_irq();
if (m_fgcoll) update_irq();
}
}
}
@ -839,7 +863,7 @@ int victory_state::command5()
}
acc &= 0xff;
}
if (m_fgcoll) victory_update_irq();
if (m_fgcoll) update_irq();
}
micro.xp = x;
@ -971,7 +995,7 @@ int victory_state::command7()
m_rram[addr + 0] ^= micro.r >> shift;
m_rram[addr + 1] ^= micro.r << nshift;
}
if (m_fgcoll) victory_update_irq();
if (m_fgcoll) update_irq();
}
count_states(micro, 4);
@ -1054,7 +1078,7 @@ TIMER_CALLBACK_MEMBER(victory_state::bgcoll_irq_callback)
m_bgcollx = param & 0xff;
m_bgcolly = param >> 8;
m_bgcoll = 1;
victory_update_irq();
update_irq();
}
@ -1065,7 +1089,7 @@ TIMER_CALLBACK_MEMBER(victory_state::bgcoll_irq_callback)
*
*************************************/
UINT32 victory_state::screen_update_victory(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
UINT32 victory_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int bgcollmask = (m_video_control & 4) ? 4 : 7;
int count = 0;