rltennis.c: added save state support (nw)

This commit is contained in:
Ivan Vangelista 2015-03-22 09:34:09 +01:00
parent d42d2c5e04
commit ac34f207b4
3 changed files with 38 additions and 33 deletions

View File

@ -69,17 +69,17 @@ player - when there's nothing to play - first, empty 2k of ROMs are selected.
#define RLT_TIMER_FREQ (RLT_REFRESH_RATE*256) #define RLT_TIMER_FREQ (RLT_REFRESH_RATE*256)
#define RLT_XTAL XTAL_12MHz #define RLT_XTAL XTAL_12MHz
READ16_MEMBER(rltennis_state::rlt_io_r) READ16_MEMBER(rltennis_state::io_r)
{ {
return (ioport("P1" )->read()&0x1fff) | (m_unk_counter<<13); /* top 3 bits controls smaple address update */ return (ioport("P1" )->read()&0x1fff) | (m_unk_counter<<13); /* top 3 bits controls smaple address update */
} }
WRITE16_MEMBER(rltennis_state::rlt_snd1_w) WRITE16_MEMBER(rltennis_state::snd1_w)
{ {
COMBINE_DATA(&m_data760000); COMBINE_DATA(&m_data760000);
} }
WRITE16_MEMBER(rltennis_state::rlt_snd2_w) WRITE16_MEMBER(rltennis_state::snd2_w)
{ {
COMBINE_DATA(&m_data740000); COMBINE_DATA(&m_data740000);
} }
@ -88,15 +88,15 @@ static ADDRESS_MAP_START( rltennis_main, AS_PROGRAM, 16, rltennis_state )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_SHARE("nvram") AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_RANGE(0x200000, 0x20ffff) AM_RAM
AM_RANGE(0x700000, 0x70000f) AM_WRITE(rlt_blitter_w) AM_RANGE(0x700000, 0x70000f) AM_WRITE(blitter_w)
AM_RANGE(0x720000, 0x720001) AM_DEVWRITE8("ramdac",ramdac_device,index_w,0x00ff) AM_RANGE(0x720000, 0x720001) AM_DEVWRITE8("ramdac",ramdac_device,index_w,0x00ff)
AM_RANGE(0x720002, 0x720003) AM_DEVREADWRITE8("ramdac",ramdac_device,pal_r,pal_w,0x00ff) AM_RANGE(0x720002, 0x720003) AM_DEVREADWRITE8("ramdac",ramdac_device,pal_r,pal_w,0x00ff)
AM_RANGE(0x720006, 0x720007) AM_DEVWRITE8("ramdac",ramdac_device,index_r_w,0x00ff) AM_RANGE(0x720006, 0x720007) AM_DEVWRITE8("ramdac",ramdac_device,index_r_w,0x00ff)
AM_RANGE(0x740000, 0x740001) AM_WRITE(rlt_snd1_w) AM_RANGE(0x740000, 0x740001) AM_WRITE(snd1_w)
AM_RANGE(0x760000, 0x760001) AM_WRITE(rlt_snd2_w) AM_RANGE(0x760000, 0x760001) AM_WRITE(snd2_w)
AM_RANGE(0x780000, 0x780001) AM_WRITENOP /* sound control, unknown, usually = 0x0044 */ AM_RANGE(0x780000, 0x780001) AM_WRITENOP /* sound control, unknown, usually = 0x0044 */
AM_RANGE(0x7a0000, 0x7a0003) AM_READNOP /* unknown, read only at boot time*/ AM_RANGE(0x7a0000, 0x7a0003) AM_READNOP /* unknown, read only at boot time*/
AM_RANGE(0x7e0000, 0x7e0001) AM_READ(rlt_io_r) AM_RANGE(0x7e0000, 0x7e0001) AM_READ(io_r)
AM_RANGE(0x7e0002, 0x7e0003) AM_READ_PORT("P2") AM_RANGE(0x7e0002, 0x7e0003) AM_READ_PORT("P2")
ADDRESS_MAP_END ADDRESS_MAP_END
@ -144,7 +144,7 @@ TIMER_CALLBACK_MEMBER(rltennis_state::sample_player)
m_timer->adjust(attotime::from_hz( RLT_TIMER_FREQ )); m_timer->adjust(attotime::from_hz( RLT_TIMER_FREQ ));
} }
INTERRUPT_GEN_MEMBER(rltennis_state::rltennis_interrupt) INTERRUPT_GEN_MEMBER(rltennis_state::interrupt)
{ {
++m_unk_counter; /* frame counter? verify */ ++m_unk_counter; /* frame counter? verify */
device.execute().set_input_line(4, HOLD_LINE); device.execute().set_input_line(4, HOLD_LINE);
@ -157,6 +157,14 @@ void rltennis_state::machine_start()
m_samples_2 = memregion("samples2")->base(); m_samples_2 = memregion("samples2")->base();
m_gfx = memregion("gfx1")->base(); m_gfx = memregion("gfx1")->base();
m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(rltennis_state::sample_player),this)); m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(rltennis_state::sample_player),this));
save_item(NAME(m_data760000));
save_item(NAME(m_data740000));
save_item(NAME(m_dac_counter));
save_item(NAME(m_sample_rom_offset_1));
save_item(NAME(m_sample_rom_offset_2));
save_item(NAME(m_offset_shift));
save_item(NAME(m_unk_counter));
} }
void rltennis_state::machine_reset() void rltennis_state::machine_reset()
@ -172,13 +180,13 @@ static MACHINE_CONFIG_START( rltennis, rltennis_state )
MCFG_CPU_ADD("maincpu", M68000, RLT_XTAL/2) /* 68000P8 ??? */ MCFG_CPU_ADD("maincpu", M68000, RLT_XTAL/2) /* 68000P8 ??? */
MCFG_CPU_PROGRAM_MAP(rltennis_main) MCFG_CPU_PROGRAM_MAP(rltennis_main)
MCFG_CPU_VBLANK_INT_DRIVER("screen", rltennis_state, rltennis_interrupt) MCFG_CPU_VBLANK_INT_DRIVER("screen", rltennis_state, interrupt)
MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE( RLT_REFRESH_RATE ) MCFG_SCREEN_REFRESH_RATE( RLT_REFRESH_RATE )
MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_SIZE(320, 240)
MCFG_SCREEN_VISIBLE_AREA(0,319, 0, 239) MCFG_SCREEN_VISIBLE_AREA(0,319, 0, 239)
MCFG_SCREEN_UPDATE_DRIVER(rltennis_state, screen_update_rltennis) MCFG_SCREEN_UPDATE_DRIVER(rltennis_state, screen_update)
MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 256) MCFG_PALETTE_ADD("palette", 256)
@ -221,4 +229,4 @@ ROM_START( rltennis )
ROM_LOAD( "tennis_3.u52", 0x00000, 0x80000, CRC(517dcd0e) SHA1(b2703e185ee8cf7e115ea07151e7bee8be34948b) ) ROM_LOAD( "tennis_3.u52", 0x00000, 0x80000, CRC(517dcd0e) SHA1(b2703e185ee8cf7e115ea07151e7bee8be34948b) )
ROM_END ROM_END
GAME( 1993, rltennis, 0, rltennis, rltennis, driver_device, 0, ROT0, "TCH", "Reality Tennis", GAME_IMPERFECT_GRAPHICS) GAME( 1993, rltennis, 0, rltennis, rltennis, driver_device, 0, ROT0, "TCH", "Reality Tennis", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )

