#include #include #include "6502.h" #include "nes.h" #include "mmc1.h" byte reg[4] = {0, 0, 0, 0}; byte state = 0, b = 0; void mmc1reset(void) { state = 0; b = 0; reg[0] |= 0xC; memcpy(mem + 0xC000, prg[header.nprg - 1], 0x4000); } void mmc1updateprg(void) { int bank = (reg[3] & 0xf) % header.nprg; switch((reg[0]>>2) & 3) { case 0: case 1: memcpy(mem + 0x8000, prg[bank], 0x4000); memcpy(mem + 0xC000, prg[bank+1], 0x4000); break; case 2: memcpy(mem + 0x8000, prg[0], 0x4000); memcpy(mem + 0xC000, prg[bank], 0x4000); break; case 3: memcpy(mem + 0x8000, prg[bank], 0x4000); memcpy(mem + 0xC000, prg[header.nprg - 1], 0x4000); break; } } void mmc1write(word addr, byte val) { if(val & 0x80) { mmc1reset(); } else { b = ((b >> 1) | (b << 7)); b |= val & 1; state++; if(state == 5) { int r = (addr >> 13) - 4; b = ((b >> 4) | (b << 4)); reg[r] = b; mmc1updateprg(); state = 0; b = 0; } } }