diff options
author | aiju <devnull@localhost> | 2014-03-02 12:24:07 +0100 |
---|---|---|
committer | aiju <devnull@localhost> | 2014-03-02 12:24:07 +0100 |
commit | 142858b176c3b3a256389e1c700b78ba89e85e69 (patch) | |
tree | 667b52a14c98882a7ad109b4d424eb0d9f696980 /sys/src/games | |
parent | 88405371b1bcdc2e03eb7559ff2e993949c9b5a7 (diff) |
games/nes: SUROM support, subtle NMI timing bug fixed
Diffstat (limited to 'sys/src/games')
-rw-r--r-- | sys/src/games/nes/cpu.c | 13 | ||||
-rw-r--r-- | sys/src/games/nes/mem.c | 10 | ||||
-rw-r--r-- | sys/src/games/nes/nes.c | 2 | ||||
-rw-r--r-- | sys/src/games/nes/ppu.c | 2 |
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(); } } |