summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/isa/sb16.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/isa/sb16.cpp')
-rw-r--r--src/devices/bus/isa/sb16.cpp62
1 files changed, 41 insertions, 21 deletions
diff --git a/src/devices/bus/isa/sb16.cpp b/src/devices/bus/isa/sb16.cpp
index 333703f2cfc..b260edca7b9 100644
--- a/src/devices/bus/isa/sb16.cpp
+++ b/src/devices/bus/isa/sb16.cpp
@@ -163,12 +163,15 @@ void sb16_lle_device::ctrl8_w(uint8_t data)
* bit3 -
* bit4 -
* bit5 -
- * bit6 - ?
+ * bit6 - ? (wolf3d)
* bit7 - toggle for 8bit irq
*/
if(data & 4)
{
m_dma8_cnt = m_dma8_len;
+ if (!(BIT(m_mode, 6)))
+ m_dma8_cnt >>= 1;
+ m_dma8_cnt ++;
m_dma8_done = false;
}
if(!(data & 2) || !(m_ctrl16 & 2))
@@ -210,6 +213,9 @@ void sb16_lle_device::ctrl16_w(uint8_t data)
if(data & 4)
{
m_dma16_cnt = m_dma16_len;
+ if (!(BIT(m_mode, 7)))
+ m_dma16_cnt >>= 1;
+ m_dma16_cnt ++;
m_dma16_done = false;
}
if(!(data & 2) || !(m_ctrl8 & 2))
@@ -240,7 +246,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 +261,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;
}
@@ -381,7 +388,7 @@ void sb16_lle_device::sb16_io(address_map &map)
map(0x0004, 0x0004).mirror(0xff00).rw(FUNC(sb16_lle_device::mode_r), FUNC(sb16_lle_device::mode_w));
map(0x0005, 0x0005).mirror(0xff00).rw(FUNC(sb16_lle_device::dac_ctrl_r), FUNC(sb16_lle_device::dac_ctrl_w));
map(0x0006, 0x0006).mirror(0xff00).r(FUNC(sb16_lle_device::dma_stat_r));
-// map(0x0007, 0x0007) // unknown
+// map(0x0007, 0x0007) // unknown, readback status of stereo f/f?
map(0x0008, 0x0008).mirror(0xff00).rw(FUNC(sb16_lle_device::ctrl8_r), FUNC(sb16_lle_device::ctrl8_w));
map(0x0009, 0x0009).mirror(0xff00).w(FUNC(sb16_lle_device::rate_w));
map(0x000A, 0x000A).mirror(0xff00).r(FUNC(sb16_lle_device::dma8_cnt_lo_r));
@@ -406,6 +413,7 @@ void sb16_lle_device::sb16_io(address_map &map)
void sb16_lle_device::host_io(address_map &map)
{
+ 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));
@@ -426,16 +434,26 @@ void sb16_lle_device::device_add_mconfig(machine_config &config)
m_cpu->port_in_cb<2>().set(FUNC(sb16_lle_device::p2_r));
m_cpu->port_out_cb<2>().set(FUNC(sb16_lle_device::p2_w));
- 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);
+ SPEAKER(config, "speaker", 2).front();
+
+ 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, "speaker", 1.0, 0);
+ m_mixer->add_route(1, "speaker", 1.0, 1);
+ 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, "lspeaker", 0.5); // unknown DAC
- DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
+ DAC_16BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, m_mixer, 0.5, 0); // unknown DAC
+ DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, m_mixer, 0.5, 1); // unknown DAC
+
+ ymf262_device &ymf262(YMF262(config, "ymf262", XTAL(14'318'181)));
+ ymf262.add_route(0, m_mixer, 1.00, 0);
+ ymf262.add_route(1, m_mixer, 1.00, 1);
+ ymf262.add_route(2, m_mixer, 1.00, 0);
+ ymf262.add_route(3, m_mixer, 1.00, 1);
PC_JOY(config, m_joy);
}
@@ -483,7 +501,7 @@ uint8_t sb16_lle_device::dack_r(int line)
return ret;
}
- ++m_adc_fifo_tail %= 16;
+ ++m_adc_fifo_tail %= FIFO_SIZE;
if(m_adc_fifo_ctrl & 4)
{
@@ -491,7 +509,7 @@ uint8_t sb16_lle_device::dack_r(int line)
return ret;
}
- if(m_adc_fifo_head == ((m_adc_fifo_tail + 1) % 16))
+ if(m_adc_fifo_head == ((m_adc_fifo_tail + 1) % FIFO_SIZE))
m_isa->drq1_w(0);
return ret;
}
@@ -526,7 +544,7 @@ void sb16_lle_device::dack_w(int line, uint8_t data)
return;
}
- ++m_dac_fifo_head %= 16;
+ ++m_dac_fifo_head %= FIFO_SIZE;
if(m_dac_fifo_ctrl & 4)
{
@@ -560,7 +578,7 @@ uint16_t sb16_lle_device::dack16_r(int line)
m_isa->drq5_w(0);
return ret;
}
- ++m_adc_fifo_tail %= 16;
+ ++m_adc_fifo_tail %= FIFO_SIZE;
if(m_adc_fifo_ctrl & 4)
{
@@ -568,7 +586,7 @@ uint16_t sb16_lle_device::dack16_r(int line)
return ret;
}
- if(m_adc_fifo_head == ((m_adc_fifo_tail + 1) % 16))
+ if(m_adc_fifo_head == ((m_adc_fifo_tail + 1) % FIFO_SIZE))
m_isa->drq5_w(0);
return ret;
}
@@ -595,7 +613,7 @@ void sb16_lle_device::dack16_w(int line, uint16_t data)
m_isa->drq5_w(0);
return;
}
- ++m_dac_fifo_head %= 16;
+ ++m_dac_fifo_head %= FIFO_SIZE;
if(m_dac_fifo_ctrl & 4)
{
@@ -687,6 +705,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"),
@@ -712,7 +731,7 @@ void sb16_lle_device::device_start()
m_isa->install_device(0x0200, 0x0207, read8smo_delegate(*subdevice<pc_joy_device>("pc_joy"), FUNC(pc_joy_device::joy_port_r)), write8smo_delegate(*subdevice<pc_joy_device>("pc_joy"), FUNC(pc_joy_device::joy_port_w)));
m_isa->install_device(0x0220, 0x022f, *this, &sb16_lle_device::host_io);
m_isa->install_device(0x0330, 0x0331, read8sm_delegate(*this, FUNC(sb16_lle_device::mpu401_r)), write8sm_delegate(*this, FUNC(sb16_lle_device::mpu401_w)));
- m_isa->install_device(0x0388, 0x0389, read8sm_delegate(ymf262, FUNC(ymf262_device::read)), write8sm_delegate(ymf262, FUNC(ymf262_device::write)));
+ m_isa->install_device(0x0388, 0x038b, read8sm_delegate(ymf262, FUNC(ymf262_device::read)), write8sm_delegate(ymf262, FUNC(ymf262_device::write)));
m_isa->install_device(0x0220, 0x0223, read8sm_delegate(ymf262, FUNC(ymf262_device::read)), write8sm_delegate(ymf262, FUNC(ymf262_device::write)));
m_isa->install_device(0x0228, 0x0229, read8sm_delegate(ymf262, FUNC(ymf262_device::read)), write8sm_delegate(ymf262, FUNC(ymf262_device::write)));
m_isa->set_dma_channel(1, this, false);
@@ -752,6 +771,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
@@ -844,12 +864,12 @@ TIMER_CALLBACK_MEMBER(sb16_lle_device::timer_tick)
m_isa->drq5_w(1);
if((!(m_ctrl8 & 2) && !(m_mode & 1)) || (!(m_ctrl16 & 2) && (m_mode & 1)))
- ++m_dac_fifo_tail %= 16;
+ ++m_dac_fifo_tail %= FIFO_SIZE;
if((!(m_ctrl8 & 2) && (m_mode & 1)) || (!(m_ctrl16 & 2) && !(m_mode & 1)))
{
m_adc_fifo[m_adc_fifo_head].h[0] = adcl;
m_adc_fifo[m_adc_fifo_head].h[1] = adcr;
- ++m_adc_fifo_head %= 16;
+ ++m_adc_fifo_head %= FIFO_SIZE;
}
}