trunk/src/emu/machine/i8355.c
| r29219 | r29220 | |
| 65 | 65 | |
| 66 | 66 | if (m_ddr[port] != 0xff) |
| 67 | 67 | { |
| 68 | | data |= m_in_port_func[port](0) & ~m_ddr[port]; |
| 68 | if (port == 0) {data |= m_in_pa_cb(0) & ~m_ddr[port];} |
| 69 | else { data |= m_in_pb_cb(0) & ~m_ddr[port];} |
| 69 | 70 | } |
| 70 | 71 | |
| 71 | 72 | return data; |
| r29219 | r29220 | |
| 80 | 81 | { |
| 81 | 82 | m_output[port] = data; |
| 82 | 83 | |
| 83 | | m_out_port_func[port](0, m_output[port] & m_ddr[port]); |
| 84 | if (port == 0) {m_out_pa_cb((offs_t)0, m_output[port] & m_ddr[port]);} |
| 85 | else {m_out_pb_cb((offs_t)0, m_output[port] & m_ddr[port]);} |
| 84 | 86 | } |
| 85 | 87 | |
| 86 | 88 | |
| r29219 | r29220 | |
| 96 | 98 | i8355_device::i8355_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 97 | 99 | : device_t(mconfig, I8355, "Intel 8355", tag, owner, clock, "i8355", __FILE__), |
| 98 | 100 | device_memory_interface(mconfig, *this), |
| 101 | m_in_pa_cb(*this), |
| 102 | m_out_pa_cb(*this), |
| 103 | m_in_pb_cb(*this), |
| 104 | m_out_pb_cb(*this), |
| 99 | 105 | m_space_config("ram", ENDIANNESS_LITTLE, 8, 11, 0, NULL, *ADDRESS_MAP_NAME(i8355)) |
| 100 | 106 | { |
| 101 | 107 | } |
| 102 | 108 | |
| 103 | | |
| 104 | 109 | //------------------------------------------------- |
| 105 | | // device_config_complete - perform any |
| 106 | | // operations now that the configuration is |
| 107 | | // complete |
| 108 | | //------------------------------------------------- |
| 109 | | |
| 110 | | void i8355_device::device_config_complete() |
| 111 | | { |
| 112 | | // inherit a copy of the static data |
| 113 | | const i8355_interface *intf = reinterpret_cast<const i8355_interface *>(static_config()); |
| 114 | | if (intf != NULL) |
| 115 | | *static_cast<i8355_interface *>(this) = *intf; |
| 116 | | |
| 117 | | // or initialize to defaults if none provided |
| 118 | | else |
| 119 | | { |
| 120 | | memset(&m_in_pa_cb, 0, sizeof(m_in_pa_cb)); |
| 121 | | memset(&m_out_pa_cb, 0, sizeof(m_out_pa_cb)); |
| 122 | | memset(&m_in_pb_cb, 0, sizeof(m_in_pb_cb)); |
| 123 | | memset(&m_out_pb_cb, 0, sizeof(m_out_pb_cb)); |
| 124 | | } |
| 125 | | } |
| 126 | | |
| 127 | | |
| 128 | | //------------------------------------------------- |
| 129 | 110 | // device_start - device-specific startup |
| 130 | 111 | //------------------------------------------------- |
| 131 | 112 | |
| 132 | 113 | void i8355_device::device_start() |
| 133 | 114 | { |
| 134 | 115 | // resolve callbacks |
| 135 | | m_in_port_func[0].resolve(m_in_pa_cb, *this); |
| 136 | | m_in_port_func[1].resolve(m_in_pb_cb, *this); |
| 137 | | m_out_port_func[0].resolve(m_out_pa_cb, *this); |
| 138 | | m_out_port_func[1].resolve(m_out_pb_cb, *this); |
| 116 | m_in_pa_cb.resolve_safe(0); |
| 117 | m_in_pb_cb.resolve_safe(0); |
| 118 | m_out_pa_cb.resolve_safe(); |
| 119 | m_out_pb_cb.resolve_safe(); |
| 139 | 120 | |
| 140 | 121 | // register for state saving |
| 141 | 122 | save_item(NAME(m_output)); |
trunk/src/emu/machine/i8355.h
| r29219 | r29220 | |
| 52 | 52 | // INTERFACE CONFIGURATION MACROS |
| 53 | 53 | ///************************************************************************* |
| 54 | 54 | |
| 55 | | #define MCFG_I8355_ADD(_tag, _clock, _config) \ |
| 56 | | MCFG_DEVICE_ADD((_tag), I8355, _clock) \ |
| 57 | | MCFG_DEVICE_CONFIG(_config) |
| 55 | #define MCFG_I8355_IN_PA_CB(_devcb) \ |
| 56 | devcb = &i8355_device::set_in_pa_callback(*device, DEVCB2_##_devcb); |
| 58 | 57 | |
| 59 | | #define I8355_INTERFACE(name) \ |
| 60 | | const i8355_interface (name) = |
| 58 | #define MCFG_I8355_OUT_PA_CB(_devcb) \ |
| 59 | devcb = &i8355_device::set_out_pa_callback(*device, DEVCB2_##_devcb); |
| 60 | |
| 61 | #define MCFG_I8355_IN_PB_CB(_devcb) \ |
| 62 | devcb = &i8355_device::set_in_pb_callback(*device, DEVCB2_##_devcb); |
| 63 | |
| 64 | #define MCFG_I8355_OUT_PB_CB(_devcb) \ |
| 65 | devcb = &i8355_device::set_out_pb_callback(*device, DEVCB2_##_devcb); |
| 66 | |
| 61 | 67 | |
| 62 | | |
| 63 | | |
| 64 | 68 | ///************************************************************************* |
| 65 | 69 | // TYPE DEFINITIONS |
| 66 | 70 | ///************************************************************************* |
| 67 | 71 | |
| 68 | | // ======================> i8355_interface |
| 69 | | |
| 70 | | struct i8355_interface |
| 71 | | { |
| 72 | | devcb_read8 m_in_pa_cb; |
| 73 | | devcb_write8 m_out_pa_cb; |
| 74 | | |
| 75 | | devcb_read8 m_in_pb_cb; |
| 76 | | devcb_write8 m_out_pb_cb; |
| 77 | | }; |
| 78 | | |
| 79 | | |
| 80 | | |
| 81 | 72 | // ======================> i8355_device |
| 82 | 73 | |
| 83 | 74 | class i8355_device : public device_t, |
| 84 | | public device_memory_interface, |
| 85 | | public i8355_interface |
| 75 | public device_memory_interface |
| 86 | 76 | { |
| 87 | 77 | public: |
| 88 | 78 | // construction/destruction |
| 89 | 79 | i8355_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 90 | 80 | |
| 81 | template<class _Object> static devcb2_base &set_in_pa_callback(device_t &device, _Object object) { return downcast<i8355_device &>(device).m_in_pa_cb.set_callback(object); } |
| 82 | template<class _Object> static devcb2_base &set_out_pa_callback(device_t &device, _Object object) { return downcast<i8355_device &>(device).m_out_pa_cb.set_callback(object); } |
| 83 | template<class _Object> static devcb2_base &set_in_pb_callback(device_t &device, _Object object) { return downcast<i8355_device &>(device).m_in_pb_cb.set_callback(object); } |
| 84 | template<class _Object> static devcb2_base &set_out_pb_callback(device_t &device, _Object object) { return downcast<i8355_device &>(device).m_out_pb_cb.set_callback(object); } |
| 85 | |
| 91 | 86 | DECLARE_READ8_MEMBER( io_r ); |
| 92 | 87 | DECLARE_WRITE8_MEMBER( io_w ); |
| 93 | 88 | |
| r29219 | r29220 | |
| 96 | 91 | |
| 97 | 92 | protected: |
| 98 | 93 | // device-level overrides |
| 99 | | virtual void device_config_complete(); |
| 100 | 94 | virtual void device_start(); |
| 101 | 95 | virtual void device_reset(); |
| 102 | 96 | |
| r29219 | r29220 | |
| 107 | 101 | inline void write_port(int port, UINT8 data); |
| 108 | 102 | |
| 109 | 103 | private: |
| 110 | | devcb_resolved_read8 m_in_port_func[2]; |
| 111 | | devcb_resolved_write8 m_out_port_func[2]; |
| 104 | devcb2_read8 m_in_pa_cb; |
| 105 | devcb2_write8 m_out_pa_cb; |
| 112 | 106 | |
| 107 | devcb2_read8 m_in_pb_cb; |
| 108 | devcb2_write8 m_out_pb_cb; |
| 109 | |
| 113 | 110 | // registers |
| 114 | 111 | UINT8 m_output[2]; // output latches |
| 115 | 112 | UINT8 m_ddr[2]; // DDR latches |
trunk/src/mess/drivers/exp85.c
| r29219 | r29220 | |
| 131 | 131 | m_speaker->level_w(!BIT(data, 7)); |
| 132 | 132 | } |
| 133 | 133 | |
| 134 | | static I8355_INTERFACE( i8355_intf ) |
| 135 | | { |
| 136 | | DEVCB_DRIVER_MEMBER(exp85_state, i8355_a_r), |
| 137 | | DEVCB_DRIVER_MEMBER(exp85_state, i8355_a_w), |
| 138 | | DEVCB_NULL, |
| 139 | | DEVCB_NULL |
| 140 | | }; |
| 141 | | |
| 142 | 134 | /* I8085A Interface */ |
| 143 | 135 | |
| 144 | 136 | READ_LINE_MEMBER( exp85_state::sid_r ) |
| r29219 | r29220 | |
| 220 | 212 | |
| 221 | 213 | /* devices */ |
| 222 | 214 | MCFG_I8155_ADD(I8155_TAG, XTAL_6_144MHz/2, i8155_intf) |
| 223 | | MCFG_I8355_ADD(I8355_TAG, XTAL_6_144MHz/2, i8355_intf) |
| 215 | MCFG_DEVICE_ADD(I8355_TAG, I8355, XTAL_6_144MHz/2) |
| 216 | MCFG_I8355_IN_PA_CB(READ8(exp85_state, i8355_a_r)) |
| 217 | MCFG_I8355_OUT_PA_CB(WRITE8(exp85_state, i8355_a_w)) |
| 224 | 218 | MCFG_CASSETTE_ADD("cassette", exp85_cassette_interface) |
| 225 | 219 | |
| 226 | 220 | MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "serial_terminal") |