mirror of
https://github.com/holub/mame
synced 2025-06-26 22:29:10 +03:00
changed rmnimbus to use DEVCB & added a callback for ACK. (nw)
This commit is contained in:
parent
2b322a3585
commit
a03e62136c
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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 =
|
||||
|
@ -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,
|
||||
|
@ -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 );
|
||||
};
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user