View File

@ -10,45 +10,40 @@ public:
rltennis_state(const machine_config &mconfig, device_type type, const char *tag) rltennis_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_data760000(0), m_data740000(0), m_dac_counter(0), m_sample_rom_offset_1(0), m_sample_rom_offset_2(0),
m_offset_shift(0),
m_dac_1(*this, "dac1"), m_dac_1(*this, "dac1"),
m_dac_2(*this, "dac2") { } m_dac_2(*this, "dac2"),
m_data760000(0), m_data740000(0), m_dac_counter(0), m_sample_rom_offset_1(0), m_sample_rom_offset_2(0),
m_offset_shift(0) { }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<dac_device> m_dac_1;
required_device<dac_device> m_dac_2;
UINT16 m_blitter[RLT_NUM_BLITTER_REGS]; UINT16 m_blitter[RLT_NUM_BLITTER_REGS];
INT32 m_data760000; INT32 m_data760000;
INT32 m_data740000; INT32 m_data740000;
INT32 m_dac_counter; INT32 m_dac_counter;
INT32 m_sample_rom_offset_1; INT32 m_sample_rom_offset_1;
INT32 m_sample_rom_offset_2; INT32 m_sample_rom_offset_2;
INT32 m_offset_shift; INT32 m_offset_shift;
INT32 m_unk_counter; INT32 m_unk_counter;
bitmap_ind16 *m_tmp_bitmap[RLT_NUM_BITMAPS]; bitmap_ind16 *m_tmp_bitmap[RLT_NUM_BITMAPS];
required_device<dac_device> m_dac_1;
required_device<dac_device> m_dac_2;
UINT8 *m_samples_1; UINT8 *m_samples_1;
UINT8 *m_samples_2; UINT8 *m_samples_2;
UINT8 *m_gfx; UINT8 *m_gfx;
emu_timer *m_timer; emu_timer *m_timer;
DECLARE_READ16_MEMBER(rlt_io_r); DECLARE_READ16_MEMBER(io_r);
DECLARE_WRITE16_MEMBER(rlt_snd1_w); DECLARE_WRITE16_MEMBER(snd1_w);
DECLARE_WRITE16_MEMBER(rlt_snd2_w); DECLARE_WRITE16_MEMBER(snd2_w);
DECLARE_WRITE16_MEMBER(rlt_blitter_w); DECLARE_WRITE16_MEMBER(blitter_w);
virtual void machine_start(); virtual void machine_start();
virtual void machine_reset(); virtual void machine_reset();
virtual void video_start(); virtual void video_start();
UINT32 screen_update_rltennis(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(rltennis_interrupt); UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(interrupt);
TIMER_CALLBACK_MEMBER(sample_player); TIMER_CALLBACK_MEMBER(sample_player);
}; };

