capbowl.c: killed anonymous timer, enabled save state support (nw)

tms34061.c: added save state support (nw)
This commit is contained in:
Ivan Vangelista 2015-02-27 18:33:18 +01:00
parent dfbb61232c
commit 482a4d9249
4 changed files with 64 additions and 77 deletions

View File

@ -60,9 +60,7 @@ void tms34061_device::device_start()
/* allocate memory for VRAM */
m_vram = auto_alloc_array_clear(machine(), UINT8, m_vramsize + 256 * 2);
/* not really a save state, just there for debugging purposes */
save_pointer(NAME(m_vram), m_vramsize);
/* allocate memory for latch RAM */
m_latchram = auto_alloc_array_clear(machine(), UINT8, m_vramsize + 256 * 2);
@ -95,6 +93,14 @@ void tms34061_device::device_start()
/* start vertical interrupt timer */
m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tms34061_device::interrupt), this));
save_item(NAME(m_regs));
save_item(NAME(m_xmask));
save_item(NAME(m_yshift));
save_pointer(NAME(m_vram), m_vramsize);
save_pointer(NAME(m_latchram), m_vramsize);
save_item(NAME(m_latchdata));
save_pointer(NAME(m_shiftreg), m_vramsize);
}
//-------------------------------------------------

View File

