games/snes: cpu timing fix

This commit is contained in:
aiju 2014-03-22 12:50:40 +01:00
parent b13425e2b0
commit 0d080855b2
5 changed files with 14 additions and 12 deletions

View file

@ -609,11 +609,8 @@ enum { COP = 0, BRK = 1, NMI = 3, IRQ = 5 };
static void static void
interrupt(int src) interrupt(int src)
{ {
if(src > BRK){ if(src > BRK)
io(); memread(pc | rPB);
if(!emu)
io();
}
if(!emu) if(!emu)
push8(rPB >> 16); push8(rPB >> 16);
push16(pc); push16(pc);
@ -687,7 +684,6 @@ cpustep(void)
lastpc = curpc; lastpc = curpc;
if(trace) if(trace)
print("%.6x %.2x A=%.4x X=%.4x Y=%.4x P=%.2x %.2x\n", curpc, op, rA, rX, rY, rP, rS); print("%.6x %.2x A=%.4x X=%.4x Y=%.4x P=%.2x %.2x\n", curpc, op, rA, rX, rY, rP, rS);
cyc = 0;
switch(op){ switch(op){
case 0x00: fetch8(); interrupt(BRK); break; case 0x00: fetch8(); interrupt(BRK); break;
case 0x01: nz(rA |= mem816(dpi(0, 1, 0), 0)); break; case 0x01: nz(rA |= mem816(dpi(0, 1, 0), 0)); break;

View file

@ -24,7 +24,7 @@ extern u16int spc;
extern u8int dspstate; extern u8int dspstate;
extern u16int dspcounter, noise; extern u16int dspcounter, noise;
extern int ppuclock, spcclock, dspclock, stimerclock; extern int ppuclock, spcclock, dspclock, stimerclock, cpupause;
extern int battery, saveclock, scale, mouse; extern int battery, saveclock, scale, mouse;
enum { enum {

View file

@ -183,7 +183,7 @@ regread(u16int p)
reg[OPCTLATCH] &= ~3; reg[OPCTLATCH] &= ~3;
return mdr2 = reg[p] | v | mdr2 & 0x20; return mdr2 = reg[p] | v | mdr2 & 0x20;
case 0x2180: case 0x2180:
v = memread(0x7e0000 | reg[0x2181] | reg[0x2182] << 8 | (reg[0x2183] & 1) << 16); v = mem[reg[0x2181] | reg[0x2182] << 8 | (reg[0x2183] & 1) << 16];
incwram(); incwram();
return v; return v;
case 0x4016: case 0x4016:
@ -337,7 +337,7 @@ regwrite(u16int p, u8int v)
case 0x213e: case 0x213e:
return; return;
case 0x2180: case 0x2180:
memwrite(0x7e0000 | reg[0x2181] | reg[0x2182] << 8 | (reg[0x2183] & 1) << 16, v); mem[reg[0x2181] | reg[0x2182] << 8 | (reg[0x2183] & 1) << 16] = v;
incwram(); incwram();
return; return;
case 0x4016: case 0x4016:

View file

@ -857,9 +857,11 @@ ppustep(void)
pixeldraw(rx, ppuy - 1, ppuy >= yvbl ? 0x31c8 : 0); pixeldraw(rx, ppuy - 1, ppuy >= yvbl ? 0x31c8 : 0);
} }
if(ppux == 134)
cpupause = 1;
if(ppux == 0x116 && ppuy <= yvbl) if(ppux == 0x116 && ppuy <= yvbl)
hdma |= reg[0x420c]; hdma |= reg[0x420c];
if((reg[NMITIMEN] & HCNTIRQ) != 0 && htime == ppux && ((reg[NMITIMEN] & VCNTIRQ) == 0 || vtime == ppuy)) if((reg[NMITIMEN] & HCNTIRQ) != 0 && htime+4 == ppux && ((reg[NMITIMEN] & VCNTIRQ) == 0 || vtime == ppuy))
irq |= IRQPPU; irq |= IRQPPU;
if(++ppux >= 340){ if(++ppux >= 340){
ppux = 0; ppux = 0;

View file

@ -11,7 +11,7 @@
uchar *prg, *sram; uchar *prg, *sram;
int nprg, nsram, hirom, battery; int nprg, nsram, hirom, battery;
int ppuclock, spcclock, dspclock, stimerclock, saveclock, msgclock, paused, perfclock; int ppuclock, spcclock, dspclock, stimerclock, saveclock, msgclock, paused, perfclock, cpupause;
Mousectl *mc; Mousectl *mc;
QLock pauselock; QLock pauselock;
u32int keys; u32int keys;
@ -267,7 +267,11 @@ usage:
qlock(&pauselock); qlock(&pauselock);
qunlock(&pauselock); qunlock(&pauselock);
} }
t = cpustep(); if(cpupause){
t = 40;
cpupause = 0;
}else
t = cpustep();
spcclock -= t; spcclock -= t;
stimerclock += t; stimerclock += t;
ppuclock += t; ppuclock += t;