diff options
Diffstat (limited to 'src/devices/bus/a2bus/mouse.cpp')
-rw-r--r-- | src/devices/bus/a2bus/mouse.cpp | 68 |
1 files changed, 46 insertions, 22 deletions
diff --git a/src/devices/bus/a2bus/mouse.cpp b/src/devices/bus/a2bus/mouse.cpp index 144c6ed23b8..9d8d889386e 100644 --- a/src/devices/bus/a2bus/mouse.cpp +++ b/src/devices/bus/a2bus/mouse.cpp @@ -97,22 +97,20 @@ public: // construction/destruction a2bus_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - // optional information overrides - virtual const tiny_rom_entry *device_rom_region() const override; - virtual ioport_constructor device_input_ports() const override; - protected: a2bus_mouse_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - virtual void device_add_mconfig(machine_config &config) override; - virtual void device_start() override; - virtual void device_reset() override; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + virtual void device_start() override ATTR_COLD; // overrides of standard a2bus slot functions virtual uint8_t read_c0nx(uint8_t offset) override; virtual void write_c0nx(uint8_t offset, uint8_t data) override; virtual uint8_t read_cnxx(uint8_t offset) override; +private: void pia_out_a(uint8_t data); void pia_out_b(uint8_t data); void pia_irqa_w(int state); @@ -124,18 +122,21 @@ protected: void mcu_port_b_w(uint8_t data); void mcu_port_c_w(uint8_t data); + template <unsigned AXIS, u8 DIR, u8 CLK> void update_axis(); + void set_port_a_out(int32_t param); + void set_port_a_in(int32_t param); + void set_port_c_in(int32_t param); + required_device<pia6821_device> m_pia; required_device<m68705p_device> m_mcu; required_ioport m_mouseb; required_ioport_array<2> m_mousexy; -private: - template <unsigned AXIS, u8 DIR, u8 CLK> void update_axis(); - required_region_ptr<uint8_t> m_rom; - int m_rom_bank; + + uint16_t m_rom_bank; uint8_t m_port_a_in, m_port_b_in; - int m_last[2], m_count[2]; + int16_t m_last[2], m_count[2]; }; @@ -236,16 +237,16 @@ a2bus_mouse_device::a2bus_mouse_device(const machine_config &mconfig, const char void a2bus_mouse_device::device_start() { + m_last[0] = m_last[1] = m_count[0] = m_count[1] = 0; + // register save state variables + save_item(NAME(m_rom_bank)); save_item(NAME(m_port_a_in)); save_item(NAME(m_port_b_in)); save_item(NAME(m_last)); save_item(NAME(m_count)); -} -void a2bus_mouse_device::device_reset() -{ - m_last[0] = m_last[1] = m_count[0] = m_count[1] = 0; + m_pia->cb1_w(1); // tied high via 10k resistor } /*------------------------------------------------- @@ -272,19 +273,23 @@ void a2bus_mouse_device::write_c0nx(uint8_t offset, uint8_t data) uint8_t a2bus_mouse_device::read_cnxx(uint8_t offset) { - return m_rom[offset+m_rom_bank]; + return m_rom[offset | m_rom_bank]; } void a2bus_mouse_device::pia_out_a(uint8_t data) { - m_port_a_in = data; + machine().scheduler().synchronize( + timer_expired_delegate(FUNC(a2bus_mouse_device::set_port_a_in), this), + int32_t(uint32_t(data))); } void a2bus_mouse_device::pia_out_b(uint8_t data) { - m_mcu->pc_w(data >> 4); + machine().scheduler().synchronize( + timer_expired_delegate(FUNC(a2bus_mouse_device::set_port_c_in), this), + int32_t(uint32_t(data >> 4))); - m_rom_bank = (data & 0xe) << 7; + m_rom_bank = uint16_t(data & 0xe) << 7; } void a2bus_mouse_device::pia_irqa_w(int state) @@ -302,7 +307,9 @@ uint8_t a2bus_mouse_device::mcu_port_a_r() void a2bus_mouse_device::mcu_port_a_w(uint8_t data) { - m_pia->set_a_input(data); + machine().scheduler().synchronize( + timer_expired_delegate(FUNC(a2bus_mouse_device::set_port_a_out), this), + int32_t(uint32_t(data))); } uint8_t a2bus_mouse_device::mcu_port_b_r() @@ -348,7 +355,8 @@ void a2bus_mouse_device::mcu_port_c_w(uint8_t data) m_pia->portb_w(data << 4); } -template <unsigned AXIS, u8 DIR, u8 CLK> void a2bus_mouse_device::update_axis() +template <unsigned AXIS, u8 DIR, u8 CLK> +void a2bus_mouse_device::update_axis() { // read the axis and check for changes const int new_m = m_mousexy[AXIS]->read(); @@ -379,8 +387,24 @@ template <unsigned AXIS, u8 DIR, u8 CLK> void a2bus_mouse_device::update_axis() } } +void a2bus_mouse_device::set_port_a_out(int32_t param) +{ + m_pia->set_a_input(uint8_t(uint32_t(param))); +} + +void a2bus_mouse_device::set_port_a_in(int32_t param) +{ + m_port_a_in = uint8_t(uint32_t(param)); } +void a2bus_mouse_device::set_port_c_in(int32_t param) +{ + const uint8_t data = uint8_t(uint32_t(param)); + m_mcu->pc_w(data); +} + +} // anonymous namespace + /*************************************************************************** GLOBAL VARIABLES |