mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-02-24 07:02:27 +01:00
byuu says: Small WIP, just fixes the timings for GSU multiply. However, the actual product may still be wrong when CLSR and MS0 are both set. Since I wasn't 'corrupting' the value in said case before, then this behavior can only be better than before. Turned the (cache,memory)_access_timing into functions that compute the values; and pulled "clockspeed" into GSU. Also, I'm thinking it might be kind of pointless to have clockspeed at all. Supposedly even the Mario Chip can run at 21.48MHz anyway. Enforcing 10.74MHz mode seems kind of silly. If we change it to just be a "default value for CLSR", then we can just inline the memory access tests without the need for the access_timing functions (literally just clsr?2:1 then) Slight compilation bug: go to processor/gsu/registers.hpp:33 and add reg16_t() = default; I missed it due to a partial recompile. Too lazy to upload another WIP just for that. Probably not worth doing much SuperFX testing just yet, as it looks like they're doing some other tests at the moment on NESdev.
117 lines
1.9 KiB
C++
117 lines
1.9 KiB
C++
#ifdef SUPERFX_CPP
|
|
|
|
auto SuperFX::mmio_read(unsigned addr) -> uint8 {
|
|
cpu.synchronize_coprocessors();
|
|
addr &= 0xffff;
|
|
|
|
if(addr >= 0x3100 && addr <= 0x32ff) {
|
|
return cache_mmio_read(addr - 0x3100);
|
|
}
|
|
|
|
if(addr >= 0x3000 && addr <= 0x301f) {
|
|
return regs.r[(addr >> 1) & 15] >> ((addr & 1) << 3);
|
|
}
|
|
|
|
switch(addr) {
|
|
case 0x3030: {
|
|
return regs.sfr >> 0;
|
|
}
|
|
|
|
case 0x3031: {
|
|
uint8 r = regs.sfr >> 8;
|
|
regs.sfr.irq = 0;
|
|
cpu.regs.irq = 0;
|
|
return r;
|
|
}
|
|
|
|
case 0x3034: {
|
|
return regs.pbr;
|
|
}
|
|
|
|
case 0x3036: {
|
|
return regs.rombr;
|
|
}
|
|
|
|
case 0x303b: {
|
|
return regs.vcr;
|
|
}
|
|
|
|
case 0x303c: {
|
|
return regs.rambr;
|
|
}
|
|
|
|
case 0x303e: {
|
|
return regs.cbr >> 0;
|
|
}
|
|
|
|
case 0x303f: {
|
|
return regs.cbr >> 8;
|
|
}
|
|
}
|
|
|
|
return 0x00;
|
|
}
|
|
|
|
auto SuperFX::mmio_write(unsigned addr, uint8 data) -> void {
|
|
cpu.synchronize_coprocessors();
|
|
addr &= 0xffff;
|
|
|
|
if(addr >= 0x3100 && addr <= 0x32ff) {
|
|
return cache_mmio_write(addr - 0x3100, data);
|
|
}
|
|
|
|
if(addr >= 0x3000 && addr <= 0x301f) {
|
|
unsigned n = (addr >> 1) & 15;
|
|
if((addr & 1) == 0) {
|
|
regs.r[n] = (regs.r[n] & 0xff00) | data;
|
|
} else {
|
|
regs.r[n] = (data << 8) | (regs.r[n] & 0xff);
|
|
}
|
|
|
|
if(addr == 0x301f) regs.sfr.g = 1;
|
|
return;
|
|
}
|
|
|
|
switch(addr) {
|
|
case 0x3030: {
|
|
bool g = regs.sfr.g;
|
|
regs.sfr = (regs.sfr & 0xff00) | (data << 0);
|
|
if(g == 1 && regs.sfr.g == 0) {
|
|
regs.cbr = 0x0000;
|
|
cache_flush();
|
|
}
|
|
} break;
|
|
|
|
case 0x3031: {
|
|
regs.sfr = (data << 8) | (regs.sfr & 0x00ff);
|
|
} break;
|
|
|
|
case 0x3033: {
|
|
regs.bramr = data;
|
|
} break;
|
|
|
|
case 0x3034: {
|
|
regs.pbr = data & 0x7f;
|
|
cache_flush();
|
|
} break;
|
|
|
|
case 0x3037: {
|
|
regs.cfgr = data;
|
|
} break;
|
|
|
|
case 0x3038: {
|
|
regs.scbr = data;
|
|
} break;
|
|
|
|
case 0x3039: {
|
|
regs.clsr = data;
|
|
} break;
|
|
|
|
case 0x303a: {
|
|
regs.scmr = data;
|
|
} break;
|
|
}
|
|
}
|
|
|
|
#endif
|