bus/cbus: initial hookup for PC-98 Sound Blaster 16

This commit is contained in:
angelosa 2024-11-18 21:28:08 +01:00
parent fe971256dc
commit be99bd1e17
6 changed files with 161 additions and 5 deletions

View File

@ -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

View File

@ -12,7 +12,7 @@
// TYPE DEFINITIONS
//**************************************************************************
// ======================> isa8_mpu401_device
// ======================> mpu_pc98_device
class mpu_pc98_device : public device_t
{

View File

@ -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);
})
);
}

View File

@ -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<pc9801_slot_device> m_bus;
required_device<ymf262_device> m_opl3;
required_device<dac_16bit_r2r_device> m_ldac;
required_device<dac_16bit_r2r_device> m_rdac;
};
// device type definition
DECLARE_DEVICE_TYPE(SB16_CT2720, sb16_ct2720_device)
#endif // MAME_BUS_CBUS_SB16_H

View File

@ -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 (同人ハード)

View File

@ -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"