summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/techno.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/techno.cpp')
-rw-r--r--src/mame/drivers/techno.cpp56
1 files changed, 38 insertions, 18 deletions
diff --git a/src/mame/drivers/techno.cpp b/src/mame/drivers/techno.cpp
index 171b60eece9..eba5c5ef94b 100644
--- a/src/mame/drivers/techno.cpp
+++ b/src/mame/drivers/techno.cpp
@@ -29,6 +29,12 @@ public:
, m_switch(*this, "SWITCH.%u", 0)
{ }
+ enum
+ {
+ IRQ_SET_TIMER,
+ IRQ_ADVANCE_TIMER
+ };
+
DECLARE_READ16_MEMBER(key_r);
DECLARE_READ16_MEMBER(rtrg_r);
DECLARE_READ16_MEMBER(sound_r);
@@ -40,17 +46,22 @@ public:
DECLARE_WRITE16_MEMBER(sol1_w);
DECLARE_WRITE16_MEMBER(sol2_w);
DECLARE_WRITE16_MEMBER(sound_w);
- INTERRUPT_GEN_MEMBER(techno_intgen);
- IRQ_CALLBACK_MEMBER(intack);
private:
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ required_device<cpu_device> m_maincpu;
+ required_ioport_array<8> m_switch;
+
+ emu_timer *m_irq_set_timer;
+ emu_timer *m_irq_advance_timer;
+
bool m_digwait;
uint8_t m_keyrow;
uint16_t m_digit;
uint8_t m_vector;
- virtual void machine_reset() override;
- required_device<cpu_device> m_maincpu;
- required_ioport_array<8> m_switch;
};
@@ -230,26 +241,38 @@ static INPUT_PORTS_START( techno )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fix top left target middle") PORT_CODE(KEYCODE_EQUALS)
INPUT_PORTS_END
-INTERRUPT_GEN_MEMBER(techno_state::techno_intgen)
+void techno_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- // vectors change per int: 88-8F, 98-9F)
- if ((m_vector & 7) == 7)
- m_vector = (m_vector ^ 0x10) & 0x97;
- m_vector++;
- m_maincpu->set_input_line(M68K_IRQ_1, ASSERT_LINE);
+ if (id == IRQ_ADVANCE_TIMER)
+ {
+ // vectors change per int: 88-8F, 98-9F)
+ if ((m_vector & 7) == 7)
+ m_vector = (m_vector ^ 0x10) & 0x97;
+ m_vector++;
+
+ // schematics show a 74HC74 cleared only upon IRQ acknowledgment or reset, but this is clearly incorrect for xforce
+ m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
+ }
+ else if (id == IRQ_SET_TIMER)
+ {
+ m_maincpu->set_input_line_and_vector(M68K_IRQ_1, ASSERT_LINE, m_vector);
+ m_irq_advance_timer->adjust(attotime::from_hz(XTAL_8MHz / 32));
+ }
}
-IRQ_CALLBACK_MEMBER(techno_state::intack)
+void techno_state::machine_start()
{
- // IRQ is cleared via hardware
- m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
- return m_vector;
+ m_irq_set_timer = timer_alloc(IRQ_SET_TIMER);
+ m_irq_advance_timer = timer_alloc(IRQ_ADVANCE_TIMER);
}
void techno_state::machine_reset()
{
m_vector = 0x88;
m_digit = 0;
+
+ attotime freq = attotime::from_hz(XTAL_8MHz / 256); // 31250Hz
+ m_irq_set_timer->adjust(freq, 0, freq);
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
}
@@ -257,9 +280,6 @@ static MACHINE_CONFIG_START( techno )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, XTAL_8MHz)
MCFG_CPU_PROGRAM_MAP(techno_map)
- MCFG_CPU_PERIODIC_INT_DRIVER(techno_state, techno_intgen, XTAL_8MHz/256) // 31250Hz
- MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(techno_state, intack)
-
MCFG_NVRAM_ADD_0FILL("nvram")
//MCFG_CPU_ADD("cpu2", TMS7000, XTAL_4MHz)