mirror of
https://github.com/holub/mame
synced 2025-06-28 07:04:35 +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 != NULL)
|
||||||
{
|
{
|
||||||
if(m_scsicb->line_change_cb!=NULL)
|
|
||||||
m_scsicb->line_change_cb(this, line,state);
|
|
||||||
|
|
||||||
switch (line)
|
switch (line)
|
||||||
{
|
{
|
||||||
case SCSI_LINE_BSY: m_scsicb->out_bsy_func(state); break;
|
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_IO: m_scsicb->out_io_func(state); break;
|
||||||
case SCSI_LINE_MSG: m_scsicb->out_msg_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_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;
|
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_io_func.resolve(_out_io_func, *this);
|
||||||
out_msg_func.resolve(_out_msg_func, *this);
|
out_msg_func.resolve(_out_msg_func, *this);
|
||||||
out_req_func.resolve(_out_req_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);
|
out_rst_func.resolve(_out_rst_func, *this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,14 +25,13 @@
|
|||||||
|
|
||||||
struct SCSICB_interface
|
struct SCSICB_interface
|
||||||
{
|
{
|
||||||
void (*line_change_cb)(device_t *, UINT8 line, UINT8 state);
|
|
||||||
|
|
||||||
devcb_write_line _out_bsy_func;
|
devcb_write_line _out_bsy_func;
|
||||||
devcb_write_line _out_sel_func;
|
devcb_write_line _out_sel_func;
|
||||||
devcb_write_line _out_cd_func;
|
devcb_write_line _out_cd_func;
|
||||||
devcb_write_line _out_io_func;
|
devcb_write_line _out_io_func;
|
||||||
devcb_write_line _out_msg_func;
|
devcb_write_line _out_msg_func;
|
||||||
devcb_write_line _out_req_func;
|
devcb_write_line _out_req_func;
|
||||||
|
devcb_write_line _out_ack_func;
|
||||||
devcb_write_line _out_rst_func;
|
devcb_write_line _out_rst_func;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -49,6 +48,7 @@ public:
|
|||||||
devcb_resolved_write_line out_io_func;
|
devcb_resolved_write_line out_io_func;
|
||||||
devcb_resolved_write_line out_msg_func;
|
devcb_resolved_write_line out_msg_func;
|
||||||
devcb_resolved_write_line out_req_func;
|
devcb_resolved_write_line out_req_func;
|
||||||
|
devcb_resolved_write_line out_ack_func;
|
||||||
devcb_resolved_write_line out_rst_func;
|
devcb_resolved_write_line out_rst_func;
|
||||||
|
|
||||||
UINT8 scsi_data_r();
|
UINT8 scsi_data_r();
|
||||||
|
@ -1040,13 +1040,13 @@ WRITE_LINE_MEMBER( bulletf_state::req_w )
|
|||||||
|
|
||||||
static const SCSICB_interface scsi_intf =
|
static const SCSICB_interface scsi_intf =
|
||||||
{
|
{
|
||||||
NULL,
|
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_DRIVER_LINE_MEMBER(bulletf_state, req_w),
|
DEVCB_DRIVER_LINE_MEMBER(bulletf_state, req_w),
|
||||||
|
DEVCB_NULL,
|
||||||
DEVCB_NULL
|
DEVCB_NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -86,7 +86,14 @@ static const msm5205_interface msm5205_config =
|
|||||||
|
|
||||||
static const SCSICB_interface scsibus_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 =
|
static const centronics_interface nimbus_centronics_config =
|
||||||
|
@ -986,7 +986,7 @@ static const floppy_interface v1050_floppy_interface =
|
|||||||
|
|
||||||
static const SCSICB_interface sasi_intf =
|
static const SCSICB_interface sasi_intf =
|
||||||
{
|
{
|
||||||
NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
|
@ -264,8 +264,6 @@ extern const wd17xx_interface nimbus_wd17xx_interface;
|
|||||||
/* SASI harddisk interface */
|
/* SASI harddisk interface */
|
||||||
#define SCSIBUS_TAG "scsibus"
|
#define SCSIBUS_TAG "scsibus"
|
||||||
|
|
||||||
void nimbus_scsi_linechange(device_t *device, UINT8 line, UINT8 state);
|
|
||||||
|
|
||||||
/* Masks for writes to port 0x400 */
|
/* Masks for writes to port 0x400 */
|
||||||
#define FDC_DRIVE0_MASK 0x01
|
#define FDC_DRIVE0_MASK 0x01
|
||||||
#define FDC_DRIVE1_MASK 0x02
|
#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_RESET_MASK 0x01
|
||||||
#define HDC_SEL_MASK 0x02
|
#define HDC_SEL_MASK 0x02
|
||||||
#define HDC_IRQ_MASK 0x04
|
#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
|
#define SCSI_ID_NONE 0x80
|
||||||
@ -463,4 +461,10 @@ public:
|
|||||||
DECLARE_WRITE8_MEMBER(nimbus_via_write_portb);
|
DECLARE_WRITE8_MEMBER(nimbus_via_write_portb);
|
||||||
DECLARE_WRITE_LINE_MEMBER(nimbus_via_irq_w);
|
DECLARE_WRITE_LINE_MEMBER(nimbus_via_irq_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(nimbus_ack_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 =
|
static const SCSICB_interface sasi_intf =
|
||||||
{
|
{
|
||||||
NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_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 =
|
static const SCSICB_interface sasi_intf =
|
||||||
{
|
{
|
||||||
NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_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 =
|
static const SCSICB_interface sasi_intf =
|
||||||
{
|
{
|
||||||
NULL,
|
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_DEVICE_LINE_MEMBER("^^", base_d9060_device, req_w),
|
DEVCB_DEVICE_LINE_MEMBER("^^", base_d9060_device, req_w),
|
||||||
|
DEVCB_NULL,
|
||||||
DEVCB_NULL
|
DEVCB_NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -285,13 +285,13 @@ WRITE_LINE_MEMBER( e01_device::scsi_req_w )
|
|||||||
|
|
||||||
static const SCSICB_interface scsi_intf =
|
static const SCSICB_interface scsi_intf =
|
||||||
{
|
{
|
||||||
NULL,
|
|
||||||
DEVCB_DEVICE_LINE_MEMBER("^^", e01_device, scsi_bsy_w),
|
DEVCB_DEVICE_LINE_MEMBER("^^", e01_device, scsi_bsy_w),
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_DEVICE_LINE_MEMBER("^^", e01_device, scsi_req_w),
|
DEVCB_DEVICE_LINE_MEMBER("^^", e01_device, scsi_req_w),
|
||||||
|
DEVCB_NULL,
|
||||||
DEVCB_NULL
|
DEVCB_NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -66,13 +66,13 @@ WRITE_LINE_MEMBER( luxor_4105_device::sasi_req_w )
|
|||||||
|
|
||||||
static const SCSICB_interface sasi_intf =
|
static const SCSICB_interface sasi_intf =
|
||||||
{
|
{
|
||||||
NULL,
|
|
||||||
DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_bsy_w),
|
DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_bsy_w),
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_io_w),
|
DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_io_w),
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_req_w),
|
DEVCB_DEVICE_LINE_MEMBER("^^", luxor_4105_device, sasi_req_w),
|
||||||
|
DEVCB_NULL,
|
||||||
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;
|
UINT8 last = 0;
|
||||||
|
|
||||||
switch (line)
|
last=m_nimbus_drives.reg410_in & mask;
|
||||||
{
|
|
||||||
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;
|
|
||||||
|
|
||||||
if(state)
|
if(state)
|
||||||
drvstate->m_nimbus_drives.reg410_in|=mask;
|
m_nimbus_drives.reg410_in|=mask;
|
||||||
else
|
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))
|
if(HDC_IRQ_ENABLED() && ((~m_nimbus_drives.reg410_in & HDC_INT_TRIGGER)==HDC_INT_TRIGGER))
|
||||||
set_disk_int(device->machine(),1);
|
set_disk_int(machine(),1);
|
||||||
else
|
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 (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;
|
m_nimbus_drives.drq_ff=1;
|
||||||
hdc_drq(device->machine());
|
hdc_drq(machine());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
drvstate->m_scsibus->scsi_ack_w(1);
|
m_scsibus->scsi_ack_w(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user