View File

@ -110,7 +110,7 @@ enum
#define SRC_SHIFT 8 #define SRC_SHIFT 8
WRITE16_MEMBER(rltennis_state::rlt_blitter_w) WRITE16_MEMBER(rltennis_state::blitter_w)
{ {
int old_data=m_blitter[offset]; int old_data=m_blitter[offset];
COMBINE_DATA(&m_blitter[offset]); COMBINE_DATA(&m_blitter[offset]);
@ -224,9 +224,11 @@ void rltennis_state::video_start()
m_tmp_bitmap[BITMAP_FG_1] = auto_bitmap_ind16_alloc(machine(), 512, 256); m_tmp_bitmap[BITMAP_FG_1] = auto_bitmap_ind16_alloc(machine(), 512, 256);
m_tmp_bitmap[BITMAP_FG_2] = auto_bitmap_ind16_alloc(machine(), 512, 256); m_tmp_bitmap[BITMAP_FG_2] = auto_bitmap_ind16_alloc(machine(), 512, 256);
m_tmp_bitmap[BITMAP_FG_DISPLAY] = auto_bitmap_ind16_alloc(machine(), 512, 256); m_tmp_bitmap[BITMAP_FG_DISPLAY] = auto_bitmap_ind16_alloc(machine(), 512, 256);
save_item(NAME(m_blitter));
} }
UINT32 rltennis_state::screen_update_rltennis(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) UINT32 rltennis_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
copybitmap(bitmap, *m_tmp_bitmap[BITMAP_BG], 0, 0, 0, 0, cliprect); copybitmap(bitmap, *m_tmp_bitmap[BITMAP_BG], 0, 0, 0, 0, cliprect);
copybitmap_trans(bitmap, *m_tmp_bitmap[BITMAP_FG_DISPLAY], 0, 0, 0, 0, cliprect, 0); copybitmap_trans(bitmap, *m_tmp_bitmap[BITMAP_FG_DISPLAY], 0, 0, 0, 0, cliprect, 0);