From be99bd1e17cbb25b8c29c733b888c1ab5cff28f9 Mon Sep 17 00:00:00 2001 From: angelosa Date: Mon, 18 Nov 2024 21:28:08 +0100 Subject: bus/cbus: initial hookup for PC-98 Sound Blaster 16 --- scripts/src/bus.lua | 10 ++-- src/devices/bus/cbus/mpu_pc98.h | 2 +- src/devices/bus/cbus/sb16_ct2720.cpp | 101 +++++++++++++++++++++++++++++++++++ src/devices/bus/cbus/sb16_ct2720.h | 50 +++++++++++++++++ src/mame/nec/pc9801.cpp | 1 + src/mame/nec/pc9801.h | 2 + 6 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 src/devices/bus/cbus/sb16_ct2720.cpp create mode 100644 src/devices/bus/cbus/sb16_ct2720.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 2134d108aa3..76884ee6e83 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -5252,6 +5252,8 @@ if (BUSES["CBUS"]~=null) then files { MAME_DIR .. "src/devices/bus/cbus/amd98.cpp", MAME_DIR .. "src/devices/bus/cbus/amd98.h", + MAME_DIR .. "src/devices/bus/cbus/mpu_pc98.cpp", + MAME_DIR .. "src/devices/bus/cbus/mpu_pc98.h", MAME_DIR .. "src/devices/bus/cbus/pc9801_26.cpp", MAME_DIR .. "src/devices/bus/cbus/pc9801_26.h", MAME_DIR .. "src/devices/bus/cbus/pc9801_55.cpp", @@ -5260,12 +5262,12 @@ if (BUSES["CBUS"]~=null) then MAME_DIR .. "src/devices/bus/cbus/pc9801_86.h", MAME_DIR .. "src/devices/bus/cbus/pc9801_118.cpp", MAME_DIR .. "src/devices/bus/cbus/pc9801_118.h", - MAME_DIR .. "src/devices/bus/cbus/pc9801_snd.cpp", - MAME_DIR .. "src/devices/bus/cbus/pc9801_snd.h", - MAME_DIR .. "src/devices/bus/cbus/mpu_pc98.cpp", - MAME_DIR .. "src/devices/bus/cbus/mpu_pc98.h", MAME_DIR .. "src/devices/bus/cbus/pc9801_cbus.cpp", MAME_DIR .. "src/devices/bus/cbus/pc9801_cbus.h", + MAME_DIR .. "src/devices/bus/cbus/pc9801_snd.cpp", + MAME_DIR .. "src/devices/bus/cbus/pc9801_snd.h", + MAME_DIR .. "src/devices/bus/cbus/sb16_ct2720.cpp", + MAME_DIR .. "src/devices/bus/cbus/sb16_ct2720.h", } end diff --git a/src/devices/bus/cbus/mpu_pc98.h b/src/devices/bus/cbus/mpu_pc98.h index af5b1e04391..6f754094afd 100644 --- a/src/devices/bus/cbus/mpu_pc98.h +++ b/src/devices/bus/cbus/mpu_pc98.h @@ -12,7 +12,7 @@ // TYPE DEFINITIONS //************************************************************************** -// ======================> isa8_mpu401_device +// ======================> mpu_pc98_device class mpu_pc98_device : public device_t { diff --git a/src/devices/bus/cbus/sb16_ct2720.cpp b/src/devices/bus/cbus/sb16_ct2720.cpp new file mode 100644 index 00000000000..31823f6b35f --- /dev/null +++ b/src/devices/bus/cbus/sb16_ct2720.cpp @@ -0,0 +1,101 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese +/************************************************************************************************** + +Creative Sound Blaster 16 for PC-9800 Series (board name: CT2720) + +References: +- https://j02.nobody.jp/jto98/n_desk_sound/ct2720.htm +- http://retropc.net/yasuma/V2/PC/SOUND/ct2720.html + +TODO: +- Optional YM2203 (+ ROM socket), PC-9801-26K equivalent fallback; +- Game port; +- MIDI; +- CT1741 (DSP); +- CT1745 (Mixer); +- CD-Rom interface/CD-In; +- Mic-In/Line-In; +- Configuration dips; + +**************************************************************************************************/ + +#include "emu.h" +#include "bus/cbus/sb16_ct2720.h" +#include "speaker.h" + + +DEFINE_DEVICE_TYPE(SB16_CT2720, sb16_ct2720_device, "sb16_ct2720", "Creative Sound Blaster 16 CT-2720") + +sb16_ct2720_device::sb16_ct2720_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, SB16_CT2720, tag, owner, clock) + , m_bus(*this, DEVICE_SELF_OWNER) + , m_opl3(*this, "opl3") + , m_ldac(*this, "ldac") + , m_rdac(*this, "rdac") +{ +} + +void sb16_ct2720_device::device_add_mconfig(machine_config &config) +{ + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); + + DAC_16BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC + DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC + +// PC_JOY(config, m_joy); + +// MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(FUNC(sb_device::midi_rx_w)); +// MIDI_PORT(config, "mdout", midiout_slot, "midiout"); + + YMF262(config, m_opl3, XTAL(14'318'181)); + m_opl3->add_route(0, "lspeaker", 1.0); + m_opl3->add_route(1, "rspeaker", 1.0); + m_opl3->add_route(2, "lspeaker", 1.0); + m_opl3->add_route(3, "rspeaker", 1.0); +} + +void sb16_ct2720_device::device_start() +{ + m_bus->install_device(0x0000, 0xffff, *this, &sb16_ct2720_device::io_map); +} + +void sb16_ct2720_device::device_reset() +{ +} + +void sb16_ct2720_device::io_map(address_map &map) +{ + const u16 base = 0xd2; +// map(0x0400 | base, 0x0400 | base).select(0x300) PC Gameport + map(0x2000 | base, 0x2000 | base).select(0x300).lrw8( + NAME([this] (offs_t offset) { + return m_opl3->read(offset >> 8); + }), + NAME([this] (offs_t offset, u8 data) { + m_opl3->write(offset >> 8, data); + }) + ); +// map(0x2400 | base, 0x2400 | base).select(0x100) CT1745 mixer ($224-$225 on AT) +// map(0x2600 | base, 0x2600 | base) CT1741 DSP reset + map(0x2800 | base, 0x2800 | base).select(0x100).lrw8( + NAME([this] (offs_t offset) { + return m_opl3->read(offset >> 8); + }), + NAME([this] (offs_t offset, u8 data) { + m_opl3->write(offset >> 8, data); + }) + ); +// map(0x2a00 | base, 0x2a00 | base) CT1741 DSP read data port +// map(0x2c00 | base, 0x2c00 | base).select(0x300) CT1741 DSP ($22c-$22f on AT) +// map(0x8000 | base, 0x8000 | base).select(0x100) MIDI port/Wave Blaster + map(0xc800 | base, 0xc800 | base).select(0x300).lrw8( + NAME([this] (offs_t offset) { + return m_opl3->read(offset >> 8); + }), + NAME([this] (offs_t offset, u8 data) { + m_opl3->write(offset >> 8, data); + }) + ); +} diff --git a/src/devices/bus/cbus/sb16_ct2720.h b/src/devices/bus/cbus/sb16_ct2720.h new file mode 100644 index 00000000000..4ea5e40188a --- /dev/null +++ b/src/devices/bus/cbus/sb16_ct2720.h @@ -0,0 +1,50 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese + +#ifndef MAME_BUS_CBUS_SB16_CT2720_H + +#pragma once + +#include "bus/cbus/pc9801_cbus.h" +//#include "bus/midi/midi.h" +//#include "bus/pc_joy/pc_joy.h" +#include "sound/dac.h" +//#include "sound/saa1099.h" +#include "sound/ymopl.h" +//#include "diserial.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class sb16_ct2720_device : public device_t +{ +public: + // construction/destruction + sb16_ct2720_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + static constexpr feature_type unemulated_features() { return feature::SOUND | feature::MICROPHONE; } + +protected: + // device-level overrides + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + +private: + void io_map(address_map &map) ATTR_COLD; + + required_device m_bus; + required_device m_opl3; + required_device m_ldac; + required_device m_rdac; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(SB16_CT2720, sb16_ct2720_device) + +#endif // MAME_BUS_CBUS_SB16_H diff --git a/src/mame/nec/pc9801.cpp b/src/mame/nec/pc9801.cpp index a6cfd666fe1..580d8876022 100644 --- a/src/mame/nec/pc9801.cpp +++ b/src/mame/nec/pc9801.cpp @@ -1936,6 +1936,7 @@ static void pc9801_cbus_devices(device_slot_interface &device) // Spark Board device.option_add("amd98", AMD98); device.option_add("mpu_pc98", MPU_PC98); + device.option_add("sb16", SB16_CT2720); // doujinshi HW // MAD Factory / Doujin Hard (同人ハード) diff --git a/src/mame/nec/pc9801.h b/src/mame/nec/pc9801.h index e4ad90dce1d..60e58cda323 100644 --- a/src/mame/nec/pc9801.h +++ b/src/mame/nec/pc9801.h @@ -53,6 +53,8 @@ #include "bus/cbus/pc9801_118.h" #include "bus/cbus/mpu_pc98.h" #include "bus/cbus/pc9801_cbus.h" +#include "bus/cbus/sb16_ct2720.h" + #include "pc9801_kbd.h" #include "pc9801_cd.h" -- cgit v1.2.3