trunk/src/emu/machine/mb89352.c
| r29453 | r29454 | |
| 109 | 109 | const device_type MB89352A = &device_creator<mb89352_device>; |
| 110 | 110 | |
| 111 | 111 | |
| 112 | | void mb89352_device::device_config_complete() |
| 113 | | { |
| 114 | | // copy static configuration if present |
| 115 | | const mb89352_interface *intf = reinterpret_cast<const mb89352_interface *>(static_config()); |
| 116 | | if (intf != NULL) |
| 117 | | *static_cast<mb89352_interface *>(this) = *intf; |
| 118 | | |
| 119 | | // otherwise, initialize it to defaults |
| 120 | | else |
| 121 | | { |
| 122 | | memset(&irq_callback,0,sizeof(irq_callback)); |
| 123 | | memset(&drq_callback,0,sizeof(drq_callback)); |
| 124 | | } |
| 125 | | } |
| 126 | | |
| 127 | 112 | /* |
| 128 | 113 | * Device |
| 129 | 114 | */ |
| 130 | 115 | |
| 131 | 116 | mb89352_device::mb89352_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 132 | | : device_t(mconfig, MB89352A, "MB89352A", tag, owner, clock, "mb89352", __FILE__) |
| 117 | : device_t(mconfig, MB89352A, "MB89352A", tag, owner, clock, "mb89352", __FILE__), |
| 118 | m_irq_cb(*this), |
| 119 | m_drq_cb(*this) |
| 133 | 120 | { |
| 134 | 121 | } |
| 135 | 122 | |
| r29453 | r29454 | |
| 146 | 133 | m_spc_status |= SSTS_TC_ZERO; |
| 147 | 134 | m_ints = 0x00; |
| 148 | 135 | |
| 149 | | m_irq_func.resolve(irq_callback,*this); |
| 150 | | m_drq_func.resolve(drq_callback,*this); |
| 136 | m_irq_cb.resolve_safe(); |
| 137 | m_drq_cb.resolve_safe(); |
| 151 | 138 | |
| 152 | 139 | memset(m_SCSIdevices,0,sizeof(m_SCSIdevices)); |
| 153 | 140 | |
| r29453 | r29454 | |
| 204 | 191 | case TIMER_TRANSFER: |
| 205 | 192 | // TODO: check interrupts are actually enabled |
| 206 | 193 | { |
| 207 | | m_drq_func(1); |
| 194 | m_drq_cb(1); |
| 208 | 195 | } |
| 209 | 196 | break; |
| 210 | 197 | } |
| r29453 | r29454 | |
| 325 | 312 | m_spc_status |= SSTS_DREG_EMPTY; |
| 326 | 313 | m_ints |= INTS_COMMAND_COMPLETE; |
| 327 | 314 | if(m_int_enable != 0) |
| 328 | | m_irq_func(1); |
| 315 | m_irq_cb(1); |
| 329 | 316 | if(m_phase == SCSI_PHASE_MESSAGE_IN) |
| 330 | 317 | set_phase(SCSI_PHASE_BUS_FREE); |
| 331 | 318 | else if(m_phase == SCSI_PHASE_DATAIN) |
| r29453 | r29454 | |
| 427 | 414 | if(m_busfree_int_enable) |
| 428 | 415 | { |
| 429 | 416 | if(m_int_enable != 0) |
| 430 | | m_irq_func(1); |
| 417 | m_irq_cb(1); |
| 431 | 418 | } |
| 432 | 419 | logerror("mb89352: SCMD: Bus free\n"); |
| 433 | 420 | break; |
| r29453 | r29454 | |
| 458 | 445 | m_spc_status |= SSTS_SPC_BSY; |
| 459 | 446 | m_ints |= INTS_COMMAND_COMPLETE; |
| 460 | 447 | if(m_int_enable != 0) |
| 461 | | m_irq_func(1); |
| 448 | m_irq_cb(1); |
| 462 | 449 | logerror("mb89352: SCMD: Selection (SCSI ID%i)\n",m_target); |
| 463 | 450 | break; |
| 464 | 451 | case 0x02: // Reset ATN |
| r29453 | r29454 | |
| 558 | 545 | break; |
| 559 | 546 | case 0x04: // INTS - Interrupt Sense |
| 560 | 547 | m_ints &= ~data; // resets relevant status bits to zero |
| 561 | | m_irq_func(0); // clear IRQ |
| 548 | m_irq_cb(0); // clear IRQ |
| 562 | 549 | logerror("mb89352: Reset INTS status bits %02x\n",data); |
| 563 | 550 | break; |
| 564 | 551 | case 0x08: // PCTL - Phase control |
| r29453 | r29454 | |
| 613 | 600 | m_spc_status |= SSTS_DREG_EMPTY; |
| 614 | 601 | m_ints |= INTS_COMMAND_COMPLETE; |
| 615 | 602 | if(m_int_enable != 0) |
| 616 | | m_irq_func(1); |
| 603 | m_irq_cb(1); |
| 617 | 604 | set_phase(SCSI_PHASE_STATUS); |
| 618 | 605 | } |
| 619 | 606 | } |
trunk/src/emu/machine/mb89352.h
| r29453 | r29454 | |
| 48 | 48 | #define SERR_SCSI_PAR 0x80 |
| 49 | 49 | |
| 50 | 50 | |
| 51 | | struct mb89352_interface |
| 52 | | { |
| 53 | | devcb_write_line irq_callback; /* irq callback */ |
| 54 | | devcb_write_line drq_callback; /* drq callback */ |
| 55 | | }; |
| 51 | #define MCFG_MB89352A_IRQ_CB(_devcb) \ |
| 52 | devcb = &mb89352_device::set_irq_callback(*device, DEVCB2_##_devcb); |
| 53 | |
| 54 | #define MCFG_MB89352A_DRQ_CB(_devcb) \ |
| 55 | devcb = &mb89352_device::set_drq_callback(*device, DEVCB2_##_devcb); |
| 56 | 56 | |
| 57 | | #define MCFG_MB89352A_ADD(_tag, _intrf) \ |
| 58 | | MCFG_DEVICE_ADD(_tag, MB89352A, 0) \ |
| 59 | | MCFG_DEVICE_CONFIG(_intrf) |
| 60 | | |
| 61 | | class mb89352_device : public device_t, |
| 62 | | public mb89352_interface |
| 57 | class mb89352_device : public device_t |
| 63 | 58 | { |
| 64 | 59 | public: |
| 65 | 60 | // construction/destruction |
| 66 | 61 | mb89352_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 67 | 62 | |
| 63 | template<class _Object> static devcb2_base &set_irq_callback(device_t &device, _Object object) { return downcast<mb89352_device &>(device).m_irq_cb.set_callback(object); } |
| 64 | template<class _Object> static devcb2_base &set_drq_callback(device_t &device, _Object object) { return downcast<mb89352_device &>(device).m_drq_cb.set_callback(object); } |
| 65 | |
| 68 | 66 | // any publically accessible interfaces needed for runtime |
| 69 | 67 | DECLARE_READ8_MEMBER( mb89352_r ); |
| 70 | 68 | DECLARE_WRITE8_MEMBER( mb89352_w ); |
| r29453 | r29454 | |
| 77 | 75 | virtual void device_start(); |
| 78 | 76 | virtual void device_reset(); |
| 79 | 77 | virtual void device_stop(); |
| 80 | | virtual void device_config_complete(); |
| 81 | 78 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 82 | 79 | |
| 83 | 80 | private: |
| r29453 | r29454 | |
| 87 | 84 | int get_scsi_cmd_len(UINT8 cbyte); |
| 88 | 85 | //void set_ints(UINT8 flag); |
| 89 | 86 | |
| 90 | | devcb_resolved_write_line m_irq_func; |
| 91 | | devcb_resolved_write_line m_drq_func; |
| 87 | devcb2_write_line m_irq_cb; /* irq callback */ |
| 88 | devcb2_write_line m_drq_cb; /* drq callback */ |
| 92 | 89 | |
| 93 | 90 | scsihle_device* m_SCSIdevices[8]; |
| 94 | 91 | |
trunk/src/mess/drivers/x68k.c
| r29453 | r29454 | |
| 1603 | 1603 | |
| 1604 | 1604 | } |
| 1605 | 1605 | |
| 1606 | | static const mb89352_interface x68k_scsi_intf = |
| 1607 | | { |
| 1608 | | DEVCB_DRIVER_LINE_MEMBER(x68k_state,x68k_scsi_irq), |
| 1609 | | DEVCB_DRIVER_LINE_MEMBER(x68k_state,x68k_scsi_drq) |
| 1610 | | }; |
| 1611 | | |
| 1612 | 1606 | static X68K_EXPANSION_INTERFACE(x68k_exp_intf) |
| 1613 | 1607 | { |
| 1614 | 1608 | DEVCB_DRIVER_LINE_MEMBER(x68k_state,x68k_irq2_line), |
| r29453 | r29454 | |
| 1938 | 1932 | MCFG_SCSIDEV_ADD("scsi:harddisk4", SCSIHD, SCSI_ID_4) |
| 1939 | 1933 | MCFG_SCSIDEV_ADD("scsi:harddisk5", SCSIHD, SCSI_ID_5) |
| 1940 | 1934 | MCFG_SCSIDEV_ADD("scsi:harddisk6", SCSIHD, SCSI_ID_6) |
| 1941 | | MCFG_MB89352A_ADD("scsi:mb89352",x68k_scsi_intf) |
| 1935 | MCFG_DEVICE_ADD("scsi:mb89352", MB89352A, 0) |
| 1936 | MCFG_MB89352A_IRQ_CB(DEVWRITELINE(DEVICE_SELF_OWNER, x68k_state, x68k_scsi_irq)) |
| 1937 | MCFG_MB89352A_DRQ_CB(DEVWRITELINE(DEVICE_SELF_OWNER, x68k_state, x68k_scsi_drq)) |
| 1942 | 1938 | MACHINE_CONFIG_END |
| 1943 | 1939 | |
| 1944 | 1940 | static MACHINE_CONFIG_START( x68kxvi, x68k_state ) |
| r29453 | r29454 | |
| 1959 | 1955 | MCFG_SCSIDEV_ADD("scsi:harddisk4", SCSIHD, SCSI_ID_4) |
| 1960 | 1956 | MCFG_SCSIDEV_ADD("scsi:harddisk5", SCSIHD, SCSI_ID_5) |
| 1961 | 1957 | MCFG_SCSIDEV_ADD("scsi:harddisk6", SCSIHD, SCSI_ID_6) |
| 1962 | | MCFG_MB89352A_ADD("scsi:mb89352",x68k_scsi_intf) |
| 1958 | MCFG_DEVICE_ADD("scsi:mb89352", MB89352A, 0) |
| 1959 | MCFG_MB89352A_IRQ_CB(DEVWRITELINE(DEVICE_SELF_OWNER, x68k_state, x68k_scsi_irq)) |
| 1960 | MCFG_MB89352A_DRQ_CB(DEVWRITELINE(DEVICE_SELF_OWNER, x68k_state, x68k_scsi_drq)) |
| 1963 | 1961 | MACHINE_CONFIG_END |
| 1964 | 1962 | |
| 1965 | 1963 | static MACHINE_CONFIG_START( x68030, x68k_state ) |
| r29453 | r29454 | |
| 1981 | 1979 | MCFG_SCSIDEV_ADD("scsi:harddisk4", SCSIHD, SCSI_ID_4) |
| 1982 | 1980 | MCFG_SCSIDEV_ADD("scsi:harddisk5", SCSIHD, SCSI_ID_5) |
| 1983 | 1981 | MCFG_SCSIDEV_ADD("scsi:harddisk6", SCSIHD, SCSI_ID_6) |
| 1984 | | MCFG_MB89352A_ADD("scsi:mb89352",x68k_scsi_intf) |
| 1982 | MCFG_DEVICE_ADD("scsi:mb89352", MB89352A, 0) |
| 1983 | MCFG_MB89352A_IRQ_CB(DEVWRITELINE(DEVICE_SELF_OWNER, x68k_state, x68k_scsi_irq)) |
| 1984 | MCFG_MB89352A_DRQ_CB(DEVWRITELINE(DEVICE_SELF_OWNER, x68k_state, x68k_scsi_drq)) |
| 1985 | 1985 | MACHINE_CONFIG_END |
| 1986 | 1986 | |
| 1987 | 1987 | ROM_START( x68000 ) |