changed rmnimbus to use DEVCB & added a callback for ACK. (nw)

This commit is contained in:
smf- 2012-10-07 12:04:20 +00:00
parent 2b322a3585
commit a03e62136c
13 changed files with 63 additions and 39 deletions

View File

@ -491,9 +491,6 @@ void scsibus_device::scsi_out_line_change_now(UINT8 line, UINT8 state)
if(m_scsicb != NULL)
{
if(m_scsicb->line_change_cb!=NULL)
m_scsicb->line_change_cb(this, line,state);
switch (line)
{
case SCSI_LINE_BSY: m_scsicb->out_bsy_func(state); break;
@ -502,6 +499,7 @@ void scsibus_device::scsi_out_line_change_now(UINT8 line, UINT8 state)
case SCSI_LINE_IO: m_scsicb->out_io_func(state); break;
case SCSI_LINE_MSG: m_scsicb->out_msg_func(state); break;
case SCSI_LINE_REQ: m_scsicb->out_req_func(state); break;
case SCSI_LINE_ACK: m_scsicb->out_ack_func(state); break;
case SCSI_LINE_RESET: m_scsicb->out_rst_func(state); break;
}
}

View File

@ -24,6 +24,7 @@ void scsicb_device::device_start()
out_io_func.resolve(_out_io_func, *this);
out_msg_func.resolve(_out_msg_func, *this);
out_req_func.resolve(_out_req_func, *this);
out_ack_func.resolve(_out_ack_func, *this);
out_rst_func.resolve(_out_rst_func, *this);
}

View File

@ -25,14 +25,13 @@
struct SCSICB_interface
{
void (*line_change_cb)(device_t *, UINT8 line, UINT8 state);
devcb_write_line _out_bsy_func;
devcb_write_line _out_sel_func;
devcb_write_line _out_cd_func;
devcb_write_line _out_io_func;
devcb_write_line _out_msg_func;
devcb_write_line _out_req_func;
devcb_write_line _out_ack_func;
devcb_write_line _out_rst_func;
};
@ -49,6 +48,7 @@ public:
devcb_resolved_write_line out_io_func;
devcb_resolved_write_line out_msg_func;
devcb_resolved_write_line out_req_func;
devcb_resolved_write_line out_ack_func;
devcb_resolved_write_line out_rst_func;
UINT8 scsi_data_r();

View File

@ -1040,13 +1040,13 @@ WRITE_LINE_MEMBER( bulletf_state::req_w )
static const SCSICB_interface scsi_intf =
{
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(bulletf_state, req_w),
DEVCB_NULL,
DEVCB_NULL
};

View File

@ -86,7 +86,14 @@ static const msm5205_interface msm5205_config =
static const SCSICB_interface scsibus_config =
{
&nimbus_scsi_linechange
DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_bsy_w),
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_cd_w),
DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_io_w),
DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_msg_w),
DEVCB_DRIVER_LINE_MEMBER(rmnimbus_state, nimbus_scsi_req_w),
DEVCB_NULL,
DEVCB_NULL
};
static const centronics_interface nimbus_centronics_config =

View File

@ -986,7 +986,7 @@ static const floppy_interface v1050_floppy_interface =
static const SCSICB_interface sasi_intf =
{
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,

View File

@ -264,8 +264,6 @@ extern const wd17xx_interface nimbus_wd17xx_interface;
/* SASI harddisk interface */
#define SCSIBUS_TAG "scsibus"
void nimbus_scsi_linechange(device_t *device, UINT8 line, UINT8 state);
/* Masks for writes to port 0x400 */
#define FDC_DRIVE0_MASK 0x01
#define FDC_DRIVE1_MASK 0x02
@ -305,7 +303,7 @@ void nimbus_scsi_linechange(device_t *device, UINT8 line, UINT8 state);
#define HDC_RESET_MASK 0x01
#define HDC_SEL_MASK 0x02
#define HDC_IRQ_MASK 0x04
#define HDC_IRQ_ENABLED(state) ((state->m_nimbus_drives.reg410_out & HDC_IRQ_MASK) ? 1 : 0)
#define HDC_IRQ_ENABLED() ((m_nimbus_drives.reg410_out & HDC_IRQ_MASK) ? 1 : 0)
#define SCSI_ID_NONE 0x80
@ -463,4 +461,10 @@ public:
DECLARE_WRITE8_MEMBER(nimbus_via_write_portb);
DECLARE_WRITE_LINE_MEMBER(nimbus_via_irq_w);
DECLARE_WRITE_LINE_MEMBER(nimbus_ack_w);
DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_bsy_w);
DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_cd_w);
DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_io_w);
DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_msg_w);
DECLARE_WRITE_LINE_MEMBER(nimbus_scsi_req_w);
void nimbus_scsi_linechange( UINT8 mask, UINT8 state );
};

