diff options
| author | 2025-11-24 13:00:06 +0100 | |
|---|---|---|
| committer | 2025-11-24 13:07:41 +0100 | |
| commit | 5162043bd73a00299ac1c722aab4c4746a16b91a (patch) | |
| tree | 640541272911f30b020294c48fa65c8f0546023a | |
| parent | 242ecf301b4d6ba1bf665c1af2219ff924cd75d3 (diff) | |
bus/pc98_cbus: add SNE Sound Orchestra
| -rw-r--r-- | scripts/src/bus.lua | 2 | ||||
| -rw-r--r-- | src/devices/bus/pc98_cbus/options.cpp | 45 | ||||
| -rw-r--r-- | src/devices/bus/pc98_cbus/pc9801_26.cpp | 9 | ||||
| -rw-r--r-- | src/devices/bus/pc98_cbus/pc9801_26.h | 8 | ||||
| -rw-r--r-- | src/devices/bus/pc98_cbus/sound_orchestra.cpp | 80 | ||||
| -rw-r--r-- | src/devices/bus/pc98_cbus/sound_orchestra.h | 43 |
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 |
