summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <lordkale4@gmail.com>2025-11-24 13:00:06 +0100
committer angelosa <lordkale4@gmail.com>2025-11-24 13:07:41 +0100
commit5162043bd73a00299ac1c722aab4c4746a16b91a (patch)
tree640541272911f30b020294c48fa65c8f0546023a
parent242ecf301b4d6ba1bf665c1af2219ff924cd75d3 (diff)
bus/pc98_cbus: add SNE Sound Orchestra
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--src/devices/bus/pc98_cbus/options.cpp45
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_26.cpp9
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_26.h8
-rw-r--r--src/devices/bus/pc98_cbus/sound_orchestra.cpp80
-rw-r--r--src/devices/bus/pc98_cbus/sound_orchestra.h43
6 files changed, 167 insertions, 20 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index dfaa78f79ec..5f5750f8551 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -5591,6 +5591,8 @@ if (BUSES["PC98_CBUS"]~=null) then
MAME_DIR .. "src/devices/bus/pc98_cbus/sb16_ct2720.h",
MAME_DIR .. "src/devices/bus/pc98_cbus/slot.cpp",
MAME_DIR .. "src/devices/bus/pc98_cbus/slot.h",
+ MAME_DIR .. "src/devices/bus/pc98_cbus/sound_orchestra.cpp",
+ MAME_DIR .. "src/devices/bus/pc98_cbus/sound_orchestra.h",
MAME_DIR .. "src/devices/bus/pc98_cbus/sound.cpp",
MAME_DIR .. "src/devices/bus/pc98_cbus/sound.h",
MAME_DIR .. "src/devices/bus/pc98_cbus/speakboard.cpp",
diff --git a/src/devices/bus/pc98_cbus/options.cpp b/src/devices/bus/pc98_cbus/options.cpp
index ecd622fcc84..efb89c167a4 100644
--- a/src/devices/bus/pc98_cbus/options.cpp
+++ b/src/devices/bus/pc98_cbus/options.cpp
@@ -17,27 +17,38 @@
#include "mif201.h"
#include "mpu_pc98.h"
#include "sb16_ct2720.h"
+#include "sound_orchestra.h"
#include "sound.h"
#include "speakboard.h"
#include "wavestar.h"
void pc98_cbus_devices(device_slot_interface &device)
{
- // official HW
+ // sound cards
+ // NEC
device.option_add("pc9801_14", PC9801_14);
device.option_add("pc9801_26", PC9801_26);
- device.option_add("pc9801_27", PC9801_27);
- device.option_add("pc9801_55u", PC9801_55U);
- device.option_add("pc9801_55l", PC9801_55L);
device.option_add("pc9801_86", PC9801_86);
device.option_add("pc9801_118", PC9801_118);
+ // System Sacom
+ device.option_add("amd98", AMD98);
+ // Creative Labs
+ device.option_add("sb16", SB16_CT2720);
+ // SNE
+ device.option_add("sound_orchestra", SOUND_ORCHESTRA);
+ // Idol Japan
+ device.option_add("speakboard", SPEAKBOARD);
+// device.option_add("sparkboard", SPARKBOARD);
+ // QVision
+ device.option_add("wavestar", QVISION_WAVESTAR);
+ // doujinshi HW
+ // MAD Factory / Doujin Hard (同人ハード)
+ // MAD Factory Chibi-Oto: an ADPCM override for -86
+ // MAD Factory Otomi-chan: "TORIE9211 MAD FACTORY" printed on proto PCB, just overrides for ADPCM for -86?
+ device.option_add("otomichan_kai", OTOMICHAN_KAI);
-// Spark Board
- device.option_add("amd98", AMD98);
+ // MIDI
device.option_add("mpu_pc98", MPU_PC98);
- device.option_add("sb16", SB16_CT2720);
- device.option_add("speakboard", SPEAKBOARD);
- device.option_add("wavestar", QVISION_WAVESTAR);
// File Bay
// for first gen only
@@ -46,11 +57,14 @@ void pc98_cbus_devices(device_slot_interface &device)
// PC-9801-08 (2dd, external unit)
// PC-9801-15 (8' unit)
- // doujinshi HW
-// MAD Factory / Doujin Hard (同人ハード)
-// MAD Factory Chibi-Oto: an ADPCM override for -86
-// MAD Factory Otomi-chan: "TORIE9211 MAD FACTORY" printed on proto PCB, just overrides for ADPCM for -86?
- device.option_add("otomichan_kai", OTOMICHAN_KAI);
+ // SASI
+ device.option_add("pc9801_27", PC9801_27);
+
+ // SCSI
+// device_option_add("pc9801_55", PC9801_55);
+ device.option_add("pc9801_55u", PC9801_55U);
+ device.option_add("pc9801_55l", PC9801_55L);
+// device.option_add("pc9801_92", PC9801_92);
// internal sound options
device.option_add_internal("sound_pc9821ce", SOUND_PC9821CE);
@@ -66,7 +80,7 @@ void pc98_cbus_ram_devices(device_slot_interface &device)
device.option_add("640kb", PC9801_02_640KB);
}
-// TODO: add just a subset for now, all needs to be verified if compatible with C-Bus.
+// TODO: add just a subset for now, all needs to be verified if compatible with this C-Bus variant.
void pc88va_cbus_devices(device_slot_interface &device)
{
device.option_add("pc9801_27", PC9801_27);
@@ -77,6 +91,7 @@ void pc88va_cbus_devices(device_slot_interface &device)
}
// https://man.openbsd.org/cbus.4
+// Add the known options only
void luna88k2_cbus_devices(device_slot_interface &device)
{
// Allied Telesis CentreCOM LA-98
diff --git a/src/devices/bus/pc98_cbus/pc9801_26.cpp b/src/devices/bus/pc98_cbus/pc9801_26.cpp
index 80a98d4e0b1..f9beb7af5d0 100644
--- a/src/devices/bus/pc98_cbus/pc9801_26.cpp
+++ b/src/devices/bus/pc98_cbus/pc9801_26.cpp
@@ -32,8 +32,8 @@ TODO:
// device type definition
DEFINE_DEVICE_TYPE(PC9801_26, pc9801_26_device, "pc9801_26", "NEC PC-9801-26/K sound card")
-pc9801_26_device::pc9801_26_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, PC9801_26, tag, owner, clock)
+pc9801_26_device::pc9801_26_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
, device_pc98_cbus_slot_interface(mconfig, *this)
, m_opn(*this, "opn")
, m_joy(*this, "joy_p%u", 1U)
@@ -42,6 +42,11 @@ pc9801_26_device::pc9801_26_device(const machine_config &mconfig, const char *ta
{
}
+pc9801_26_device::pc9801_26_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : pc9801_26_device(mconfig, PC9801_26, tag, owner, clock)
+{
+}
+
void pc9801_26_device::device_add_mconfig(machine_config &config)
{
SPEAKER(config, "mono").front_center();
diff --git a/src/devices/bus/pc98_cbus/pc9801_26.h b/src/devices/bus/pc98_cbus/pc9801_26.h
index 0163f0213a6..47c459926bb 100644
--- a/src/devices/bus/pc98_cbus/pc9801_26.h
+++ b/src/devices/bus/pc98_cbus/pc9801_26.h
@@ -30,6 +30,8 @@ public:
pc9801_26_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
+ pc9801_26_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
@@ -38,14 +40,14 @@ protected:
u16 read_io_base();
virtual void remap(int space_id, offs_t start, offs_t end) override;
-private:
+ virtual void io_map(address_map &map) ATTR_COLD;
+
required_device<ym2203_device> m_opn;
+private:
required_device_array<msx_general_purpose_port_device, 2U> m_joy;
required_memory_region m_bios;
required_ioport m_irq_jp;
- void io_map(address_map &map) ATTR_COLD;
-
u32 m_rom_base;
u8 m_joy_sel;
u8 m_int_level;
diff --git a/src/devices/bus/pc98_cbus/sound_orchestra.cpp b/src/devices/bus/pc98_cbus/sound_orchestra.cpp
new file mode 100644
index 00000000000..52ae9b74273
--- /dev/null
+++ b/src/devices/bus/pc98_cbus/sound_orchestra.cpp
@@ -0,0 +1,80 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/**************************************************************************************************
+
+SNE Sound Orchestra
+
+Built on top of -26, with extra YM3812 as ADPCM engine
+
+https://j02.nobody.jp/jto98/n_desk_sound/sso.htm
+
+TODO:
+- Better PnP (has separate ADPCM control)
+- valis2 has no sound from the ADPCM channel (initializes the registers tho?)
+- add SNE Sound Orchestra VS (replaces OPL2 with Y8950)
+
+===================================================================================================
+
+- Known SW with Sound Orchestra support
+ albatr2
+ valis2
+ zan
+ みゅあっぷ98/iv (V6.41A) ~ muap98/iv (VS only?)
+ SNE Sound Musician / Great Musician / Little Musician / SOS1 / SOS2 (all undumped?)
+
+**************************************************************************************************/
+
+#include "emu.h"
+#include "sound_orchestra.h"
+
+#include "speaker.h"
+
+DEFINE_DEVICE_TYPE(SOUND_ORCHESTRA, sound_orchestra_device, "sound_orchestra", "SNE Sound Orchestra sound card")
+
+sound_orchestra_device::sound_orchestra_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : pc9801_26_device(mconfig, SOUND_ORCHESTRA, tag, owner, clock)
+ , m_opl2(*this, "opl2")
+{
+}
+
+void sound_orchestra_device::device_add_mconfig(machine_config &config)
+{
+ pc9801_26_device::device_add_mconfig(config);
+ // YM2203C
+ m_opn->reset_routes();
+
+ // pseudo-stereo
+ config.device_remove("mono");
+ SPEAKER(config, "ssg_left").front_left();
+ SPEAKER(config, "fm_right").front_right();
+
+ // TODO: mixing unconfirmed
+ m_opn->add_route(0, "fm_right", 0.25);
+ m_opn->add_route(1, "fm_right", 0.25);
+ m_opn->add_route(2, "fm_right", 0.25);
+ m_opn->add_route(3, "fm_right", 0.50);
+
+ YM3812(config, m_opl2, 15.9744_MHz_XTAL / 4);
+ m_opl2->add_route(ALL_OUTPUTS, "ssg_left", 1.00);
+
+}
+
+ROM_START( sound_orchestra )
+ ROM_REGION( 0x4000, "bios", ROMREGION_ERASEFF )
+ // baddump: should require own BIOS to accomodate the ADPCM in BASIC
+ ROM_LOAD16_BYTE( "26k_wyka01_00.bin", 0x0000, 0x2000, BAD_DUMP CRC(f071bf69) SHA1(f3cdef94e9fee116cf4a9b54881e77c6cd903815) )
+ ROM_LOAD16_BYTE( "26k_wyka02_00.bin", 0x0001, 0x2000, BAD_DUMP CRC(eaa01052) SHA1(5d47edae49aad591f139d5599fe04b61aefd5ecd) )
+ROM_END
+
+const tiny_rom_entry *sound_orchestra_device::device_rom_region() const
+{
+ return ROM_NAME( sound_orchestra );
+}
+
+void sound_orchestra_device::io_map(address_map &map)
+{
+ const u16 io_base = read_io_base();
+ map(0x0088 | io_base, 0x008b | io_base).rw(m_opn, FUNC(ym2203_device::read), FUNC(ym2203_device::write)).umask16(0x00ff);
+ map(0x008c | io_base, 0x008f | io_base).rw(m_opl2, FUNC(ym3812_device::read), FUNC(ym3812_device::write)).umask16(0x00ff);
+}
+
diff --git a/src/devices/bus/pc98_cbus/sound_orchestra.h b/src/devices/bus/pc98_cbus/sound_orchestra.h
new file mode 100644
index 00000000000..e18fa579d5f
--- /dev/null
+++ b/src/devices/bus/pc98_cbus/sound_orchestra.h
@@ -0,0 +1,43 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ NEC PC-9801-26 sound card
+
+***************************************************************************/
+
+#ifndef MAME_BUS_PC98_CBUS_SOUND_ORCHESTRA_H
+#define MAME_BUS_PC98_CBUS_SOUND_ORCHESTRA_H
+
+#pragma once
+
+#include "slot.h"
+
+#include "pc9801_26.h"
+#include "sound/ymopl.h"
+
+
+class sound_orchestra_device : public pc9801_26_device
+{
+public:
+ // construction/destruction
+ sound_orchestra_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+
+ virtual void io_map(address_map &map) override ATTR_COLD;
+
+ virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
+
+private:
+ required_device<ym3812_device> m_opl2;
+
+};
+
+
+DECLARE_DEVICE_TYPE(SOUND_ORCHESTRA, sound_orchestra_device)
+
+
+#endif // MAME_BUS_PC98_CBUS_SOUND_ORCHESTRA_H