Path: blob/master/libsnes/bsnes/snes/chip/superfx/memory/memory.cpp
2 views
#ifdef SUPERFX_CPP12uint8 SuperFX::bus_read(unsigned addr) {3if((addr & 0xc00000) == 0x000000) { //$00-3f:0000-7fff, $00-3f:8000-ffff4while(!regs.scmr.ron && scheduler.sync != Scheduler::SynchronizeMode::All) {5add_clocks(6);6synchronize_cpu();7}8return cartridge.rom.read((((addr & 0x3f0000) >> 1) | (addr & 0x7fff)) & rom_mask);9}1011if((addr & 0xe00000) == 0x400000) { //$40-5f:0000-ffff12while(!regs.scmr.ron && scheduler.sync != Scheduler::SynchronizeMode::All) {13add_clocks(6);14synchronize_cpu();15}16return cartridge.rom.read(addr & rom_mask);17}1819if((addr & 0xe00000) == 0x600000) { //$60-7f:0000-ffff20while(!regs.scmr.ran && scheduler.sync != Scheduler::SynchronizeMode::All) {21add_clocks(6);22synchronize_cpu();23}24return cartridge.ram.read(addr & ram_mask);25}26}2728void SuperFX::bus_write(unsigned addr, uint8 data) {29if((addr & 0xe00000) == 0x600000) { //$60-7f:0000-ffff30while(!regs.scmr.ran && scheduler.sync != Scheduler::SynchronizeMode::All) {31add_clocks(6);32synchronize_cpu();33}34return cartridge.ram.write(addr & ram_mask, data);35}36}3738uint8 SuperFX::op_read(uint16 addr) {39uint16 offset = addr - regs.cbr;40if(offset < 512) {41if(cache.valid[offset >> 4] == false) {42unsigned dp = offset & 0xfff0;43unsigned sp = (regs.pbr << 16) + ((regs.cbr + dp) & 0xfff0);44for(unsigned n = 0; n < 16; n++) {45add_clocks(memory_access_speed);46cache.buffer[dp++] = bus_read(sp++);47}48cache.valid[offset >> 4] = true;49} else {50add_clocks(cache_access_speed);51}52return cache.buffer[offset];53}5455if(regs.pbr <= 0x5f) {56//$[00-5f]:[0000-ffff] ROM57rombuffer_sync();58add_clocks(memory_access_speed);59return bus_read((regs.pbr << 16) + addr);60} else {61//$[60-7f]:[0000-ffff] RAM62rambuffer_sync();63add_clocks(memory_access_speed);64return bus_read((regs.pbr << 16) + addr);65}66}6768uint8 SuperFX::peekpipe() {69uint8 result = regs.pipeline;70regs.pipeline = op_read(regs.r[15]);71r15_modified = false;72return result;73}7475uint8 SuperFX::pipe() {76uint8 result = regs.pipeline;77regs.pipeline = op_read(++regs.r[15]);78r15_modified = false;79return result;80}8182void SuperFX::cache_flush() {83for(unsigned n = 0; n < 32; n++) cache.valid[n] = false;84}8586uint8 SuperFX::cache_mmio_read(uint16 addr) {87addr = (addr + regs.cbr) & 511;88return cache.buffer[addr];89}9091void SuperFX::cache_mmio_write(uint16 addr, uint8 data) {92addr = (addr + regs.cbr) & 511;93cache.buffer[addr] = data;94if((addr & 15) == 15) cache.valid[addr >> 4] = true;95}9697void SuperFX::memory_reset() {98rom_mask = cartridge.rom.size() - 1;99ram_mask = cartridge.ram.size() - 1;100101for(unsigned n = 0; n < 512; n++) cache.buffer[n] = 0x00;102for(unsigned n = 0; n < 32; n++) cache.valid[n] = false;103for(unsigned n = 0; n < 2; n++) {104pixelcache[n].offset = ~0;105pixelcache[n].bitpend = 0x00;106}107}108109#endif110111112