Path: blob/master/libsnes/bsnes/snes/chip/hitachidsp/memory.cpp
2 views
#ifdef HITACHIDSP_CPP12uint8 HitachiDSP::bus_read(unsigned addr) {3if((addr & 0x408000) == 0x008000) return bus.read(addr);4return 0x00;5}67void HitachiDSP::bus_write(unsigned addr, uint8 data) {8if((addr & 0x40e000) == 0x006000) return bus.write(addr, data);9}1011uint8 HitachiDSP::rom_read(unsigned addr) {12if(co_active() == cpu.thread) {13if(state == State::Idle) return cartridge.rom.read(addr);14if((addr & 0x40ffe0) == 0x00ffe0) return regs.vector[addr & 0x1f];15return cpu.regs.mdr;16}17if(co_active() == hitachidsp.thread) {18return cartridge.rom.read(addr);19}20return cpu.regs.mdr;21}2223void HitachiDSP::rom_write(unsigned addr, uint8 data) {24}2526uint8 HitachiDSP::dsp_read(unsigned addr) {27addr &= 0x1fff;2829//Data RAM30if((addr >= 0x0000 && addr <= 0x0bff) || (addr >= 0x1000 && addr <= 0x1bff)) {31return dataRAM[addr & 0x0fff];32}3334//MMIO35switch(addr) {36case 0x1f40: return regs.dma_source >> 0;37case 0x1f41: return regs.dma_source >> 8;38case 0x1f42: return regs.dma_source >> 16;39case 0x1f43: return regs.dma_length >> 0;40case 0x1f44: return regs.dma_length >> 8;41case 0x1f45: return regs.dma_target >> 0;42case 0x1f46: return regs.dma_target >> 8;43case 0x1f47: return regs.dma_target >> 16;44case 0x1f48: return regs.r1f48;45case 0x1f49: return regs.program_offset >> 0;46case 0x1f4a: return regs.program_offset >> 8;47case 0x1f4b: return regs.program_offset >> 16;48case 0x1f4c: return regs.r1f4c;49case 0x1f4d: return regs.page_number >> 0;50case 0x1f4e: return regs.page_number >> 8;51case 0x1f4f: return regs.program_counter;52case 0x1f50: return regs.r1f50;53case 0x1f51: return regs.r1f51;54case 0x1f52: return regs.r1f52;55case 0x1f53: case 0x1f54: case 0x1f55: case 0x1f56:56case 0x1f57: case 0x1f58: case 0x1f59: case 0x1f5a:57case 0x1f5b: case 0x1f5c: case 0x1f5d: case 0x1f5e:58case 0x1f5f: return ((state != State::Idle) << 6) | ((state == State::Idle) << 1);59}6061//Vector62if(addr >= 0x1f60 && addr <= 0x1f7f) {63return regs.vector[addr & 0x1f];64}6566//GPRs67if((addr >= 0x1f80 && addr <= 0x1faf) || (addr >= 0x1fc0 && addr <= 0x1fef)) {68unsigned index = (addr & 0x3f) / 3; //0..1569unsigned shift = ((addr & 0x3f) % 3) * 8; //0, 8, 1670return regs.gpr[index] >> shift;71}7273return 0x00;74}7576void HitachiDSP::dsp_write(unsigned addr, uint8 data) {77addr &= 0x1fff;7879//Data RAM80if((addr >= 0x0000 && addr <= 0x0bff) || (addr >= 0x1000 && addr <= 0x1bff)) {81dataRAM[addr & 0x0fff] = data;82return;83}8485//MMIO86switch(addr) {87case 0x1f40: regs.dma_source = (regs.dma_source & 0xffff00) | (data << 0); return;88case 0x1f41: regs.dma_source = (regs.dma_source & 0xff00ff) | (data << 8); return;89case 0x1f42: regs.dma_source = (regs.dma_source & 0x00ffff) | (data << 16); return;90case 0x1f43: regs.dma_length = (regs.dma_length & 0xff00) | (data << 0); return;91case 0x1f44: regs.dma_length = (regs.dma_length & 0x00ff) | (data << 8); return;92case 0x1f45: regs.dma_target = (regs.dma_target & 0xffff00) | (data << 0); return;93case 0x1f46: regs.dma_target = (regs.dma_target & 0xff00ff) | (data << 8); return;94case 0x1f47: regs.dma_target = (regs.dma_target & 0x00ffff) | (data << 16);95if(state == State::Idle) state = State::DMA;96return;97case 0x1f48: regs.r1f48 = data & 0x01; return;98case 0x1f49: regs.program_offset = (regs.program_offset & 0xffff00) | (data << 0); return;99case 0x1f4a: regs.program_offset = (regs.program_offset & 0xff00ff) | (data << 8); return;100case 0x1f4b: regs.program_offset = (regs.program_offset & 0x00ffff) | (data << 16); return;101case 0x1f4c: regs.r1f4c = data & 0x03; return;102case 0x1f4d: regs.page_number = (regs.page_number & 0x7f00) | ((data & 0xff) << 0); return;103case 0x1f4e: regs.page_number = (regs.page_number & 0x00ff) | ((data & 0x7f) << 8); return;104case 0x1f4f: regs.program_counter = data;105if(state == State::Idle) {106regs.pc = regs.page_number * 256 + regs.program_counter;107state = State::Execute;108}109return;110case 0x1f50: regs.r1f50 = data & 0x77; return;111case 0x1f51: regs.r1f51 = data & 0x01; return;112case 0x1f52: regs.r1f52 = data & 0x01; return;113}114115//Vector116if(addr >= 0x1f60 && addr <= 0x1f7f) {117regs.vector[addr & 0x1f] = data;118return;119}120121//GPRs122if((addr >= 0x1f80 && addr <= 0x1faf) || (addr >= 0x1fc0 && addr <= 0x1fef)) {123unsigned index = (addr & 0x3f) / 3;124switch((addr & 0x3f) % 3) {125case 0: regs.gpr[index] = (regs.gpr[index] & 0xffff00) | (data << 0); return;126case 1: regs.gpr[index] = (regs.gpr[index] & 0xff00ff) | (data << 8); return;127case 2: regs.gpr[index] = (regs.gpr[index] & 0x00ffff) | (data << 16); return;128}129}130}131132#endif133134135