Files
weee/core/broadway/mmio/dsp.cpp
T
2026-05-20 17:55:07 +02:00

153 lines
3.8 KiB
C++

#include <broadway/mmio/dsp.hpp>
#include <mem.hpp>
#include <ircolib/log.hpp>
namespace weee::core {
dsp::dsp(mem &mem) {
mem.register_read16_handler(0x0c005000, 0x0c0051ff, [&](ircolib::u32 addr) { return read16(addr); });
mem.register_write16_handler(0x0c005000, 0x0c0051ff,
[&](ircolib::u32 addr, ircolib::u16 value) { return write16(addr, value); });
mem.register_read32_handler(0x0c005000, 0x0c0051ff, [&](ircolib::u32 addr) { return read32(addr); });
mem.register_write32_handler(0x0c005000, 0x0c0051ff,
[&](ircolib::u32 addr, ircolib::u32 value) { return write32(addr, value); });
}
ircolib::u32 dsp::read32(ircolib::u32 addr) {
switch (addr) {
case 0x20:
return ar_dma_mmaddr.whole;
case 0x24:
return ar_dma_araddr.whole;
case 0x28:
return ar_dma_cnt.whole;
case 0x30:
return dma_start_addr.whole;
default:
ircolib::panic("dsp::read32 from unimplemented addr 0x{:08X}", addr);
return 0;
}
}
void dsp::write32(ircolib::u32 addr, ircolib::u32 value) {
switch (addr) {
case 0x20:
ar_dma_mmaddr.whole = value;
break;
case 0x24:
ar_dma_araddr.whole = value;
break;
case 0x28:
ar_dma_cnt.whole = value;
break;
case 0x30:
dma_start_addr.whole = value;
break;
default:
ircolib::panic("dsp::write32 to unimplemented addr 0x{:08X} with value 0x{:08X}", addr, value);
}
}
ircolib::u16 dsp::read16(ircolib::u32 addr) {
switch (addr) {
case 0x00:
return dsp_mail_hi;
case 0x02:
return dsp_mail_lo;
case 0x04:
return cpu_mail_hi;
case 0x06:
return cpu_mail_lo;
case 0x0a:
return csr.raw;
case 0x12:
return ar_size;
case 0x20:
return ar_dma_mmaddr.hi;
case 0x22:
return ar_dma_mmaddr.lo;
case 0x24:
return ar_dma_araddr.hi;
case 0x26:
return ar_dma_araddr.lo;
case 0x28:
return ar_dma_cnt.hi;
case 0x2a:
return ar_dma_cnt.lo;
case 0x30:
return dma_start_addr.hi;
case 0x32:
return dma_start_addr.lo;
default:
ircolib::panic("dsp::read16 from unimplemented addr 0x{:08X}", addr);
return 0;
}
}
void dsp::write16(ircolib::u32 addr, ircolib::u16 value) {
switch (addr) {
case 0x00:
dsp_mail_hi = value;
break;
case 0x02:
dsp_mail_lo = value;
break;
case 0x0a:
{
Csr ccsr = {.raw = value};
Csr ocsr = csr;
csr = ccsr;
if (csr.res || (ocsr.boot_mode != ccsr.boot_mode && ccsr.boot_mode)) {
cpu_mail_hi = 0;
cpu_mail_lo = 0;
dsp_mail_hi = 0;
dsp_mail_lo = 0;
}
if (csr.piint)
csr.piint = false;
if (csr.aidint)
csr.aidint = false;
if (csr.arint)
csr.arint = false;
if (csr.dspint)
csr.dspint = false;
}
break;
case 0x12:
ar_size = value;
break;
case 0x20:
ar_dma_mmaddr.hi = value;
break;
case 0x22:
ar_dma_mmaddr.lo = value;
break;
case 0x24:
ar_dma_araddr.hi = value;
break;
case 0x26:
ar_dma_araddr.lo = value;
break;
case 0x28:
ar_dma_cnt.hi = value;
break;
case 0x2a:
ar_dma_cnt.lo = value;
csr.arint = true;
break;
case 0x30:
dma_start_addr.hi = value;
break;
case 0x32:
dma_start_addr.lo = value;
break;
default:
ircolib::panic("dsp::write16 from unimplemented addr 0x{:08X} with value 0x{:04X}", addr, value);
}
}
} // namespace weee::core