fix: Allow writes to DirectSound FIFOs in 8bit granularity

This fixes audio in games that directly write to sound FIFO using STRB instructions.


Former-commit-id: 3efb686b28146c414d5fad289f958346a9a5db6e
This commit is contained in:
Michel Heily 2020-02-18 22:26:59 +02:00
parent 1a382b4cee
commit a585753dc2
2 changed files with 23 additions and 11 deletions

View file

@ -254,13 +254,19 @@ impl Bus for IoDevices {
} }
fn write_8(&mut self, addr: Addr, value: u8) { fn write_8(&mut self, addr: Addr, value: u8) {
let t = self.read_16(addr & !1); match addr + IO_BASE {
let t = if addr & 1 != 0 { /* FIFO_A */ 0x0400_00A0 | 0x0400_00A1 | 0x0400_00A2 | 0x0400_00A3 => self.sound.write_fifo(0, value as i8),
(t & 0xff) | (value as u16) << 8 /* FIFO_B */ 0x0400_00A4 | 0x0400_00A5 | 0x0400_00A6 | 0x0400_00A7 => self.sound.write_fifo(1, value as i8),
} else { _ => {
(t & 0xff00) | (value as u16) let t = self.read_16(addr & !1);
}; let t = if addr & 1 != 0 {
self.write_16(addr & !1, t); (t & 0xff) | (value as u16) << 8
} else {
(t & 0xff00) | (value as u16)
};
self.write_16(addr & !1, t);
}
}
} }
} }

View file

@ -204,10 +204,11 @@ impl SoundController {
return; return;
} }
if !self.mse { // TODO - figure out which writes should be disabled when MSE is off
warn!("MSE disabled, refusing to write"); // if !self.mse {
return; // warn!("MSE disabled, refusing to write");
} // return;
// }
match io_addr { match io_addr {
REG_SOUNDCNT_L => { REG_SOUNDCNT_L => {
@ -288,6 +289,11 @@ impl SoundController {
} }
} }
pub fn write_fifo(&mut self, id: usize, val: i8) {
assert!(id == 0 || id == 1);
self.dma_sound[id].fifo.write(val);
}
pub fn handle_timer_overflow( pub fn handle_timer_overflow(
&mut self, &mut self,
dmac: &mut DmaController, dmac: &mut DmaController,