libgambatte: shave off an instruction or two on ff loads/stores

gcc arm/x86.
This commit is contained in:
sinamas 2013-03-27 00:52:57 +01:00
parent 869d8fa3bf
commit f79044ee79
3 changed files with 22 additions and 20 deletions

View File

@ -995,8 +995,8 @@ void CPU::process(unsigned long const cycles) {
// halt (4 cycles):
case 0x76:
if (!mem_.ime()
&& ( mem_.ff_read(0xFF0F, cycleCounter)
& mem_.ff_read(0xFFFF, cycleCounter) & 0x1F)) {
&& ( mem_.ff_read(0x0F, cycleCounter)
& mem_.ff_read(0xFF, cycleCounter) & 0x1F)) {
if (mem_.isCgb())
cycleCounter += 4;
else
@ -1779,7 +1779,7 @@ void CPU::process(unsigned long const cycles) {
{
unsigned imm;
PC_READ(imm);
FF_WRITE(0xFF00 | imm, a);
FF_WRITE(imm, a);
}
break;
@ -1791,7 +1791,7 @@ void CPU::process(unsigned long const cycles) {
// ld ($FF00+C),a (8 ycles):
// Put A into address (0xFF00 + register C):
case 0xE2:
FF_WRITE(0xFF00 | c, a);
FF_WRITE(c, a);
break;
case 0xE3: // not specified. should freeze.
@ -1868,7 +1868,7 @@ void CPU::process(unsigned long const cycles) {
{
unsigned imm;
PC_READ(imm);
FF_READ(a, 0xFF00 | imm);
FF_READ(a, imm);
}
break;
@ -1887,7 +1887,7 @@ void CPU::process(unsigned long const cycles) {
// ld a,($FF00+C) (8 cycles):
// Put value at address (0xFF00 + register C) into A:
case 0xF2:
FF_READ(a, 0xFF00 | c);
FF_READ(a, c);
break;
// di (4 cycles):

View File

@ -51,9 +51,9 @@ void Memory::setStatePtrs(SaveState &state) {
unsigned long Memory::saveState(SaveState &state, unsigned long cc) {
cc = resetCounters(cc);
nontrivial_ff_read(0xFF05, cc);
nontrivial_ff_read(0xFF0F, cc);
nontrivial_ff_read(0xFF26, cc);
nontrivial_ff_read(0x05, cc);
nontrivial_ff_read(0x0F, cc);
nontrivial_ff_read(0x26, cc);
state.mem.divLastUpdate = divLastUpdate_;
state.mem.nextSerialtime = intreq_.eventTime(intevent_serial);
@ -455,7 +455,7 @@ unsigned Memory::nontrivial_ff_read(unsigned const p, unsigned long const cc) {
if (lastOamDmaUpdate_ != disabled_time)
updateOamDma(cc);
switch (p & 0x7F) {
switch (p) {
case 0x00:
updateInput();
break;
@ -516,7 +516,7 @@ unsigned Memory::nontrivial_ff_read(unsigned const p, unsigned long const cc) {
break;
}
return ioamhram_[p - 0xFE00];
return ioamhram_[p + 0x100];
}
static bool isInOamDmaConflictArea(OamDmaSrc const oamDmaSrc, unsigned const p, bool const cgb) {
@ -574,8 +574,9 @@ unsigned Memory::nontrivial_read(unsigned const p, unsigned long const cc) {
if (p < 0xFE00)
return cart_.wramdata(p >> 12 & 1)[p & 0xFFF];
if (p >= 0xFF00)
return nontrivial_ff_read(p, cc);
long const ffp = long(p) - 0xFF00;
if (ffp >= 0)
return nontrivial_ff_read(ffp, cc);
if (!lcd_.oamReadable(cc) || oamDmaPos_ < 0xA0)
return 0xFF;
@ -788,7 +789,7 @@ void Memory::nontrivial_ff_write(unsigned const p, unsigned data, unsigned long
psg_.generateSamples(cc, isDoubleSpeed());
if (!(data & 0x80)) {
for (unsigned i = 0xFF10; i < 0xFF26; ++i)
for (unsigned i = 0x10; i < 0x26; ++i)
ff_write(i, 0, cc);
psg_.setEnabled(false);
@ -1001,7 +1002,7 @@ void Memory::nontrivial_ff_write(unsigned const p, unsigned data, unsigned long
return;
}
ioamhram_[p - 0xFE00] = data;
ioamhram_[p + 0x100] = data;
}
void Memory::nontrivial_write(unsigned const p, unsigned const data, unsigned long const cc) {
@ -1030,13 +1031,14 @@ void Memory::nontrivial_write(unsigned const p, unsigned const data, unsigned lo
} else
cart_.wramdata(p >> 12 & 1)[p & 0xFFF] = data;
} else if (p - 0xFF80u >= 0x7Fu) {
if (p < 0xFF00) {
long const ffp = long(p) - 0xFF00;
if (ffp < 0) {
if (lcd_.oamWritable(cc) && oamDmaPos_ >= 0xA0 && (p < 0xFEA0 || isCgb())) {
lcd_.oamChange(cc);
ioamhram_[p - 0xFE00] = data;
}
} else
nontrivial_ff_write(p, data, cc);
nontrivial_ff_write(ffp, data, cc);
} else
ioamhram_[p - 0xFE00] = data;
}

View File

@ -67,7 +67,7 @@ public:
void di() { intreq_.di(); }
unsigned ff_read(unsigned p, unsigned long cc) {
return p < 0xFF80 ? nontrivial_ff_read(p, cc) : ioamhram_[p - 0xFE00];
return p < 0x80 ? nontrivial_ff_read(p, cc) : ioamhram_[p + 0x100];
}
unsigned read(unsigned p, unsigned long cc) {
@ -82,8 +82,8 @@ public:
}
void ff_write(unsigned p, unsigned data, unsigned long cc) {
if (p - 0xFF80u < 0x7Fu) {
ioamhram_[p - 0xFE00] = data;
if (p - 0x80u < 0x7Fu) {
ioamhram_[p + 0x100] = data;
} else
nontrivial_ff_write(p, data, cc);
}