summaryrefslogtreecommitdiffstats
path: root/src/mame/machine/snes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/snes.cpp')
-rw-r--r--src/mame/machine/snes.cpp61
1 files changed, 11 insertions, 50 deletions
diff --git a/src/mame/machine/snes.cpp b/src/mame/machine/snes.cpp
index d8bdd2bf16c..fe2a810c5ee 100644
--- a/src/mame/machine/snes.cpp
+++ b/src/mame/machine/snes.cpp
@@ -52,44 +52,10 @@ void snes_state::scpu_irq_refresh()
}
-void snes_state::device_timer(emu_timer &timer, device_timer_id id, int param)
-{
- switch (id)
- {
- case TIMER_NMI_TICK:
- snes_nmi_tick(param);
- break;
- case TIMER_HIRQ_TICK:
- snes_hirq_tick_callback(param);
- break;
- case TIMER_RESET_OAM_ADDRESS:
- snes_reset_oam_address(param);
- break;
- case TIMER_RESET_HDMA:
- snes_reset_hdma(param);
- break;
- case TIMER_UPDATE_IO:
- snes_update_io(param);
- break;
- case TIMER_SCANLINE_TICK:
- snes_scanline_tick(param);
- break;
- case TIMER_HBLANK_TICK:
- snes_hblank_tick(param);
- break;
- default:
- throw emu_fatalerror("Unknown id in snes_state::device_timer");
- }
-}
-
-
TIMER_CALLBACK_MEMBER(snes_state::snes_nmi_tick)
{
// pull NMI
m_maincpu->set_input_line(G65816_LINE_NMI, ASSERT_LINE);
-
- // don't happen again
- m_nmi_timer->adjust(attotime::never);
}
void snes_state::hirq_tick()
@@ -99,9 +65,6 @@ void snes_state::hirq_tick()
m_ppu->set_latch_hv(m_ppu->current_x(), m_ppu->current_y());
SNES_CPU_REG(TIMEUP) = 0x80; /* Indicate that irq occurred */
scpu_irq_refresh();
-
- // don't happen again
- m_hirq_timer->adjust(attotime::never);
}
TIMER_CALLBACK_MEMBER(snes_state::snes_hirq_tick_callback)
@@ -125,8 +88,6 @@ TIMER_CALLBACK_MEMBER(snes_state::snes_update_io)
{
io_read();
SNES_CPU_REG(HVBJOY) &= 0xfe; /* Clear busy bit */
-
- m_io_timer->adjust(attotime::never);
}
TIMER_CALLBACK_MEMBER(snes_state::snes_scanline_tick)
@@ -180,7 +141,7 @@ TIMER_CALLBACK_MEMBER(snes_state::snes_scanline_tick)
/* Start of VBlank */
if (m_ppu->current_vert() == m_ppu->last_visible_line())
{
- timer_set(m_screen->time_until_pos(m_ppu->current_vert(), 10), TIMER_RESET_OAM_ADDRESS);
+ m_oam_reset_addr_timer->adjust(m_screen->time_until_pos(m_ppu->current_vert(), 10));
SNES_CPU_REG(HVBJOY) |= 0x81; /* Set vblank bit to on & indicate controllers being read */
SNES_CPU_REG(RDNMI) |= 0x80; /* Set NMI occurred bit */
@@ -212,7 +173,6 @@ TIMER_CALLBACK_MEMBER(snes_state::snes_scanline_tick)
m_maincpu->set_input_line(G65816_LINE_NMI, CLEAR_LINE );
}
- m_scanline_timer->adjust(attotime::never);
m_hblank_timer->adjust(m_screen->time_until_pos(m_ppu->current_vert(), m_hblank_offset * m_ppu->htmult()));
// printf("%02x %d\n",SNES_CPU_REG(HVBJOY),m_ppu->current_vert());
@@ -226,9 +186,6 @@ TIMER_CALLBACK_MEMBER(snes_state::snes_hblank_tick)
m_ppu->set_current_vert(m_screen->vpos());
- /* make sure we halt */
- m_hblank_timer->adjust(attotime::never);
-
/* draw a scanline */
if (m_ppu->current_vert() <= m_ppu->last_visible_line())
{
@@ -559,7 +516,7 @@ void snes_state::snes_w_io(address_space &space, offs_t offset, uint8_t data)
return;
case HDMAEN: /* HDMA channel designation */
if (data != SNES_CPU_REG(HDMAEN)) //if a HDMA is enabled, data is inited at the next scanline
- timer_set(m_screen->time_until_pos(m_ppu->current_vert() + 1), TIMER_RESET_HDMA);
+ m_hdma_reset_timer->adjust(m_screen->time_until_pos(m_ppu->current_vert() + 1));
SNES_CPU_REG(HDMAEN) = data;
return;
case TIMEUP: // IRQ Flag is cleared on both read and write
@@ -1018,20 +975,24 @@ uint8_t snes_state::oldjoy2_read(int latched)
void snes_state::snes_init_timers()
{
/* init timers and stop them */
- m_scanline_timer = timer_alloc(TIMER_SCANLINE_TICK);
+ m_scanline_timer = timer_alloc(FUNC(snes_state::snes_scanline_tick), this);
m_scanline_timer->adjust(attotime::never);
- m_hblank_timer = timer_alloc(TIMER_HBLANK_TICK);
+ m_hblank_timer = timer_alloc(FUNC(snes_state::snes_hblank_tick), this);
m_hblank_timer->adjust(attotime::never);
- m_nmi_timer = timer_alloc(TIMER_NMI_TICK);
+ m_nmi_timer = timer_alloc(FUNC(snes_state::snes_nmi_tick), this);
m_nmi_timer->adjust(attotime::never);
- m_hirq_timer = timer_alloc(TIMER_HIRQ_TICK);
+ m_hirq_timer = timer_alloc(FUNC(snes_state::snes_hirq_tick_callback), this);
m_hirq_timer->adjust(attotime::never);
//m_div_timer = timer_alloc(TIMER_DIV);
//m_div_timer->adjust(attotime::never);
//m_mult_timer = timer_alloc(TIMER_MULT);
//m_mult_timer->adjust(attotime::never);
- m_io_timer = timer_alloc(TIMER_UPDATE_IO);
+ m_io_timer = timer_alloc(FUNC(snes_state::snes_update_io), this);
m_io_timer->adjust(attotime::never);
+ m_oam_reset_addr_timer = timer_alloc(FUNC(snes_state::snes_reset_oam_address), this);
+ m_oam_reset_addr_timer->adjust(attotime::never);
+ m_hdma_reset_timer = timer_alloc(FUNC(snes_state::snes_reset_hdma), this);
+ m_hdma_reset_timer->adjust(attotime::never);
// SNES hcounter has a 0-339 range. hblank starts at counter 260.
// clayfighter sets an HIRQ at 260, apparently it wants it to be before hdma kicks off, so we'll delay 2 pixels.