trunk/src/emu/machine/scsicb.c
| r18533 | r18534 | |
| 27 | 27 | } |
| 28 | 28 | |
| 29 | 29 | scsicb_device::scsicb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 30 | | : scsidev_device(mconfig, SCSICB, "SCSI callback", tag, owner, clock) |
| 30 | : scsidev_device(mconfig, SCSICB, "SCSI callback", tag, owner, clock), |
| 31 | m_bsy_handler(*this), |
| 32 | m_sel_handler(*this), |
| 33 | m_cd_handler(*this), |
| 34 | m_io_handler(*this), |
| 35 | m_msg_handler(*this), |
| 36 | m_req_handler(*this), |
| 37 | m_ack_handler(*this), |
| 38 | m_atn_handler(*this), |
| 39 | m_rst_handler(*this) |
| 31 | 40 | { |
| 32 | 41 | } |
| 33 | 42 | |
| 34 | | void scsicb_device::device_config_complete() |
| 35 | | { |
| 36 | | // inherit a copy of the static data |
| 37 | | const SCSICB_interface *intf = reinterpret_cast<const SCSICB_interface *>(static_config()); |
| 38 | | if (intf != NULL) |
| 39 | | { |
| 40 | | *static_cast<SCSICB_interface *>(this) = *intf; |
| 41 | | } |
| 42 | | } |
| 43 | | |
| 44 | 43 | void scsicb_device::device_start() |
| 45 | 44 | { |
| 46 | 45 | scsidev_device::device_start(); |
| 47 | 46 | |
| 48 | 47 | linestate = 0; |
| 49 | 48 | |
| 50 | | out_bsy_func.resolve(_out_bsy_func, *this); |
| 51 | | out_sel_func.resolve(_out_sel_func, *this); |
| 52 | | out_cd_func.resolve(_out_cd_func, *this); |
| 53 | | out_io_func.resolve(_out_io_func, *this); |
| 54 | | out_msg_func.resolve(_out_msg_func, *this); |
| 55 | | out_req_func.resolve(_out_req_func, *this); |
| 56 | | out_ack_func.resolve(_out_ack_func, *this); |
| 57 | | out_atn_func.resolve(_out_atn_func, *this); |
| 58 | | out_rst_func.resolve(_out_rst_func, *this); |
| 49 | m_bsy_handler.resolve_safe(); |
| 50 | m_sel_handler.resolve_safe(); |
| 51 | m_cd_handler.resolve_safe(); |
| 52 | m_io_handler.resolve_safe(); |
| 53 | m_msg_handler.resolve_safe(); |
| 54 | m_req_handler.resolve_safe(); |
| 55 | m_ack_handler.resolve_safe(); |
| 56 | m_atn_handler.resolve_safe(); |
| 57 | m_rst_handler.resolve_safe(); |
| 59 | 58 | } |
| 60 | 59 | |
| 61 | 60 | void scsicb_device::scsi_in( UINT32 data, UINT32 mask ) |
| 62 | 61 | { |
| 63 | 62 | linestate = data; |
| 64 | 63 | |
| 65 | | trigger_callback( mask, SCSI_MASK_BSY, out_bsy_func ); |
| 66 | | trigger_callback( mask, SCSI_MASK_SEL, out_sel_func ); |
| 67 | | trigger_callback( mask, SCSI_MASK_CD, out_cd_func ); |
| 68 | | trigger_callback( mask, SCSI_MASK_IO, out_io_func ); |
| 69 | | trigger_callback( mask, SCSI_MASK_MSG, out_msg_func ); |
| 70 | | trigger_callback( mask, SCSI_MASK_REQ, out_req_func ); |
| 71 | | trigger_callback( mask, SCSI_MASK_ACK, out_ack_func ); |
| 72 | | trigger_callback( mask, SCSI_MASK_ATN, out_atn_func ); |
| 73 | | trigger_callback( mask, SCSI_MASK_RST, out_rst_func ); |
| 64 | trigger_callback( mask, SCSI_MASK_BSY, m_bsy_handler ); |
| 65 | trigger_callback( mask, SCSI_MASK_SEL, m_sel_handler ); |
| 66 | trigger_callback( mask, SCSI_MASK_CD, m_cd_handler ); |
| 67 | trigger_callback( mask, SCSI_MASK_IO, m_io_handler ); |
| 68 | trigger_callback( mask, SCSI_MASK_MSG, m_msg_handler ); |
| 69 | trigger_callback( mask, SCSI_MASK_REQ, m_req_handler ); |
| 70 | trigger_callback( mask, SCSI_MASK_ACK, m_ack_handler ); |
| 71 | trigger_callback( mask, SCSI_MASK_ATN, m_atn_handler ); |
| 72 | trigger_callback( mask, SCSI_MASK_RST, m_rst_handler ); |
| 74 | 73 | } |
| 75 | 74 | |
| 76 | 75 | UINT8 scsicb_device::scsi_data_r() |
| r18533 | r18534 | |
| 148 | 147 | } |
| 149 | 148 | } |
| 150 | 149 | |
| 151 | | void scsicb_device::trigger_callback( UINT32 update_mask, UINT32 line_mask, devcb_resolved_write_line &write_line ) |
| 150 | void scsicb_device::trigger_callback( UINT32 update_mask, UINT32 line_mask, devcb2_write_line &write_line ) |
| 152 | 151 | { |
| 153 | 152 | if( ( update_mask & line_mask ) != 0 && !write_line.isnull() ) |
| 154 | 153 | { |
trunk/src/emu/machine/scsicb.h
| r18533 | r18534 | |
| 15 | 15 | |
| 16 | 16 | #include "scsidev.h" |
| 17 | 17 | |
| 18 | | struct SCSICB_interface |
| 18 | class scsicb_device : public scsidev_device |
| 19 | 19 | { |
| 20 | | devcb_write_line _out_bsy_func; |
| 21 | | devcb_write_line _out_sel_func; |
| 22 | | devcb_write_line _out_cd_func; |
| 23 | | devcb_write_line _out_io_func; |
| 24 | | devcb_write_line _out_msg_func; |
| 25 | | devcb_write_line _out_req_func; |
| 26 | | devcb_write_line _out_ack_func; |
| 27 | | devcb_write_line _out_atn_func; |
| 28 | | devcb_write_line _out_rst_func; |
| 29 | | }; |
| 30 | | |
| 31 | | class scsicb_device : public scsidev_device, |
| 32 | | public SCSICB_interface |
| 33 | | { |
| 34 | 20 | public: |
| 35 | 21 | // construction/destruction |
| 36 | 22 | scsicb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 37 | 23 | |
| 24 | // static configuration helpers |
| 25 | template<class _Object> static devcb2_base &set_bsy_handler(device_t &device, _Object object) { return downcast<scsicb_device &>(device).m_bsy_handler.set_callback(object); } |
| 26 | template<class _Object> static devcb2_base &set_sel_handler(device_t &device, _Object object) { return downcast<scsicb_device &>(device).m_sel_handler.set_callback(object); } |
| 27 | template<class _Object> static devcb2_base &set_cd_handler(device_t &device, _Object object) { return downcast<scsicb_device &>(device).m_cd_handler.set_callback(object); } |
| 28 | template<class _Object> static devcb2_base &set_io_handler(device_t &device, _Object object) { return downcast<scsicb_device &>(device).m_io_handler.set_callback(object); } |
| 29 | template<class _Object> static devcb2_base &set_msg_handler(device_t &device, _Object object) { return downcast<scsicb_device &>(device).m_msg_handler.set_callback(object); } |
| 30 | template<class _Object> static devcb2_base &set_req_handler(device_t &device, _Object object) { return downcast<scsicb_device &>(device).m_req_handler.set_callback(object); } |
| 31 | template<class _Object> static devcb2_base &set_ack_handler(device_t &device, _Object object) { return downcast<scsicb_device &>(device).m_ack_handler.set_callback(object); } |
| 32 | template<class _Object> static devcb2_base &set_atn_handler(device_t &device, _Object object) { return downcast<scsicb_device &>(device).m_atn_handler.set_callback(object); } |
| 33 | template<class _Object> static devcb2_base &set_rst_handler(device_t &device, _Object object) { return downcast<scsicb_device &>(device).m_rst_handler.set_callback(object); } |
| 34 | |
| 38 | 35 | virtual void scsi_in( UINT32 data, UINT32 mask ); |
| 39 | 36 | |
| 40 | 37 | UINT8 scsi_data_r(); |
| r18533 | r18534 | |
| 65 | 62 | |
| 66 | 63 | protected: |
| 67 | 64 | // device-level overrides |
| 68 | | virtual void device_config_complete(); |
| 69 | 65 | virtual void device_start(); |
| 70 | 66 | |
| 71 | 67 | private: |
| 72 | 68 | UINT8 get_scsi_line(UINT32 mask); |
| 73 | 69 | void set_scsi_line(UINT32 mask, UINT8 state); |
| 74 | | void trigger_callback(UINT32 update_mask, UINT32 line_mask, devcb_resolved_write_line &write_line); |
| 70 | void trigger_callback(UINT32 update_mask, UINT32 line_mask, devcb2_write_line &write_line); |
| 75 | 71 | const char *get_line_name(UINT32 mask); |
| 76 | 72 | |
| 77 | | devcb_resolved_write_line out_bsy_func; |
| 78 | | devcb_resolved_write_line out_sel_func; |
| 79 | | devcb_resolved_write_line out_cd_func; |
| 80 | | devcb_resolved_write_line out_io_func; |
| 81 | | devcb_resolved_write_line out_msg_func; |
| 82 | | devcb_resolved_write_line out_req_func; |
| 83 | | devcb_resolved_write_line out_ack_func; |
| 84 | | devcb_resolved_write_line out_atn_func; |
| 85 | | devcb_resolved_write_line out_rst_func; |
| 73 | devcb2_write_line m_bsy_handler; |
| 74 | devcb2_write_line m_sel_handler; |
| 75 | devcb2_write_line m_cd_handler; |
| 76 | devcb2_write_line m_io_handler; |
| 77 | devcb2_write_line m_msg_handler; |
| 78 | devcb2_write_line m_req_handler; |
| 79 | devcb2_write_line m_ack_handler; |
| 80 | devcb2_write_line m_atn_handler; |
| 81 | devcb2_write_line m_rst_handler; |
| 86 | 82 | |
| 87 | 83 | UINT32 linestate; |
| 88 | 84 | }; |
| 89 | 85 | |
| 90 | | #define MCFG_SCSICB_ADD(_tag, _intf) \ |
| 91 | | MCFG_DEVICE_ADD(_tag, SCSICB, 0) \ |
| 92 | | MCFG_DEVICE_CONFIG(_intf) |
| 86 | #define MCFG_SCSICB_ADD(_tag) \ |
| 87 | MCFG_DEVICE_ADD(_tag, SCSICB, 0) |
| 93 | 88 | |
| 89 | #define MCFG_SCSICB_BSY_HANDLER(_devcb) \ |
| 90 | devcb = &scsicb_device::set_bsy_handler(*device, DEVCB2_##_devcb); \ |
| 91 | |
| 92 | #define MCFG_SCSICB_SEL_HANDLER(_devcb) \ |
| 93 | devcb = &scsicb_device::set_sel_handler(*device, DEVCB2_##_devcb); \ |
| 94 | |
| 95 | #define MCFG_SCSICB_CD_HANDLER(_devcb) \ |
| 96 | devcb = &scsicb_device::set_cd_handler(*device, DEVCB2_##_devcb); \ |
| 97 | |
| 98 | #define MCFG_SCSICB_IO_HANDLER(_devcb) \ |
| 99 | devcb = &scsicb_device::set_io_handler(*device, DEVCB2_##_devcb); \ |
| 100 | |
| 101 | #define MCFG_SCSICB_MSG_HANDLER(_devcb) \ |
| 102 | devcb = &scsicb_device::set_msg_handler(*device, DEVCB2_##_devcb); \ |
| 103 | |
| 104 | #define MCFG_SCSICB_REQ_HANDLER(_devcb) \ |
| 105 | devcb = &scsicb_device::set_req_handler(*device, DEVCB2_##_devcb); \ |
| 106 | |
| 107 | #define MCFG_SCSICB_ACK_HANDLER(_devcb) \ |
| 108 | devcb = &scsicb_device::set_ack_handler(*device, DEVCB2_##_devcb); \ |
| 109 | |
| 110 | #define MCFG_SCSICB_ATN_HANDLER(_devcb) \ |
| 111 | devcb = &scsicb_device::set_atn_handler(*device, DEVCB2_##_devcb); \ |
| 112 | |
| 113 | #define MCFG_SCSICB_RST_HANDLER(_devcb) \ |
| 114 | devcb = &scsicb_device::set_rst_handler(*device, DEVCB2_##_devcb); \ |
| 115 | |
| 94 | 116 | // device type definition |
| 95 | 117 | extern const device_type SCSICB; |
| 96 | 118 | |
trunk/src/mess/machine/e01.c
| r18533 | r18534 | |
| 260 | 260 | }; |
| 261 | 261 | |
| 262 | 262 | |
| 263 | | //------------------------------------------------- |
| 264 | | // SCSICB_interface scsi_intf |
| 265 | | //------------------------------------------------- |
| 266 | | |
| 267 | 263 | WRITE_LINE_MEMBER( e01_device::scsi_bsy_w ) |
| 268 | 264 | { |
| 269 | 265 | if (state) |
| r18533 | r18534 | |
| 283 | 279 | update_interrupts(); |
| 284 | 280 | } |
| 285 | 281 | |
| 286 | | static const SCSICB_interface scsi_intf = |
| 287 | | { |
| 288 | | DEVCB_DEVICE_LINE_MEMBER("^^", e01_device, scsi_bsy_w), |
| 289 | | DEVCB_NULL, |
| 290 | | DEVCB_NULL, |
| 291 | | DEVCB_NULL, |
| 292 | | DEVCB_NULL, |
| 293 | | DEVCB_DEVICE_LINE_MEMBER("^^", e01_device, scsi_req_w), |
| 294 | | DEVCB_NULL, |
| 295 | | DEVCB_NULL, |
| 296 | | DEVCB_NULL |
| 297 | | }; |
| 298 | 282 | |
| 299 | | |
| 300 | 283 | //------------------------------------------------- |
| 301 | 284 | // centronics_interface e01_centronics_intf |
| 302 | 285 | //------------------------------------------------- |
| r18533 | r18534 | |
| 352 | 335 | |
| 353 | 336 | MCFG_SCSIBUS_ADD(SCSIBUS_TAG) |
| 354 | 337 | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk0", SCSIHD, SCSI_ID_0) |
| 355 | | MCFG_SCSICB_ADD(SCSIBUS_TAG ":host", scsi_intf) |
| 338 | MCFG_SCSICB_ADD(SCSIBUS_TAG ":host") |
| 339 | MCFG_SCSICB_BSY_HANDLER(DEVWRITELINE("^", e01_device, scsi_bsy_w)) |
| 340 | MCFG_SCSICB_REQ_HANDLER(DEVWRITELINE("^", e01_device, scsi_req_w)) |
| 356 | 341 | |
| 357 | 342 | // internal ram |
| 358 | 343 | MCFG_RAM_ADD(RAM_TAG) |
trunk/src/mess/machine/lux4105.c
| r18533 | r18534 | |
| 30 | 30 | const device_type LUXOR_4105 = &device_creator<luxor_4105_device>; |
| 31 | 31 | |
| 32 | 32 | |
| 33 | | //------------------------------------------------- |
| 34 | | // SCSICB_interface sasi_intf |
| 35 | | //------------------------------------------------- |
| 36 | | |
| 37 | 33 | WRITE_LINE_MEMBER( luxor_4105_device::sasi_bsy_w ) |
| 38 | 34 | { |
| 39 | 35 | if (state) |
| r18533 | r18534 | |
| 62 | 58 | update_trrq_int(); |
| 63 | 59 | } |
| 64 | 60 | |
| 65 | | static const SCSICB_interface sasi_intf = |
| 66 | | { |
| 67 | | DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_bsy_w), |
| 68 | | DEVCB_NULL, |
| 69 | | DEVCB_NULL, |
| 70 | | DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_io_w), |
| 71 | | DEVCB_NULL, |
| 72 | | DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_req_w), |
| 73 | | DEVCB_NULL, |
| 74 | | DEVCB_NULL, |
| 75 | | DEVCB_NULL |
| 76 | | }; |
| 77 | 61 | |
| 78 | | |
| 79 | 62 | //------------------------------------------------- |
| 80 | 63 | // MACHINE_DRIVER( luxor_4105 ) |
| 81 | 64 | //------------------------------------------------- |
| r18533 | r18534 | |
| 83 | 66 | static MACHINE_CONFIG_FRAGMENT( luxor_4105 ) |
| 84 | 67 | MCFG_SCSIBUS_ADD(SASIBUS_TAG) |
| 85 | 68 | MCFG_SCSIDEV_ADD(SASIBUS_TAG ":harddisk0", S1410, SCSI_ID_0) |
| 86 | | MCFG_SCSICB_ADD(SASIBUS_TAG ":host", sasi_intf) |
| 69 | MCFG_SCSICB_ADD(SASIBUS_TAG ":host") |
| 70 | MCFG_SCSICB_BSY_HANDLER(DEVWRITELINE("^", luxor_4105_device, sasi_bsy_w)) |
| 71 | MCFG_SCSICB_IO_HANDLER(DEVWRITELINE("^", luxor_4105_device, sasi_io_w)) |
| 72 | MCFG_SCSICB_REQ_HANDLER(DEVWRITELINE("^", luxor_4105_device, sasi_req_w)) |
| 87 | 73 | MACHINE_CONFIG_END |
| 88 | 74 | |
| 89 | 75 | |
trunk/src/mess/drivers/rmnimbus.c
| r18533 | r18534 | |
| 80 | 80 | MSM5205_S48_4B /* 8 kHz */ |
| 81 | 81 | }; |
| 82 | 82 | |
| 83 | | //------------------------------------------------- |
| 84 | | // SCSICB_interface sasi_intf |
| 85 | | //------------------------------------------------- |
| 86 | | |
| 87 | | static const SCSICB_interface scsibus_config = |
| 88 | | { |
| 89 | | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_bsy_w), |
| 90 | | DEVCB_NULL, |
| 91 | | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_cd_w), |
| 92 | | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_io_w), |
| 93 | | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_msg_w), |
| 94 | | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_req_w), |
| 95 | | DEVCB_NULL, |
| 96 | | DEVCB_NULL, |
| 97 | | DEVCB_NULL |
| 98 | | }; |
| 99 | | |
| 100 | 83 | static const centronics_interface nimbus_centronics_config = |
| 101 | 84 | { |
| 102 | 85 | DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_ack_w), |
| r18533 | r18534 | |
| 331 | 314 | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk1", SCSIHD, SCSI_ID_1) |
| 332 | 315 | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk2", ACB4070, SCSI_ID_2) |
| 333 | 316 | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk3", S1410, SCSI_ID_3) |
| 334 | | MCFG_SCSICB_ADD(SCSIBUS_TAG ":host", scsibus_config) |
| 317 | MCFG_SCSICB_ADD(SCSIBUS_TAG ":host") |
| 318 | MCFG_SCSICB_BSY_HANDLER(DEVWRITELINE("^", rmnimbus_state, nimbus_scsi_bsy_w)) |
| 319 | MCFG_SCSICB_CD_HANDLER(DEVWRITELINE("^", rmnimbus_state, nimbus_scsi_cd_w)) |
| 320 | MCFG_SCSICB_IO_HANDLER(DEVWRITELINE("^", rmnimbus_state, nimbus_scsi_io_w)) |
| 321 | MCFG_SCSICB_MSG_HANDLER(DEVWRITELINE("^", rmnimbus_state, nimbus_scsi_msg_w)) |
| 322 | MCFG_SCSICB_REQ_HANDLER(DEVWRITELINE("^", rmnimbus_state, nimbus_scsi_req_w)) |
| 335 | 323 | |
| 336 | 324 | MCFG_RAM_ADD(RAM_TAG) |
| 337 | 325 | MCFG_RAM_DEFAULT_SIZE("1536K") |
trunk/src/mess/drivers/v1050.c
| r18533 | r18534 | |
| 1002 | 1002 | }; |
| 1003 | 1003 | |
| 1004 | 1004 | |
| 1005 | | //------------------------------------------------- |
| 1006 | | // SCSICB_interface sasi_intf |
| 1007 | | //------------------------------------------------- |
| 1008 | | |
| 1009 | | static const SCSICB_interface sasi_intf = |
| 1010 | | { |
| 1011 | | DEVCB_NULL, |
| 1012 | | DEVCB_NULL, |
| 1013 | | DEVCB_NULL, |
| 1014 | | DEVCB_DRIVER_LINE_MEMBER(v1050_state, sasi_io_w), |
| 1015 | | DEVCB_NULL, |
| 1016 | | DEVCB_NULL, |
| 1017 | | DEVCB_NULL, |
| 1018 | | DEVCB_NULL, |
| 1019 | | DEVCB_NULL |
| 1020 | | }; |
| 1021 | | |
| 1022 | 1005 | // Machine Initialization |
| 1023 | 1006 | |
| 1024 | 1007 | static IRQ_CALLBACK( v1050_int_ack ) |
| r18533 | r18534 | |
| 1128 | 1111 | // SASI bus |
| 1129 | 1112 | MCFG_SCSIBUS_ADD(SASIBUS_TAG) |
| 1130 | 1113 | MCFG_SCSIDEV_ADD(SASIBUS_TAG ":harddisk0", S1410, SCSI_ID_0) |
| 1131 | | MCFG_SCSICB_ADD(SASIBUS_TAG ":host", sasi_intf) |
| 1114 | MCFG_SCSICB_ADD(SASIBUS_TAG ":host") |
| 1115 | MCFG_SCSICB_IO_HANDLER(DEVWRITELINE("^", v1050_state, sasi_io_w)) |
| 1132 | 1116 | |
| 1133 | 1117 | MCFG_TIMER_DRIVER_ADD(TIMER_ACK_TAG, v1050_state, sasi_ack_tick) |
| 1134 | 1118 | MCFG_TIMER_DRIVER_ADD(TIMER_RST_TAG, v1050_state, sasi_rst_tick) |