summaryrefslogtreecommitdiffstats
path: root/src/mame/drivers/thayers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/thayers.cpp')
-rw-r--r--src/mame/drivers/thayers.cpp63
1 files changed, 32 insertions, 31 deletions
diff --git a/src/mame/drivers/thayers.cpp b/src/mame/drivers/thayers.cpp
index 97f343071a9..5b5ce89b9cf 100644
--- a/src/mame/drivers/thayers.cpp
+++ b/src/mame/drivers/thayers.cpp
@@ -56,14 +56,23 @@ public:
DECLARE_READ_LINE_MEMBER(laserdisc_ready_r);
private:
- enum
- {
- TIMER_INTRQ_TICK,
- TIMER_SSI263_PHONEME_TICK
- };
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void thayers_map(address_map &map);
+ void thayers_io_map(address_map &map);
+
+ TIMER_CALLBACK_MEMBER(intrq_tick);
+ TIMER_CALLBACK_MEMBER(phoneme_tick);
optional_device<pioneer_pr7820_device> m_pr7820;
optional_device<pioneer_ldv1000_device> m_ldv1000;
+ required_device<cpu_device> m_maincpu;
+ required_ioport_array<10> m_row;
+ output_finder<16> m_digits;
+
+ emu_timer *m_intrq_timer = nullptr;
+ emu_timer *m_phoneme_timer = nullptr;
uint8_t m_laserdisc_data = 0;
int m_rx_bit = 0;
int m_keylatch = 0;
@@ -80,6 +89,7 @@ private:
int m_cart_present = 0;
int m_pr7820_enter = 0;
struct ssi263_t m_ssi263;
+
void intrq_w(uint8_t data);
uint8_t irqstate_r();
void timer_int_ack_w(uint8_t data);
@@ -104,37 +114,22 @@ private:
void ssi263_register_w(offs_t offset, uint8_t data);
uint8_t ssi263_register_r();
- virtual void machine_start() override;
- virtual void machine_reset() override;
void check_interrupt();
- required_device<cpu_device> m_maincpu;
- required_ioport_array<10> m_row;
- output_finder<16> m_digits;
-
- void thayers_io_map(address_map &map);
- void thayers_map(address_map &map);
-
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param) override;
};
static const uint8_t led_map[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x00 };
/* Interrupts */
-void thayers_state::device_timer(emu_timer &timer, device_timer_id id, int param)
+TIMER_CALLBACK_MEMBER(thayers_state::intrq_tick)
{
- switch (id)
- {
- case TIMER_INTRQ_TICK:
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
- break;
- case TIMER_SSI263_PHONEME_TICK:
- m_ssi_data_request = 0;
- check_interrupt();
- break;
- default:
- throw emu_fatalerror("Unknown id in thayers_state::device_timer");
- }
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
+}
+
+TIMER_CALLBACK_MEMBER(thayers_state::phoneme_tick)
+{
+ m_ssi_data_request = 0;
+ check_interrupt();
}
void thayers_state::check_interrupt()
@@ -155,7 +150,7 @@ void thayers_state::intrq_w(uint8_t data)
m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
- timer_set(attotime::from_usec(8250), TIMER_INTRQ_TICK);
+ m_intrq_timer->adjust(attotime::from_usec(8250));
}
uint8_t thayers_state::irqstate_r()
@@ -533,11 +528,11 @@ void thayers_state::ssi263_register_w(offs_t offset, uint8_t data)
case 0:
case 1:
// phoneme timing response
- timer_set(attotime::from_usec(phoneme_time), TIMER_SSI263_PHONEME_TICK);
+ m_phoneme_timer->adjust(attotime::from_usec(phoneme_time));
break;
case 2:
// frame timing response
- timer_set(attotime::from_usec(frame_time), TIMER_SSI263_PHONEME_TICK);
+ m_phoneme_timer->adjust(attotime::from_usec(frame_time));
break;
case 3:
// disable A/_R output
@@ -772,6 +767,9 @@ void thayers_state::machine_start()
{
m_digits.resolve();
memset(&m_ssi263, 0, sizeof(m_ssi263));
+
+ m_intrq_timer = timer_alloc(FUNC(thayers_state::intrq_tick), this);
+ m_phoneme_timer = timer_alloc(FUNC(thayers_state::phoneme_tick), this);
}
void thayers_state::machine_reset()
@@ -794,6 +792,9 @@ void thayers_state::machine_reset()
m_cart_present = 0;
m_pr7820_enter = 0;
+
+ m_intrq_timer->adjust(attotime::never);
+ m_phoneme_timer->adjust(attotime::never);
}
/* Machine Driver */