summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus
diff options
context:
space:
mode:
author angelosa <lordkale4@gmail.com>2024-11-23 15:59:52 +0100
committer angelosa <lordkale4@gmail.com>2024-11-23 16:00:01 +0100
commit024f4305b4b24febd9c7635e4fa03cdbc9d14558 (patch)
tree7218238b3d2f219dd9565d200271b603553803ab /src/devices/bus
parente34f3fd430c1062324c3b23eca5cd612ee93e61b (diff)
isa/sb16: move mixer implementation to own ct1745 device
Diffstat (limited to 'src/devices/bus')
-rw-r--r--src/devices/bus/cbus/sb16_ct2720.cpp34
-rw-r--r--src/devices/bus/cbus/sb16_ct2720.h2
-rw-r--r--src/devices/bus/isa/sb16.cpp49
-rw-r--r--src/devices/bus/isa/sb16.h8
4 files changed, 56 insertions, 37 deletions
diff --git a/src/devices/bus/cbus/sb16_ct2720.cpp b/src/devices/bus/cbus/sb16_ct2720.cpp
index 31823f6b35f..f5f47abae7c 100644
--- a/src/devices/bus/cbus/sb16_ct2720.cpp
+++ b/src/devices/bus/cbus/sb16_ct2720.cpp
@@ -31,6 +31,7 @@ sb16_ct2720_device::sb16_ct2720_device(const machine_config &mconfig, const char
: device_t(mconfig, SB16_CT2720, tag, owner, clock)
, m_bus(*this, DEVICE_SELF_OWNER)
, m_opl3(*this, "opl3")
+ , m_mixer(*this, "mixer")
, m_ldac(*this, "ldac")
, m_rdac(*this, "rdac")
{
@@ -41,19 +42,30 @@ 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
+ CT1745(config, m_mixer);
+ m_mixer->set_fm_tag(m_opl3);
+ m_mixer->set_ldac_tag(m_ldac);
+ m_mixer->set_rdac_tag(m_rdac);
+ m_mixer->add_route(0, "lspeaker", 1.0);
+ m_mixer->add_route(1, "rspeaker", 1.0);
+ m_mixer->irq_status_cb().set([this] () {
+ return 0;
+ //return (m_irq8 << 0) | (m_irq16 << 1) | (m_irq_midi << 2) | (0x8 << 4);
+ });
// 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");
+ DAC_16BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); // unknown DAC
+ DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); // unknown DAC
+
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);
+ m_opl3->add_route(0, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0);
+ m_opl3->add_route(1, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1);
+ m_opl3->add_route(2, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0);
+ m_opl3->add_route(3, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1);
}
void sb16_ct2720_device::device_start()
@@ -77,7 +89,15 @@ void sb16_ct2720_device::io_map(address_map &map)
m_opl3->write(offset >> 8, data);
})
);
-// map(0x2400 | base, 0x2400 | base).select(0x100) CT1745 mixer ($224-$225 on AT)
+ // ($224-$225 on AT)
+ map(0x2400 | base, 0x2400 | base).select(0x100).lrw8(
+ NAME([this] (offs_t offset) {
+ return m_mixer->read(offset >> 8);
+ }),
+ NAME([this] (offs_t offset, u8 data) {
+ m_mixer->write(offset >> 8, data);
+ })
+ );
// map(0x2600 | base, 0x2600 | base) CT1741 DSP reset
map(0x2800 | base, 0x2800 | base).select(0x100).lrw8(
NAME([this] (offs_t offset) {
diff --git a/src/devices/bus/cbus/sb16_ct2720.h b/src/devices/bus/cbus/sb16_ct2720.h
index ac775191f00..48178a9313a 100644
--- a/src/devices/bus/cbus/sb16_ct2720.h
+++ b/src/devices/bus/cbus/sb16_ct2720.h
@@ -9,6 +9,7 @@
#include "bus/cbus/pc9801_cbus.h"
//#include "bus/midi/midi.h"
//#include "bus/pc_joy/pc_joy.h"
+#include "sound/ct1745.h"
#include "sound/dac.h"
#include "sound/ymopl.h"
//#include "diserial.h"
@@ -39,6 +40,7 @@ private:
required_device<pc9801_slot_device> m_bus;
required_device<ymf262_device> m_opl3;
+ required_device<ct1745_mixer_device> m_mixer;
required_device<dac_16bit_r2r_device> m_ldac;
required_device<dac_16bit_r2r_device> m_rdac;
};
diff --git a/src/devices/bus/isa/sb16.cpp b/src/devices/bus/isa/sb16.cpp
index 2cfc035baad..16c759c951d 100644
--- a/src/devices/bus/isa/sb16.cpp
+++ b/src/devices/bus/isa/sb16.cpp
@@ -240,7 +240,7 @@ void sb16_lle_device::dac_fifo_ctrl_w(uint8_t data)
{
/* port 0x0E
* bit0 - reset fifo
- * bit1 - ?
+ * bit1 - DAC output sw off?
* bit2 - disable fifo
* bit3 -
* bit4 -
@@ -255,6 +255,7 @@ void sb16_lle_device::dac_fifo_ctrl_w(uint8_t data)
m_dac_r = false;
m_dac_h = false;
}
+ m_mixer->dac_speaker_off_cb(BIT(data, 1));
m_dac_fifo_ctrl = data;
}
@@ -406,24 +407,7 @@ void sb16_lle_device::sb16_io(address_map &map)
void sb16_lle_device::host_io(address_map &map)
{
- // TODO: move to own mixer core
- map(0x4, 0x4).lrw8(
- NAME([this] (offs_t offset) {
- return m_mixer_index;
- }),
- NAME([this] (offs_t offset, u8 data) {
- m_mixer_index = data;
- })
- );
- map(0x5, 0x5).lr8(
- NAME([this] (offs_t offset) {
- if (m_mixer_index == 0x80)
- return 0x12;
- if (m_mixer_index == 0x81)
- return 0x22;
- return 0;
- })
- );
+ map(0x4, 0x5).rw(m_mixer, FUNC(ct1745_mixer_device::read), FUNC(ct1745_mixer_device::write));
map(0x6, 0x7).w(FUNC(sb16_lle_device::dsp_reset_w));
map(0xa, 0xb).r(FUNC(sb16_lle_device::host_data_r));
map(0xc, 0xd).rw(FUNC(sb16_lle_device::dsp_wbuf_status_r), FUNC(sb16_lle_device::host_cmd_w));
@@ -446,14 +430,25 @@ void sb16_lle_device::device_add_mconfig(machine_config &config)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- ymf262_device &ymf262(YMF262(config, "ymf262", XTAL(14'318'181)));
- ymf262.add_route(0, "lspeaker", 1.00);
- ymf262.add_route(1, "rspeaker", 1.00);
- ymf262.add_route(2, "lspeaker", 1.00);
- ymf262.add_route(3, "rspeaker", 1.00);
- 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
+ CT1745(config, m_mixer);
+ m_mixer->set_fm_tag("ymf262");
+ m_mixer->set_ldac_tag(m_ldac);
+ m_mixer->set_rdac_tag(m_rdac);
+ m_mixer->add_route(0, "lspeaker", 1.0);
+ m_mixer->add_route(1, "rspeaker", 1.0);
+ m_mixer->irq_status_cb().set([this] () {
+ return (m_irq8 << 0) | (m_irq16 << 1) | (m_irq_midi << 2) | (0x8 << 4);
+ });
+
+ DAC_16BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); // unknown DAC
+ DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); // unknown DAC
+
+ ymf262_device &ymf262(YMF262(config, "ymf262", XTAL(14'318'181)));
+ ymf262.add_route(0, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0);
+ ymf262.add_route(1, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1);
+ ymf262.add_route(2, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0);
+ ymf262.add_route(3, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1);
PC_JOY(config, m_joy);
}
@@ -705,6 +700,7 @@ void sb16_lle_device::mpu401_w(offs_t offset, uint8_t data)
sb16_lle_device::sb16_lle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, ISA16_SB16, tag, owner, clock),
device_isa16_card_interface(mconfig, *this),
+ m_mixer(*this, "mixer"),
m_ldac(*this, "ldac"),
m_rdac(*this, "rdac"),
m_joy(*this, "pc_joy"),
@@ -770,6 +766,7 @@ TIMER_CALLBACK_MEMBER(sb16_lle_device::timer_tick)
m_cpu->set_input_line(MCS51_INT0_LINE, ASSERT_LINE);
return;
}
+
if(m_mode & 1)
{
switch(m_mode & 0xa0) // dac 16
diff --git a/src/devices/bus/isa/sb16.h b/src/devices/bus/isa/sb16.h
index 8f9553d2f8c..a54fe0ae489 100644
--- a/src/devices/bus/isa/sb16.h
+++ b/src/devices/bus/isa/sb16.h
@@ -7,6 +7,7 @@
#include "isa.h"
#include "bus/pc_joy/pc_joy.h"
#include "cpu/mcs51/mcs51.h"
+#include "sound/ct1745.h"
#include "sound/dac.h"
#include "sound/ymopl.h"
@@ -88,8 +89,9 @@ private:
TIMER_CALLBACK_MEMBER(timer_tick);
- required_device<dac_word_interface> m_ldac;
- required_device<dac_word_interface> m_rdac;
+ required_device<ct1745_mixer_device> m_mixer;
+ required_device<dac_16bit_r2r_device> m_ldac;
+ required_device<dac_16bit_r2r_device> m_rdac;
required_device<pc_joy_device> m_joy;
required_device<i80c52_device> m_cpu;
@@ -112,8 +114,6 @@ private:
bool m_dma8_done, m_dma16_done;
emu_timer *m_timer;
-
- u8 m_mixer_index;
};
// device type definition