mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
victory.c: added save state support (nw)
This commit is contained in:
parent
590f20477c
commit
01559364d6
@ -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();
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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 µ = 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;
|
||||
|
Loading…
Reference in New Issue
Block a user