diff options
Diffstat (limited to 'src/devices/cpu/z80/kl5c80a12.h')
-rw-r--r-- | src/devices/cpu/z80/kl5c80a12.h | 47 |
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]; }; |