summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/z80/kl5c80a12.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/z80/kl5c80a12.h')
-rw-r--r--src/devices/cpu/z80/kl5c80a12.h47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/devices/cpu/z80/kl5c80a12.h b/src/devices/cpu/z80/kl5c80a12.h
index ebe1cb3bea3..28434f8c8f6 100644
--- a/src/devices/cpu/z80/kl5c80a12.h
+++ b/src/devices/cpu/z80/kl5c80a12.h
@@ -30,10 +30,30 @@ public:
// device type constructor
kl5c80a12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ // callback configuration
+ auto in_p0_callback() { return m_porta_in_callback[0].bind(); }
+ auto out_p0_callback() { return m_porta_out_callback[0].bind(); }
+ auto in_p1_callback() { return m_porta_in_callback[1].bind(); }
+ auto out_p1_callback() { return m_porta_out_callback[1].bind(); }
+ auto in_p2_callback() { return m_portb_in_callback[0].bind(); }
+ auto out_p2_callback() { return m_portb_out_callback[0].bind(); }
+ auto in_p3_callback() { return m_portb_in_callback[1].bind(); }
+ auto out_p3_callback() { return m_portb_out_callback[1].bind(); }
+ auto in_p4_callback() { return m_portb_in_callback[2].bind(); }
+ auto out_p4_callback() { return m_portb_out_callback[2].bind(); }
+
+ // misc. configuration
+ void set_p0_3state(u8 value) { m_porta_3state[0] = value; }
+ void set_p1_3state(u8 value) { m_porta_3state[1] = value; }
+ void set_p2_3state(u8 value) { m_portb_3state[0] = value; }
+ void set_p3_3state(u8 value) { m_portb_3state[1] = value; }
+ void set_p4_3state(u8 value) { m_portb_3state[2] = value; }
+
protected:
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_config_complete() override;
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
@@ -42,12 +62,39 @@ protected:
virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 2); }
private:
+ // internal I/O handlers
+ u8 porta_r(offs_t offset);
+ void porta_w(offs_t offset, u8 data);
+ u8 portb_r(offs_t offset);
+ void portb_w(offs_t offset, u8 data);
+ u8 portb_control_r();
+ void portb_control_w(u8 data);
+
+ // internal helpers
+ void portb_update_output(unsigned n);
+
// internal address maps
void internal_ram(address_map &map);
void internal_io(address_map &map);
// subdevice finders
required_device<kp69_device> m_kp69;
+
+ // callback objects
+ devcb_read8::array<2> m_porta_in_callback;
+ devcb_write8::array<2> m_porta_out_callback;
+ devcb_read8::array<3> m_portb_in_callback;
+ devcb_write8::array<3> m_portb_out_callback;
+
+ // parallel port A state
+ u8 m_porta_data[2];
+ u8 m_porta_direction[2];
+ u8 m_porta_3state[2];
+
+ // parallel port B state
+ u8 m_portb_data[3];
+ u8 m_portb_direction;
+ u8 m_portb_3state[3];
};