mpc3000,segas32,x68k: switch to nscsi mb89352 implementation

This commit is contained in:
Patrick Mackinlay 2023-04-05 18:30:30 +07:00
parent 7a0f090406
commit f84ca47069
6 changed files with 103 additions and 92 deletions

View File

@ -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<mb89352_device &>(*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<x68k_expansion_slot_device *>(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);
}

View File

@ -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<scsi_port_device> m_scsibus;
required_device<mb89352_device> m_spc;
required_region_ptr<u8> m_rom;
};
// device type definition

View File

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

View File

@ -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_device>("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<mb89352_device &>(*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

View File

@ -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<mb89352_device &>(*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);
}

View File

@ -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")
{
}