Path: blob/master/libsnes/bsnes/snes/chip/superfx/mmio/mmio.cpp
2 views
#ifdef SUPERFX_CPP12uint8 SuperFX::mmio_read(unsigned addr) {3cpu.synchronize_coprocessors();4addr &= 0xffff;56if(addr >= 0x3100 && addr <= 0x32ff) {7return cache_mmio_read(addr - 0x3100);8}910if(addr >= 0x3000 && addr <= 0x301f) {11return regs.r[(addr >> 1) & 15] >> ((addr & 1) << 3);12}1314switch(addr) {15case 0x3030: {16return regs.sfr >> 0;17}1819case 0x3031: {20uint8 r = regs.sfr >> 8;21regs.sfr.irq = 0;22cpu.regs.irq = 0;23return r;24}2526case 0x3034: {27return regs.pbr;28}2930case 0x3036: {31return regs.rombr;32}3334case 0x303b: {35return regs.vcr;36}3738case 0x303c: {39return regs.rambr;40}4142case 0x303e: {43return regs.cbr >> 0;44}4546case 0x303f: {47return regs.cbr >> 8;48}49}5051return 0x00;52}5354void SuperFX::mmio_write(unsigned addr, uint8 data) {55cpu.synchronize_coprocessors();56addr &= 0xffff;5758if(addr >= 0x3100 && addr <= 0x32ff) {59return cache_mmio_write(addr - 0x3100, data);60}6162if(addr >= 0x3000 && addr <= 0x301f) {63unsigned n = (addr >> 1) & 15;64if((addr & 1) == 0) {65regs.r[n] = (regs.r[n] & 0xff00) | data;66} else {67regs.r[n] = (data << 8) | (regs.r[n] & 0xff);68}6970if(addr == 0x301f) regs.sfr.g = 1;71return;72}7374switch(addr) {75case 0x3030: {76bool g = regs.sfr.g;77regs.sfr = (regs.sfr & 0xff00) | (data << 0);78if(g == 1 && regs.sfr.g == 0) {79regs.cbr = 0x0000;80cache_flush();81}82} break;8384case 0x3031: {85regs.sfr = (data << 8) | (regs.sfr & 0x00ff);86} break;8788case 0x3033: {89regs.bramr = data;90} break;9192case 0x3034: {93regs.pbr = data & 0x7f;94cache_flush();95} break;9697case 0x3037: {98regs.cfgr = data;99update_speed();100} break;101102case 0x3038: {103regs.scbr = data;104} break;105106case 0x3039: {107regs.clsr = data;108update_speed();109} break;110111case 0x303a: {112regs.scmr = data;113} break;114}115}116117#endif118119120