#include #include #include 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