summaryrefslogtreecommitdiff
path: root/sys/src/games
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2014-03-02 12:24:07 +0100
committeraiju <devnull@localhost>2014-03-02 12:24:07 +0100
commit142858b176c3b3a256389e1c700b78ba89e85e69 (patch)
tree667b52a14c98882a7ad109b4d424eb0d9f696980 /sys/src/games
parent88405371b1bcdc2e03eb7559ff2e993949c9b5a7 (diff)
games/nes: SUROM support, subtle NMI timing bug fixed
Diffstat (limited to 'sys/src/games')
-rw-r--r--sys/src/games/nes/cpu.c13
-rw-r--r--sys/src/games/nes/mem.c10
-rw-r--r--sys/src/games/nes/nes.c2
-rw-r--r--sys/src/games/nes/ppu.c2
4 files changed, 17 insertions, 10 deletions
diff --git a/sys/src/games/nes/cpu.c b/sys/src/games/nes/cpu.c
index e21c2e88c..f23c6a239 100644
--- a/sys/src/games/nes/cpu.c
+++ b/sys/src/games/nes/cpu.c
@@ -244,11 +244,12 @@ step(void)
u16int a, v;
int c;
- if(nmi){
- interrupt(1, 0);
- nmi = 0;
- return 7;
- }
+ if(nmi)
+ if(--nmi == 0){
+ interrupt(1, 0);
+ nmi = 0;
+ return 7;
+ }
if(irq && (rP & 4) == 0){
interrupt(0, 0);
return 7;
@@ -256,7 +257,7 @@ step(void)
curpc = pc;
op = fetch8();
if(trace)
- print("%x %x %x %x %x %x %x %x\n", curpc, op, rA, rX, rY, rS, rP, memread(0x2c));
+ print("%x %x %x %x %x %x %x\n", curpc, op, rA, rX, rY, rS, rP);
switch(op){
case 0x00: pc++; interrupt(0, 1); return 7;
case 0x01: nz(rA |= indX()); return 6;
diff --git a/sys/src/games/nes/mem.c b/sys/src/games/nes/mem.c
index 69951a124..63a851d56 100644
--- a/sys/src/games/nes/mem.c
+++ b/sys/src/games/nes/mem.c
@@ -54,6 +54,8 @@ mmc1(int v, u8int p)
if(v < 0){
switch(v){
case INIT:
+ if(nprg > 32)
+ sysfatal("bad rom, too much prg rom for mmc1");
mode = 0x0C;
prgsh = 14;
chrsh = 12;
@@ -99,6 +101,10 @@ mmc1(int v, u8int p)
mirr = mirrs[mode & 3];
break;
case 0xA000:
+ if(nprg > 16){
+ pr = s & 0x10 | pr & 0x0f;
+ pr %= nprg;
+ }
c0 = s & 0x1f;
c0 %= 2*nchr;
break;
@@ -107,7 +113,7 @@ mmc1(int v, u8int p)
c1 %= 2*nchr;
break;
case 0xE000:
- pr = s & 0x0f;
+ pr = pr & 0x10 | s & 0x0f;
pr %= nprg;
break;
}
@@ -121,7 +127,7 @@ t:
break;
case 0x0C:
prgb[0] = prg + pr * 0x4000;
- prgb[1] = prg + (0x0f % nprg) * 0x4000;
+ prgb[1] = prg + ((pr & 0x10 | 0x0f) % nprg) * 0x4000;
break;
default:
prgb[0] = prg + (pr & 0xfe) * 0x4000;
diff --git a/sys/src/games/nes/nes.c b/sys/src/games/nes/nes.c
index 96b05084f..5cc6c1c3b 100644
--- a/sys/src/games/nes/nes.c
+++ b/sys/src/games/nes/nes.c
@@ -93,7 +93,7 @@ loadrom(char *file, int sflag)
if(readn(fd, chr, nchr * CHRSZ) < nchr * CHRSZ)
sysfatal("read: %r");
}else{
- nchr = 16;
+ nchr = 1;
chr = malloc(nchr * CHRSZ);
if(chr == nil)
sysfatal("malloc: %r");
diff --git a/sys/src/games/nes/ppu.c b/sys/src/games/nes/ppu.c
index 015ca7041..ba68343f6 100644
--- a/sys/src/games/nes/ppu.c
+++ b/sys/src/games/nes/ppu.c
@@ -326,7 +326,7 @@ ppustep(void)
if(ppux == 1){
mem[PPUSTATUS] |= PPUVBLANK;
if((mem[PPUCTRL] & PPUNMI) != 0)
- nmi = 1;
+ nmi = 2;
flush();
}
}