2010-08-09 13:28:56 +00:00
|
|
|
#ifdef SUPERFX_CPP
|
|
|
|
|
2015-06-27 02:38:47 +00:00
|
|
|
auto SuperFX::mmio_read(unsigned addr) -> uint8 {
|
Update to v079r06 release.
byuu says:
It does add some more code to the CPU::step() function, so performance
probably went down actually, by about 1%. Removing the input.tick() call
didn't compensate as much as I'd hoped.
Hooked up Super Scope and Justifier support. The good news is that the
Justifier alignment doesn't get fucked up anymore when you go
off-screen. Never could fix that in the old version.
The bad news is that it takes a major speed hit for the time being.
I need to figure out how to run the CPU and input threads out of order.
Every time I try, the input gets thrown off by most of a scanline.
Right now, I'm forced to sync constantly to get the latching position
really accurate. But worst case, I can cut the syncs down by skipping
large chunks around the cursor position, +/-40 clock cycles. So it's
only temporarily slow.
Lastly, killed the old Input class, merged Controllers class into it.
I actually like Controllers as a name better, but it doesn't jive with
video/audio/input, so oh well.
2011-06-25 12:56:32 +00:00
|
|
|
cpu.synchronize_coprocessors();
|
2010-08-09 13:28:56 +00:00
|
|
|
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) {
|
2013-05-05 09:21:30 +00:00
|
|
|
case 0x3030: {
|
|
|
|
return regs.sfr >> 0;
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2013-05-05 09:21:30 +00:00
|
|
|
case 0x3031: {
|
|
|
|
uint8 r = regs.sfr >> 8;
|
|
|
|
regs.sfr.irq = 0;
|
|
|
|
cpu.regs.irq = 0;
|
|
|
|
return r;
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2013-05-05 09:21:30 +00:00
|
|
|
case 0x3034: {
|
|
|
|
return regs.pbr;
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2013-05-05 09:21:30 +00:00
|
|
|
case 0x3036: {
|
|
|
|
return regs.rombr;
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2013-05-05 09:21:30 +00:00
|
|
|
case 0x303b: {
|
|
|
|
return regs.vcr;
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2013-05-05 09:21:30 +00:00
|
|
|
case 0x303c: {
|
|
|
|
return regs.rambr;
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2013-05-05 09:21:30 +00:00
|
|
|
case 0x303e: {
|
|
|
|
return regs.cbr >> 0;
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2013-05-05 09:21:30 +00:00
|
|
|
case 0x303f: {
|
|
|
|
return regs.cbr >> 8;
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0x00;
|
|
|
|
}
|
|
|
|
|
2015-06-27 02:38:47 +00:00
|
|
|
auto SuperFX::mmio_write(unsigned addr, uint8 data) -> void {
|
Update to v079r06 release.
byuu says:
It does add some more code to the CPU::step() function, so performance
probably went down actually, by about 1%. Removing the input.tick() call
didn't compensate as much as I'd hoped.
Hooked up Super Scope and Justifier support. The good news is that the
Justifier alignment doesn't get fucked up anymore when you go
off-screen. Never could fix that in the old version.
The bad news is that it takes a major speed hit for the time being.
I need to figure out how to run the CPU and input threads out of order.
Every time I try, the input gets thrown off by most of a scanline.
Right now, I'm forced to sync constantly to get the latching position
really accurate. But worst case, I can cut the syncs down by skipping
large chunks around the cursor position, +/-40 clock cycles. So it's
only temporarily slow.
Lastly, killed the old Input class, merged Controllers class into it.
I actually like Controllers as a name better, but it doesn't jive with
video/audio/input, so oh well.
2011-06-25 12:56:32 +00:00
|
|
|
cpu.synchronize_coprocessors();
|
2010-08-09 13:28:56 +00:00
|
|
|
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) {
|
2013-05-05 09:21:30 +00:00
|
|
|
case 0x3030: {
|
|
|
|
bool g = regs.sfr.g;
|
|
|
|
regs.sfr = (regs.sfr & 0xff00) | (data << 0);
|
|
|
|
if(g == 1 && regs.sfr.g == 0) {
|
|
|
|
regs.cbr = 0x0000;
|
2010-08-09 13:28:56 +00:00
|
|
|
cache_flush();
|
2013-05-05 09:21:30 +00:00
|
|
|
}
|
|
|
|
} 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;
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|