(MESS) converted scsibus from legacy device to c++ (nw)

This commit is contained in:
smf- 2012-08-26 14:25:29 +00:00
parent 10511fec79
commit 013bd9ab94
14 changed files with 892 additions and 943 deletions

View File

@ -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));

View File

@ -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);

View File

@ -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();

View File

@ -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)

View File

@ -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();

View File

@ -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);

View File

@ -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

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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

View File

@ -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