summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/a2bus/mouse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/a2bus/mouse.cpp')
-rw-r--r--src/devices/bus/a2bus/mouse.cpp68
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