Path: blob/master/libsnes/bsnes/snes/chip/superfx/timing/timing.cpp
2 views
#ifdef SUPERFX_CPP12void SuperFX::add_clocks(unsigned clocks) {3if(regs.romcl) {4regs.romcl -= min(clocks, regs.romcl);5if(regs.romcl == 0) {6regs.sfr.r = 0;7regs.romdr = bus_read((regs.rombr << 16) + regs.r[14]);8}9}1011if(regs.ramcl) {12regs.ramcl -= min(clocks, regs.ramcl);13if(regs.ramcl == 0) {14bus_write(0x700000 + (regs.rambr << 16) + regs.ramar, regs.ramdr);15}16}1718step(clocks);19synchronize_cpu();20}2122void SuperFX::rombuffer_sync() {23if(regs.romcl) add_clocks(regs.romcl);24}2526void SuperFX::rombuffer_update() {27regs.sfr.r = 1;28regs.romcl = memory_access_speed;29}3031uint8 SuperFX::rombuffer_read() {32rombuffer_sync();33return regs.romdr;34}3536void SuperFX::rambuffer_sync() {37if(regs.ramcl) add_clocks(regs.ramcl);38}3940uint8 SuperFX::rambuffer_read(uint16 addr) {41rambuffer_sync();42return bus_read(0x700000 + (regs.rambr << 16) + addr);43}4445void SuperFX::rambuffer_write(uint16 addr, uint8 data) {46rambuffer_sync();47regs.ramcl = memory_access_speed;48regs.ramar = addr;49regs.ramdr = data;50}5152void SuperFX::r14_modify(uint16 data) {53regs.r[14].data = data;54rombuffer_update();55}5657void SuperFX::r15_modify(uint16 data) {58regs.r[15].data = data;59r15_modified = true;60}6162void SuperFX::update_speed() {63//force SuperFX1 mode?64if(clockmode == 1) {65cache_access_speed = 2;66memory_access_speed = 6;67return;68}6970//force SuperFX2 mode?71if(clockmode == 2) {72cache_access_speed = 1;73memory_access_speed = 5;74regs.cfgr.ms0 = 0; //cannot use high-speed multiplication in 21MHz mode75return;76}7778//default: allow S-CPU to select mode79cache_access_speed = (regs.clsr ? 1 : 2);80memory_access_speed = (regs.clsr ? 5 : 6);81if(regs.clsr) regs.cfgr.ms0 = 0; //cannot use high-speed multiplication in 21MHz mode82}8384void SuperFX::timing_reset() {85update_speed();86r15_modified = false;8788regs.romcl = 0;89regs.romdr = 0;9091regs.ramcl = 0;92regs.ramar = 0;93regs.ramdr = 0;94}9596#endif979899