View File

@ -93,7 +93,7 @@ static const z80_daisy_config daisy_chain[] =
static const SCSICB_interface sasi_intf =
{
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,

View File

@ -86,7 +86,7 @@ static const z80_daisy_config daisy_chain[] =
static const SCSICB_interface sasi_intf =
{
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,

View File

@ -148,13 +148,13 @@ WRITE_LINE_MEMBER( base_d9060_device::req_w )
static const SCSICB_interface sasi_intf =
{
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("^^", base_d9060_device, req_w),
DEVCB_NULL,
DEVCB_NULL
};

View File

@ -285,13 +285,13 @@ WRITE_LINE_MEMBER( e01_device::scsi_req_w )
static const SCSICB_interface scsi_intf =
{
NULL,
DEVCB_DEVICE_LINE_MEMBER("^^", e01_device, scsi_bsy_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("^^", e01_device, scsi_req_w),
DEVCB_NULL,
DEVCB_NULL
};

View File

@ -66,13 +66,13 @@ WRITE_LINE_MEMBER( luxor_4105_device::sasi_req_w )
static const SCSICB_interface sasi_intf =
{
NULL,
DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_bsy_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_io_w),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_req_w),
DEVCB_NULL,
DEVCB_NULL
};

View File

@ -2456,47 +2456,61 @@ static void hdc_drq(running_machine &machine)
}
}
void nimbus_scsi_linechange(device_t *device, UINT8 line, UINT8 state)
WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_bsy_w )
{
nimbus_scsi_linechange( HDC_BSY_MASK, state );
}
WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_cd_w )
{
nimbus_scsi_linechange( HDC_CD_MASK, state );
}
WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_io_w )
{
nimbus_scsi_linechange( HDC_IO_MASK, state );
}
WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_msg_w )
{
nimbus_scsi_linechange( HDC_MSG_MASK, state );
}
WRITE_LINE_MEMBER( rmnimbus_state::nimbus_scsi_req_w )
{
nimbus_scsi_linechange( HDC_REQ_MASK, state );
}
void rmnimbus_state::nimbus_scsi_linechange( UINT8 mask, UINT8 state )
{
rmnimbus_state *drvstate = device->machine().driver_data<rmnimbus_state>();
UINT8 mask = 0;
UINT8 last = 0;
switch (line)
{
case SCSI_LINE_REQ : mask=HDC_REQ_MASK; break;
case SCSI_LINE_CD : mask=HDC_CD_MASK; break;
case SCSI_LINE_IO : mask=HDC_IO_MASK; break;
case SCSI_LINE_BSY : mask=HDC_BSY_MASK; break;
case SCSI_LINE_MSG : mask=HDC_MSG_MASK; break;
}
last=drvstate->m_nimbus_drives.reg410_in & mask;
last=m_nimbus_drives.reg410_in & mask;
if(state)
drvstate->m_nimbus_drives.reg410_in|=mask;
m_nimbus_drives.reg410_in|=mask;
else
drvstate->m_nimbus_drives.reg410_in&=~mask;
m_nimbus_drives.reg410_in&=~mask;
if(HDC_IRQ_ENABLED(drvstate) && ((~drvstate->m_nimbus_drives.reg410_in & HDC_INT_TRIGGER)==HDC_INT_TRIGGER))
set_disk_int(device->machine(),1);
if(HDC_IRQ_ENABLED() && ((~m_nimbus_drives.reg410_in & HDC_INT_TRIGGER)==HDC_INT_TRIGGER))
set_disk_int(machine(),1);
else
set_disk_int(device->machine(),0);
set_disk_int(machine(),0);
if(line==SCSI_LINE_REQ)
if( mask == HDC_REQ_MASK )
{
if (state==0)
{
if(((drvstate->m_nimbus_drives.reg410_in & HDC_CD_MASK)==HDC_CD_MASK) && (last!=0))
if(((m_nimbus_drives.reg410_in & HDC_CD_MASK)==HDC_CD_MASK) && (last!=0))
{
drvstate->m_nimbus_drives.drq_ff=1;
hdc_drq(device->machine());
m_nimbus_drives.drq_ff=1;
hdc_drq(machine());
}
}
else
{
drvstate->m_scsibus->scsi_ack_w(1);
m_scsibus->scsi_ack_w(1);
}
}
}