diff options
author | 2024-11-23 15:59:52 +0100 | |
---|---|---|
committer | 2024-11-23 16:00:01 +0100 | |
commit | 024f4305b4b24febd9c7635e4fa03cdbc9d14558 (patch) | |
tree | 7218238b3d2f219dd9565d200271b603553803ab /src/devices/bus | |
parent | e34f3fd430c1062324c3b23eca5cd612ee93e61b (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.cpp | 34 | ||||
-rw-r--r-- | src/devices/bus/cbus/sb16_ct2720.h | 2 | ||||
-rw-r--r-- | src/devices/bus/isa/sb16.cpp | 49 | ||||
-rw-r--r-- | src/devices/bus/isa/sb16.h | 8 |
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 |