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.cpp156
1 files changed, 119 insertions, 37 deletions
diff --git a/src/devices/bus/a2bus/mouse.cpp b/src/devices/bus/a2bus/mouse.cpp
index 817cbd1fd85..9d8d889386e 100644
--- a/src/devices/bus/a2bus/mouse.cpp
+++ b/src/devices/bus/a2bus/mouse.cpp
@@ -40,8 +40,8 @@
Hookup notes:
- PIA port A connects to 68705 port A in its entirety (bi-directional)
- PIA PB4-PB7 connects to 68705 PC0-3 (bi-directional)
+ PIA port A connects to 68705 port A in its entirety (bi-directional with internal pullups)
+ PIA PB4-PB7 connects to 68705 PC0-3 (bi-directional but should not be pulled up)
PIA PB0 is 'sync latch'
PIA PB1 is A8 on the EPROM
PIA PB2 is A9 on the EPROM
@@ -66,6 +66,12 @@
#include "emu.h"
#include "mouse.h"
+#include "machine/6821pia.h"
+#include "cpu/m6805/m68705.h"
+
+
+namespace {
+
/***************************************************************************
CONSTANTS
***************************************************************************/
@@ -79,11 +85,60 @@
#define MOUSE_YAXIS_TAG "a2mse_y"
-/***************************************************************************
- GLOBAL VARIABLES
-***************************************************************************/
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class a2bus_mouse_device:
+ public device_t,
+ public device_a2bus_card_interface
+{
+public:
+ // construction/destruction
+ a2bus_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ a2bus_mouse_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ 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);
+ void pia_irqb_w(int state);
+
+ uint8_t mcu_port_a_r();
+ uint8_t mcu_port_b_r();
+ void mcu_port_a_w(uint8_t data);
+ 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;
+
+ required_region_ptr<uint8_t> m_rom;
+
+ uint16_t m_rom_bank;
+ uint8_t m_port_a_in, m_port_b_in;
+ int16_t m_last[2], m_count[2];
+};
-DEFINE_DEVICE_TYPE(A2BUS_MOUSE, a2bus_mouse_device, "a2mouse", "Apple II Mouse Card")
ROM_START( mouse )
ROM_REGION(0x800, MOUSE_ROM_REGION, 0)
@@ -97,7 +152,7 @@ ROM_START( mouse )
ROM_LOAD( "mmi_pal16r4a,binary.2a", 0x000000, 0x000100, CRC(1da5c745) SHA1(ba267b69a2fda2a2348b140979ece562411bb37b) )
ROM_END
-static INPUT_PORTS_START( mouse )
+INPUT_PORTS_START( mouse )
PORT_START(MOUSE_BUTTON_TAG) /* Mouse - button */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Button") PORT_CODE(MOUSECODE_BUTTON1)
@@ -139,6 +194,7 @@ void a2bus_mouse_device::device_add_mconfig(machine_config &config)
PIA6821(config, m_pia, 1021800);
m_pia->writepa_handler().set(FUNC(a2bus_mouse_device::pia_out_a));
m_pia->writepb_handler().set(FUNC(a2bus_mouse_device::pia_out_b));
+ m_pia->tspb_handler().set_constant(0x00);
m_pia->irqa_handler().set(FUNC(a2bus_mouse_device::pia_irqa_w));
m_pia->irqb_handler().set(FUNC(a2bus_mouse_device::pia_irqb_w));
}
@@ -181,20 +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));
- m_port_b_in = 0x00;
-}
-
-void a2bus_mouse_device::device_reset()
-{
- m_rom_bank = 0;
- m_last[0] = m_last[1] = m_count[0] = m_count[1] = 0;
- m_port_a_in = 0x00;
+ m_pia->cb1_w(1); // tied high via 10k resistor
}
/*-------------------------------------------------
@@ -221,40 +273,46 @@ 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];
}
-WRITE8_MEMBER(a2bus_mouse_device::pia_out_a)
+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)));
}
-WRITE8_MEMBER(a2bus_mouse_device::pia_out_b)
+void a2bus_mouse_device::pia_out_b(uint8_t data)
{
- m_mcu->pc_w(space, 0, 0xf0 | ((data >> 4) & 0x0f));
+ 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;
}
-WRITE_LINE_MEMBER(a2bus_mouse_device::pia_irqa_w)
+void a2bus_mouse_device::pia_irqa_w(int state)
{
}
-WRITE_LINE_MEMBER(a2bus_mouse_device::pia_irqb_w)
+void a2bus_mouse_device::pia_irqb_w(int state)
{
}
-READ8_MEMBER(a2bus_mouse_device::mcu_port_a_r)
+uint8_t a2bus_mouse_device::mcu_port_a_r()
{
return m_port_a_in;
}
-WRITE8_MEMBER(a2bus_mouse_device::mcu_port_a_w)
+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)));
}
-READ8_MEMBER(a2bus_mouse_device::mcu_port_b_r)
+uint8_t a2bus_mouse_device::mcu_port_b_r()
{
enum { XAXIS, YAXIS };
constexpr u8 BUTTON = 0x80;
@@ -280,7 +338,7 @@ READ8_MEMBER(a2bus_mouse_device::mcu_port_b_r)
return m_port_b_in;
}
-WRITE8_MEMBER(a2bus_mouse_device::mcu_port_b_w)
+void a2bus_mouse_device::mcu_port_b_w(uint8_t data)
{
if (!BIT(data, 6))
{
@@ -292,24 +350,23 @@ WRITE8_MEMBER(a2bus_mouse_device::mcu_port_b_w)
}
}
-WRITE8_MEMBER(a2bus_mouse_device::mcu_port_c_w)
+void a2bus_mouse_device::mcu_port_c_w(uint8_t data)
{
- m_pia->write_portb(data << 4);
+ 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
+ // read the axis and check for changes
const int new_m = m_mousexy[AXIS]->read();
-
- // did it change?
int diff = new_m - m_last[AXIS];
// check for wrap
if (diff > 0x80)
- diff = 0x100 - diff;
- if (diff < -0x80)
- diff = -0x100 - diff;
+ diff -= 0x100;
+ else if (diff < -0x80)
+ diff += 0x100;
m_count[AXIS] += diff;
m_last[AXIS] = new_m;
@@ -329,3 +386,28 @@ 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
+***************************************************************************/
+
+DEFINE_DEVICE_TYPE_PRIVATE(A2BUS_MOUSE, device_a2bus_card_interface, a2bus_mouse_device, "a2mouse", "Apple II Mouse Card")