i should implement DSP DMA...
This commit is contained in:
+123
-2
@@ -7,12 +7,77 @@ 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;
|
||||
@@ -21,11 +86,67 @@ ircolib::u16 dsp::read16(ircolib::u32 addr) {
|
||||
|
||||
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.raw = value;
|
||||
{
|
||||
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::read16 from unimplemented addr 0x{:08X}", addr);
|
||||
ircolib::panic("dsp::write16 from unimplemented addr 0x{:08X} with value 0x{:04X}", addr, value);
|
||||
}
|
||||
}
|
||||
} // namespace weee::core
|
||||
|
||||
Reference in New Issue
Block a user