From f84ca47069e787fbee7501d1a4c89f778a597098 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Wed, 5 Apr 2023 18:30:30 +0700 Subject: [PATCH] mpc3000,segas32,x68k: switch to nscsi mb89352 implementation --- src/devices/bus/x68k/x68k_scsiext.cpp | 61 +++++++++++++-------------- src/devices/bus/x68k/x68k_scsiext.h | 7 +-- src/mame/akai/mpc3000.cpp | 26 +++++++++--- src/mame/sega/segas32.cpp | 52 +++++++++++------------ src/mame/sharp/x68k.cpp | 45 ++++++++++++-------- src/mame/sharp/x68k.h | 4 +- 6 files changed, 103 insertions(+), 92 deletions(-) diff --git a/src/devices/bus/x68k/x68k_scsiext.cpp b/src/devices/bus/x68k/x68k_scsiext.cpp index bec669ef1f5..a5f8a984567 100644 --- a/src/devices/bus/x68k/x68k_scsiext.cpp +++ b/src/devices/bus/x68k/x68k_scsiext.cpp @@ -11,9 +11,8 @@ #include "emu.h" #include "x68k_scsiext.h" -#include "bus/scsi/scsi.h" -#include "bus/scsi/scsihd.h" -#include "machine/mb89352.h" +#include "bus/nscsi/hd.h" +#include "machine/mb87030.h" //************************************************************************** @@ -36,41 +35,49 @@ const tiny_rom_entry *x68k_scsiext_device::device_rom_region() const return ROM_NAME( x68k_cz6bs1 ); } +static void scsi_devices(device_slot_interface &device) +{ + device.option_add("harddisk", NSCSI_HARDDISK); +} + // device machine config void x68k_scsiext_device::device_add_mconfig(machine_config &config) { - SCSI_PORT(config, m_scsibus); - m_scsibus->set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); - m_scsibus->set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1)); - m_scsibus->set_slot_device(3, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_2)); - m_scsibus->set_slot_device(4, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_3)); - m_scsibus->set_slot_device(5, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4)); - m_scsibus->set_slot_device(6, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5)); - m_scsibus->set_slot_device(7, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6)); + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:0", scsi_devices, "harddisk"); + NSCSI_CONNECTOR(config, "scsi:1", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:2", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:3", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:7").option_set("spc", MB89352).machine_config( + [this](device_t *device) + { + mb89352_device &spc = downcast(*device); - MB89352A(config, m_spc); - m_spc->set_scsi_port(m_scsibus); - m_spc->irq_cb().set(FUNC(x68k_scsiext_device::irq_w)); - m_spc->drq_cb().set(FUNC(x68k_scsiext_device::drq_w)); + spc.set_clock(8'000'000); // ? + spc.out_irq_callback().set(*this, FUNC(x68k_scsiext_device::irq_w)); + spc.out_dreq_callback().set(*this, FUNC(x68k_scsiext_device::drq_w)); + }); } x68k_scsiext_device::x68k_scsiext_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, X68K_SCSIEXT, tag, owner, clock) , device_x68k_expansion_card_interface(mconfig, *this) - , m_slot(nullptr), - m_scsibus(*this, "scsi"), - m_spc(*this, "mb89352") + , m_slot(nullptr) + , m_spc(*this, "scsi:7:spc") + , m_rom(*this, "scsiexrom") { } void x68k_scsiext_device::device_start() { - uint8_t *ROM = machine().root_device().memregion(subtag("scsiexrom").c_str())->base(); - m_slot = dynamic_cast(owner()); - m_slot->space().install_rom(0xea0020,0xea1fff,ROM); + + m_slot->space().install_rom(0xea0020,0xea1fff, m_rom.target()); m_slot->space().unmap_write(0xea0020,0xea1fff); - m_slot->space().install_readwrite_handler(0xea0000,0xea001f, read8sm_delegate(*this, FUNC(x68k_scsiext_device::register_r)), write8sm_delegate(*this, FUNC(x68k_scsiext_device::register_w)), 0x00ff00ff); + m_slot->space().install_device(0xea0000, 0xea001f, *m_spc, &mb89352_device::map, 0x00ff00ff); } void x68k_scsiext_device::device_reset() @@ -91,13 +98,3 @@ void x68k_scsiext_device::drq_w(int state) { // TODO } - -uint8_t x68k_scsiext_device::register_r(offs_t offset) -{ - return m_spc->mb89352_r(offset); -} - -void x68k_scsiext_device::register_w(offs_t offset, uint8_t data) -{ - m_spc->mb89352_w(offset,data); -} diff --git a/src/devices/bus/x68k/x68k_scsiext.h b/src/devices/bus/x68k/x68k_scsiext.h index c3be3ab84b5..7d48d958730 100644 --- a/src/devices/bus/x68k/x68k_scsiext.h +++ b/src/devices/bus/x68k/x68k_scsiext.h @@ -12,7 +12,7 @@ #pragma once #include "x68kexp.h" -#include "machine/mb89352.h" +#include "machine/mb87030.h" class x68k_scsiext_device : public device_t, public device_x68k_expansion_card_interface @@ -21,9 +21,6 @@ public: // construction/destruction x68k_scsiext_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - uint8_t register_r(offs_t offset); - void register_w(offs_t offset, uint8_t data); - protected: // device-level overrides virtual void device_start() override; @@ -40,8 +37,8 @@ private: x68k_expansion_slot_device *m_slot; - required_device m_scsibus; required_device m_spc; + required_region_ptr m_rom; }; // device type definition diff --git a/src/mame/akai/mpc3000.cpp b/src/mame/akai/mpc3000.cpp index 100337e8cba..8e6f5489d3f 100644 --- a/src/mame/akai/mpc3000.cpp +++ b/src/mame/akai/mpc3000.cpp @@ -67,13 +67,14 @@ MPCs on other hardware: #include "sound/l7a1045_l6028_dsp_a.h" #include "video/hd61830.h" #include "bus/midi/midi.h" +#include "bus/nscsi/devices.h" #include "speaker.h" #include "screen.h" #include "emupal.h" #include "machine/74259.h" #include "machine/i8255.h" #include "machine/input_merger.h" -#include "machine/mb89352.h" +#include "machine/mb87030.h" #include "machine/pit8253.h" #include "machine/upd765.h" @@ -157,7 +158,7 @@ void mpc3000_state::mpc3000_io_map(address_map &map) map(0x0060, 0x0067).rw(m_dsp, FUNC(l7a1045_sound_device::l7a1045_sound_r), FUNC(l7a1045_sound_device::l7a1045_sound_w)); map(0x0068, 0x0069).rw(FUNC(mpc3000_state::dsp_0008_hack_r), FUNC(mpc3000_state::dsp_0008_hack_w)); map(0x0080, 0x0087).rw("dioexp", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); - map(0x00a0, 0x00bf).rw("spc", FUNC(mb89352_device::mb89352_r), FUNC(mb89352_device::mb89352_w)).umask16(0x00ff); + map(0x00a0, 0x00bf).m("scsi:7:spc", FUNC(mb89352_device::map)).umask16(0x00ff); //map(0x00c0, 0x00c7).rw("sio", FUNC(te7774_device::read0), FUNC(te7774_device::write0)).umask16(0x00ff); //map(0x00c8, 0x00cf).rw("sio", FUNC(te7774_device::read1), FUNC(te7774_device::write1)).umask16(0x00ff); //map(0x00d0, 0x00d7).rw("sio", FUNC(te7774_device::read2), FUNC(te7774_device::write2)).umask16(0x00ff); @@ -274,12 +275,23 @@ void mpc3000_state::mpc3000(machine_config &config) midiout_slot(MIDI_PORT(config, "mdout")); - mb89352_device &spc(MB89352A(config, "spc", 16_MHz_XTAL / 2)); - spc.set_scsi_port("scsi"); - spc.irq_cb().set("intp3", FUNC(input_merger_device::in_w<1>)); - spc.drq_cb().set(m_maincpu, FUNC(v53a_device::dreq_w<0>)); + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:7").option_set("spc", MB89352).machine_config( + [this](device_t *device) + { + mb89352_device &spc = downcast(*device); - SCSI_PORT(config, "scsi"); + spc.set_clock(16_MHz_XTAL / 2); + spc.out_irq_callback().set(":intp3", FUNC(input_merger_device::in_w<1>)); + spc.out_dreq_callback().set(m_maincpu, FUNC(v53a_device::dreq_w<0>)); + }); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); diff --git a/src/mame/sega/segas32.cpp b/src/mame/sega/segas32.cpp index 276aa8a1409..8716e8b4ee6 100644 --- a/src/mame/sega/segas32.cpp +++ b/src/mame/sega/segas32.cpp @@ -527,8 +527,7 @@ orunners: Interleaved with the dj and << >> buttons is the data the drives the #include "emu.h" #include "segas32.h" -#include "bus/scsi/scsi.h" -#include "bus/scsi/scsicd.h" +#include "bus/nscsi/cd.h" #include "cpu/z80/z80.h" #include "cpu/v60/v60.h" #include "cpu/nec/v25.h" @@ -537,7 +536,7 @@ orunners: Interleaved with the dj and << >> buttons is the data the drives the #include "machine/eepromser.h" #include "machine/i8255.h" #include "machine/mb8421.h" -#include "machine/mb89352.h" +#include "machine/mb87030.h" #include "machine/msm6253.h" #include "machine/upd4701.h" #include "315_5296.h" @@ -548,12 +547,6 @@ orunners: Interleaved with the dj and << >> buttons is the data the drives the #include "layout/generic.h" #include "radr.lh" -/* - * TODO: Kokoroji hangs if CD comms are handled with current mb89352 core. - * We currently hide this behind a compile switch to aid development - */ -#define S32_KOKOROJI_TEST_CD 0 - DEFINE_DEVICE_TYPE(SEGA_S32_PCB, segas32_state, "segas32_pcb", "Sega System 32 PCB") segas32_state::segas32_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) @@ -2518,19 +2511,13 @@ void segas32_state::system32_cd_map(address_map &map) { map.unmap_value_high(); system32_map(map); - #if S32_KOKOROJI_TEST_CD - map(0xc00040, 0xc0005f).mirror(0x0fff80).rw("mb89352", FUNC(mb89352_device::mb89352_r), FUNC(mb89352_device::mb89352_w)).umask16(0x00ff); - #else - map(0xc00040, 0xc0005f).mirror(0x0fff80).noprw(); - #endif + map(0xc00040, 0xc0005f).mirror(0x0fff80).m("scsi:7:spc", FUNC(mb89352_device::map)).umask16(0x00ff); map(0xc00060, 0xc0006f).mirror(0x0fff80).rw("cxdio", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff); } -void segas32_cd_state::cdrom_config(device_t *device) +static void scsi_devices(device_slot_interface &device) { - cdda_device *cdda = device->subdevice("cdda"); - cdda->add_route(0, "^^lspeaker", 1.0); - cdda->add_route(1, "^^rspeaker", 1.0); + device.option_add("cdrom", NSCSI_CDROM); } void segas32_cd_state::device_add_mconfig(machine_config &config) @@ -2539,14 +2526,23 @@ void segas32_cd_state::device_add_mconfig(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &segas32_cd_state::system32_cd_map); - mb89352_device &scsictrl(MB89352A(config, "mb89352", 8000000)); - scsictrl.set_scsi_port("scsi"); - scsictrl.irq_cb().set(FUNC(segas32_cd_state::scsi_irq_w)); - scsictrl.drq_cb().set(FUNC(segas32_cd_state::scsi_drq_w)); + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:0", scsi_devices, "cdrom"); + NSCSI_CONNECTOR(config, "scsi:1", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:2", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:3", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:7").option_set("spc", MB89352).machine_config( + [this](device_t *device) + { + mb89352_device &spc = downcast(*device); - scsi_port_device &scsi(SCSI_PORT(config, "scsi")); - scsi.set_slot_device(1, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); - scsi.slot(1).set_option_machine_config("cdrom", cdrom_config); + spc.set_clock(8000000); + spc.out_irq_callback().set(*this, FUNC(segas32_cd_state::scsi_irq_w)); + spc.out_dreq_callback().set(*this, FUNC(segas32_cd_state::scsi_drq_w)); + }); cxd1095_device &cxdio(CXD1095(config, "cxdio")); cxdio.out_porta_cb().set(FUNC(segas32_cd_state::lamps1_w)); @@ -4320,7 +4316,7 @@ ROM_START( kokoroj ) ROM_LOAD64_WORD( "mpr-15534.ic25", 0x800006, 0x200000, CRC(4fa5c56d) SHA1(52926bef0f21ef17dc9d49e3137712bf6d8c29af) ) // Audio CD - DISK_REGION( "mainpcb:scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "mainpcb:scsi:0:cdrom" ) DISK_IMAGE_READONLY( "kokoroj", 0, NO_DUMP ) ROM_END @@ -4350,7 +4346,7 @@ ROM_START( kokoroja ) ROM_LOAD64_WORD( "mpr-15534.ic25", 0x800006, 0x200000, CRC(4fa5c56d) SHA1(52926bef0f21ef17dc9d49e3137712bf6d8c29af) ) // Audio CD - DISK_REGION( "mainpcb:scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "mainpcb:scsi:0:cdrom" ) DISK_IMAGE_READONLY( "kokoroj", 0, NO_DUMP ) ROM_END @@ -4391,7 +4387,7 @@ ROM_START( kokoroj2 ) ROM_LOAD64_WORD( "mpr-16196.ic25", 0x800006, 0x200000, CRC(b8e22e05) SHA1(dd667e2c5d421cba356421825e6aca9b5ca0af45) ) /* AUDIO CD */ - DISK_REGION( "mainpcb:scsi:" SCSI_PORT_DEVICE1 ":cdrom" ) + DISK_REGION( "mainpcb:scsi:0:cdrom" ) DISK_IMAGE_READONLY( "cdp-00146", 0, SHA1(0b37e0ea2380ecd9abef2ccd6a8096d76d2ba344) ) ROM_END diff --git a/src/mame/sharp/x68k.cpp b/src/mame/sharp/x68k.cpp index 81ece85b547..0a365e52c60 100644 --- a/src/mame/sharp/x68k.cpp +++ b/src/mame/sharp/x68k.cpp @@ -125,9 +125,8 @@ #include "bus/x68k/x68k_neptunex.h" #include "bus/x68k/x68k_scsiext.h" #include "bus/x68k/x68k_midi.h" -#include "bus/scsi/scsi.h" -#include "bus/scsi/scsihd.h" -#include "bus/scsi/scsicd.h" +#include "bus/nscsi/hd.h" +#include "bus/nscsi/cd.h" #include "softlist.h" #include "speaker.h" @@ -1036,7 +1035,7 @@ void x68ksupr_state::x68kxvi_map(address_map &map) map(0xe82200, 0xe823ff).rw(m_pcgpalette, FUNC(palette_device::read16), FUNC(palette_device::write16)).share("pcgpalette"); map(0xe92001, 0xe92001).rw(m_okim6258, FUNC(okim6258_device::status_r), FUNC(okim6258_device::ctrl_w)); map(0xe92003, 0xe92003).rw(m_okim6258, FUNC(okim6258_device::status_r), FUNC(okim6258_device::data_w)); - map(0xe96020, 0xe9603f).rw(m_scsictrl, FUNC(mb89352_device::mb89352_r), FUNC(mb89352_device::mb89352_w)).umask16(0x00ff); + map(0xe96020, 0xe9603f).m(m_scsictrl, FUNC(mb89352_device::map)).umask16(0x00ff); map(0xea0000, 0xea1fff).rw(FUNC(x68ksupr_state::exp_r), FUNC(x68ksupr_state::exp_w)); // external SCSI ROM and controller map(0xeafa80, 0xeafa89).rw(FUNC(x68ksupr_state::areaset_r), FUNC(x68ksupr_state::enh_areaset_w)); map(0xfc0000, 0xfdffff).rom(); // internal SCSI ROM @@ -1051,7 +1050,7 @@ void x68030_state::x68030_map(address_map &map) // map(0xe8c000, 0xe8dfff).rw(FUNC(x68k_state::x68k_printer_r), FUNC(x68k_state::x68k_printer_w)); map(0xe92000, 0xe92003).r(m_okim6258, FUNC(okim6258_device::status_r)).umask32(0x00ff00ff).w(FUNC(x68030_state::adpcm_w)).umask32(0x00ff00ff); - map(0xe96020, 0xe9603f).rw(m_scsictrl, FUNC(mb89352_device::mb89352_r), FUNC(mb89352_device::mb89352_w)).umask32(0x00ff00ff); + map(0xe96020, 0xe9603f).m(m_scsictrl, FUNC(mb89352_device::map)).umask32(0x00ff00ff); map(0xea0000, 0xea1fff).noprw();//.rw(FUNC(x68030_state::exp_r), FUNC(x68030_state::exp_w)); // external SCSI ROM and controller map(0xeafa80, 0xeafa8b).rw(FUNC(x68030_state::areaset_r), FUNC(x68030_state::enh_areaset_w)); map(0xfc0000, 0xfdffff).rom(); // internal SCSI ROM @@ -1361,23 +1360,33 @@ void x68k_state::x68000(machine_config &config) X68KHDC(config, "x68k_hdc", 0); } +static void scsi_devices(device_slot_interface &device) +{ + device.option_add("harddisk", NSCSI_HARDDISK); + device.option_add("cdrom", NSCSI_CDROM); +} + void x68ksupr_state::x68ksupr_base(machine_config &config) { x68000_base(config); - scsi_port_device &scsi(SCSI_PORT(config, "scsi")); - scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); - scsi.set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1)); - scsi.set_slot_device(3, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_2)); - scsi.set_slot_device(4, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_3)); - scsi.set_slot_device(5, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4)); - scsi.set_slot_device(6, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5)); - scsi.set_slot_device(7, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6)); + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:0", scsi_devices, "harddisk"); + NSCSI_CONNECTOR(config, "scsi:1", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:2", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:3", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, "cdrom"); + NSCSI_CONNECTOR(config, "scsi:7").option_set("spc", MB89352).machine_config( + [this](device_t *device) + { + mb89352_device &spc = downcast(*device); - MB89352A(config, m_scsictrl, 40_MHz_XTAL / 8); - m_scsictrl->set_scsi_port("scsi"); - m_scsictrl->irq_cb().set(FUNC(x68ksupr_state::scsi_irq)); - m_scsictrl->drq_cb().set(FUNC(x68ksupr_state::scsi_drq)); + spc.set_clock(40_MHz_XTAL / 8); + spc.out_irq_callback().set(*this, FUNC(x68ksupr_state::scsi_irq)); + spc.out_dreq_callback().set(*this, FUNC(x68ksupr_state::scsi_drq)); + }); VICON(config, m_crtc, 38.86363_MHz_XTAL); m_crtc->set_clock_69m(69.55199_MHz_XTAL); @@ -1411,7 +1420,7 @@ void x68030_state::x68030(machine_config &config) m_hd63450->set_clock(50_MHz_XTAL / 4); m_scc->set_clock(20_MHz_XTAL / 4); - m_scsictrl->set_clock(20_MHz_XTAL / 4); + //m_scsictrl->set_clock(20_MHz_XTAL / 4); m_crtc->set_clock_50m(50.35_MHz_XTAL); } diff --git a/src/mame/sharp/x68k.h b/src/mame/sharp/x68k.h index da39c204642..96f02ebf1c4 100644 --- a/src/mame/sharp/x68k.h +++ b/src/mame/sharp/x68k.h @@ -23,7 +23,7 @@ #include "machine/8530scc.h" #include "machine/hd63450.h" #include "machine/i8255.h" -#include "machine/mb89352.h" +#include "machine/mb87030.h" #include "machine/mc68901.h" #include "machine/ram.h" #include "machine/rp5c15.h" @@ -309,7 +309,7 @@ class x68ksupr_state : public x68k_state public: x68ksupr_state(const machine_config &mconfig, device_type type, const char *tag) : x68k_state(mconfig, type, tag) - , m_scsictrl(*this, "mb89352") + , m_scsictrl(*this, "scsi:7:spc") { }