From 52bfae1ab47c50068e38068d32eaef0d5216ace0 Mon Sep 17 00:00:00 2001 From: retro-wertz Date: Tue, 17 Oct 2017 11:16:36 +0800 Subject: [PATCH 1/5] Replaced remaining C++ comments --- src/boards/copyfami_emu.c | 146 +++++++++++++++++++------------------- src/boards/copyfami_hwi.c | 121 ++++++++++++++++--------------- 2 files changed, 135 insertions(+), 132 deletions(-) diff --git a/src/boards/copyfami_emu.c b/src/boards/copyfami_emu.c index a715a2e..e565d98 100644 --- a/src/boards/copyfami_emu.c +++ b/src/boards/copyfami_emu.c @@ -24,81 +24,81 @@ #include "mapinc.h" #include "mmc3.h" -//#define DEBUG_SERIAL +/* #define DEBUG_SERIAL */ -// *** COPY FAMICOM EMULATION *** +/* *** COPY FAMICOM EMULATION *** */ /* - - - $0000-$1FFF - $2000-$200F PPU - $2010-$3FFB - $3FFC-$3FFF - $4000-$7FFF APU / - $8000-$FFF9 CART/ROM - $FFFA-$FFFB CART/ NMI - $FFFE-$FFFF CART/ IRQ - - - - CTRL R/W $3FFC ---aenic ($00 at reset) - - c - - 0 - - 1 - - i - IRQ - 0 - - 1 - - n - NMI - 0 - - 1 - - e - NMI - 0 - - 1 - - a - AROM - 0 - - 1 - - - BANK R/W $3FFD ---mbbbb - - b - - m - ROM - - USBDATA R/W $3FFE dddddddd - - d - / - - STATUS R $3FFF vmnicptr - - r - USB - 0 - - 1 - - t - USB - 0 - - 1 - - p - USB - 0 - - 1 - - c - - 0 - - 1 - - i - IRQ - 0 - - 1 - - n - NMI - 0 - - 1 - - m - 10 VRAM () - v - VRAM - 0 - - 1 - - - AROM - - VRAM - 8000-FFFF -*/ + * + * + * $0000-$1FFF + * $2000-$200F PPU + * $2010-$3FFB + * $3FFC-$3FFF + * $4000-$7FFF APU / + * $8000-$FFF9 CART/ROM + * $FFFA-$FFFB CART/ NMI + * $FFFE-$FFFF CART/ IRQ + * + * + * + * CTRL R/W $3FFC ---aenic ($00 at reset) + * + * c - + * 0 - + * 1 - + * i - IRQ + * 0 - + * 1 - + * n - NMI + * 0 - + * 1 - + * e - NMI + * 0 - + * 1 - + * a - AROM + * 0 - + * 1 - + * + * BANK R/W $3FFD ---mbbbb + * + * b - + * m - ROM + * + * USBDATA R/W $3FFE dddddddd + * + * d - / + * + * STATUS R $3FFF vmnicptr + * + * r - USB + * 0 - + * 1 - + * t - USB + * 0 - + * 1 - + * p - USB + * 0 - + * 1 - + * c - + * 0 - + * 1 - + * i - IRQ + * 0 - + * 1 - + * n - NMI + * 0 - + * 1 - + * m - 10 VRAM () + * v - VRAM + * 0 - + * 1 - + * + * AROM + * + * VRAM + * 8000-FFFF + */ #define CTRL 0x00 #define CCART 0x01 @@ -196,7 +196,7 @@ static DECLFW(MCopyFamiWriteReg) { ; #endif bytes_count++; -// FCEU_printf(" %02X",V); +/* FCEU_printf(" %02X",V); */ } else { regs[A & 3] = V; Sync(); diff --git a/src/boards/copyfami_hwi.c b/src/boards/copyfami_hwi.c index 8ddb9c6..40d6632 100644 --- a/src/boards/copyfami_hwi.c +++ b/src/boards/copyfami_hwi.c @@ -18,10 +18,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -// *** COPY FAMICOM HARDWARE INTERFACE *** - #ifdef COPYFAMI +/* *** COPY FAMICOM HARDWARE INTERFACE *** */ + #define MESSAGE_LOG #define NO_CACHE #define NO_RAM @@ -42,45 +42,45 @@ static uint8 *WRAM = NULL; -uint8 InitVector[] = { 0xDE, 0xAD, 0xBE, 0xEF };// args none, return DE AD BE EF -uint8 ResetCmd[] = { 0x00 }; // args none, return none -uint8 StateCmd[] = { 0x01 }; // args none, return 7 bytes status -uint8 StatusCmd[] = { 0x02 }; // args none, return 32 bytes status -uint8 LoadPlugCmd[] = { 0x03, 0x00, 0x00 }; // args 2b size, Nb data return none -uint8 RunPlugCmd[] = { 0x04 }; // args none, return none -uint8 RunGameCmd[] = { 0x05 }; // args none, return none -uint8 NROMSave[] = { 0x06 }; // args none, return 16b + 32kb + 8kb +uint8 InitVector[] = { 0xDE, 0xAD, 0xBE, 0xEF };/* args none, return DE AD BE EF */ +uint8 ResetCmd[] = { 0x00 }; /* args none, return none */ +uint8 StateCmd[] = { 0x01 }; /* args none, return 7 bytes status */ +uint8 StatusCmd[] = { 0x02 }; /* args none, return 32 bytes status */ +uint8 LoadPlugCmd[] = { 0x03, 0x00, 0x00 }; /* args 2b size, Nb data return none */ +uint8 RunPlugCmd[] = { 0x04 }; /* args none, return none */ +uint8 RunGameCmd[] = { 0x05 }; /* args none, return none */ +uint8 NROMSave[] = { 0x06 }; /* args none, return 16b + 32kb + 8kb */ -uint8 PRGWBCmd[] = { 0x08, 0x00, 0x00, 0x00 }; // args 2b addr, 1b data return none -uint8 PRGRBCmd[] = { 0x09, 0x00, 0x00 }; // args 2b addr return 1b data -uint8 CHRWBCmd[] = { 0x0A, 0x00, 0x00, 0x00 }; // args 2b addr, 1b data return none -uint8 CHRRBCmd[] = { 0x0B, 0x00, 0x00 }; // args 2b addr, return 1b data +uint8 PRGWBCmd[] = { 0x08, 0x00, 0x00, 0x00 }; /* args 2b addr, 1b data return none */ +uint8 PRGRBCmd[] = { 0x09, 0x00, 0x00 }; /* args 2b addr return 1b data */ +uint8 CHRWBCmd[] = { 0x0A, 0x00, 0x00, 0x00 }; /* args 2b addr, 1b data return none */ +uint8 CHRRBCmd[] = { 0x0B, 0x00, 0x00 }; /* args 2b addr, return 1b data */ -uint8 PRGSUMCmd[] = { 0x10, 0x00, 0x00 }; // args 1b addr, 1b size return (256 * N)b -uint8 PRG32KSUMCmd[] = { 0x10, 0x80, 0x80 }; // args 1b addr, 1b size return 32kb -uint8 PRG16KSUMCmd[] = { 0x10, 0x00, 0x40 }; // args 1b addr, 1b size return 16kb -uint8 PRG8KSUMCmd[] = { 0x10, 0x00, 0x20 }; // args 1b addr, 1b size return 8kb -uint8 PRG4KSUMCmd[] = { 0x10, 0x00, 0x10 }; // args 1b addr, 1b size return 4kb +uint8 PRGSUMCmd[] = { 0x10, 0x00, 0x00 }; /* args 1b addr, 1b size return (256 * N)b */ +uint8 PRG32KSUMCmd[] = { 0x10, 0x80, 0x80 }; /* args 1b addr, 1b size return 32kb */ +uint8 PRG16KSUMCmd[] = { 0x10, 0x00, 0x40 }; /* args 1b addr, 1b size return 16kb */ +uint8 PRG8KSUMCmd[] = { 0x10, 0x00, 0x20 }; /* args 1b addr, 1b size return 8kb */ +uint8 PRG4KSUMCmd[] = { 0x10, 0x00, 0x10 }; /* args 1b addr, 1b size return 4kb */ -uint8 CHRSUMCmd[] = { 0x11, 0x00, 0x00 }; // args 1b addr, 1b size return (256 * N)b -uint8 CHR8KSUMCmd[] = { 0x11, 0x00, 0x20 }; // args 1b addr, 1b size return 8kb -uint8 CHR4KSUMCmd[] = { 0x11, 0x00, 0x10 }; // args 1b addr, 1b size return 4kb -uint8 CHR2KSUMCmd[] = { 0x11, 0x00, 0x08 }; // args 1b addr, 1b size return 2kb -uint8 CHR1KSUMCmd[] = { 0x11, 0x00, 0x04 }; // args 1b addr, 1b size return 1kb +uint8 CHRSUMCmd[] = { 0x11, 0x00, 0x00 }; /* args 1b addr, 1b size return (256 * N)b */ +uint8 CHR8KSUMCmd[] = { 0x11, 0x00, 0x20 }; /* args 1b addr, 1b size return 8kb */ +uint8 CHR4KSUMCmd[] = { 0x11, 0x00, 0x10 }; /* args 1b addr, 1b size return 4kb */ +uint8 CHR2KSUMCmd[] = { 0x11, 0x00, 0x08 }; /* args 1b addr, 1b size return 2kb */ +uint8 CHR1KSUMCmd[] = { 0x11, 0x00, 0x04 }; /* args 1b addr, 1b size return 1kb */ -uint8 PRGGetCmd[] = { 0x12, 0x00, 0x00 }; // args 1b addr, 1b size return (256 * N)b -uint8 PRG32KGetCmd[] = { 0x12, 0x80, 0x80 }; // args 1b addr, 1b size return 32kb -uint8 PRG16KGetCmd[] = { 0x12, 0x00, 0x40 }; // args 1b addr, 1b size return 16kb -uint8 PRG8KGetCmd[] = { 0x12, 0x00, 0x20 }; // args 1b addr, 1b size return 8kb -uint8 PRG4KGetCmd[] = { 0x12, 0x00, 0x10 }; // args 1b addr, 1b size return 4kb +uint8 PRGGetCmd[] = { 0x12, 0x00, 0x00 }; /* args 1b addr, 1b size return (256 * N)b */ +uint8 PRG32KGetCmd[] = { 0x12, 0x80, 0x80 }; /* args 1b addr, 1b size return 32kb */ +uint8 PRG16KGetCmd[] = { 0x12, 0x00, 0x40 }; /* args 1b addr, 1b size return 16kb */ +uint8 PRG8KGetCmd[] = { 0x12, 0x00, 0x20 }; /* args 1b addr, 1b size return 8kb */ +uint8 PRG4KGetCmd[] = { 0x12, 0x00, 0x10 }; /* args 1b addr, 1b size return 4kb */ -uint8 CHRGetCmd[] = { 0x13, 0x00, 0x00 }; // args 1b addr, 1b size return (256 * N)b -uint8 CHR8KGetCmd[] = { 0x13, 0x00, 0x20 }; // args 1b addr, 1b size return 8kb -uint8 CHR4KGetCmd[] = { 0x13, 0x00, 0x10 }; // args 1b addr, 1b size return 4kb -uint8 CHR2KGetCmd[] = { 0x13, 0x00, 0x08 }; // args 1b addr, 1b size return 2kb -uint8 CHR1KGetCmd[] = { 0x13, 0x00, 0x04 }; // args 1b addr, 1b size return 1kb +uint8 CHRGetCmd[] = { 0x13, 0x00, 0x00 }; /* args 1b addr, 1b size return (256 * N)b */ +uint8 CHR8KGetCmd[] = { 0x13, 0x00, 0x20 }; /* args 1b addr, 1b size return 8kb */ +uint8 CHR4KGetCmd[] = { 0x13, 0x00, 0x10 }; /* args 1b addr, 1b size return 4kb */ +uint8 CHR2KGetCmd[] = { 0x13, 0x00, 0x08 }; /* args 1b addr, 1b size return 2kb */ +uint8 CHR1KGetCmd[] = { 0x13, 0x00, 0x04 }; /* args 1b addr, 1b size return 1kb */ -uint8 CPUTestCmd[] = { 0x14, 0x00, 0x00 }; // args 1b addr, 1b size return (2b + 1b) * N + 3b +uint8 CPUTestCmd[] = { 0x14, 0x00, 0x00 }; /* args 1b addr, 1b size return (2b + 1b) * N + 3b */ typedef struct { int32 mirror; @@ -326,8 +326,9 @@ static void UpdateCmd(uint32 val) { if (cmd.size < CMD_MAX_SIZE) { index = cmd.size++; } else { - // если достигнут максимум для команды, выбросить последнуюю, добавить новую, - // продолжать до банксвичинга + /* если достигнут максимум для команды, выбросить последнуюю, добавить новую, + * продолжать до банксвичинга + */ cmd.hash = 0; for (index = 0; index < (CMD_MAX_SIZE - 1); index++) { cmd.seq[index] = cmd.seq[index + 1]; @@ -361,10 +362,11 @@ static DECLFW(MCopyFamiWrite) { Sync(); #else UpdateCmd((A << 8) | V); - // ищем команду в кеше + /* ищем команду в кеше */ if (cmd.found == -1) { - // не найдена, проверяем, изменилось ли состояние банков - // либо не предельной ли она длины для команды + /* не найдена, проверяем, изменилось ли состояние банков + * либо не предельной ли она длины для команды + */ cmd_cache[cmd.hashf].index = cmd.found = cmds.count++; cmd_cache[cmd.hashf].retest = 0; cmd_cache[cmd.hashf].verify = 0; @@ -378,15 +380,15 @@ static DECLFW(MCopyFamiWrite) { cmd.hash = 0; Sync(); } else { - // если добавлена полная команда без банксвитчинга + /* если добавлена полная команда без банксвитчинга */ cmd_cache[cmd.hashf].index = -2; } } else if (cmd.found == -2) { - // частичное совпадение, если число проверок не превысило лимит + /* частичное совпадение, если число проверок не превысило лимит */ if (cmd_cache[cmd.hashf].retest < CMD_MAX_RETEST) { - // то проверим состояние банков + /* то проверим состояние банков */ if (CheckStatus()) { - // изменилось, запишем новую команду + /* изменилось, запишем новую команду */ cmd_cache[cmd.hashf].index = cmd.found = cmds.count++; cmd_cache[cmd.hashf].retest = 0; cmd_cache[cmd.hashf].verify = 0; @@ -399,17 +401,16 @@ static DECLFW(MCopyFamiWrite) { cmd.hash = 0; Sync(); } else { - // не изменилось, отметим увеличим счетчик проверок + /* не изменилось, отметим увеличим счетчик проверок */ cmd_cache[cmd.hashf].retest++; } } } else { - // найдена, последний рубеж обороны от говна -/* + /* найдена, последний рубеж обороны от говна */ +#if 0 if(cmd_cache[cmd.hashf].verify < CMD_MAX_VERIFY) { if(CheckStatus()) { int32 changed = 0; - // , if(cmds.states[cmd.found].mirror != state_new.mirror) changed = 1; for(i=0; i<8; i++) @@ -426,8 +427,10 @@ static DECLFW(MCopyFamiWrite) { } } else cmd_cache[cmd.hashf].verify++; - } else */{ - // применяем без малейшего зазрения совести + } else +#endif + { + /* применяем без малейшего зазрения совести */ ApplyStatus(); cmd.size = 0; cmd.hash = 0; @@ -453,7 +456,7 @@ static void MCopyFamiReset(void) { } static void MCopyFamiPower(void) { -// uint32 resp, presp; +/* uint32 resp, presp; */ FCEU_printf("NOW POWERING... "); @@ -466,7 +469,7 @@ static void MCopyFamiPower(void) { SetReadHandler(0x6000, 0x7fff, CartBR); #endif -/* +#if 0 FCEU_printf("READING MEMORY MAP...\n"); CPUTestCmd[1] = 0x50; CPUTestCmd[2] = 0x30; @@ -477,10 +480,10 @@ static void MCopyFamiPower(void) { GET(resp, 3); if(presp != 0xffffffff) { switch(presp & 0x00FF0000) { - case 0x00000000: // BUS + case 0x00000000: /* BUS */ FCEU_printf(" %04X-%04X OPEN BUS\n",presp & 0x7fff, (resp - 1) & 0x7fff); break; - case 0x00010000: // RAM + case 0x00010000: /* RAM */ FCEU_printf(" %04X-%04X RAM\n",presp & 0x7fff, (resp - 1) & 0x7fff); SetWriteHandler(presp & 0x7fff, (resp - 1) & 0x7fff, CartBW); SetReadHandler(presp & 0x7fff, (resp - 1) & 0x7fff, CartBR); @@ -489,7 +492,7 @@ static void MCopyFamiPower(void) { } presp = resp; } -*/ +#endif SetWriteHandler(0x8000, 0xffff, MCopyFamiWrite); SetReadHandler(0x8000, 0xffff, CartBR); @@ -528,17 +531,17 @@ void MapperCopyFami_Init(CartInfo *info) { info->Close = MCopyFamiClose; GameStateRestore = StateRestore; - size = 1024 * CHR_CACHE_SIZE; // размер страницы 1кб + size = 1024 * CHR_CACHE_SIZE; /* размер страницы 1кб */ chr_data.buf = (uint8*)FCEU_gmalloc(size); - SetupCartCHRMapping(1, chr_data.buf, size, 1); // проверять ппу рам, иначе игра может портить данные + SetupCartCHRMapping(1, chr_data.buf, size, 1); /* проверять ппу рам, иначе игра может портить данные */ AddExState(chr_data.buf, size, 0, "CCHR"); - size = 8192; // размер страницы 8кб + size = 8192; /* размер страницы 8кб */ WRAM = (uint8*)FCEU_gmalloc(size); SetupCartPRGMapping(1, WRAM, size, 1); AddExState(WRAM, size, 0, "CPRM"); - size = 8192 * PRG_CACHE_SIZE; // размер страницы 8кб + size = 8192 * PRG_CACHE_SIZE; /* размер страницы 8кб */ prg_data.buf = (uint8*)FCEU_gmalloc(size); SetupCartPRGMapping(2, prg_data.buf, size, 0); AddExState(prg_data.buf, size, 0, "CPPR"); From 3d4765ad74b4b14127d5c56355a9563cdae7333b Mon Sep 17 00:00:00 2001 From: retro-wertz Date: Tue, 17 Oct 2017 11:57:21 +0800 Subject: [PATCH 2/5] Mapper57: fix mirroring --- src/boards/57.c | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/src/boards/57.c b/src/boards/57.c index bb93c37..df79d44 100644 --- a/src/boards/57.c +++ b/src/boards/57.c @@ -21,47 +21,42 @@ #include "mapinc.h" -static uint8 prg_reg; -static uint8 chr_reg; +static uint8 regs[2]; static uint8 hrd_flag; static SFORMAT StateRegs[] = { { &hrd_flag, 1, "DPSW" }, - { &prg_reg, 1, "PRG" }, - { &chr_reg, 1, "CHR" }, + { regs, 2, "REGS" }, { 0 } }; static void Sync(void) { - if (prg_reg & 0x10) - setprg32(0x8000, (prg_reg >> 6) & 3); + if (regs[1] & 0x10) + setprg32(0x8000, (regs[1] >> 6) & 3); else { - setprg16(0x8000, (prg_reg >> 5) & 7); - setprg16(0xC000, (prg_reg >> 5) & 7); + setprg16(0x8000, (regs[1] >> 5) & 7); + setprg16(0xC000, (regs[1] >> 5) & 7); } - /* Mirroring (0=Vert, 1=Horz) - * https://wiki.nesdev.com/w/index.php/INES_Mapper_057 - */ - setmirror((prg_reg & 8) ? MI_H : MI_V); - setchr8((chr_reg & 7) | (prg_reg & 7) | ((chr_reg & 0x40) >> 3)); + setmirror((regs[1] & 8) >> 3 ^ 1); + setchr8((regs[0] & 7) | (regs[1] & 7) | ((regs[0] & 0x40) >> 3)); } +#if 0 static DECLFR(M57Read) { return hrd_flag; } +#endif static DECLFW(M57Write) { - if ((A & 0x8800) == 0x8800) - prg_reg = V; - else - chr_reg = V; - Sync(); + switch (A & 0x8800) { + case 0x8000: regs[0] = V; Sync(); break; + case 0x8800: regs[1] = V; Sync(); break; + } } static void M57Power(void) { - prg_reg = 0; - chr_reg = 0; + regs[1] = regs[0] = 0; hrd_flag = 0; SetReadHandler(0x8000, 0xFFFF, CartBR); SetWriteHandler(0x8000, 0xFFFF, M57Write); From c9f255b93c69b14599563b6593a3491187a15f9e Mon Sep 17 00:00:00 2001 From: retro-wertz Date: Tue, 17 Oct 2017 12:07:45 +0800 Subject: [PATCH 3/5] Mapper69: reg $D should awknowledge IRQ and no other --- src/boards/69.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/boards/69.c b/src/boards/69.c index 26831bc..f1f79a9 100644 --- a/src/boards/69.c +++ b/src/boards/69.c @@ -90,8 +90,8 @@ static DECLFW(M69Write1) { case 0xB: preg[2] = V; Sync(); break; case 0xC: mirr = V & 3; Sync();break; case 0xD: IRQa = V; X6502_IRQEnd(FCEU_IQEXT); break; - case 0xE: IRQCount &= 0xFF00; IRQCount |= V; X6502_IRQEnd(FCEU_IQEXT); break; - case 0xF: IRQCount &= 0x00FF; IRQCount |= V << 8; X6502_IRQEnd(FCEU_IQEXT); break; + case 0xE: IRQCount &= 0xFF00; IRQCount |= V; break; + case 0xF: IRQCount &= 0x00FF; IRQCount |= V << 8; break; } } From 384d6a98bafbc804a63f307f8b8a56cd68052dc8 Mon Sep 17 00:00:00 2001 From: retro-wertz Date: Tue, 17 Oct 2017 12:49:12 +0800 Subject: [PATCH 4/5] Build fix and add comments --- src/boards/57.c | 2 -- src/boards/69.c | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/boards/57.c b/src/boards/57.c index df79d44..fb2a11f 100644 --- a/src/boards/57.c +++ b/src/boards/57.c @@ -42,11 +42,9 @@ static void Sync(void) { setchr8((regs[0] & 7) | (regs[1] & 7) | ((regs[0] & 0x40) >> 3)); } -#if 0 static DECLFR(M57Read) { return hrd_flag; } -#endif static DECLFW(M57Write) { switch (A & 0x8800) { diff --git a/src/boards/69.c b/src/boards/69.c index f1f79a9..0de0558 100644 --- a/src/boards/69.c +++ b/src/boards/69.c @@ -89,6 +89,9 @@ static DECLFW(M69Write1) { case 0xA: preg[1] = V; Sync(); break; case 0xB: preg[2] = V; Sync(); break; case 0xC: mirr = V & 3; Sync();break; + /* 17/10/17- reg $0D should awknowledge IRQ and no other + * http://forums.nesdev.com/viewtopic.php?f=2&t=12436&start=15 + */ case 0xD: IRQa = V; X6502_IRQEnd(FCEU_IQEXT); break; case 0xE: IRQCount &= 0xFF00; IRQCount |= V; break; case 0xF: IRQCount &= 0x00FF; IRQCount |= V << 8; break; From 15c0f1468cf44945c7bc7fd1728bce1eeea9d9f0 Mon Sep 17 00:00:00 2001 From: retro-wertz Date: Tue, 17 Oct 2017 15:14:08 +0800 Subject: [PATCH 5/5] Mapper190: Layout update to look similar to others --- src/boards/190.c | 79 +++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/src/boards/190.c b/src/boards/190.c index f6612ff..946f961 100644 --- a/src/boards/190.c +++ b/src/boards/190.c @@ -21,65 +21,70 @@ #include "mapinc.h" -static uint8 prgr, chrr[4]; +static uint8 preg, creg[4]; static uint8 *WRAM = NULL; -static void Mapper190_Sync(void) { +static SFORMAT StateRegs[] = +{ + { &preg, 1, "PREG" }, + { creg, 4, "CREG" }, + { 0 } +}; + +static void Sync(void) { setprg8r(0x10, 0x6000, 0); - - setprg16(0x8000, prgr); + setprg16(0x8000, preg); setprg16(0xC000, 0); - setchr2(0x0000, chrr[0]); - setchr2(0x0800, chrr[1]); - setchr2(0x1000, chrr[2]); - setchr2(0x1800, chrr[3]); + setchr2(0x0000, creg[0]); + setchr2(0x0800, creg[1]); + setchr2(0x1000, creg[2]); + setchr2(0x1800, creg[3]); } -static DECLFW(Mapper190_Write89) { prgr = V&7; Mapper190_Sync(); } -static DECLFW(Mapper190_WriteCD) { prgr = 8|(V&7); Mapper190_Sync(); } - -static DECLFW(Mapper190_WriteAB) { - int bank = A&3; - chrr[bank] = V&63; - Mapper190_Sync(); +static DECLFW(M190Write89) { + preg = V & 7; + Sync(); } +static DECLFW(M190WriteCD) { + preg = 8 | (V & 7); + Sync(); +} -static void Mapper190_Power(void) { +static DECLFW(M190WriteAB) { + creg[A & 3] = V; + Sync(); +} + +static void M190Power(void) { + creg[0] = creg[1] = creg[2] = creg[3] = 0; + preg = 0; FCEU_CheatAddRAM(0x2000 >> 10, 0x6000, WRAM); - SetReadHandler(0x6000, 0xFFFF, CartBR); - SetWriteHandler(0x6000, 0x7FFF, CartBW); - SetWriteHandler(0x8000, 0x9FFF, Mapper190_Write89); - SetWriteHandler(0xA000, 0xBFFF, Mapper190_WriteAB); - SetWriteHandler(0xC000, 0xDFFF, Mapper190_WriteCD); - Mapper190_Sync(); - + SetWriteHandler(0x8000, 0x9FFF, M190Write89); + SetWriteHandler(0xA000, 0xBFFF, M190WriteAB); + SetWriteHandler(0xC000, 0xDFFF, M190WriteCD); setmirror(MI_V); + Sync(); } -static void Mapper190_Close(void) { - FCEU_gfree(WRAM); +static void M190Close(void) { + if (WRAM) + FCEU_gfree(WRAM); WRAM = NULL; } -static void Mapper190_Restore(int version) { - Mapper190_Sync(); +static void StateRestore(int version) { + Sync(); } - void Mapper190_Init(CartInfo *info) { - info->Power = Mapper190_Power; - info->Close = Mapper190_Close; - GameStateRestore = Mapper190_Restore; - + info->Power = M190Power; + info->Close = M190Close; WRAM = (uint8*)FCEU_gmalloc(0x2000); SetupCartPRGMapping(0x10, WRAM, 0x2000, 1); - - chrr[0] = chrr[1] = chrr[2] = chrr[3] = prgr = 0; - - AddExState(&prgr, 1, 0, "PRGR"); - AddExState(chrr, 4, 0, "CHRR"); AddExState(WRAM, 0x2000, 0, "WRAM"); + GameStateRestore = StateRestore; + AddExState(&StateRegs, ~0, 0, 0); }