Previous 199869 Revisions Next

r29454 Tuesday 8th April, 2014 at 15:25:57 UTC by Osso
mb89352_device: converted to devcb2 (nw)
[src/emu/machine]mb89352.c mb89352.h
[src/mess/drivers]x68k.c

trunk/src/emu/machine/mb89352.c
r29453r29454
109109const device_type MB89352A = &device_creator<mb89352_device>;
110110
111111
112void 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
127112/*
128113 * Device
129114 */
130115
131116mb89352_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)
133120{
134121}
135122
r29453r29454
146133      m_spc_status |= SSTS_TC_ZERO;
147134   m_ints = 0x00;
148135
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();
151138
152139   memset(m_SCSIdevices,0,sizeof(m_SCSIdevices));
153140
r29453r29454
204191   case TIMER_TRANSFER:
205192      // TODO: check interrupts are actually enabled
206193      {
207         m_drq_func(1);
194         m_drq_cb(1);
208195      }
209196      break;
210197   }
r29453r29454
325312            m_spc_status |= SSTS_DREG_EMPTY;
326313            m_ints |= INTS_COMMAND_COMPLETE;
327314            if(m_int_enable != 0)
328               m_irq_func(1);
315               m_irq_cb(1);
329316            if(m_phase == SCSI_PHASE_MESSAGE_IN)
330317               set_phase(SCSI_PHASE_BUS_FREE);
331318            else if(m_phase == SCSI_PHASE_DATAIN)
r29453r29454
427414         if(m_busfree_int_enable)
428415         {
429416            if(m_int_enable != 0)
430               m_irq_func(1);
417               m_irq_cb(1);
431418         }
432419         logerror("mb89352: SCMD: Bus free\n");
433420         break;
r29453r29454
458445         m_spc_status |= SSTS_SPC_BSY;
459446         m_ints |= INTS_COMMAND_COMPLETE;
460447         if(m_int_enable != 0)
461            m_irq_func(1);
448            m_irq_cb(1);
462449         logerror("mb89352: SCMD: Selection (SCSI ID%i)\n",m_target);
463450         break;
464451      case 0x02:  // Reset ATN
r29453r29454
558545      break;
559546   case 0x04:  // INTS - Interrupt Sense
560547      m_ints &= ~data;  // resets relevant status bits to zero
561      m_irq_func(0);  // clear IRQ
548      m_irq_cb(0);  // clear IRQ
562549      logerror("mb89352: Reset INTS status bits %02x\n",data);
563550      break;
564551   case 0x08:  // PCTL - Phase control
r29453r29454
613600            m_spc_status |= SSTS_DREG_EMPTY;
614601            m_ints |= INTS_COMMAND_COMPLETE;
615602            if(m_int_enable != 0)
616               m_irq_func(1);
603               m_irq_cb(1);
617604            set_phase(SCSI_PHASE_STATUS);
618605         }
619606      }
trunk/src/emu/machine/mb89352.h
r29453r29454
4848#define SERR_SCSI_PAR   0x80
4949
5050
51struct 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);
5656
57#define MCFG_MB89352A_ADD(_tag, _intrf) \
58   MCFG_DEVICE_ADD(_tag, MB89352A, 0) \
59   MCFG_DEVICE_CONFIG(_intrf)
60
61class mb89352_device : public device_t,
62                  public mb89352_interface
57class mb89352_device : public device_t
6358{
6459public:
6560   // construction/destruction
6661   mb89352_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
6762
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   
6866   // any publically accessible interfaces needed for runtime
6967   DECLARE_READ8_MEMBER( mb89352_r );
7068   DECLARE_WRITE8_MEMBER( mb89352_w );
r29453r29454
7775   virtual void device_start();
7876   virtual void device_reset();
7977   virtual void device_stop();
80   virtual void device_config_complete();
8178   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
8279
8380private:
r29453r29454
8784   int get_scsi_cmd_len(UINT8 cbyte);
8885   //void set_ints(UINT8 flag);
8986
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 */
9289
9390   scsihle_device* m_SCSIdevices[8];
9491
trunk/src/mess/drivers/x68k.c
r29453r29454
16031603
16041604}
16051605
1606static 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
16121606static X68K_EXPANSION_INTERFACE(x68k_exp_intf)
16131607{
16141608   DEVCB_DRIVER_LINE_MEMBER(x68k_state,x68k_irq2_line),
r29453r29454
19381932   MCFG_SCSIDEV_ADD("scsi:harddisk4", SCSIHD, SCSI_ID_4)
19391933   MCFG_SCSIDEV_ADD("scsi:harddisk5", SCSIHD, SCSI_ID_5)
19401934   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))
19421938MACHINE_CONFIG_END
19431939
19441940static MACHINE_CONFIG_START( x68kxvi, x68k_state )
r29453r29454
19591955   MCFG_SCSIDEV_ADD("scsi:harddisk4", SCSIHD, SCSI_ID_4)
19601956   MCFG_SCSIDEV_ADD("scsi:harddisk5", SCSIHD, SCSI_ID_5)
19611957   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))
19631961MACHINE_CONFIG_END
19641962
19651963static MACHINE_CONFIG_START( x68030, x68k_state )
r29453r29454
19811979   MCFG_SCSIDEV_ADD("scsi:harddisk4", SCSIHD, SCSI_ID_4)
19821980   MCFG_SCSIDEV_ADD("scsi:harddisk5", SCSIHD, SCSI_ID_5)
19831981   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))
19851985MACHINE_CONFIG_END
19861986
19871987ROM_START( x68000 )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team