153 lines
3.8 KiB
C++
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
|