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/nes/mem.c | |
parent | 88405371b1bcdc2e03eb7559ff2e993949c9b5a7 (diff) |
games/nes: SUROM support, subtle NMI timing bug fixed
Diffstat (limited to 'sys/src/games/nes/mem.c')
-rw-r--r-- | sys/src/games/nes/mem.c | 10 |
1 files changed, 8 insertions, 2 deletions
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; |