mirror of
https://github.com/holub/mame
synced 2025-06-30 16:00:01 +03:00
(MESS) converted scsibus from legacy device to c++ (nw)
This commit is contained in:
parent
10511fec79
commit
013bd9ab94
@ -478,9 +478,9 @@ WRITE8_MEMBER( bulletf_state::mbank_w )
|
||||
|
||||
READ8_MEMBER( bulletf_state::scsi_r )
|
||||
{
|
||||
UINT8 data = scsi_data_r(m_scsibus, 0);
|
||||
UINT8 data = m_scsibus->scsi_data_r();
|
||||
|
||||
scsi_ack_w(m_scsibus, 0);
|
||||
m_scsibus->scsi_ack_w(0);
|
||||
|
||||
m_wack = 0;
|
||||
update_dma_rdy();
|
||||
@ -495,9 +495,9 @@ READ8_MEMBER( bulletf_state::scsi_r )
|
||||
|
||||
WRITE8_MEMBER( bulletf_state::scsi_w )
|
||||
{
|
||||
scsi_data_w(m_scsibus, 0, data);
|
||||
m_scsibus->scsi_data_w(data);
|
||||
|
||||
scsi_ack_w(m_scsibus, 0);
|
||||
m_scsibus->scsi_ack_w(0);
|
||||
|
||||
m_wack = 0;
|
||||
update_dma_rdy();
|
||||
@ -927,11 +927,11 @@ READ8_MEMBER( bulletf_state::pio_pa_r )
|
||||
|
||||
UINT8 data = 0;
|
||||
|
||||
data |= !scsi_bsy_r(m_scsibus) << 3;
|
||||
data |= !scsi_msg_r(m_scsibus) << 4;
|
||||
data |= !scsi_cd_r(m_scsibus) << 5;
|
||||
data |= !scsi_req_r(m_scsibus) << 6;
|
||||
data |= !scsi_io_r(m_scsibus) << 7;
|
||||
data |= !m_scsibus->scsi_bsy_r() << 3;
|
||||
data |= !m_scsibus->scsi_msg_r() << 4;
|
||||
data |= !m_scsibus->scsi_cd_r() << 5;
|
||||
data |= !m_scsibus->scsi_req_r() << 6;
|
||||
data |= !m_scsibus->scsi_io_r() << 7;
|
||||
|
||||
return data;
|
||||
}
|
||||
@ -953,9 +953,9 @@ WRITE8_MEMBER( bulletf_state::pio_pa_w )
|
||||
|
||||
*/
|
||||
|
||||
//scsi_atn_w(m_scsibus, !BIT(data, 0));
|
||||
scsi_rst_w(m_scsibus, !BIT(data, 1));
|
||||
scsi_sel_w(m_scsibus, !BIT(data, 2));
|
||||
//m_scsibus->scsi_atn_w(!BIT(data, 0));
|
||||
m_scsibus->scsi_rst_w(!BIT(data, 1));
|
||||
m_scsibus->scsi_sel_w(!BIT(data, 2));
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( bulletf_state::cstrb_w )
|
||||
@ -1036,7 +1036,7 @@ WRITE_LINE_MEMBER( bulletf_state::req_w )
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
scsi_ack_w(m_scsibus, 1);
|
||||
m_scsibus->scsi_ack_w(1);
|
||||
|
||||
m_wack = 1;
|
||||
}
|
||||
@ -1111,7 +1111,7 @@ void bullet_state::machine_start()
|
||||
void bulletf_state::machine_start()
|
||||
{
|
||||
// initialize SASI bus
|
||||
init_scsibus(m_scsibus, 512);
|
||||
m_scsibus->init_scsibus(512);
|
||||
|
||||
// state saving
|
||||
save_item(NAME(m_fdrdy));
|
||||
|
@ -363,11 +363,11 @@ READ8_MEMBER( v1050_state::sasi_status_r )
|
||||
|
||||
UINT8 data = 0;
|
||||
|
||||
data |= scsi_req_r(m_sasibus);
|
||||
data |= !scsi_bsy_r(m_sasibus) << 1;
|
||||
data |= !scsi_msg_r(m_sasibus) << 2;
|
||||
data |= !scsi_cd_r(m_sasibus) << 3;
|
||||
data |= scsi_io_r(m_sasibus) << 4;
|
||||
data |= m_sasibus->scsi_req_r();
|
||||
data |= !m_sasibus->scsi_bsy_r() << 1;
|
||||
data |= !m_sasibus->scsi_msg_r() << 2;
|
||||
data |= !m_sasibus->scsi_cd_r() << 3;
|
||||
data |= m_sasibus->scsi_io_r() << 4;
|
||||
|
||||
return data;
|
||||
}
|
||||
@ -376,14 +376,14 @@ static TIMER_DEVICE_CALLBACK( sasi_ack_tick )
|
||||
{
|
||||
v1050_state *state = timer.machine().driver_data<v1050_state>();
|
||||
|
||||
scsi_ack_w(state->m_sasibus, 1);
|
||||
state->m_sasibus->scsi_ack_w(1);
|
||||
}
|
||||
|
||||
static TIMER_DEVICE_CALLBACK( sasi_rst_tick )
|
||||
{
|
||||
v1050_state *state = timer.machine().driver_data<v1050_state>();
|
||||
|
||||
scsi_rst_w(state->m_sasibus, 1);
|
||||
state->m_sasibus->scsi_rst_w(1);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( v1050_state::sasi_ctrl_w )
|
||||
@ -403,12 +403,12 @@ WRITE8_MEMBER( v1050_state::sasi_ctrl_w )
|
||||
|
||||
*/
|
||||
|
||||
scsi_sel_w(m_sasibus, !BIT(data, 0));
|
||||
m_sasibus->scsi_sel_w(!BIT(data, 0));
|
||||
|
||||
if (BIT(data, 1))
|
||||
{
|
||||
// send acknowledge pulse
|
||||
scsi_ack_w(m_sasibus, 0);
|
||||
m_sasibus->scsi_ack_w(0);
|
||||
|
||||
m_timer_ack->adjust(attotime::from_nsec(100));
|
||||
}
|
||||
@ -416,7 +416,7 @@ WRITE8_MEMBER( v1050_state::sasi_ctrl_w )
|
||||
if (BIT(data, 7))
|
||||
{
|
||||
// send reset pulse
|
||||
scsi_rst_w(m_sasibus, 0);
|
||||
m_sasibus->scsi_rst_w(0);
|
||||
|
||||
m_timer_rst->adjust(attotime::from_nsec(100));
|
||||
}
|
||||
@ -450,7 +450,7 @@ static ADDRESS_MAP_START( v1050_io, AS_IO, 8, v1050_state )
|
||||
AM_RANGE(0xb0, 0xb0) AM_READWRITE(dint_clr_r, dint_clr_w)
|
||||
AM_RANGE(0xc0, 0xc0) AM_WRITE(v1050_i8214_w)
|
||||
AM_RANGE(0xd0, 0xd0) AM_WRITE(bank_w)
|
||||
AM_RANGE(0xe0, 0xe0) AM_DEVREADWRITE_LEGACY(SASIBUS_TAG, scsi_data_r, scsi_data_w)
|
||||
AM_RANGE(0xe0, 0xe0) AM_DEVREADWRITE(SASIBUS_TAG, scsibus_device, scsi_data_r, scsi_data_w)
|
||||
AM_RANGE(0xe1, 0xe1) AM_READWRITE(sasi_status_r, sasi_ctrl_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -1030,7 +1030,7 @@ void v1050_state::machine_start()
|
||||
address_space *program = m_maincpu->memory().space(AS_PROGRAM);
|
||||
|
||||
// initialize SASI bus
|
||||
init_scsibus(m_sasibus, 256);
|
||||
m_sasibus->init_scsibus(256);
|
||||
|
||||
// initialize I8214
|
||||
m_pic->etlg_w(1);
|
||||
|
@ -104,7 +104,7 @@ public:
|
||||
m_scsibus(*this, SCSIBUS_TAG)
|
||||
{ }
|
||||
|
||||
required_device<device_t> m_scsibus;
|
||||
required_device<scsibus_device> m_scsibus;
|
||||
|
||||
virtual void machine_start();
|
||||
virtual void machine_reset();
|
||||
|
@ -336,7 +336,7 @@ void nimbus_scsi_linechange(device_t *device, UINT8 line, UINT8 state);
|
||||
|
||||
#define FDC_SIDE() ((state->m_nimbus_drives.reg400 & FDC_SIDE_MASK) >> 4)
|
||||
#define FDC_MOTOR() ((state->m_nimbus_drives.reg400 & FDC_MOTOR_MASKO) >> 5)
|
||||
#define FDC_DRIVE() (scsibus_driveno(state->m_nimbus_drives.reg400 & FDC_DRIVE_MASK))
|
||||
#define FDC_DRIVE() (fdc_driveno(state->m_nimbus_drives.reg400 & FDC_DRIVE_MASK))
|
||||
#define HDC_DRQ_ENABLED() ((state->m_nimbus_drives.reg400 & HDC_DRQ_MASK) ? 1 : 0)
|
||||
#define FDC_DRQ_ENABLED(state) ((state->m_nimbus_drives.reg400 & FDC_DRQ_MASK) ? 1 : 0)
|
||||
|
||||
|
@ -94,7 +94,7 @@ public:
|
||||
required_device<timer_device> m_timer_sio;
|
||||
required_device<timer_device> m_timer_ack;
|
||||
required_device<timer_device> m_timer_rst;
|
||||
required_device<device_t> m_sasibus;
|
||||
required_device<scsibus_device> m_sasibus;
|
||||
|
||||
virtual void machine_start();
|
||||
virtual void machine_reset();
|
||||
|
@ -387,10 +387,10 @@ READ8_MEMBER( base_d9060_device::via_pb_r )
|
||||
|
||||
UINT8 data = 0;
|
||||
|
||||
data |= !scsi_cd_r(m_sasibus) << 2;
|
||||
data |= !scsi_bsy_r(m_sasibus) << 3;
|
||||
data |= !scsi_io_r(m_sasibus) << 6;
|
||||
data |= !scsi_msg_r(m_sasibus) << 7;
|
||||
data |= !m_sasibus->scsi_cd_r() << 2;
|
||||
data |= !m_sasibus->scsi_bsy_r() << 3;
|
||||
data |= !m_sasibus->scsi_io_r() << 6;
|
||||
data |= !m_sasibus->scsi_msg_r() << 7;
|
||||
|
||||
// drive type
|
||||
data |= (m_variant == TYPE_9060) << 4;
|
||||
@ -415,18 +415,18 @@ WRITE8_MEMBER( base_d9060_device::via_pb_w )
|
||||
|
||||
*/
|
||||
|
||||
scsi_sel_w(m_sasibus, !BIT(data, 0));
|
||||
scsi_rst_w(m_sasibus, !BIT(data, 1));
|
||||
m_sasibus->scsi_sel_w(!BIT(data, 0));
|
||||
m_sasibus->scsi_rst_w(!BIT(data, 1));
|
||||
}
|
||||
|
||||
READ_LINE_MEMBER( base_d9060_device::req_r )
|
||||
{
|
||||
return !scsi_req_r(m_sasibus);
|
||||
return !m_sasibus->scsi_req_r();
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( base_d9060_device::ack_w )
|
||||
{
|
||||
scsi_ack_w(m_sasibus, state);
|
||||
m_sasibus->scsi_ack_w(state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( base_d9060_device::enable_w )
|
||||
@ -436,14 +436,14 @@ WRITE_LINE_MEMBER( base_d9060_device::enable_w )
|
||||
|
||||
static const via6522_interface via_intf =
|
||||
{
|
||||
DEVCB_DEVICE_HANDLER(SASIBUS_TAG, scsi_data_r),
|
||||
DEVCB_DEVICE_MEMBER(SASIBUS_TAG, scsibus_device, scsi_data_r),
|
||||
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_d9060_device, via_pb_r),
|
||||
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_d9060_device, req_r),
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
|
||||
DEVCB_DEVICE_HANDLER(SASIBUS_TAG, scsi_data_w),
|
||||
DEVCB_DEVICE_MEMBER(SASIBUS_TAG, scsibus_device, scsi_data_w),
|
||||
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_d9060_device, via_pb_w),
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
@ -571,7 +571,7 @@ void base_d9060_device::device_start()
|
||||
|
||||
void base_d9060_device::device_reset()
|
||||
{
|
||||
init_scsibus(m_sasibus, 256);
|
||||
m_sasibus->init_scsibus(256);
|
||||
|
||||
m_maincpu->set_input_line(M6502_SET_OVERFLOW, ASSERT_LINE);
|
||||
m_maincpu->set_input_line(M6502_SET_OVERFLOW, CLEAR_LINE);
|
||||
|
@ -91,7 +91,7 @@ private:
|
||||
required_device<riot6532_device> m_riot0;
|
||||
required_device<riot6532_device> m_riot1;
|
||||
required_device<via6522_device> m_via;
|
||||
required_device<device_t> m_sasibus;
|
||||
required_device<scsibus_device> m_sasibus;
|
||||
|
||||
// IEEE-488 bus
|
||||
int m_rfdo; // not ready for data output
|
||||
|
@ -274,7 +274,7 @@ WRITE_LINE_MEMBER( e01_device::scsi_bsy_w )
|
||||
{
|
||||
if (!state)
|
||||
{
|
||||
scsi_sel_w(m_scsibus, 1);
|
||||
m_scsibus->scsi_sel_w(1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -282,7 +282,7 @@ WRITE_LINE_MEMBER( e01_device::scsi_req_w )
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
scsi_ack_w(m_scsibus, 1);
|
||||
m_scsibus->scsi_ack_w(1);
|
||||
}
|
||||
|
||||
m_hdc_irq = !state;
|
||||
@ -564,7 +564,7 @@ void e01_device::device_start()
|
||||
|
||||
void e01_device::device_reset()
|
||||
{
|
||||
init_scsibus(m_scsibus, 512);
|
||||
m_scsibus->init_scsibus(512);
|
||||
|
||||
m_clk_timer->adjust(attotime::zero, 0, attotime::from_hz(200000));
|
||||
|
||||
@ -697,9 +697,9 @@ WRITE8_MEMBER( e01_device::network_irq_enable_w )
|
||||
|
||||
READ8_MEMBER( e01_device::hdc_data_r )
|
||||
{
|
||||
UINT8 data = scsi_data_r(m_scsibus, 0);
|
||||
UINT8 data = m_scsibus->scsi_data_r(space, 0);
|
||||
|
||||
scsi_ack_w(m_scsibus, 0);
|
||||
m_scsibus->scsi_ack_w(0);
|
||||
|
||||
return data;
|
||||
}
|
||||
@ -711,9 +711,9 @@ READ8_MEMBER( e01_device::hdc_data_r )
|
||||
|
||||
WRITE8_MEMBER( e01_device::hdc_data_w )
|
||||
{
|
||||
scsi_data_w(m_scsibus, 0, data);
|
||||
m_scsibus->scsi_data_w(space, 0, data);
|
||||
|
||||
scsi_ack_w(m_scsibus, 0);
|
||||
m_scsibus->scsi_ack_w(0);
|
||||
}
|
||||
|
||||
|
||||
@ -741,11 +741,11 @@ READ8_MEMBER( e01_device::hdc_status_r )
|
||||
UINT8 data = 0;
|
||||
|
||||
// SCSI bus
|
||||
data |= !scsi_msg_r(m_scsibus);
|
||||
data |= !scsi_bsy_r(m_scsibus) << 1;
|
||||
data |= !scsi_req_r(m_scsibus) << 5;
|
||||
data |= !scsi_io_r(m_scsibus) << 6;
|
||||
data |= !scsi_cd_r(m_scsibus) << 7;
|
||||
data |= !m_scsibus->scsi_msg_r();
|
||||
data |= !m_scsibus->scsi_bsy_r() << 1;
|
||||
data |= !m_scsibus->scsi_req_r() << 5;
|
||||
data |= !m_scsibus->scsi_io_r() << 6;
|
||||
data |= !m_scsibus->scsi_cd_r() << 7;
|
||||
|
||||
// TODO NIRQ
|
||||
|
||||
@ -759,7 +759,7 @@ READ8_MEMBER( e01_device::hdc_status_r )
|
||||
|
||||
WRITE8_MEMBER( e01_device::hdc_select_w )
|
||||
{
|
||||
scsi_sel_w(m_scsibus, 0);
|
||||
m_scsibus->scsi_sel_w(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -85,7 +85,7 @@ protected:
|
||||
required_device<device_t> m_adlc;
|
||||
required_device<mc146818_device> m_rtc;
|
||||
required_device<ram_device> m_ram;
|
||||
required_device<device_t> m_scsibus;
|
||||
required_device<scsibus_device> m_scsibus;
|
||||
|
||||
inline void update_interrupts();
|
||||
inline void network_irq_enable(int enabled);
|
||||
|
@ -42,7 +42,7 @@ WRITE_LINE_MEMBER( luxor_4105_device::sasi_bsy_w )
|
||||
{
|
||||
if (!state)
|
||||
{
|
||||
scsi_sel_w(m_sasibus, 1);
|
||||
m_sasibus->scsi_sel_w(1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -50,7 +50,7 @@ WRITE_LINE_MEMBER( luxor_4105_device::sasi_io_w )
|
||||
{
|
||||
if (!m_io && state)
|
||||
{
|
||||
scsi_data_w(m_sasibus, m_data);
|
||||
m_sasibus->scsi_data_w(m_data);
|
||||
}
|
||||
|
||||
m_io = state;
|
||||
@ -62,7 +62,7 @@ WRITE_LINE_MEMBER( luxor_4105_device::sasi_req_w )
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
scsi_ack_w(m_sasibus, 1);
|
||||
m_sasibus->scsi_ack_w(1);
|
||||
}
|
||||
|
||||
update_trrq_int();
|
||||
@ -147,8 +147,8 @@ ioport_constructor luxor_4105_device::device_input_ports() const
|
||||
|
||||
inline void luxor_4105_device::update_trrq_int()
|
||||
{
|
||||
int cd = scsi_cd_r(m_sasibus);
|
||||
int req = scsi_req_r(m_sasibus);
|
||||
int cd = m_sasibus->scsi_cd_r();
|
||||
int req = m_sasibus->scsi_req_r();
|
||||
int trrq = !(cd & !req);
|
||||
|
||||
if (BIT(m_dma, 5))
|
||||
@ -210,14 +210,14 @@ void luxor_4105_device::device_start()
|
||||
|
||||
void luxor_4105_device::device_reset()
|
||||
{
|
||||
init_scsibus(m_sasibus, 512);
|
||||
m_sasibus->init_scsibus(512);
|
||||
|
||||
m_cs = 0;
|
||||
m_data = 0;
|
||||
m_dma = 0;
|
||||
|
||||
scsi_rst_w(m_sasibus, 0);
|
||||
scsi_rst_w(m_sasibus, 1);
|
||||
m_sasibus->scsi_rst_w(0);
|
||||
m_sasibus->scsi_rst_w(1);
|
||||
|
||||
m_slot->trrq_w(1);
|
||||
}
|
||||
@ -283,10 +283,10 @@ UINT8 luxor_4105_device::abc1600bus_stat()
|
||||
|
||||
*/
|
||||
|
||||
data = !scsi_bsy_r(m_sasibus);
|
||||
data |= !scsi_req_r(m_sasibus) << 2;
|
||||
data |= !scsi_cd_r(m_sasibus) << 3;
|
||||
data |= !scsi_io_r(m_sasibus) << 6;
|
||||
data = !m_sasibus->scsi_bsy_r();
|
||||
data |= !m_sasibus->scsi_req_r() << 2;
|
||||
data |= !m_sasibus->scsi_cd_r() << 3;
|
||||
data |= !m_sasibus->scsi_io_r() << 6;
|
||||
}
|
||||
|
||||
return data;
|
||||
@ -303,19 +303,19 @@ UINT8 luxor_4105_device::abc1600bus_inp()
|
||||
|
||||
if (m_cs)
|
||||
{
|
||||
if (scsi_bsy_r(m_sasibus))
|
||||
if (m_sasibus->scsi_bsy_r())
|
||||
{
|
||||
ioport("1E")->read();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!scsi_io_r(m_sasibus))
|
||||
if (!m_sasibus->scsi_io_r())
|
||||
{
|
||||
data = scsi_data_r(m_sasibus);
|
||||
data = m_sasibus->scsi_data_r();
|
||||
|
||||
if (!scsi_req_r(m_sasibus))
|
||||
if (!m_sasibus->scsi_req_r())
|
||||
{
|
||||
scsi_ack_w(m_sasibus, 0);
|
||||
m_sasibus->scsi_ack_w(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -335,13 +335,13 @@ void luxor_4105_device::abc1600bus_out(UINT8 data)
|
||||
{
|
||||
m_data = data;
|
||||
|
||||
if (scsi_io_r(m_sasibus))
|
||||
if (m_sasibus->scsi_io_r())
|
||||
{
|
||||
scsi_data_w(m_sasibus, m_data);
|
||||
m_sasibus->scsi_data_w(m_data);
|
||||
|
||||
if (!scsi_req_r(m_sasibus))
|
||||
if (!m_sasibus->scsi_req_r())
|
||||
{
|
||||
scsi_ack_w(m_sasibus, 0);
|
||||
m_sasibus->scsi_ack_w(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -356,7 +356,7 @@ void luxor_4105_device::abc1600bus_c1(UINT8 data)
|
||||
{
|
||||
if (m_cs)
|
||||
{
|
||||
scsi_sel_w(m_sasibus, 0);
|
||||
m_sasibus->scsi_sel_w(0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -372,8 +372,8 @@ void luxor_4105_device::abc1600bus_c3(UINT8 data)
|
||||
m_data = 0;
|
||||
m_dma = 0;
|
||||
|
||||
scsi_rst_w(m_sasibus, 0);
|
||||
scsi_rst_w(m_sasibus, 1);
|
||||
m_sasibus->scsi_rst_w(0);
|
||||
m_sasibus->scsi_rst_w(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -71,7 +71,7 @@ private:
|
||||
|
||||
abc1600bus_slot_device *m_slot;
|
||||
|
||||
required_device<device_t> m_sasibus;
|
||||
required_device<scsibus_device> m_sasibus;
|
||||
|
||||
int m_cs;
|
||||
int m_io;
|
||||
|
@ -2280,6 +2280,22 @@ static WRITE_LINE_DEVICE_HANDLER( nimbus_fdc_drq_w )
|
||||
drq_callback(device->machine(),1);
|
||||
}
|
||||
|
||||
static UINT8 fdc_driveno(UINT8 drivesel)
|
||||
{
|
||||
switch (drivesel)
|
||||
{
|
||||
case 0x01: return 0;
|
||||
case 0x02: return 1;
|
||||
case 0x04: return 2;
|
||||
case 0x08: return 3;
|
||||
case 0x10: return 4;
|
||||
case 0x20: return 5;
|
||||
case 0x40: return 6;
|
||||
case 0x80: return 7;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
0x410 read bits
|
||||
|
||||
@ -2297,7 +2313,7 @@ READ8_MEMBER(rmnimbus_state::nimbus_disk_r)
|
||||
{
|
||||
int result = 0;
|
||||
device_t *fdc = machine().device(FDC_TAG);
|
||||
device_t *hdc = machine().device(SCSIBUS_TAG);
|
||||
scsibus_device *hdc = machine().device<scsibus_device>(SCSIBUS_TAG);
|
||||
|
||||
int pc=cpu_get_pc(&space.device());
|
||||
rmnimbus_state *state = machine().driver_data<rmnimbus_state>();
|
||||
@ -2328,7 +2344,7 @@ READ8_MEMBER(rmnimbus_state::nimbus_disk_r)
|
||||
result=m_nimbus_drives.reg410_in ^ INV_BITS_410;
|
||||
break;
|
||||
case 0x18 :
|
||||
result = scsi_data_r(hdc);
|
||||
result = hdc->scsi_data_r();
|
||||
hdc_post_rw(machine());
|
||||
default:
|
||||
break;
|
||||
@ -2365,7 +2381,7 @@ READ8_MEMBER(rmnimbus_state::nimbus_disk_r)
|
||||
WRITE8_MEMBER(rmnimbus_state::nimbus_disk_w)
|
||||
{
|
||||
device_t *fdc = machine().device(FDC_TAG);
|
||||
device_t *hdc = machine().device(SCSIBUS_TAG);
|
||||
scsibus_device *hdc = machine().device<scsibus_device>(SCSIBUS_TAG);
|
||||
int pc=cpu_get_pc(&space.device());
|
||||
UINT8 reg400_old = m_nimbus_drives.reg400;
|
||||
|
||||
@ -2408,7 +2424,7 @@ WRITE8_MEMBER(rmnimbus_state::nimbus_disk_w)
|
||||
break;
|
||||
|
||||
case 0x18 :
|
||||
scsi_data_w(hdc, data);
|
||||
hdc->scsi_data_w(data);
|
||||
hdc_post_rw(machine());
|
||||
break;
|
||||
}
|
||||
@ -2417,16 +2433,16 @@ WRITE8_MEMBER(rmnimbus_state::nimbus_disk_w)
|
||||
static void hdc_reset(running_machine &machine)
|
||||
{
|
||||
rmnimbus_state *state = machine.driver_data<rmnimbus_state>();
|
||||
device_t *hdc = machine.device(SCSIBUS_TAG);
|
||||
scsibus_device *hdc = machine.device<scsibus_device>(SCSIBUS_TAG);
|
||||
|
||||
init_scsibus(hdc, 512);
|
||||
hdc->init_scsibus(512);
|
||||
|
||||
state->m_nimbus_drives.reg410_in=0;
|
||||
state->m_nimbus_drives.reg410_in |= (get_scsi_line(hdc,SCSI_LINE_REQ) ? HDC_REQ_MASK : 0);
|
||||
state->m_nimbus_drives.reg410_in |= (get_scsi_line(hdc,SCSI_LINE_CD) ? HDC_CD_MASK : 0);
|
||||
state->m_nimbus_drives.reg410_in |= (get_scsi_line(hdc,SCSI_LINE_IO) ? HDC_IO_MASK : 0);
|
||||
state->m_nimbus_drives.reg410_in |= (get_scsi_line(hdc,SCSI_LINE_BSY) ? HDC_BSY_MASK : 0);
|
||||
state->m_nimbus_drives.reg410_in |= (get_scsi_line(hdc,SCSI_LINE_MSG) ? HDC_MSG_MASK : 0);
|
||||
state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_REQ) ? HDC_REQ_MASK : 0);
|
||||
state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_CD) ? HDC_CD_MASK : 0);
|
||||
state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_IO) ? HDC_IO_MASK : 0);
|
||||
state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_BSY) ? HDC_BSY_MASK : 0);
|
||||
state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_MSG) ? HDC_MSG_MASK : 0);
|
||||
|
||||
state->m_nimbus_drives.drq_ff=0;
|
||||
}
|
||||
@ -2434,7 +2450,7 @@ static void hdc_reset(running_machine &machine)
|
||||
static void hdc_ctrl_write(running_machine &machine, UINT8 data)
|
||||
{
|
||||
rmnimbus_state *state = machine.driver_data<rmnimbus_state>();
|
||||
device_t *hdc = machine.device(SCSIBUS_TAG);
|
||||
scsibus_device *hdc = machine.device<scsibus_device>(SCSIBUS_TAG);
|
||||
|
||||
// If we enable the HDC interupt, and an interrupt is pending, go deal with it.
|
||||
if(((data & HDC_IRQ_MASK) && (~state->m_nimbus_drives.reg410_out & HDC_IRQ_MASK)) &&
|
||||
@ -2443,17 +2459,17 @@ static void hdc_ctrl_write(running_machine &machine, UINT8 data)
|
||||
|
||||
state->m_nimbus_drives.reg410_out=data;
|
||||
|
||||
set_scsi_line(hdc, SCSI_LINE_RESET, (data & HDC_RESET_MASK) ? 0 : 1);
|
||||
set_scsi_line(hdc, SCSI_LINE_SEL, (data & HDC_SEL_MASK) ? 0 : 1);
|
||||
hdc->set_scsi_line(SCSI_LINE_RESET, (data & HDC_RESET_MASK) ? 0 : 1);
|
||||
hdc->set_scsi_line(SCSI_LINE_SEL, (data & HDC_SEL_MASK) ? 0 : 1);
|
||||
}
|
||||
|
||||
static void hdc_post_rw(running_machine &machine)
|
||||
{
|
||||
rmnimbus_state *state = machine.driver_data<rmnimbus_state>();
|
||||
device_t *hdc = machine.device(SCSIBUS_TAG);
|
||||
scsibus_device *hdc = machine.device<scsibus_device>(SCSIBUS_TAG);
|
||||
|
||||
if((state->m_nimbus_drives.reg410_in & HDC_REQ_MASK)==0)
|
||||
set_scsi_line(hdc,SCSI_LINE_ACK,0);
|
||||
hdc->set_scsi_line(SCSI_LINE_ACK,0);
|
||||
|
||||
state->m_nimbus_drives.drq_ff=0;
|
||||
}
|
||||
@ -2506,7 +2522,10 @@ void nimbus_scsi_linechange(device_t *device, UINT8 line, UINT8 state)
|
||||
}
|
||||
}
|
||||
else
|
||||
set_scsi_line(device,SCSI_LINE_ACK,1);
|
||||
{
|
||||
scsibus_device *hdc = downcast<scsibus_device *>(device);
|
||||
hdc->set_scsi_line(SCSI_LINE_ACK,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -10,16 +10,33 @@
|
||||
#ifndef _SCSIBUS_H_
|
||||
#define _SCSIBUS_H_
|
||||
|
||||
#include "emu.h"
|
||||
#include "machine/scsi.h"
|
||||
#include "machine/scsidev.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
INTERFACE
|
||||
***************************************************************************/
|
||||
|
||||
typedef struct _SCSIBus_interface SCSIBus_interface;
|
||||
struct _SCSIBus_interface
|
||||
{
|
||||
const SCSIConfigTable *scsidevs; /* SCSI devices */
|
||||
void (*line_change_cb)(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_rst_func;
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
MACROS
|
||||
***************************************************************************/
|
||||
|
||||
DECLARE_LEGACY_DEVICE(SCSIBUS, scsibus);
|
||||
|
||||
#define MCFG_SCSIBUS_ADD(_tag, _intrf) \
|
||||
MCFG_DEVICE_ADD(_tag, SCSIBUS, 0) \
|
||||
MCFG_DEVICE_CONFIG(_intrf)
|
||||
@ -85,10 +102,10 @@ DECLARE_LEGACY_DEVICE(SCSIBUS, scsibus);
|
||||
#define XEBEC_PARAMS_SIZE 0x08
|
||||
#define XEBEC_ALT_TRACK_SIZE 0x03
|
||||
|
||||
#define IS_COMMAND(cmd) (bus->command[0]==cmd)
|
||||
#define IS_READ_COMMAND() ((bus->command[0]==0x08) || (bus->command[0]==0x28) || (bus->command[0]==0xa8))
|
||||
#define IS_WRITE_COMMAND() ((bus->command[0]==0x0a) || (bus->command[0]==0x2a))
|
||||
#define SET_STATUS_SENSE(stat,sen) { bus->status=(stat); bus->sense=(sen); }
|
||||
#define IS_COMMAND(cmd) (command[0]==cmd)
|
||||
#define IS_READ_COMMAND() ((command[0]==0x08) || (command[0]==0x28) || (command[0]==0xa8))
|
||||
#define IS_WRITE_COMMAND() ((command[0]==0x0a) || (command[0]==0x2a))
|
||||
#define SET_STATUS_SENSE(stat,sen) { status=(stat); sense=(sen); }
|
||||
|
||||
#define FORMAT_UNIT_TIMEOUT 5
|
||||
|
||||
@ -150,70 +167,106 @@ typedef struct
|
||||
UINT8 sectors_per_track;
|
||||
} adaptec_sense_t;
|
||||
|
||||
/***************************************************************************
|
||||
INTERFACE
|
||||
***************************************************************************/
|
||||
|
||||
typedef struct _SCSIBus_interface SCSIBus_interface;
|
||||
struct _SCSIBus_interface
|
||||
class scsibus_device : public device_t,
|
||||
public SCSIBus_interface
|
||||
{
|
||||
const SCSIConfigTable *scsidevs; /* SCSI devices */
|
||||
void (*line_change_cb)(device_t *device, UINT8 line, UINT8 state);
|
||||
public:
|
||||
// construction/destruction
|
||||
scsibus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
/* SCSI Bus read/write */
|
||||
|
||||
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_rst_func;
|
||||
UINT8 scsi_data_r();
|
||||
void scsi_data_w( UINT8 data );
|
||||
DECLARE_READ8_MEMBER( scsi_data_r );
|
||||
DECLARE_WRITE8_MEMBER( scsi_data_w );
|
||||
|
||||
/* Get/Set lines */
|
||||
|
||||
UINT8 get_scsi_line(UINT8 lineno);
|
||||
void set_scsi_line(UINT8 line, UINT8 state);
|
||||
|
||||
DECLARE_READ_LINE_MEMBER( scsi_bsy_r );
|
||||
DECLARE_READ_LINE_MEMBER( scsi_sel_r );
|
||||
DECLARE_READ_LINE_MEMBER( scsi_cd_r );
|
||||
DECLARE_READ_LINE_MEMBER( scsi_io_r );
|
||||
DECLARE_READ_LINE_MEMBER( scsi_msg_r );
|
||||
DECLARE_READ_LINE_MEMBER( scsi_req_r );
|
||||
DECLARE_READ_LINE_MEMBER( scsi_ack_r );
|
||||
DECLARE_READ_LINE_MEMBER( scsi_rst_r );
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER( scsi_bsy_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( scsi_sel_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( scsi_cd_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( scsi_io_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( scsi_msg_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( scsi_req_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( scsi_ack_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( scsi_rst_w );
|
||||
|
||||
/* Initialisation at machine reset time */
|
||||
void init_scsibus(int sectorbytes);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_config_complete();
|
||||
virtual void device_start();
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||
|
||||
private:
|
||||
int get_scsi_cmd_len(int cbyte);
|
||||
UINT8 scsibus_driveno(UINT8 drivesel);
|
||||
void scsi_change_phase(UINT8 newphase);
|
||||
void set_scsi_line_now(UINT8 line, UINT8 state);
|
||||
void set_scsi_line_ack(UINT8 state);
|
||||
void scsi_in_line_changed(UINT8 line, UINT8 state);
|
||||
void scsi_out_line_change(UINT8 line, UINT8 state);
|
||||
void scsi_out_line_change_now(UINT8 line, UINT8 state);
|
||||
void scsi_out_line_req(UINT8 state);
|
||||
void scsibus_read_data();
|
||||
void scsibus_write_data();
|
||||
int datain_done();
|
||||
int dataout_done();
|
||||
void scsibus_exec_command();
|
||||
void check_process_dataout();
|
||||
void dump_command_bytes();
|
||||
void dump_data_bytes(int count);
|
||||
void dump_bytes(UINT8 *buff, int count);
|
||||
|
||||
scsidev_device *devices[8];
|
||||
|
||||
devcb_resolved_write_line out_bsy_func;
|
||||
devcb_resolved_write_line out_sel_func;
|
||||
devcb_resolved_write_line out_cd_func;
|
||||
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_rst_func;
|
||||
|
||||
UINT8 linestate;
|
||||
UINT8 last_id;
|
||||
UINT8 phase;
|
||||
|
||||
UINT8 command[CMD_BUF_SIZE];
|
||||
UINT8 cmd_idx;
|
||||
UINT8 is_linked;
|
||||
|
||||
UINT8 status;
|
||||
UINT8 sense;
|
||||
|
||||
UINT8 buffer[ADAPTEC_BUF_SIZE];
|
||||
UINT16 data_idx;
|
||||
int xfer_count;
|
||||
int bytes_left;
|
||||
int data_last;
|
||||
int sectorbytes;
|
||||
|
||||
emu_timer *req_timer;
|
||||
emu_timer *ack_timer;
|
||||
emu_timer *sel_timer;
|
||||
emu_timer *dataout_timer;
|
||||
};
|
||||
|
||||
/* SCSI Bus read/write */
|
||||
|
||||
UINT8 scsi_data_r(device_t *device);
|
||||
void scsi_data_w(device_t *device, UINT8 data);
|
||||
|
||||
READ8_DEVICE_HANDLER( scsi_data_r );
|
||||
WRITE8_DEVICE_HANDLER( scsi_data_w );
|
||||
|
||||
/* Get/Set lines */
|
||||
|
||||
UINT8 get_scsi_lines(device_t *device);
|
||||
UINT8 get_scsi_line(device_t *device, UINT8 lineno);
|
||||
void set_scsi_line(device_t *device, UINT8 line, UINT8 state);
|
||||
|
||||
READ_LINE_DEVICE_HANDLER( scsi_bsy_r );
|
||||
READ_LINE_DEVICE_HANDLER( scsi_sel_r );
|
||||
READ_LINE_DEVICE_HANDLER( scsi_cd_r );
|
||||
READ_LINE_DEVICE_HANDLER( scsi_io_r );
|
||||
READ_LINE_DEVICE_HANDLER( scsi_msg_r );
|
||||
READ_LINE_DEVICE_HANDLER( scsi_req_r );
|
||||
READ_LINE_DEVICE_HANDLER( scsi_ack_r );
|
||||
READ_LINE_DEVICE_HANDLER( scsi_rst_r );
|
||||
|
||||
WRITE_LINE_DEVICE_HANDLER( scsi_bsy_w );
|
||||
WRITE_LINE_DEVICE_HANDLER( scsi_sel_w );
|
||||
WRITE_LINE_DEVICE_HANDLER( scsi_cd_w );
|
||||
WRITE_LINE_DEVICE_HANDLER( scsi_io_w );
|
||||
WRITE_LINE_DEVICE_HANDLER( scsi_msg_w );
|
||||
WRITE_LINE_DEVICE_HANDLER( scsi_req_w );
|
||||
WRITE_LINE_DEVICE_HANDLER( scsi_ack_w );
|
||||
WRITE_LINE_DEVICE_HANDLER( scsi_rst_w );
|
||||
|
||||
/* Get current bus phase */
|
||||
|
||||
UINT8 get_scsi_phase(device_t *device);
|
||||
|
||||
/* utility functions */
|
||||
|
||||
/* get a drive's number from it's select line */
|
||||
UINT8 scsibus_driveno(UINT8 drivesel);
|
||||
|
||||
/* get the number of bytes for a scsi command */
|
||||
int get_scsi_cmd_len(int cbyte);
|
||||
|
||||
/* Initialisation at machine reset time */
|
||||
void init_scsibus(device_t *device, int sectorbytes);
|
||||
// device type definition
|
||||
extern const device_type SCSIBUS;
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user