summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/korgdss1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/korgdss1.cpp')
-rw-r--r--src/mame/drivers/korgdss1.cpp588
1 files changed, 588 insertions, 0 deletions
diff --git a/src/mame/drivers/korgdss1.cpp b/src/mame/drivers/korgdss1.cpp
new file mode 100644
index 00000000000..88c6e615106
--- /dev/null
+++ b/src/mame/drivers/korgdss1.cpp
@@ -0,0 +1,588 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/****************************************************************************
+
+ Skeleton driver for Korg DSS-1 synthesizer.
+
+****************************************************************************/
+
+#include "emu.h"
+#include "bus/midi/midi.h"
+#include "bus/nscsi/devices.h"
+#include "cpu/i8085/i8085.h"
+#include "cpu/m6800/m6801.h"
+#include "cpu/nec/v5x.h"
+#include "imagedev/floppy.h"
+#include "machine/gen_latch.h"
+#include "machine/i8155.h"
+#include "machine/i8255.h"
+#include "machine/ncr5380n.h"
+#include "machine/nscsi_bus.h"
+#include "machine/pit8253.h"
+#include "machine/upd765.h"
+#include "video/hd44780.h"
+#include "emupal.h"
+#include "screen.h"
+
+class korg_dss1_state : public driver_device
+{
+public:
+ korg_dss1_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_cpu1(*this, "cpu1")
+ , m_cpu2(*this, "cpu2")
+ , m_io1(*this, "io1")
+ , m_io2(*this, "io2")
+ , m_latch(*this, "latch%u", 1U)
+ , m_pit(*this, "pit%u", 1U)
+ , m_fdc(*this, "fdc")
+ , m_lcdc(*this, "lcdc")
+ , m_rombank(*this, "rombank")
+ {
+ }
+
+ void dss1(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ u8 klm782_ga1_r(offs_t offset);
+ void klm782_ga1_w(offs_t offset, u8 data);
+ u8 klm782_ga2_1_r(offs_t offset);
+ void klm782_ga2_1_w(offs_t offset, u8 data);
+ u8 klm782_ga2_2_r(offs_t offset);
+ void klm782_ga2_2_w(offs_t offset, u8 data);
+ u8 klm782_ga3_1_r(offs_t offset);
+ void klm782_ga3_1_w(offs_t offset, u8 data);
+ u8 klm782_ga3_2_r(offs_t offset);
+ void klm782_ga3_2_w(offs_t offset, u8 data);
+ void dmaram_lsb_w(u8 data);
+ void dmaram_msb_w(u8 data);
+ u8 dmaram_lsb_r();
+ u8 dmaram_msb_r();
+ void mode_select_w(u8 data);
+
+ void klm780(machine_config &config);
+ void klm781(machine_config &config);
+ void klm782(machine_config &config);
+
+private:
+ HD44780_PIXEL_UPDATE(lcd_pixel_update);
+
+ void bank_switch_w(u8 data);
+ void panel_led_w(u8 data);
+ DECLARE_WRITE_LINE_MEMBER(fdc_reset_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_tc_w);
+ DECLARE_WRITE_LINE_MEMBER(sed9420c_trgin_w);
+ u8 fdc_r(offs_t offset);
+ void fdc_w(offs_t offset, u8 data);
+
+ void vcf_vca_ef_w(u8 data);
+ u8 cpu2_p5_r();
+ void ad_select_w(u8 data);
+ void da_lsb_w(u8 data);
+ void da_msb_w(u8 data);
+ u8 kbd_r();
+ void kbd_w(u8 data);
+
+ void cpu1_map(address_map &map);
+ void cpu2_map(address_map &map);
+
+ void palette_init_dss1(palette_device &palette);
+
+protected:
+ optional_device<cpu_device> m_cpu1;
+ required_device<hd6303x_cpu_device> m_cpu2;
+ required_device<i8155_device> m_io1;
+ required_device<i8255_device> m_io2;
+ required_device_array<generic_latch_8_device, 2> m_latch;
+ required_device_array<pit8253_device, 6> m_pit;
+ required_device<upd765a_device> m_fdc;
+ required_device<hd44780_device> m_lcdc;
+ optional_memory_bank m_rombank;
+};
+
+class korg_dssmsrk_state : public korg_dss1_state
+{
+public:
+ korg_dssmsrk_state(const machine_config &mconfig, device_type type, const char *tag)
+ : korg_dss1_state(mconfig, type, tag)
+ , m_msrkcpu(*this, "msrkcpu")
+ , m_scsic(*this, "scsi:7:scsic")
+ {
+ }
+
+ void dssmsrk(machine_config &config);
+
+private:
+ void msrk_map(address_map &map);
+ void msrk_io_map(address_map &map);
+
+ u8 fdc_r(offs_t offset);
+ void fdc_w(offs_t offset, u8 data);
+
+ required_device<v40_device> m_msrkcpu;
+ required_device<ncr53c80_device> m_scsic;
+};
+
+void korg_dss1_state::machine_start()
+{
+ if (m_rombank.found())
+ m_rombank->configure_entries(0, 2, memregion("klm780")->base(), 0x8000);
+}
+
+void korg_dss1_state::machine_reset()
+{
+ if (m_rombank.found())
+ m_rombank->set_entry(0);
+}
+
+HD44780_PIXEL_UPDATE(korg_dss1_state::lcd_pixel_update)
+{
+ if (x < 5 && y < 8 && line < 2 && pos < 20)
+ bitmap.pix16(line * 8 + y, pos * 6 + x) = state;
+}
+
+
+void korg_dss1_state::bank_switch_w(u8 data)
+{
+ m_rombank->set_entry(data & 0x01);
+}
+
+void korg_dss1_state::panel_led_w(u8 data)
+{
+ // TODO
+ // TODO
+}
+
+WRITE_LINE_MEMBER(korg_dss1_state::fdc_reset_w)
+{
+ if (!state)
+ m_fdc->soft_reset();
+}
+
+WRITE_LINE_MEMBER(korg_dss1_state::fdc_tc_w)
+{
+ if (m_cpu1.found())
+ m_fdc->tc_w(state);
+ else
+ {
+ // TODO: MSRK rejumpers this to control SED9420C's MIN/STD input instead
+ }
+}
+
+WRITE_LINE_MEMBER(korg_dss1_state::sed9420c_trgin_w)
+{
+ // TODO
+}
+
+u8 korg_dss1_state::fdc_r(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ m_cpu1->adjust_icount(-1);
+
+ if (BIT(offset, 0))
+ return m_fdc->fifo_r();
+ else
+ return m_fdc->msr_r();
+}
+
+u8 korg_dssmsrk_state::fdc_r(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ m_msrkcpu->adjust_icount(-1);
+
+ if (BIT(offset, 0))
+ return m_fdc->fifo_r();
+ else
+ return m_fdc->msr_r();
+}
+
+void korg_dss1_state::fdc_w(offs_t offset, u8 data)
+{
+ if (!machine().side_effects_disabled())
+ m_cpu1->adjust_icount(-1);
+
+ if (BIT(offset, 0))
+ m_fdc->fifo_w(data);
+}
+
+void korg_dssmsrk_state::fdc_w(offs_t offset, u8 data)
+{
+ if (!machine().side_effects_disabled())
+ m_msrkcpu->adjust_icount(-1);
+
+ if (BIT(offset, 0))
+ m_fdc->fifo_w(data);
+}
+
+void korg_dss1_state::vcf_vca_ef_w(u8 data)
+{
+ // TODO
+}
+
+u8 korg_dss1_state::cpu2_p5_r()
+{
+ // TODO: other bits
+ return m_latch[0]->pending_r() | (m_latch[1]->pending_r() << 1);
+}
+
+void korg_dss1_state::ad_select_w(u8 data)
+{
+ // TODO
+}
+
+void korg_dss1_state::da_lsb_w(u8 data)
+{
+ // TODO
+}
+
+void korg_dss1_state::da_msb_w(u8 data)
+{
+ // TODO
+}
+
+u8 korg_dss1_state::kbd_r()
+{
+ // TODO
+ return 0;
+}
+
+void korg_dss1_state::kbd_w(u8 data)
+{
+ // TODO
+}
+
+u8 korg_dss1_state::klm782_ga1_r(offs_t offset)
+{
+ // TODO
+ return 0;
+}
+
+void korg_dss1_state::klm782_ga1_w(offs_t offset, u8 data)
+{
+ // TODO
+}
+
+u8 korg_dss1_state::klm782_ga2_1_r(offs_t offset)
+{
+ // TODO
+ return 0;
+}
+
+void korg_dss1_state::klm782_ga2_1_w(offs_t offset, u8 data)
+{
+ // TODO
+}
+
+u8 korg_dss1_state::klm782_ga2_2_r(offs_t offset)
+{
+ // TODO
+ return 0;
+}
+
+void korg_dss1_state::klm782_ga2_2_w(offs_t offset, u8 data)
+{
+ // TODO
+}
+
+u8 korg_dss1_state::klm782_ga3_1_r(offs_t offset)
+{
+ // TODO
+ return 0;
+}
+
+void korg_dss1_state::klm782_ga3_1_w(offs_t offset, u8 data)
+{
+ // TODO
+}
+
+u8 korg_dss1_state::klm782_ga3_2_r(offs_t offset)
+{
+ // TODO
+ return 0;
+}
+
+void korg_dss1_state::klm782_ga3_2_w(offs_t offset, u8 data)
+{
+ // TODO
+}
+
+void korg_dss1_state::dmaram_lsb_w(u8 data)
+{
+ // TODO
+}
+
+void korg_dss1_state::dmaram_msb_w(u8 data)
+{
+ // TODO
+}
+
+u8 korg_dss1_state::dmaram_lsb_r()
+{
+ // TODO
+ return 0;
+}
+
+u8 korg_dss1_state::dmaram_msb_r()
+{
+ // TODO
+ return 0;
+}
+
+void korg_dss1_state::mode_select_w(u8 data)
+{
+ // TODO
+}
+
+void korg_dss1_state::cpu1_map(address_map &map)
+{
+ map(0x0000, 0x7fff).bankr("rombank");
+ map(0x8000, 0x9fff).rom().region("klm780", 0x10000);
+ map(0xa000, 0xbfff).ram();
+ map(0xc000, 0xc0ff).mirror(0x200).rw(m_io1, FUNC(i8155_device::memory_r), FUNC(i8155_device::memory_w));
+ map(0xc100, 0xc107).mirror(0x2f8).rw(m_io1, FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
+ map(0xc400, 0xc403).mirror(0x3fc).rw(m_io2, FUNC(i8255_device::read), FUNC(i8255_device::write));
+ map(0xc800, 0xc800).mirror(0x3ff).w(FUNC(korg_dss1_state::bank_switch_w));
+ map(0xd000, 0xd003).mirror(0x300).rw(m_pit[0], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0xd004, 0xd007).mirror(0x300).rw(m_pit[1], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0xd008, 0xd00b).mirror(0x300).rw(m_pit[2], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0xd00c, 0xd00f).mirror(0x300).rw(m_pit[3], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0xd010, 0xd013).mirror(0x300).rw(m_pit[4], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0xd014, 0xd017).mirror(0x300).rw(m_pit[5], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0xd018, 0xd018).mirror(0x303).w(FUNC(korg_dssmsrk_state::dmaram_lsb_w));
+ map(0xd01c, 0xd01c).mirror(0x303).w(FUNC(korg_dssmsrk_state::dmaram_msb_w));
+ map(0xd020, 0xd027).mirror(0x318).rw(FUNC(korg_dssmsrk_state::klm782_ga3_1_r), FUNC(korg_dssmsrk_state::klm782_ga3_1_w));
+ map(0xd040, 0xd047).mirror(0x318).rw(FUNC(korg_dssmsrk_state::klm782_ga3_2_r), FUNC(korg_dssmsrk_state::klm782_ga3_2_w));
+ map(0xd060, 0xd061).mirror(0x31e).rw(FUNC(korg_dssmsrk_state::klm782_ga1_r), FUNC(korg_dssmsrk_state::klm782_ga1_w));
+ map(0xd080, 0xd08f).mirror(0x310).rw(FUNC(korg_dssmsrk_state::klm782_ga2_1_r), FUNC(korg_dssmsrk_state::klm782_ga2_1_w));
+ map(0xd0a0, 0xd0af).mirror(0x310).rw(FUNC(korg_dssmsrk_state::klm782_ga2_2_r), FUNC(korg_dssmsrk_state::klm782_ga2_2_w));
+ map(0xd0c0, 0xd0c0).mirror(0x31f).r(FUNC(korg_dssmsrk_state::dmaram_lsb_r));
+ map(0xd0e0, 0xd0e0).mirror(0x31f).r(FUNC(korg_dssmsrk_state::dmaram_msb_r));
+ map(0xd400, 0xd400).mirror(0x3fe).w(m_latch[0], FUNC(generic_latch_8_device::write));
+ map(0xd800, 0xd800).mirror(0x3fe).r(m_latch[1], FUNC(generic_latch_8_device::read));
+ map(0xdc00, 0xdc01).mirror(0x3fe).rw(FUNC(korg_dss1_state::fdc_r), FUNC(korg_dss1_state::fdc_w));
+ map(0xe000, 0xffff).ram();
+}
+
+void korg_dssmsrk_state::msrk_map(address_map &map)
+{
+ map.global_mask(0x3ffff);
+ map(0x00000, 0x07fff).rom().region("klm780", 0);
+ map(0x08000, 0x0bfff).ram();
+ map(0x0c000, 0x0c0ff).mirror(0x200).rw(m_io1, FUNC(i8155_device::memory_r), FUNC(i8155_device::memory_w));
+ map(0x0c100, 0x0c107).mirror(0x2f8).rw(m_io1, FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
+ map(0x0c400, 0x0c403).mirror(0x3fc).rw(m_io2, FUNC(i8255_device::read), FUNC(i8255_device::write));
+ //map(0x0cc00, 0x0cc1f).mirror(0x3e0).w(FUNC(korg_dssmsrk_state::msrk_ga_w));
+ map(0x0d000, 0x0d003).mirror(0x300).rw(m_pit[0], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0x0d004, 0x0d007).mirror(0x300).rw(m_pit[1], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0x0d008, 0x0d00b).mirror(0x300).rw(m_pit[2], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0x0d00c, 0x0d00f).mirror(0x300).rw(m_pit[3], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0x0d010, 0x0d013).mirror(0x300).rw(m_pit[4], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0x0d014, 0x0d017).mirror(0x300).rw(m_pit[5], FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0x0d018, 0x0d018).mirror(0x303).w(FUNC(korg_dssmsrk_state::dmaram_lsb_w));
+ map(0x0d01c, 0x0d01c).mirror(0x303).w(FUNC(korg_dssmsrk_state::dmaram_msb_w));
+ map(0x0d020, 0x0d027).mirror(0x318).rw(FUNC(korg_dssmsrk_state::klm782_ga3_1_r), FUNC(korg_dssmsrk_state::klm782_ga3_1_w));
+ map(0x0d040, 0x0d047).mirror(0x318).rw(FUNC(korg_dssmsrk_state::klm782_ga3_2_r), FUNC(korg_dssmsrk_state::klm782_ga3_2_w));
+ map(0x0d060, 0x0d061).mirror(0x31e).rw(FUNC(korg_dssmsrk_state::klm782_ga1_r), FUNC(korg_dssmsrk_state::klm782_ga1_w));
+ map(0x0d080, 0x0d08f).mirror(0x310).rw(FUNC(korg_dssmsrk_state::klm782_ga2_1_r), FUNC(korg_dssmsrk_state::klm782_ga2_1_w));
+ map(0x0d0a0, 0x0d0af).mirror(0x310).rw(FUNC(korg_dssmsrk_state::klm782_ga2_2_r), FUNC(korg_dssmsrk_state::klm782_ga2_2_w));
+ map(0x0d0c0, 0x0d0c0).mirror(0x31f).r(FUNC(korg_dssmsrk_state::dmaram_lsb_r));
+ map(0x0d0e0, 0x0d0e0).mirror(0x31f).r(FUNC(korg_dssmsrk_state::dmaram_msb_r));
+ map(0x0d400, 0x0d400).mirror(0x3fe).w(m_latch[0], FUNC(generic_latch_8_device::write));
+ map(0x0d800, 0x0d800).mirror(0x3fe).r(m_latch[1], FUNC(generic_latch_8_device::read));
+ map(0x0e000, 0x0ffff).ram();
+ map(0x10000, 0x17fff).mirror(0x8000).rom().region("klm780", 0x8000);
+ map(0x30000, 0x3ffff).rom().region("msrk", 0);
+}
+
+void korg_dssmsrk_state::msrk_io_map(address_map &map)
+{
+ map(0xc800, 0xc807).mirror(0x3f8).rw(m_scsic, FUNC(ncr53c80_device::read), FUNC(ncr53c80_device::write));
+ map(0xdc00, 0xdc01).mirror(0x3fe).rw(FUNC(korg_dssmsrk_state::fdc_r), FUNC(korg_dssmsrk_state::fdc_w));
+}
+
+void korg_dss1_state::cpu2_map(address_map &map)
+{
+ map(0x0000, 0x001f).rw(m_cpu2, FUNC(hd6303x_cpu_device::m6801_io_r), FUNC(hd6303x_cpu_device::m6801_io_w)); // FIXME: internalize this
+ map(0x0015, 0x0015).r(FUNC(korg_dss1_state::cpu2_p5_r));
+ map(0x0017, 0x0017).w(FUNC(korg_dss1_state::ad_select_w));
+ map(0x0040, 0x00ff).ram(); // FIXME: internalize this
+ map(0x0100, 0x0100).mirror(0x3cff).w(FUNC(korg_dss1_state::da_lsb_w));
+ map(0x0200, 0x0200).mirror(0x3cff).w(FUNC(korg_dss1_state::da_msb_w));
+ map(0x0300, 0x0300).mirror(0x3cff).r(m_latch[0], FUNC(generic_latch_8_device::read));
+ map(0x0300, 0x0300).mirror(0x3cff).w(m_latch[1], FUNC(generic_latch_8_device::write));
+ map(0x4000, 0x4000).mirror(0x3fff).rw(FUNC(korg_dss1_state::kbd_r), FUNC(korg_dss1_state::kbd_w));
+ map(0x8000, 0x9fff).mirror(0x2000).ram();
+ map(0xc000, 0xffff).rom().region("klm781", 0);
+}
+
+
+static INPUT_PORTS_START(dss1)
+INPUT_PORTS_END
+
+static void dss1_floppies(device_slot_interface &device)
+{
+ device.option_add("35dd", FLOPPY_35_DD);
+}
+
+void korg_dss1_state::palette_init_dss1(palette_device &palette)
+{
+ palette.set_pen_color(0, rgb_t(131, 136, 139));
+ palette.set_pen_color(1, rgb_t( 92, 83, 88));
+}
+
+void korg_dss1_state::klm780(machine_config &config)
+{
+ I8085A(config, m_cpu1, 10_MHz_XTAL); // uPD8085AC-2
+ m_cpu1->set_addrmap(AS_PROGRAM, &korg_dss1_state::cpu1_map);
+
+ I8155(config, m_io1, 10_MHz_XTAL / 2); // uPD8155HC-2
+ m_io1->out_to_callback().set_inputline(m_cpu1, I8085_RST75_LINE);
+ m_io1->in_pa_callback().set(m_lcdc, FUNC(hd44780_device::db_r));
+ m_io1->out_pa_callback().set(m_lcdc, FUNC(hd44780_device::db_w));
+ m_io1->out_pb_callback().set(FUNC(korg_dss1_state::panel_led_w));
+ m_io1->out_pc_callback().set(m_lcdc, FUNC(hd44780_device::e_w)).bit(0);
+ m_io1->out_pc_callback().append(m_lcdc, FUNC(hd44780_device::rw_w)).bit(1);
+ m_io1->out_pc_callback().append(m_lcdc, FUNC(hd44780_device::rs_w)).bit(2);
+ m_io1->out_pc_callback().append(FUNC(korg_dss1_state::fdc_reset_w)).bit(3);
+ m_io1->out_pc_callback().append(FUNC(korg_dss1_state::fdc_tc_w)).bit(4);
+ m_io1->out_pc_callback().append(FUNC(korg_dss1_state::sed9420c_trgin_w)).bit(5);
+
+ I8255(config, m_io2); // uPD8255AC-2
+ m_io2->out_pc_callback().set(FUNC(korg_dss1_state::mode_select_w));
+
+ UPD765A(config, m_fdc, 16_MHz_XTAL / 4, true, true); // uPD765AC; clocked through SED9420C
+ m_fdc->intrq_wr_callback().set_inputline(m_cpu1, I8085_INTR_LINE);
+ FLOPPY_CONNECTOR(config, "fdc:0", dss1_floppies, "35dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", dss1_floppies, nullptr, floppy_image_device::default_floppy_formats).enable_sound(true);
+
+ GENERIC_LATCH_8(config, m_latch[0]);
+ m_latch[0]->data_pending_callback().set_inputline(m_cpu1, I8085_RST65_LINE).invert();
+
+ GENERIC_LATCH_8(config, m_latch[1]);
+ m_latch[1]->data_pending_callback().set_inputline(m_cpu1, I8085_RST55_LINE);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("lcdc", FUNC(hd44780_device::screen_update));
+ screen.set_size(6*20, 8*2);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette", FUNC(korg_dss1_state::palette_init_dss1), 2);
+
+ HD44780(config, m_lcdc, 0);
+ m_lcdc->set_lcd_size(2, 20);
+ m_lcdc->set_pixel_update_cb(FUNC(korg_dss1_state::lcd_pixel_update));
+}
+
+void korg_dss1_state::klm781(machine_config &config)
+{
+ HD6303X(config, m_cpu2, 8_MHz_XTAL); // HD63B03X
+ m_cpu2->set_addrmap(AS_PROGRAM, &korg_dss1_state::cpu2_map);
+ m_cpu2->out_p2_cb().set(FUNC(korg_dss1_state::vcf_vca_ef_w));
+ m_cpu2->out_ser_tx_cb().set("midi_out", FUNC(midi_port_device::write_txd));
+
+ MIDI_PORT(config, "midi_in", midiin_slot, "midiin");
+ MIDI_PORT(config, "midi_out", midiout_slot, "midiout");
+}
+
+void korg_dss1_state::klm782(machine_config &config)
+{
+ PIT8253(config, m_pit[0]);
+ PIT8253(config, m_pit[1]);
+ PIT8253(config, m_pit[2]);
+ PIT8253(config, m_pit[3]);
+ PIT8253(config, m_pit[4]);
+ PIT8253(config, m_pit[5]);
+}
+
+void korg_dss1_state::dss1(machine_config &config)
+{
+ klm780(config);
+ klm781(config);
+ klm782(config);
+}
+
+void korg_dssmsrk_state::dssmsrk(machine_config &config)
+{
+ V40(config, m_msrkcpu, 16_MHz_XTAL); // uPD70208
+ m_msrkcpu->set_addrmap(AS_PROGRAM, &korg_dssmsrk_state::msrk_map);
+ m_msrkcpu->set_addrmap(AS_IO, &korg_dssmsrk_state::msrk_io_map);
+ m_msrkcpu->out_hreq_cb().set_inputline(m_msrkcpu, INPUT_LINE_HALT);
+ m_msrkcpu->out_hreq_cb().append(m_msrkcpu, FUNC(v40_device::hack_w));
+ m_msrkcpu->in_ior_cb<0>().set(m_fdc, FUNC(upd765a_device::dma_r));
+ m_msrkcpu->out_iow_cb<0>().set(m_fdc, FUNC(upd765a_device::dma_w));
+ m_msrkcpu->in_ior_cb<1>().set(m_scsic, FUNC(ncr53c80_device::dma_r));
+ m_msrkcpu->out_iow_cb<1>().set(m_scsic, FUNC(ncr53c80_device::dma_w));
+ m_msrkcpu->out_eop_cb().set(m_fdc, FUNC(upd765a_device::tc_line_w));
+ //m_msrkcpu->out_eop_cb().append(m_scsic, FUNC(ncr53c80_device::eop_w));
+ m_msrkcpu->out_handler<1>().set(m_msrkcpu, FUNC(v40_device::tclk_w));
+
+ klm780(config);
+ config.device_remove("cpu1");
+ m_io1->set_clock(16_MHz_XTAL / 4); // CLKOUT divider not verified
+ m_io1->out_to_callback().set_inputline(m_msrkcpu, INPUT_LINE_IRQ1);
+ m_fdc->intrq_wr_callback().set_inputline(m_msrkcpu, INPUT_LINE_IRQ6);
+ m_fdc->drq_wr_callback().set(m_msrkcpu, FUNC(v40_device::dreq_w<0>)); // FIXME: delayed by 74HCT164
+ m_latch[0]->data_pending_callback().set_inputline(m_msrkcpu, INPUT_LINE_IRQ2).invert();
+ m_latch[1]->data_pending_callback().set_inputline(m_msrkcpu, INPUT_LINE_IRQ3);
+
+ klm781(config);
+ klm782(config);
+
+ 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("scsic", NCR53C80).machine_config([this] (device_t *device) {
+ auto &scsic = downcast<ncr53c80_device &>(*device); // 48-pin DIP
+ scsic.irq_handler().set_inputline(m_msrkcpu, INPUT_LINE_IRQ4);
+ scsic.drq_handler().set(m_msrkcpu, FUNC(v40_device::dreq_w<1>));
+ });
+}
+
+
+ROM_START(dss1)
+ ROM_REGION(0x12000, "klm780", 0)
+ ROM_SYSTEM_BIOS(0, "v36", "Version 36")
+ ROM_SYSTEM_BIOS(1, "v34", "Version 34")
+ ROM_SYSTEM_BIOS(2, "v31", "Version 31")
+ ROMX_LOAD("860336.ic19", 0x00000, 0x8000, CRC(44515595) SHA1(f4873c219cda4158506acbfb06abb8a72224049d), ROM_BIOS(0)) // 27256 (bank 0)
+ ROMX_LOAD("860334.ic19", 0x00000, 0x8000, CRC(076c5956) SHA1(752a26761c63e46f1a6efa1b19a60bafa7a5bc42), ROM_BIOS(1))
+ ROMX_LOAD("860331.ic19", 0x00000, 0x8000, CRC(fcefcc79) SHA1(2332ffcbbe61d460d1929e65cbaa01e0766ba51f), ROM_BIOS(2))
+ ROMX_LOAD("860436.ic18", 0x08000, 0x8000, CRC(c8830cf9) SHA1(2bcdcfd9afc9e6b2078afdf9c027622b705780a9), ROM_BIOS(0)) // 27256 (bank 1)
+ ROMX_LOAD("860434.ic18", 0x08000, 0x8000, CRC(5b253cac) SHA1(20507004ead025b03b2f7a31af87c9dae968e8eb), ROM_BIOS(1))
+ ROMX_LOAD("860431.ic18", 0x08000, 0x8000, CRC(ed0e4238) SHA1(b7e56a3f414dd13bb6b9ef40262c6b93e52f5254), ROM_BIOS(2))
+ ROMX_LOAD("860536.ic12", 0x10000, 0x2000, CRC(547388a1) SHA1(4c3dfaebe48f441955f2a6bd42dd4d30eb63b913), ROM_BIOS(0)) // 2764 (not banked)
+ ROMX_LOAD("860534.ic12", 0x10000, 0x2000, CRC(9b5792b7) SHA1(e031d7f3a5c4f67399a75050bd02343ed6f8926d), ROM_BIOS(1))
+ ROMX_LOAD("860531.ic12", 0x10000, 0x2000, CRC(a8173858) SHA1(e1d898594ad9e65a95478cf1ec14b9b3cafd0159), ROM_BIOS(2))
+
+ ROM_REGION(0x4000, "klm781", 0)
+ ROMX_LOAD("860236.ic15", 0x0000, 0x4000, CRC(b4ea379a) SHA1(66b3586b6fb7fa5edf70a933e49f626452ffe006), ROM_BIOS(0))
+ ROMX_LOAD("860234.ic15", 0x0000, 0x4000, CRC(5766cdb5) SHA1(ded6c5758fbf90fd65b80d5b08e72349d38555d2), ROM_BIOS(1))
+ ROMX_LOAD("860231.ic15", 0x0000, 0x4000, CRC(2559b3aa) SHA1(8b7998ffc24405d0ca08a93c23c18f97aff74d16), ROM_BIOS(2))
+ROM_END
+
+ROM_START(dssmsrk)
+ ROM_REGION(0x10000, "klm780", 0)
+ ROM_LOAD("113000.ic18", 0x00000, 0x8000, CRC(6fa13d52) SHA1(8de0e4e8ac4afe0d0fb116b6c8b64739ba81a722))
+ ROM_LOAD("113001.ic19", 0x08000, 0x8000, CRC(ec7e2473) SHA1(dacea4a545ce3ed1fc11d9025e86dfd1d32a222c))
+ // EPROM at IC12 is replaced with D4364C-15 SRAM
+
+ ROM_REGION(0x4000, "klm781", 0)
+ ROM_LOAD("860236.ic15", 0x0000, 0x4000, CRC(b4ea379a) SHA1(66b3586b6fb7fa5edf70a933e49f626452ffe006))
+
+ ROM_REGION(0x10000, "msrk", 0)
+ ROM_LOAD("113003.u30", 0x00000, 0x10000, CRC(81b17db3) SHA1(af8a3167e06641d41b9b9e6e024335c2eb827274))
+ROM_END
+
+SYST(1986, dss1, 0, 0, dss1, dss1, korg_dss1_state, empty_init, "Korg", "DSS-1 Digital Sampling Synthesizer", MACHINE_IS_SKELETON)
+SYST(1987, dssmsrk, dss1, 0, dssmsrk, dss1, korg_dssmsrk_state, empty_init, "Korg / Sound Logic", "DSS-1 Digital Sampling Synthesizer (Memory/SCSI Retrofit)", MACHINE_IS_SKELETON)