trunk/src/emu/bus/plus4/user.h
| r26905 | r26906 | |
| 49 | 49 | MCFG_DEVICE_ADD(_tag, PLUS4_USER_PORT, 0) \ |
| 50 | 50 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
| 51 | 51 | |
| 52 | #define MCFG_PLUS4_USER_PORT_4_HANDLER(_devcb) \ |
| 53 | devcb = &plus4_user_port_device::set_4_handler(*device, DEVCB2_##_devcb); |
| 52 | 54 | |
| 55 | #define MCFG_PLUS4_USER_PORT_5_HANDLER(_devcb) \ |
| 56 | devcb = &plus4_user_port_device::set_5_handler(*device, DEVCB2_##_devcb); |
| 53 | 57 | |
| 58 | #define MCFG_PLUS4_USER_PORT_6_HANDLER(_devcb) \ |
| 59 | devcb = &plus4_user_port_device::set_6_handler(*device, DEVCB2_##_devcb); |
| 60 | |
| 61 | #define MCFG_PLUS4_USER_PORT_7_HANDLER(_devcb) \ |
| 62 | devcb = &plus4_user_port_device::set_7_handler(*device, DEVCB2_##_devcb); |
| 63 | |
| 64 | #define MCFG_PLUS4_USER_PORT_8_HANDLER(_devcb) \ |
| 65 | devcb = &plus4_user_port_device::set_8_handler(*device, DEVCB2_##_devcb); |
| 66 | |
| 67 | #define MCFG_PLUS4_USER_PORT_B_HANDLER(_devcb) \ |
| 68 | devcb = &plus4_user_port_device::set_b_handler(*device, DEVCB2_##_devcb); |
| 69 | |
| 70 | #define MCFG_PLUS4_USER_PORT_C_HANDLER(_devcb) \ |
| 71 | devcb = &plus4_user_port_device::set_c_handler(*device, DEVCB2_##_devcb); |
| 72 | |
| 73 | #define MCFG_PLUS4_USER_PORT_F_HANDLER(_devcb) \ |
| 74 | devcb = &plus4_user_port_device::set_f_handler(*device, DEVCB2_##_devcb); |
| 75 | |
| 76 | #define MCFG_PLUS4_USER_PORT_H_HANDLER(_devcb) \ |
| 77 | devcb = &plus4_user_port_device::set_h_handler(*device, DEVCB2_##_devcb); |
| 78 | |
| 79 | #define MCFG_PLUS4_USER_PORT_J_HANDLER(_devcb) \ |
| 80 | devcb = &plus4_user_port_device::set_j_handler(*device, DEVCB2_##_devcb); |
| 81 | |
| 82 | #define MCFG_PLUS4_USER_PORT_K_HANDLER(_devcb) \ |
| 83 | devcb = &plus4_user_port_device::set_k_handler(*device, DEVCB2_##_devcb); |
| 84 | |
| 85 | #define MCFG_PLUS4_USER_PORT_L_HANDLER(_devcb) \ |
| 86 | devcb = &plus4_user_port_device::set_l_handler(*device, DEVCB2_##_devcb); |
| 87 | |
| 54 | 88 | //************************************************************************** |
| 55 | 89 | // TYPE DEFINITIONS |
| 56 | 90 | //************************************************************************** |
| r26905 | r26906 | |
| 60 | 94 | class device_plus4_user_port_interface; |
| 61 | 95 | |
| 62 | 96 | class plus4_user_port_device : public device_t, |
| 63 | | public device_slot_interface |
| 97 | public device_slot_interface |
| 64 | 98 | { |
| 65 | 99 | public: |
| 66 | 100 | // construction/destruction |
| 67 | 101 | plus4_user_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 68 | 102 | |
| 103 | template<class _Object> static devcb2_base &set_4_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_4_handler.set_callback(object); } |
| 104 | template<class _Object> static devcb2_base &set_5_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_5_handler.set_callback(object); } |
| 105 | template<class _Object> static devcb2_base &set_6_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_6_handler.set_callback(object); } |
| 106 | template<class _Object> static devcb2_base &set_7_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_7_handler.set_callback(object); } |
| 107 | template<class _Object> static devcb2_base &set_8_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_8_handler.set_callback(object); } |
| 108 | template<class _Object> static devcb2_base &set_b_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_b_handler.set_callback(object); } |
| 109 | template<class _Object> static devcb2_base &set_c_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_c_handler.set_callback(object); } |
| 110 | template<class _Object> static devcb2_base &set_f_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_f_handler.set_callback(object); } |
| 111 | template<class _Object> static devcb2_base &set_h_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_h_handler.set_callback(object); } |
| 112 | template<class _Object> static devcb2_base &set_j_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_j_handler.set_callback(object); } |
| 113 | template<class _Object> static devcb2_base &set_k_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_k_handler.set_callback(object); } |
| 114 | template<class _Object> static devcb2_base &set_l_handler(device_t &device, _Object object) { return downcast<plus4_user_port_device &>(device).m_l_handler.set_callback(object); } |
| 115 | |
| 69 | 116 | // computer interface |
| 70 | | DECLARE_READ8_MEMBER( p_r ); |
| 71 | | DECLARE_WRITE8_MEMBER( p_w ); |
| 72 | | DECLARE_READ_LINE_MEMBER( rxd_r ); |
| 73 | | DECLARE_READ_LINE_MEMBER( dcd_r ); |
| 74 | | DECLARE_READ_LINE_MEMBER( dsr_r ); |
| 75 | | DECLARE_WRITE_LINE_MEMBER( txd_w ); |
| 76 | | DECLARE_WRITE_LINE_MEMBER( dtr_w ); |
| 77 | | DECLARE_WRITE_LINE_MEMBER( rts_w ); |
| 78 | | DECLARE_WRITE_LINE_MEMBER( rxc_w ); |
| 79 | | DECLARE_WRITE_LINE_MEMBER( atn_w ); |
| 117 | DECLARE_WRITE_LINE_MEMBER( write_4 ); |
| 118 | DECLARE_WRITE_LINE_MEMBER( write_5 ); |
| 119 | DECLARE_WRITE_LINE_MEMBER( write_6 ); |
| 120 | DECLARE_WRITE_LINE_MEMBER( write_7 ); |
| 121 | DECLARE_WRITE_LINE_MEMBER( write_8 ); |
| 122 | DECLARE_WRITE_LINE_MEMBER( write_9 ); |
| 123 | DECLARE_WRITE_LINE_MEMBER( write_b ); |
| 124 | DECLARE_WRITE_LINE_MEMBER( write_d ); |
| 125 | DECLARE_WRITE_LINE_MEMBER( write_e ); |
| 126 | DECLARE_WRITE_LINE_MEMBER( write_f ); |
| 127 | DECLARE_WRITE_LINE_MEMBER( write_j ); |
| 128 | DECLARE_WRITE_LINE_MEMBER( write_k ); |
| 129 | DECLARE_WRITE_LINE_MEMBER( write_m ); |
| 80 | 130 | |
| 131 | // device interface |
| 132 | devcb2_write_line m_4_handler; |
| 133 | devcb2_write_line m_5_handler; |
| 134 | devcb2_write_line m_6_handler; |
| 135 | devcb2_write_line m_7_handler; |
| 136 | devcb2_write_line m_8_handler; |
| 137 | devcb2_write_line m_b_handler; |
| 138 | devcb2_write_line m_c_handler; |
| 139 | devcb2_write_line m_f_handler; |
| 140 | devcb2_write_line m_h_handler; |
| 141 | devcb2_write_line m_j_handler; |
| 142 | devcb2_write_line m_k_handler; |
| 143 | devcb2_write_line m_l_handler; |
| 144 | |
| 81 | 145 | protected: |
| 82 | 146 | // device-level overrides |
| 83 | | virtual void device_config_complete() { }; |
| 84 | 147 | virtual void device_start(); |
| 85 | 148 | virtual void device_reset(); |
| 86 | 149 | |
| r26905 | r26906 | |
| 98 | 161 | device_plus4_user_port_interface(const machine_config &mconfig, device_t &device); |
| 99 | 162 | virtual ~device_plus4_user_port_interface(); |
| 100 | 163 | |
| 101 | | virtual UINT8 plus4_p_r() { return 0xff; }; |
| 102 | | virtual void plus4_p_w(UINT8 data) { }; |
| 164 | DECLARE_WRITE_LINE_MEMBER( write_4 ) {} |
| 165 | DECLARE_WRITE_LINE_MEMBER( write_5 ) {} |
| 166 | DECLARE_WRITE_LINE_MEMBER( write_6 ) {} |
| 167 | DECLARE_WRITE_LINE_MEMBER( write_7 ) {} |
| 168 | DECLARE_WRITE_LINE_MEMBER( write_8 ) {} |
| 169 | DECLARE_WRITE_LINE_MEMBER( write_9 ) {} |
| 170 | DECLARE_WRITE_LINE_MEMBER( write_b ) {} |
| 171 | DECLARE_WRITE_LINE_MEMBER( write_d ) {} |
| 172 | DECLARE_WRITE_LINE_MEMBER( write_e ) {} |
| 173 | DECLARE_WRITE_LINE_MEMBER( write_f ) {} |
| 174 | DECLARE_WRITE_LINE_MEMBER( write_j ) {} |
| 175 | DECLARE_WRITE_LINE_MEMBER( write_k ) {} |
| 176 | DECLARE_WRITE_LINE_MEMBER( write_m ) {} |
| 103 | 177 | |
| 104 | | virtual int plus4_rxd_r() { return 1; }; |
| 105 | | virtual int plus4_dcd_r() { return 0; }; |
| 106 | | virtual int plus4_dsr_r() { return 0; }; |
| 107 | | virtual void plus4_txd_w(int state) { }; |
| 108 | | virtual void plus4_dtr_w(int state) { }; |
| 109 | | virtual void plus4_rts_w(int state) { }; |
| 110 | | virtual void plus4_rxc_w(int state) { }; |
| 111 | | virtual void plus4_atn_w(int state) { }; |
| 112 | | |
| 113 | 178 | protected: |
| 114 | 179 | plus4_user_port_device *m_slot; |
| 115 | 180 | }; |
| r26905 | r26906 | |
| 119 | 184 | extern const device_type PLUS4_USER_PORT; |
| 120 | 185 | |
| 121 | 186 | |
| 122 | | // slot devices |
| 123 | | #include "diag264_lb_user.h" |
| 124 | | |
| 125 | 187 | SLOT_INTERFACE_EXTERN( plus4_user_port_cards ); |
| 126 | 188 | |
| 127 | | |
| 128 | | |
| 129 | 189 | #endif |
trunk/src/emu/bus/plus4/user.c
| r26905 | r26906 | |
| 1 | |
| 2 | |
| 1 | 3 | /********************************************************************** |
| 2 | 4 | |
| 3 | 5 | Commodore Plus/4 User Port emulation |
| r26905 | r26906 | |
| 53 | 55 | //------------------------------------------------- |
| 54 | 56 | |
| 55 | 57 | plus4_user_port_device::plus4_user_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 56 | | device_t(mconfig, PLUS4_USER_PORT, "User Port", tag, owner, clock, "plus4_user_port", __FILE__), |
| 57 | | device_slot_interface(mconfig, *this) |
| 58 | device_t(mconfig, PLUS4_USER_PORT, "User Port", tag, owner, clock, "plus4_user_port", __FILE__), |
| 59 | device_slot_interface(mconfig, *this), |
| 60 | m_4_handler(*this), |
| 61 | m_5_handler(*this), |
| 62 | m_6_handler(*this), |
| 63 | m_7_handler(*this), |
| 64 | m_8_handler(*this), |
| 65 | m_b_handler(*this), |
| 66 | m_c_handler(*this), |
| 67 | m_f_handler(*this), |
| 68 | m_h_handler(*this), |
| 69 | m_j_handler(*this), |
| 70 | m_k_handler(*this), |
| 71 | m_l_handler(*this) |
| 58 | 72 | { |
| 59 | 73 | } |
| 60 | 74 | |
| r26905 | r26906 | |
| 66 | 80 | void plus4_user_port_device::device_start() |
| 67 | 81 | { |
| 68 | 82 | m_cart = dynamic_cast<device_plus4_user_port_interface *>(get_card_device()); |
| 83 | |
| 84 | // resolve callbacks |
| 85 | m_4_handler.resolve_safe(); |
| 86 | m_5_handler.resolve_safe(); |
| 87 | m_6_handler.resolve_safe(); |
| 88 | m_7_handler.resolve_safe(); |
| 89 | m_8_handler.resolve_safe(); |
| 90 | m_b_handler.resolve_safe(); |
| 91 | m_c_handler.resolve_safe(); |
| 92 | m_f_handler.resolve_safe(); |
| 93 | m_h_handler.resolve_safe(); |
| 94 | m_j_handler.resolve_safe(); |
| 95 | m_k_handler.resolve_safe(); |
| 96 | m_l_handler.resolve_safe(); |
| 97 | |
| 98 | // pull up |
| 99 | m_4_handler(1); |
| 100 | m_5_handler(1); |
| 101 | m_6_handler(1); |
| 102 | m_7_handler(1); |
| 103 | m_8_handler(1); |
| 104 | m_b_handler(1); |
| 105 | m_c_handler(1); |
| 106 | m_f_handler(1); |
| 107 | m_h_handler(1); |
| 108 | m_j_handler(1); |
| 109 | m_k_handler(1); |
| 110 | m_l_handler(1); |
| 69 | 111 | } |
| 70 | 112 | |
| 71 | 113 | |
| r26905 | r26906 | |
| 82 | 124 | } |
| 83 | 125 | |
| 84 | 126 | |
| 85 | | READ8_MEMBER( plus4_user_port_device::p_r ) { UINT8 data = 0xff; if (m_cart != NULL) data = m_cart->plus4_p_r(); return data; } |
| 86 | | WRITE8_MEMBER( plus4_user_port_device::p_w ) { if (m_cart != NULL) m_cart->plus4_p_w(data); } |
| 127 | WRITE_LINE_MEMBER( plus4_user_port_device::write_4 ) { if (m_cart != NULL) m_cart->write_4(state); } |
| 128 | WRITE_LINE_MEMBER( plus4_user_port_device::write_5 ) { if (m_cart != NULL) m_cart->write_5(state); } |
| 129 | WRITE_LINE_MEMBER( plus4_user_port_device::write_6 ) { if (m_cart != NULL) m_cart->write_6(state); } |
| 130 | WRITE_LINE_MEMBER( plus4_user_port_device::write_7 ) { if (m_cart != NULL) m_cart->write_7(state); } |
| 131 | WRITE_LINE_MEMBER( plus4_user_port_device::write_8 ) { if (m_cart != NULL) m_cart->write_8(state); } |
| 132 | WRITE_LINE_MEMBER( plus4_user_port_device::write_9 ) { if (m_cart != NULL) m_cart->write_9(state); } |
| 133 | WRITE_LINE_MEMBER( plus4_user_port_device::write_b ) { if (m_cart != NULL) m_cart->write_b(state); } |
| 134 | WRITE_LINE_MEMBER( plus4_user_port_device::write_d ) { if (m_cart != NULL) m_cart->write_d(state); } |
| 135 | WRITE_LINE_MEMBER( plus4_user_port_device::write_e ) { if (m_cart != NULL) m_cart->write_e(state); } |
| 136 | WRITE_LINE_MEMBER( plus4_user_port_device::write_f ) { if (m_cart != NULL) m_cart->write_f(state); } |
| 137 | WRITE_LINE_MEMBER( plus4_user_port_device::write_j ) { if (m_cart != NULL) m_cart->write_j(state); } |
| 138 | WRITE_LINE_MEMBER( plus4_user_port_device::write_k ) { if (m_cart != NULL) m_cart->write_k(state); } |
| 139 | WRITE_LINE_MEMBER( plus4_user_port_device::write_m ) { if (m_cart != NULL) m_cart->write_m(state); } |
| 87 | 140 | |
| 88 | | READ_LINE_MEMBER( plus4_user_port_device::rxd_r ) { int state = 1; if (m_cart != NULL) state = m_cart->plus4_rxd_r(); return state; } |
| 89 | | READ_LINE_MEMBER( plus4_user_port_device::dcd_r ) { int state = 1; if (m_cart != NULL) state = m_cart->plus4_dcd_r(); return state; } |
| 90 | | READ_LINE_MEMBER( plus4_user_port_device::dsr_r ) { int state = 1; if (m_cart != NULL) state = m_cart->plus4_dsr_r(); return state; } |
| 91 | 141 | |
| 92 | | WRITE_LINE_MEMBER( plus4_user_port_device::txd_w ) { if (m_cart != NULL) m_cart->plus4_txd_w(state); } |
| 93 | | WRITE_LINE_MEMBER( plus4_user_port_device::dtr_w ) { if (m_cart != NULL) m_cart->plus4_dtr_w(state); } |
| 94 | | WRITE_LINE_MEMBER( plus4_user_port_device::rts_w ) { if (m_cart != NULL) m_cart->plus4_rts_w(state); } |
| 95 | | WRITE_LINE_MEMBER( plus4_user_port_device::rxc_w ) { if (m_cart != NULL) m_cart->plus4_rxc_w(state); } |
| 96 | | WRITE_LINE_MEMBER( plus4_user_port_device::atn_w ) { if (m_cart != NULL) m_cart->plus4_atn_w(state); } |
| 97 | 142 | |
| 98 | | |
| 99 | 143 | //------------------------------------------------- |
| 100 | 144 | // SLOT_INTERFACE( plus4_user_port_cards ) |
| 101 | 145 | //------------------------------------------------- |
| 102 | 146 | |
| 147 | // slot devices |
| 148 | #include "diag264_lb_user.h" |
| 149 | |
| 103 | 150 | SLOT_INTERFACE_START( plus4_user_port_cards ) |
| 104 | 151 | SLOT_INTERFACE("diag264", DIAG264_USER_PORT_LOOPBACK) |
| 105 | 152 | SLOT_INTERFACE_END |
trunk/src/emu/machine/mos6529.h
| r26905 | r26906 | |
| 35 | 35 | // INTERFACE CONFIGURATION MACROS |
| 36 | 36 | //************************************************************************** |
| 37 | 37 | |
| 38 | | #define MCFG_MOS6529_ADD(_tag, _read, _write) \ |
| 39 | | MCFG_DEVICE_ADD(_tag, MOS6529, 0) \ |
| 40 | | downcast<mos6529_device *>(device)->set_callbacks(DEVCB2_##_read, DEVCB2_##_write); |
| 38 | #define MCFG_MOS6529_P0_HANDLER(_devcb) \ |
| 39 | devcb = &mos6529_device::set_p0_handler(*device, DEVCB2_##_devcb); |
| 41 | 40 | |
| 41 | #define MCFG_MOS6529_P1_HANDLER(_devcb) \ |
| 42 | devcb = &mos6529_device::set_p1_handler(*device, DEVCB2_##_devcb); |
| 42 | 43 | |
| 44 | #define MCFG_MOS6529_P2_HANDLER(_devcb) \ |
| 45 | devcb = &mos6529_device::set_p2_handler(*device, DEVCB2_##_devcb); |
| 43 | 46 | |
| 47 | #define MCFG_MOS6529_P3_HANDLER(_devcb) \ |
| 48 | devcb = &mos6529_device::set_p3_handler(*device, DEVCB2_##_devcb); |
| 49 | |
| 50 | #define MCFG_MOS6529_P4_HANDLER(_devcb) \ |
| 51 | devcb = &mos6529_device::set_p4_handler(*device, DEVCB2_##_devcb); |
| 52 | |
| 53 | #define MCFG_MOS6529_P5_HANDLER(_devcb) \ |
| 54 | devcb = &mos6529_device::set_p5_handler(*device, DEVCB2_##_devcb); |
| 55 | |
| 56 | #define MCFG_MOS6529_P6_HANDLER(_devcb) \ |
| 57 | devcb = &mos6529_device::set_p6_handler(*device, DEVCB2_##_devcb); |
| 58 | |
| 59 | #define MCFG_MOS6529_P7_HANDLER(_devcb) \ |
| 60 | devcb = &mos6529_device::set_p7_handler(*device, DEVCB2_##_devcb); |
| 61 | |
| 62 | |
| 44 | 63 | //************************************************************************** |
| 45 | 64 | // TYPE DEFINITIONS |
| 46 | 65 | //************************************************************************** |
| r26905 | r26906 | |
| 53 | 72 | // construction/destruction |
| 54 | 73 | mos6529_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 55 | 74 | |
| 56 | | template<class _read, class _write> void set_callbacks(_read rd, _write wr) { |
| 57 | | m_read_port.set_callback(rd); |
| 58 | | m_write_port.set_callback(wr); |
| 59 | | } |
| 75 | template<class _Object> static devcb2_base &set_p0_handler(device_t &device, _Object object) { return downcast<mos6529_device &>(device).m_p0_handler.set_callback(object); } |
| 76 | template<class _Object> static devcb2_base &set_p1_handler(device_t &device, _Object object) { return downcast<mos6529_device &>(device).m_p1_handler.set_callback(object); } |
| 77 | template<class _Object> static devcb2_base &set_p2_handler(device_t &device, _Object object) { return downcast<mos6529_device &>(device).m_p2_handler.set_callback(object); } |
| 78 | template<class _Object> static devcb2_base &set_p3_handler(device_t &device, _Object object) { return downcast<mos6529_device &>(device).m_p3_handler.set_callback(object); } |
| 79 | template<class _Object> static devcb2_base &set_p4_handler(device_t &device, _Object object) { return downcast<mos6529_device &>(device).m_p4_handler.set_callback(object); } |
| 80 | template<class _Object> static devcb2_base &set_p5_handler(device_t &device, _Object object) { return downcast<mos6529_device &>(device).m_p5_handler.set_callback(object); } |
| 81 | template<class _Object> static devcb2_base &set_p6_handler(device_t &device, _Object object) { return downcast<mos6529_device &>(device).m_p6_handler.set_callback(object); } |
| 82 | template<class _Object> static devcb2_base &set_p7_handler(device_t &device, _Object object) { return downcast<mos6529_device &>(device).m_p7_handler.set_callback(object); } |
| 60 | 83 | |
| 61 | 84 | DECLARE_READ8_MEMBER( read ); |
| 62 | 85 | DECLARE_WRITE8_MEMBER( write ); |
| 63 | 86 | |
| 87 | DECLARE_WRITE_LINE_MEMBER( write_p0 ) { if (state) m_input |= 1; else m_input &= ~1; } |
| 88 | DECLARE_WRITE_LINE_MEMBER( write_p1 ) { if (state) m_input |= 2; else m_input &= ~2; } |
| 89 | DECLARE_WRITE_LINE_MEMBER( write_p2 ) { if (state) m_input |= 4; else m_input &= ~4; } |
| 90 | DECLARE_WRITE_LINE_MEMBER( write_p3 ) { if (state) m_input |= 8; else m_input &= ~8; } |
| 91 | DECLARE_WRITE_LINE_MEMBER( write_p4 ) { if (state) m_input |= 16; else m_input &= ~16; } |
| 92 | DECLARE_WRITE_LINE_MEMBER( write_p5 ) { if (state) m_input |= 32; else m_input &= ~32; } |
| 93 | DECLARE_WRITE_LINE_MEMBER( write_p6 ) { if (state) m_input |= 64; else m_input &= ~64; } |
| 94 | DECLARE_WRITE_LINE_MEMBER( write_p7 ) { if (state) m_input |= 128; else m_input &= ~128; } |
| 95 | |
| 64 | 96 | protected: |
| 65 | 97 | // device-level overrides |
| 66 | 98 | virtual void device_start(); |
| 67 | 99 | |
| 68 | | private: |
| 69 | | devcb2_read8 m_read_port; |
| 70 | | devcb2_write8 m_write_port; |
| 100 | UINT8 m_input; |
| 101 | |
| 102 | devcb2_write_line m_p0_handler; |
| 103 | devcb2_write_line m_p1_handler; |
| 104 | devcb2_write_line m_p2_handler; |
| 105 | devcb2_write_line m_p3_handler; |
| 106 | devcb2_write_line m_p4_handler; |
| 107 | devcb2_write_line m_p5_handler; |
| 108 | devcb2_write_line m_p6_handler; |
| 109 | devcb2_write_line m_p7_handler; |
| 71 | 110 | }; |
| 72 | 111 | |
| 73 | 112 | |
| 74 | 113 | // device type definition |
| 75 | 114 | extern const device_type MOS6529; |
| 76 | 115 | |
| 77 | | |
| 78 | | |
| 79 | 116 | #endif |
trunk/src/mess/drivers/plus4.c
| r26905 | r26906 | |
| 626 | 626 | |
| 627 | 627 | |
| 628 | 628 | //------------------------------------------------- |
| 629 | | // MOS6529_INTERFACE( spi_kb_intf ) |
| 630 | | //------------------------------------------------- |
| 631 | | |
| 632 | | WRITE8_MEMBER( plus4_state::spi_kb_w ) |
| 633 | | { |
| 634 | | m_kb = data; |
| 635 | | } |
| 636 | | |
| 637 | | |
| 638 | | //------------------------------------------------- |
| 639 | 629 | // MOS6551_INTERFACE( acia_intf ) |
| 640 | 630 | //------------------------------------------------- |
| 641 | 631 | |
| r26905 | r26906 | |
| 695 | 685 | save_item(NAME(m_acia_irq)); |
| 696 | 686 | save_item(NAME(m_exp_irq)); |
| 697 | 687 | save_item(NAME(m_kb)); |
| 688 | |
| 689 | m_spi_kb->write_p0(1); |
| 690 | m_spi_kb->write_p1(1); |
| 691 | m_spi_kb->write_p2(1); |
| 692 | m_spi_kb->write_p3(1); |
| 693 | m_spi_kb->write_p4(1); |
| 694 | m_spi_kb->write_p5(1); |
| 695 | m_spi_kb->write_p6(1); |
| 696 | m_spi_kb->write_p7(1); |
| 698 | 697 | } |
| 699 | 698 | |
| 700 | 699 | |
| r26905 | r26906 | |
| 726 | 725 | //************************************************************************** |
| 727 | 726 | |
| 728 | 727 | //------------------------------------------------- |
| 729 | | // MACHINE_CONFIG( ntsc ) |
| 728 | // MACHINE_CONFIG( plus4 ) |
| 730 | 729 | //------------------------------------------------- |
| 731 | 730 | |
| 732 | | static MACHINE_CONFIG_START( ntsc, plus4_state ) |
| 731 | static MACHINE_CONFIG_START( plus4, plus4_state ) |
| 733 | 732 | // basic machine hardware |
| 734 | | MCFG_CPU_ADD(MOS7501_TAG, M7501, XTAL_14_31818MHz/16) |
| 733 | MCFG_CPU_ADD(MOS7501_TAG, M7501, 0) |
| 735 | 734 | MCFG_CPU_PROGRAM_MAP(plus4_mem) |
| 736 | 735 | MCFG_M7501_PORT_CALLBACKS(READ8(plus4_state, cpu_r), WRITE8(plus4_state, cpu_w)) |
| 737 | 736 | MCFG_M7501_PORT_PULLS(0x00, 0xc0) |
| r26905 | r26906 | |
| 739 | 738 | |
| 740 | 739 | // video and sound hardware |
| 741 | 740 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 742 | | MCFG_MOS7360_ADD(MOS7360_TAG, SCREEN_TAG, MOS7501_TAG, XTAL_14_31818MHz/4, ted_videoram_map, WRITELINE(plus4_state, ted_irq_w), READ8(plus4_state, ted_k_r)) |
| 741 | MCFG_MOS7360_ADD(MOS7360_TAG, SCREEN_TAG, MOS7501_TAG, 0, ted_videoram_map, WRITELINE(plus4_state, ted_irq_w), READ8(plus4_state, ted_k_r)) |
| 743 | 742 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 744 | 743 | |
| 745 | 744 | // devices |
| 746 | 745 | MCFG_PLS100_ADD(PLA_TAG) |
| 747 | 746 | |
| 748 | 747 | MCFG_DEVICE_ADD(MOS6551_TAG, MOS6551, XTAL_1_8432MHz) |
| 748 | MCFG_MOS6551_RTS_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_d)) |
| 749 | MCFG_MOS6551_DTR_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_e)) |
| 750 | MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_m)) |
| 749 | 751 | MCFG_MOS6551_IRQ_HANDLER(WRITELINE(plus4_state, acia_irq_w)) |
| 750 | 752 | |
| 751 | | MCFG_MOS6529_ADD(MOS6529_USER_TAG, DEVREAD8(PLUS4_USER_PORT_TAG, plus4_user_port_device, p_r), DEVWRITE8(PLUS4_USER_PORT_TAG, plus4_user_port_device, p_w)) |
| 752 | | MCFG_MOS6529_ADD(MOS6529_KB_TAG, CONSTANT(0xff), WRITE8(plus4_state, spi_kb_w)) |
| 753 | MCFG_DEVICE_ADD(MOS6529_USER_TAG, MOS6529, 0) |
| 754 | MCFG_MOS6529_P0_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_b)) |
| 755 | MCFG_MOS6529_P1_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_k)) |
| 756 | MCFG_MOS6529_P2_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_4)) |
| 757 | MCFG_MOS6529_P3_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_5)) |
| 758 | MCFG_MOS6529_P4_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_6)) |
| 759 | MCFG_MOS6529_P5_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_7)) |
| 760 | MCFG_MOS6529_P6_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_j)) |
| 761 | MCFG_MOS6529_P7_HANDLER(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_f)) |
| 762 | |
| 763 | MCFG_DEVICE_ADD(MOS6529_KB_TAG, MOS6529, 0) |
| 764 | MCFG_MOS6529_P0_HANDLER(WRITELINE(plus4_state, write_kb0)) |
| 765 | MCFG_MOS6529_P1_HANDLER(WRITELINE(plus4_state, write_kb1)) |
| 766 | MCFG_MOS6529_P2_HANDLER(WRITELINE(plus4_state, write_kb2)) |
| 767 | MCFG_MOS6529_P3_HANDLER(WRITELINE(plus4_state, write_kb3)) |
| 768 | MCFG_MOS6529_P4_HANDLER(WRITELINE(plus4_state, write_kb4)) |
| 769 | MCFG_MOS6529_P5_HANDLER(WRITELINE(plus4_state, write_kb5)) |
| 770 | MCFG_MOS6529_P6_HANDLER(WRITELINE(plus4_state, write_kb6)) |
| 771 | MCFG_MOS6529_P7_HANDLER(WRITELINE(plus4_state, write_kb7)) |
| 772 | |
| 753 | 773 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, plus4_datassette_devices, "c1531", NULL) |
| 774 | |
| 754 | 775 | MCFG_CBM_IEC_ADD(NULL) |
| 755 | | MCFG_CBM_IEC_BUS_ATN_CALLBACK(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, atn_w)) |
| 776 | MCFG_CBM_IEC_BUS_ATN_CALLBACK(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, write_9)) |
| 777 | |
| 756 | 778 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL) |
| 757 | 779 | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy") |
| 758 | 780 | MCFG_PLUS4_EXPANSION_SLOT_ADD(PLUS4_EXPANSION_SLOT_TAG, XTAL_14_31818MHz/16, plus4_expansion_cards, "c1551", WRITELINE(plus4_state, exp_irq_w)) |
| 759 | 781 | MCFG_PLUS4_EXPANSION_SLOT_DMA_CALLBACKS(READ8(plus4_state, read), WRITE8(plus4_state, write), INPUTLINE(MOS7501_TAG, INPUT_LINE_HALT)) |
| 782 | |
| 760 | 783 | MCFG_PLUS4_USER_PORT_ADD(PLUS4_USER_PORT_TAG, plus4_user_port_cards, NULL) |
| 784 | MCFG_PLUS4_USER_PORT_4_HANDLER(DEVWRITELINE(MOS6529_USER_TAG, mos6529_device, write_p2)) // cassette sense |
| 785 | MCFG_PLUS4_USER_PORT_5_HANDLER(DEVWRITELINE(MOS6529_USER_TAG, mos6529_device, write_p3)) |
| 786 | MCFG_PLUS4_USER_PORT_6_HANDLER(DEVWRITELINE(MOS6529_USER_TAG, mos6529_device, write_p4)) |
| 787 | MCFG_PLUS4_USER_PORT_7_HANDLER(DEVWRITELINE(MOS6529_USER_TAG, mos6529_device, write_p5)) |
| 788 | MCFG_PLUS4_USER_PORT_8_HANDLER(DEVWRITELINE(MOS6551_TAG, mos6551_device, rxc_w)) |
| 789 | MCFG_PLUS4_USER_PORT_B_HANDLER(DEVWRITELINE(MOS6529_USER_TAG, mos6529_device, write_p0)) |
| 790 | MCFG_PLUS4_USER_PORT_C_HANDLER(DEVWRITELINE(MOS6551_TAG, mos6551_device, rxd_w)) |
| 791 | MCFG_PLUS4_USER_PORT_F_HANDLER(DEVWRITELINE(MOS6529_USER_TAG, mos6529_device, write_p7)) |
| 792 | MCFG_PLUS4_USER_PORT_H_HANDLER(DEVWRITELINE(MOS6551_TAG, mos6551_device, dcd_w)) |
| 793 | MCFG_PLUS4_USER_PORT_J_HANDLER(DEVWRITELINE(MOS6529_USER_TAG, mos6529_device, write_p6)) |
| 794 | MCFG_PLUS4_USER_PORT_K_HANDLER(DEVWRITELINE(MOS6529_USER_TAG, mos6529_device, write_p1)) |
| 795 | MCFG_PLUS4_USER_PORT_L_HANDLER(DEVWRITELINE(MOS6551_TAG, mos6551_device, dsr_w)) |
| 796 | |
| 761 | 797 | MCFG_QUICKLOAD_ADD("quickload", plus4_state, cbm_c16, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) |
| 762 | 798 | |
| 763 | 799 | // internal ram |
| 764 | 800 | MCFG_RAM_ADD(RAM_TAG) |
| 765 | 801 | MCFG_RAM_DEFAULT_SIZE("64K") |
| 802 | MACHINE_CONFIG_END |
| 766 | 803 | |
| 804 | //------------------------------------------------- |
| 805 | // MACHINE_CONFIG( plus4p ) |
| 806 | //------------------------------------------------- |
| 807 | |
| 808 | static MACHINE_CONFIG_DERIVED_CLASS( plus4p, plus4, c16_state ) |
| 809 | MCFG_DEVICE_MODIFY(MOS7501_TAG) |
| 810 | MCFG_DEVICE_CLOCK(XTAL_17_73447MHz/20) |
| 811 | |
| 812 | MCFG_DEVICE_MODIFY(MOS7360_TAG) |
| 813 | MCFG_DEVICE_CLOCK(XTAL_17_73447MHz/5) |
| 814 | |
| 767 | 815 | // software list |
| 768 | 816 | MCFG_SOFTWARE_LIST_ADD("cart_list", "plus4_cart") |
| 769 | 817 | MCFG_SOFTWARE_LIST_ADD("cass_list", "plus4_cass") |
| 770 | 818 | MCFG_SOFTWARE_LIST_ADD("flop_list", "plus4_flop") |
| 771 | | MCFG_SOFTWARE_LIST_FILTER("cart_list", "NTSC") |
| 772 | | MCFG_SOFTWARE_LIST_FILTER("cass_list", "NTSC") |
| 773 | | MCFG_SOFTWARE_LIST_FILTER("flop_list", "NTSC") |
| 819 | MCFG_SOFTWARE_LIST_FILTER("cart_list", "PAL") |
| 820 | MCFG_SOFTWARE_LIST_FILTER("cass_list", "PAL") |
| 821 | MCFG_SOFTWARE_LIST_FILTER("flop_list", "PAL") |
| 774 | 822 | MACHINE_CONFIG_END |
| 775 | 823 | |
| 776 | | |
| 777 | 824 | //------------------------------------------------- |
| 778 | | // MACHINE_CONFIG( pal ) |
| 825 | // MACHINE_CONFIG( plus4n ) |
| 779 | 826 | //------------------------------------------------- |
| 780 | 827 | |
| 781 | | static MACHINE_CONFIG_START( pal, plus4_state ) |
| 782 | | // basic machine hardware |
| 783 | | MCFG_CPU_ADD(MOS7501_TAG, M7501, XTAL_17_73447MHz/20) |
| 784 | | MCFG_CPU_PROGRAM_MAP(plus4_mem) |
| 785 | | MCFG_M7501_PORT_CALLBACKS(READ8(plus4_state, cpu_r), WRITE8(plus4_state, cpu_w)) |
| 786 | | MCFG_M7501_PORT_PULLS(0x00, 0xc0) |
| 787 | | MCFG_QUANTUM_PERFECT_CPU(MOS7501_TAG) |
| 828 | static MACHINE_CONFIG_DERIVED_CLASS( plus4n, plus4, c16_state ) |
| 829 | MCFG_DEVICE_MODIFY(MOS7501_TAG) |
| 830 | MCFG_DEVICE_CLOCK(XTAL_14_31818MHz/16) |
| 788 | 831 | |
| 789 | | // video and sound hardware |
| 790 | | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 791 | | MCFG_MOS7360_ADD(MOS7360_TAG, SCREEN_TAG, MOS7501_TAG, XTAL_17_73447MHz/5, ted_videoram_map, WRITELINE(plus4_state, ted_irq_w), READ8(plus4_state, ted_k_r)) |
| 792 | | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 832 | MCFG_DEVICE_MODIFY(MOS7360_TAG) |
| 833 | MCFG_DEVICE_CLOCK(XTAL_14_31818MHz/4) |
| 793 | 834 | |
| 794 | | // devices |
| 795 | | MCFG_PLS100_ADD(PLA_TAG) |
| 796 | | |
| 797 | | MCFG_DEVICE_ADD(MOS6551_TAG, MOS6551, XTAL_1_8432MHz) |
| 798 | | MCFG_MOS6551_IRQ_HANDLER(WRITELINE(plus4_state, acia_irq_w)) |
| 799 | | |
| 800 | | MCFG_MOS6529_ADD(MOS6529_USER_TAG, DEVREAD8(PLUS4_USER_PORT_TAG, plus4_user_port_device, p_r), DEVWRITE8(PLUS4_USER_PORT_TAG, plus4_user_port_device, p_w)) |
| 801 | | MCFG_MOS6529_ADD(MOS6529_KB_TAG, CONSTANT(0xff), WRITE8(plus4_state, spi_kb_w)) |
| 802 | | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, plus4_datassette_devices, "c1531", NULL) |
| 803 | | MCFG_CBM_IEC_ADD(NULL) |
| 804 | | MCFG_CBM_IEC_BUS_ATN_CALLBACK(DEVWRITELINE(PLUS4_USER_PORT_TAG, plus4_user_port_device, atn_w)) |
| 805 | | MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL) |
| 806 | | MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy") |
| 807 | | MCFG_PLUS4_EXPANSION_SLOT_ADD(PLUS4_EXPANSION_SLOT_TAG, XTAL_17_73447MHz/20, plus4_expansion_cards, "c1551", WRITELINE(plus4_state, exp_irq_w)) |
| 808 | | MCFG_PLUS4_EXPANSION_SLOT_DMA_CALLBACKS(READ8(plus4_state, read), WRITE8(plus4_state, write), INPUTLINE(MOS7501_TAG, INPUT_LINE_HALT)) |
| 809 | | MCFG_PLUS4_USER_PORT_ADD(PLUS4_USER_PORT_TAG, plus4_user_port_cards, NULL) |
| 810 | | MCFG_QUICKLOAD_ADD("quickload", plus4_state, cbm_c16, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) |
| 811 | | |
| 812 | | // internal ram |
| 813 | | MCFG_RAM_ADD(RAM_TAG) |
| 814 | | MCFG_RAM_DEFAULT_SIZE("64K") |
| 815 | | |
| 816 | 835 | // software list |
| 817 | 836 | MCFG_SOFTWARE_LIST_ADD("cart_list", "plus4_cart") |
| 818 | 837 | MCFG_SOFTWARE_LIST_ADD("cass_list", "plus4_cass") |
| 819 | 838 | MCFG_SOFTWARE_LIST_ADD("flop_list", "plus4_flop") |
| 820 | | MCFG_SOFTWARE_LIST_FILTER("cart_list", "PAL") |
| 821 | | MCFG_SOFTWARE_LIST_FILTER("cass_list", "PAL") |
| 822 | | MCFG_SOFTWARE_LIST_FILTER("flop_list", "PAL") |
| 839 | MCFG_SOFTWARE_LIST_FILTER("cart_list", "NTSC") |
| 840 | MCFG_SOFTWARE_LIST_FILTER("cass_list", "NTSC") |
| 841 | MCFG_SOFTWARE_LIST_FILTER("flop_list", "NTSC") |
| 823 | 842 | MACHINE_CONFIG_END |
| 824 | 843 | |
| 825 | 844 | |
| r26905 | r26906 | |
| 827 | 846 | // MACHINE_CONFIG( c16n ) |
| 828 | 847 | //------------------------------------------------- |
| 829 | 848 | |
| 830 | | static MACHINE_CONFIG_DERIVED_CLASS( c16n, ntsc, c16_state ) |
| 849 | static MACHINE_CONFIG_DERIVED_CLASS( c16n, plus4n, c16_state ) |
| 831 | 850 | MCFG_CPU_MODIFY(MOS7501_TAG) |
| 832 | 851 | MCFG_M7501_PORT_CALLBACKS(READ8(c16_state, cpu_r), WRITE8(plus4_state, cpu_w)) |
| 833 | 852 | MCFG_M7501_PORT_PULLS(0x00, 0xc0) |
| r26905 | r26906 | |
| 849 | 868 | // MACHINE_CONFIG( c16p ) |
| 850 | 869 | //------------------------------------------------- |
| 851 | 870 | |
| 852 | | static MACHINE_CONFIG_DERIVED_CLASS( c16p, pal, c16_state ) |
| 871 | static MACHINE_CONFIG_DERIVED_CLASS( c16p, plus4p, c16_state ) |
| 853 | 872 | MCFG_CPU_MODIFY(MOS7501_TAG) |
| 854 | 873 | MCFG_M7501_PORT_CALLBACKS(READ8(c16_state, cpu_r), WRITE8(plus4_state, cpu_w)) |
| 855 | 874 | MCFG_M7501_PORT_PULLS(0x00, 0xc0) |
| r26905 | r26906 | |
| 881 | 900 | // MACHINE_CONFIG( v364 ) |
| 882 | 901 | //------------------------------------------------- |
| 883 | 902 | |
| 884 | | static MACHINE_CONFIG_DERIVED( v364, ntsc ) |
| 903 | static MACHINE_CONFIG_DERIVED( v364, plus4n ) |
| 885 | 904 | MCFG_SOUND_ADD(T6721A_TAG, T6721A, XTAL_640kHz) |
| 886 | 905 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 887 | 906 | |
| r26905 | r26906 | |
| 1089 | 1108 | //************************************************************************** |
| 1090 | 1109 | |
| 1091 | 1110 | // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS |
| 1092 | | COMP( 1984, c264, 0, 0, ntsc, plus4, driver_device, 0, "Commodore Business Machines", "Commodore 264 (Prototype)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) |
| 1111 | COMP( 1984, c264, 0, 0, plus4n, plus4, driver_device, 0, "Commodore Business Machines", "Commodore 264 (Prototype)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) |
| 1093 | 1112 | COMP( 1984, c232, c264, 0, c232, plus4, driver_device, 0, "Commodore Business Machines", "Commodore 232 (Prototype)", GAME_SUPPORTS_SAVE ) |
| 1094 | 1113 | COMP( 1984, v364, c264, 0, v364, plus4, driver_device, 0, "Commodore Business Machines", "Commodore V364 (Prototype)", GAME_SUPPORTS_SAVE ) |
| 1095 | | COMP( 1984, plus4, c264, 0, ntsc, plus4, driver_device, 0, "Commodore Business Machines", "Plus/4 (NTSC)", GAME_SUPPORTS_SAVE ) |
| 1096 | | COMP( 1984, plus4p, c264, 0, pal, plus4, driver_device, 0, "Commodore Business Machines", "Plus/4 (PAL)", GAME_SUPPORTS_SAVE ) |
| 1114 | COMP( 1984, plus4, c264, 0, plus4n, plus4, driver_device, 0, "Commodore Business Machines", "Plus/4 (NTSC)", GAME_SUPPORTS_SAVE ) |
| 1115 | COMP( 1984, plus4p, c264, 0, plus4p, plus4, driver_device, 0, "Commodore Business Machines", "Plus/4 (PAL)", GAME_SUPPORTS_SAVE ) |
| 1097 | 1116 | COMP( 1984, c16, c264, 0, c16n, c16, driver_device, 0, "Commodore Business Machines", "Commodore 16 (NTSC)", GAME_SUPPORTS_SAVE ) |
| 1098 | 1117 | COMP( 1984, c16p, c264, 0, c16p, c16, driver_device, 0, "Commodore Business Machines", "Commodore 16 (PAL)", GAME_SUPPORTS_SAVE ) |
| 1099 | 1118 | COMP( 1984, c16_hu, c264, 0, c16p, c16, driver_device, 0, "Commodore Business Machines", "Commodore 16 (Hungary)", GAME_SUPPORTS_SAVE ) |