diff options
author | 2020-09-05 11:15:10 -0400 | |
---|---|---|
committer | 2020-09-05 11:15:10 -0400 | |
commit | 12c6a35d3d4020ed86ef56d350c620b74e5b623a (patch) | |
tree | 6075e4803e9e247fece21710eda588be94545fcc | |
parent | 9dacca942bbc594c0ee652afd6be468920ab26f5 (diff) |
sawatte: Hack in some timer IRQs
-rw-r--r-- | src/mame/drivers/sega_sawatte.cpp | 94 |
1 files changed, 92 insertions, 2 deletions
diff --git a/src/mame/drivers/sega_sawatte.cpp b/src/mame/drivers/sega_sawatte.cpp index b011778b1d2..8e96f53a811 100644 --- a/src/mame/drivers/sega_sawatte.cpp +++ b/src/mame/drivers/sega_sawatte.cpp @@ -39,8 +39,12 @@ public: , m_maincpu(*this, "maincpu") , m_cartslot(*this, "cartslot") , m_soundram(*this, "soundram") + , m_irq3_timer(nullptr) + , m_irq4_timer(nullptr) , m_data_bank(0) , m_prog_bank(0) + , m_irq_status(0) + , m_irq_mask(0) { } void sawatte(machine_config &config); @@ -50,9 +54,16 @@ protected: virtual void machine_reset() override; private: + TIMER_CALLBACK_MEMBER(irq3_timer); + TIMER_CALLBACK_MEMBER(irq4_timer); + void bank08_w(u8 data); void bank09_w(u8 data); void bank0a_w(u8 data); + u8 irq_status_r(); + void irq_mask_w(u8 data); + void irq3_timer_w(u8 data); + void irq4_timer_w(u8 data); u8 fixed_r(offs_t offset); u8 data_bank_r(offs_t offset); u8 prog_bank_r(offs_t offset); @@ -63,22 +74,58 @@ private: required_device<generic_slot_device> m_cartslot; required_shared_ptr<u8> m_soundram; + emu_timer *m_irq3_timer; + emu_timer *m_irq4_timer; + u16 m_data_bank; u8 m_prog_bank; + u8 m_irq_status; + u8 m_irq_mask; }; void sawatte_state::machine_start() { + m_irq3_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sawatte_state::irq3_timer), this)); + m_irq4_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sawatte_state::irq4_timer), this)); + save_item(NAME(m_data_bank)); save_item(NAME(m_prog_bank)); + save_item(NAME(m_irq_status)); + save_item(NAME(m_irq_mask)); } void sawatte_state::machine_reset() { m_data_bank = 0; m_prog_bank = 0; + + m_irq_status = 0; + m_irq_mask = 0; + m_maincpu->set_input_line(m6502_device::IRQ_LINE, CLEAR_LINE); + + m_irq3_timer->adjust(attotime::never); + m_irq4_timer->adjust(attotime::never); +} + +TIMER_CALLBACK_MEMBER(sawatte_state::irq3_timer) +{ + if (BIT(m_irq_mask, 3)) + { + m_irq_status |= 0x08; + m_maincpu->set_input_line(m6502_device::IRQ_LINE, ASSERT_LINE); + } +} + +TIMER_CALLBACK_MEMBER(sawatte_state::irq4_timer) +{ + if (BIT(m_irq_mask, 4)) + { + m_irq_status |= 0x10; + m_maincpu->set_input_line(m6502_device::IRQ_LINE, ASSERT_LINE); + } } + void sawatte_state::bank08_w(u8 data) { m_data_bank = (m_data_bank & 0xff00) | data; @@ -94,6 +141,44 @@ void sawatte_state::bank0a_w(u8 data) m_prog_bank = data; } +u8 sawatte_state::irq_status_r() +{ + return m_irq_status; +} + +void sawatte_state::irq_mask_w(u8 data) +{ + m_irq_mask = data; + if (m_irq_status != 0) + { + m_irq_status &= data; + if (m_irq_status == 0) + m_maincpu->set_input_line(m6502_device::IRQ_LINE, CLEAR_LINE); + } +} + +void sawatte_state::irq3_timer_w(u8 data) +{ + if (data == 0) + m_irq3_timer->adjust(attotime::never); + else + { + attotime period = attotime::from_hz(10'000); // probably incorrect + m_irq3_timer->adjust(period, 0, period); + } +} + +void sawatte_state::irq4_timer_w(u8 data) +{ + if (!BIT(data, 0)) + m_irq4_timer->adjust(attotime::never); + else + { + attotime period = attotime::from_hz(8'000); // probably incorrect + m_irq4_timer->adjust(period, 0, period); + } +} + u8 sawatte_state::fixed_r(offs_t offset) { return m_cartslot->read_rom(offset + 0x200); @@ -120,8 +205,13 @@ void sawatte_state::mem_map(address_map &map) map(0x0011, 0x0011).portr("IN1"); map(0x0012, 0x0012).portr("IN2"); map(0x0016, 0x0016).nopr(); + map(0x0017, 0x0017).r(FUNC(sawatte_state::irq_status_r)); + map(0x0020, 0x0020).nopw(); // matrix scanning? + map(0x0022, 0x0022).nopw(); // matrix scanning? + map(0x0026, 0x0026).w(FUNC(sawatte_state::irq3_timer_w)); + map(0x0027, 0x0027).w(FUNC(sawatte_state::irq_mask_w)); + map(0x002f, 0x002f).w(FUNC(sawatte_state::irq4_timer_w)); map(0x0060, 0x007f).ram(); - map(0x0063, 0x0063).lr8([]() -> u8 { return 0x03; }, "0063_r"); // hack map(0x0080, 0x009f).ram().share("soundram"); map(0x00a0, 0x01ff).ram(); // might not all exist map(0x0200, 0x07ff).r(FUNC(sawatte_state::fixed_r)); @@ -139,7 +229,7 @@ static INPUT_PORTS_START( sawatte ) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_START("IN2") - PORT_BIT(0x1f, IP_ACTIVE_HIGH, IPT_UNKNOWN) // possibly delta of main inputs + PORT_BIT(0x1f, IP_ACTIVE_HIGH, IPT_UNKNOWN) // matrix inputs? PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON6) INPUT_PORTS_END |