Path: blob/master/libsnes/bsnes/snes/chip/armdsp/memory.cpp
2 views
#ifdef ARMDSP_CPP12uint8 ArmDSP::bus_read(uint32 addr) {3switch(addr & 0xe0000000) {4case 0x00000000: return programROM[addr & 0x0001ffff];5case 0x20000000: return pipeline.mdr.opcode >> ((addr & 3) << 3);6case 0x40000000: break; //MMIO7case 0x60000000: return 0x40404001 >> ((addr & 3) << 3);8case 0x80000000: return pipeline.mdr.opcode >> ((addr & 3) << 3);9case 0xa0000000: return dataROM[addr & 0x00007fff];10case 0xc0000000: return pipeline.mdr.opcode >> ((addr & 3) << 3);11case 0xe0000000: return programRAM[addr & 0x00003fff];12}1314addr &= 0xe000003f;1516if(addr == 0x40000010) {17if(bridge.cputoarm.ready) {18bridge.cputoarm.ready = false;19return bridge.cputoarm.data;20}21}2223if(addr == 0x40000020) {24return bridge.status();25}2627return 0x00;28}2930void ArmDSP::bus_write(uint32 addr, uint8 data) {31switch(addr & 0xe0000000) {32case 0x40000000: break; //MMIO33case 0xe0000000: programRAM[addr & 0x00003fff] = data; return;34default: return;35}3637addr &= 0xe000003f;3839if(addr == 0x40000000) {40bridge.armtocpu.ready = true;41bridge.armtocpu.data = data;42return;43}4445if(addr == 0x40000020) bridge.timerlatch = (bridge.timerlatch & 0xffff00) | (data << 0);46if(addr == 0x40000024) bridge.timerlatch = (bridge.timerlatch & 0xff00ff) | (data << 8);47if(addr == 0x40000028) bridge.timerlatch = (bridge.timerlatch & 0x00ffff) | (data << 16);4849if(addr == 0x40000028) {50bridge.timer = bridge.timerlatch;51bridge.busy = !bridge.timer;52}53}5455uint32 ArmDSP::bus_readbyte(uint32 addr) {56tick();57return bus_read(addr);58}5960void ArmDSP::bus_writebyte(uint32 addr, uint32 data) {61tick();62return bus_write(addr, data);63}6465uint32 ArmDSP::bus_readword(uint32 addr) {66tick();67addr &= ~3;68return (69(bus_read(addr + 0) << 0)70| (bus_read(addr + 1) << 8)71| (bus_read(addr + 2) << 16)72| (bus_read(addr + 3) << 24)73);74}7576void ArmDSP::bus_writeword(uint32 addr, uint32 data) {77tick();78addr &= ~3;79bus_write(addr + 0, data >> 0);80bus_write(addr + 1, data >> 8);81bus_write(addr + 2, data >> 16);82bus_write(addr + 3, data >> 24);83}8485#endif868788