@ -103,7 +103,7 @@
*
*************************************/
INTERRUPT_GEN_MEMBER(capbowl_state::capbowl_interrupt)
INTERRUPT_GEN_MEMBER(capbowl_state::interrupt)
{
if (ioport("SERVICE")->read() & 1) /* get status of the F2 key */
device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); /* trigger self test */
@ -121,8 +121,8 @@ void capbowl_state::device_timer(emu_timer &timer, device_timer_id id, int param
{
switch (id)
{
case TIMER_CAPBOWL_UPDATE:
capbowl_update(ptr, param);
case TIMER_UPDATE:
update(ptr, param);
break;
default:
assert_always(FALSE, "Unknown id in capbowl_state::device_timer");
@ -130,14 +130,14 @@ void capbowl_state::device_timer(emu_timer &timer, device_timer_id id, int param
}
TIMER_CALLBACK_MEMBER(capbowl_state::capbowl_update)
TIMER_CALLBACK_MEMBER(capbowl_state::update)
{
int scanline = param;
m_screen->update_partial(scanline - 1);
scanline += 32;
if (scanline > 240) scanline = 32;
timer_set(m_screen->time_until_pos(scanline), TIMER_CAPBOWL_UPDATE, scanline);
m_update_timer->adjust(m_screen->time_until_pos(scanline), scanline);
}
@ -190,28 +190,13 @@ WRITE8_MEMBER(capbowl_state::track_reset_w)
*
*************************************/
WRITE8_MEMBER(capbowl_state::capbowl_sndcmd_w)
WRITE8_MEMBER(capbowl_state::sndcmd_w)
{
m_audiocpu->set_input_line(M6809_IRQ_LINE, HOLD_LINE);
soundlatch_byte_w(space, offset, data);
}
/*************************************
*
* Handler called by the 2203 emulator
* when the internal timers cause an IRQ
*
*************************************/
WRITE_LINE_MEMBER(capbowl_state::firqhandler)
{
m_audiocpu->set_input_line(M6809_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE);
}
/*************************************
*
* Main CPU memory handlers
@ -223,8 +208,8 @@ static ADDRESS_MAP_START( capbowl_map, AS_PROGRAM, 8, capbowl_state )
AM_RANGE(0x4000, 0x4000) AM_WRITEONLY AM_SHARE("rowaddress")
AM_RANGE(0x4800, 0x4800) AM_WRITE(capbowl_rom_select_w)
AM_RANGE(0x5000, 0x57ff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0x5800, 0x5fff) AM_READWRITE(capbowl_tms34061_r, capbowl_tms34061_w)
AM_RANGE(0x6000, 0x6000) AM_WRITE(capbowl_sndcmd_w)
AM_RANGE(0x5800, 0x5fff) AM_READWRITE(tms34061_r, tms34061_w)
AM_RANGE(0x6000, 0x6000) AM_WRITE(sndcmd_w)
AM_RANGE(0x6800, 0x6800) AM_WRITE(track_reset_w) AM_READNOP /* + watchdog */
AM_RANGE(0x7000, 0x7000) AM_READ(track_0_r) /* + other inputs */
AM_RANGE(0x7800, 0x7800) AM_READ(track_1_r) /* + other inputs */
@ -236,8 +221,8 @@ static ADDRESS_MAP_START( bowlrama_map, AS_PROGRAM, 8, capbowl_state )
AM_RANGE(0x0000, 0x001f) AM_READWRITE(bowlrama_blitter_r, bowlrama_blitter_w)
AM_RANGE(0x4000, 0x4000) AM_WRITEONLY AM_SHARE("rowaddress")
AM_RANGE(0x5000, 0x57ff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0x5800, 0x5fff) AM_READWRITE(capbowl_tms34061_r, capbowl_tms34061_w)
AM_RANGE(0x6000, 0x6000) AM_WRITE(capbowl_sndcmd_w)
AM_RANGE(0x5800, 0x5fff) AM_READWRITE(tms34061_r, tms34061_w)
AM_RANGE(0x6000, 0x6000) AM_WRITE(sndcmd_w)
AM_RANGE(0x6800, 0x6800) AM_WRITE(track_reset_w) AM_READNOP /* + watchdog */
AM_RANGE(0x7000, 0x7000) AM_READ(track_0_r) /* + other inputs */
AM_RANGE(0x7800, 0x7800) AM_READ(track_1_r) /* + other inputs */
@ -299,17 +284,6 @@ static INPUT_PORTS_START( capbowl )
INPUT_PORTS_END
/*************************************
*
* TMS34061 interfacing
*
*************************************/
WRITE_LINE_MEMBER(capbowl_state::generate_tms34061_interrupt)
{
m_maincpu->set_input_line(M6809_FIRQ_LINE, state);
}
/*************************************
*
* Machine driver
@ -318,14 +292,15 @@ WRITE_LINE_MEMBER(capbowl_state::generate_tms34061_interrupt)
void capbowl_state::machine_start()
{
m_update_timer = timer_alloc(TIMER_UPDATE);
save_item(NAME(m_blitter_addr));
save_item(NAME(m_last_trackball_val[0]));
save_item(NAME(m_last_trackball_val[1]));
save_item(NAME(m_last_trackball_val));
}
void capbowl_state::machine_reset()
{
timer_set(m_screen->time_until_pos(32), TIMER_CAPBOWL_UPDATE, 32);
m_update_timer->adjust(m_screen->time_until_pos(32), 32);
m_blitter_addr = 0;
m_last_trackball_val[0] = 0;
@ -338,7 +313,7 @@ static MACHINE_CONFIG_START( capbowl, capbowl_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6809E, MASTER_CLOCK)
MCFG_CPU_PROGRAM_MAP(capbowl_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", capbowl_state, capbowl_interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("screen", capbowl_state, interrupt)
MCFG_WATCHDOG_TIME_INIT(PERIOD_OF_555_ASTABLE(100000.0, 100000.0, 0.1e-6) * 15.5) // ~0.3s
MCFG_CPU_ADD("audiocpu", M6809E, MASTER_CLOCK)
@ -354,18 +329,18 @@ static MACHINE_CONFIG_START( capbowl, capbowl_state )
MCFG_SCREEN_SIZE(360, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 359, 0, 244)
MCFG_SCREEN_REFRESH_RATE(57)
MCFG_SCREEN_UPDATE_DRIVER(capbowl_state, screen_update_capbowl)
MCFG_SCREEN_UPDATE_DRIVER(capbowl_state, screen_update)
MCFG_DEVICE_ADD("tms34061", TMS34061, 0)
MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */
MCFG_TMS34061_VRAM_SIZE(0x10000) /* size of video RAM */
MCFG_TMS34061_INTERRUPT_CB(WRITELINE(capbowl_state, generate_tms34061_interrupt)) /* interrupt gen callback */
MCFG_TMS34061_INTERRUPT_CB(INPUTLINE("maincpu", M6809_FIRQ_LINE)) /* interrupt gen callback */
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymsnd", YM2203, MASTER_CLOCK/2)
MCFG_YM2203_IRQ_HANDLER(WRITELINE(capbowl_state, firqhandler))
MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", M6809_FIRQ_LINE))
MCFG_AY8910_PORT_A_READ_CB(DEVREAD8("ticket", ticket_dispenser_device, read))
MCFG_AY8910_PORT_B_WRITE_CB(DEVWRITE8("ticket", ticket_dispenser_device, write)) /* Also a status LED. See memory map above */
MCFG_SOUND_ROUTE(0, "mono", 0.07)
@ -492,9 +467,9 @@ DRIVER_INIT_MEMBER(capbowl_state,capbowl)
*
*************************************/
GAME( 1988, capbowl, 0, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Capcom Bowling (set 1)", 0 )
GAME( 1988, capbowl2, capbowl, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Capcom Bowling (set 2)", 0 )
GAME( 1988, capbowl3, capbowl, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Capcom Bowling (set 3)", 0 )
GAME( 1988, capbowl4, capbowl, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Capcom Bowling (set 4)", 0 )
GAME( 1989, clbowl, capbowl, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Coors Light Bowling", 0 )
GAME( 1991, bowlrama, 0, bowlrama, capbowl, driver_device, 0, ROT270, "P&P Marketing", "Bowl-O-Rama", 0 )
GAME( 1988, capbowl, 0, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Capcom Bowling (set 1)", GAME_SUPPORTS_SAVE )
GAME( 1988, capbowl2, capbowl, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Capcom Bowling (set 2)", GAME_SUPPORTS_SAVE )
GAME( 1988, capbowl3, capbowl, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Capcom Bowling (set 3)", GAME_SUPPORTS_SAVE )
GAME( 1988, capbowl4, capbowl, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Capcom Bowling (set 4)", GAME_SUPPORTS_SAVE )
GAME( 1989, clbowl, capbowl, capbowl, capbowl, capbowl_state, capbowl, ROT270, "Incredible Technologies / Capcom", "Coors Light Bowling", GAME_SUPPORTS_SAVE )
GAME( 1991, bowlrama, 0, bowlrama, capbowl, driver_device, 0, ROT270, "P&P Marketing", "Bowl-O-Rama", GAME_SUPPORTS_SAVE )

View File

@ -12,16 +12,22 @@ class capbowl_state : public driver_device
public:
enum
{
TIMER_CAPBOWL_UPDATE
TIMER_UPDATE
};
capbowl_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_rowaddress(*this, "rowaddress"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_tms34061(*this, "tms34061"),
m_screen(*this, "screen") { }
m_screen(*this, "screen"),
m_rowaddress(*this, "rowaddress") { }
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<tms34061_device> m_tms34061;
required_device<screen_device> m_screen;
/* memory pointers */
required_shared_ptr<UINT8> m_rowaddress;
@ -31,31 +37,33 @@ public:
/* input-related */
UINT8 m_last_trackball_val[2];
emu_timer *m_update_timer;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<tms34061_device> m_tms34061;
required_device<screen_device> m_screen;
DECLARE_WRITE8_MEMBER(capbowl_rom_select_w);
// common
DECLARE_READ8_MEMBER(track_0_r);
DECLARE_READ8_MEMBER(track_1_r);
DECLARE_WRITE8_MEMBER(track_reset_w);
DECLARE_WRITE8_MEMBER(capbowl_sndcmd_w);
DECLARE_WRITE8_MEMBER(capbowl_tms34061_w);
DECLARE_READ8_MEMBER(capbowl_tms34061_r);
DECLARE_WRITE8_MEMBER(sndcmd_w);
DECLARE_WRITE8_MEMBER(tms34061_w);
DECLARE_READ8_MEMBER(tms34061_r);
// capbowl specific
DECLARE_WRITE8_MEMBER(capbowl_rom_select_w);
// bowlrama specific
DECLARE_WRITE8_MEMBER(bowlrama_blitter_w);
DECLARE_READ8_MEMBER(bowlrama_blitter_r);
DECLARE_DRIVER_INIT(capbowl);
virtual void machine_start();
virtual void machine_reset();
UINT32 screen_update_capbowl(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(capbowl_interrupt);
TIMER_CALLBACK_MEMBER(capbowl_update);
INTERRUPT_GEN_MEMBER(interrupt);
TIMER_CALLBACK_MEMBER(update);
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
inline rgb_t pen_for_pixel( UINT8 *src, UINT8 pix );
DECLARE_WRITE_LINE_MEMBER(firqhandler);
DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt);
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);

View File

@ -15,7 +15,7 @@
*
*************************************/
WRITE8_MEMBER(capbowl_state::capbowl_tms34061_w)
WRITE8_MEMBER(capbowl_state::tms34061_w)
{
int func = (offset >> 8) & 3;
int col = offset & 0xff;
@ -30,7 +30,7 @@ WRITE8_MEMBER(capbowl_state::capbowl_tms34061_w)
}
READ8_MEMBER(capbowl_state::capbowl_tms34061_r)
READ8_MEMBER(capbowl_state::tms34061_r)
{
int func = (offset >> 8) & 3;
int col = offset & 0xff;
@ -123,10 +123,8 @@ inline rgb_t capbowl_state::pen_for_pixel( UINT8 *src, UINT8 pix )
}
UINT32 capbowl_state::screen_update_capbowl(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
UINT32 capbowl_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int x, y;
/* first get the current display state */
m_tms34061->get_display_state();
@ -138,12 +136,12 @@ UINT32 capbowl_state::screen_update_capbowl(screen_device &screen, bitmap_rgb32
}
/* now regenerate the bitmap */
for (y = cliprect.min_y; y <= cliprect.max_y; y++)
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
UINT8 *src = &m_tms34061->m_display.vram[256 * y];
UINT32 *dest = &bitmap.pix32(y);
for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2)
for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2)
{
UINT8 pix = src[32 + (x / 2)];
*dest++ = pen_for_pixel(src, pix >> 4);