diff options
author | 2024-11-24 10:41:45 +0100 | |
---|---|---|
committer | 2024-11-24 10:41:52 +0100 | |
commit | be1236fcf8d0ba0c4cd1e915cfc8e02d57ad3bae (patch) | |
tree | afdfebf72bb625f6698573e2deae71e765ab4762 /src/devices/bus/isa | |
parent | 7a232fd4bf4dd09a8596d5353377d4c9b24b0de2 (diff) |
isa/sb16.cpp: halve DMA length if Stereo mode is selected
Diffstat (limited to 'src/devices/bus/isa')
-rw-r--r-- | src/devices/bus/isa/sb16.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/devices/bus/isa/sb16.cpp b/src/devices/bus/isa/sb16.cpp index 55c5588d9df..9f07573f46f 100644 --- a/src/devices/bus/isa/sb16.cpp +++ b/src/devices/bus/isa/sb16.cpp @@ -163,12 +163,14 @@ 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; + m_dma8_cnt = m_dma8_len + 1; + if (!(BIT(m_mode, 6))) + m_dma8_cnt >>= 1; m_dma8_done = false; } if(!(data & 2) || !(m_ctrl16 & 2)) @@ -209,7 +211,9 @@ void sb16_lle_device::ctrl16_w(uint8_t data) */ if(data & 4) { - m_dma16_cnt = m_dma16_len; + m_dma16_cnt = m_dma16_len + 1; + if (!(BIT(m_mode, 7))) + m_dma16_cnt >>= 1; m_dma16_done = false; } if(!(data & 2) || !(m_ctrl8 & 2)) @@ -382,7 +386,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)); |