From 0979e66e1ce9376d44dbf430dfed97badc50cb2f Mon Sep 17 00:00:00 2001 From: negativeExponent Date: Sat, 22 Feb 2020 21:37:34 +0800 Subject: [PATCH] Mapper 235 update support for 1MB/2MB carts and cart with unrom block --- src/boards/235.c | 83 +++++++++++++++++++++++++++++++++++++++------- src/ines-correct.h | 5 +++ src/ines.c | 2 +- 3 files changed, 77 insertions(+), 13 deletions(-) diff --git a/src/boards/235.c b/src/boards/235.c index b2aca1d..f7d428a 100644 --- a/src/boards/235.c +++ b/src/boards/235.c @@ -2,6 +2,7 @@ * * Copyright notice for this file: * Copyright (C) 2005 CaH4e3 + * Copyright (C) 2020 negativeExponent * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,35 +20,76 @@ */ #include "mapinc.h" +#include "../ines.h" + +static uint8 *CHRRAM; +static uint32 CHRRAMSIZE; static uint16 cmdreg; +static uint8 unrom, reg, type, openbus; + static SFORMAT StateRegs[] = { - { &cmdreg, 2, "CREG" }, + { &cmdreg, 2 | FCEUSTATE_RLSB, "CREG" }, + { &unrom, 1, "UNRM" }, + { ®, 1, "UNRG" }, + { &type, 1, "TYPE" }, + { &openbus, 1, "OPNB" }, { 0 } }; static void Sync(void) { - if (cmdreg & 0x400) - setmirror(MI_0); - else - setmirror(((cmdreg >> 13) & 1) ^ 1); - if (cmdreg & 0x800) { - setprg16(0x8000, ((cmdreg & 0x300) >> 3) | ((cmdreg & 0x1F) << 1) | ((cmdreg >> 12) & 1)); - setprg16(0xC000, ((cmdreg & 0x300) >> 3) | ((cmdreg & 0x1F) << 1) | ((cmdreg >> 12) & 1)); - } else - setprg32(0x8000, ((cmdreg & 0x300) >> 4) | (cmdreg & 0x1F)); + if (type && unrom) { + setprg16(0x8000, 0x80 | reg & 7); + setprg16(0xC000, 0x80 | 7); + setchr8(0); + setmirror(MI_V); + } else { + uint8 bank = ((cmdreg & 0x300) >> 3) | (cmdreg & 0x1F); + if (cmdreg & 0x400) + setmirror(MI_0); + else + setmirror(((cmdreg >> 13) & 1) ^ 1); + if (bank >= PRGsize[0] / 32768) + openbus = 1; + else if (cmdreg & 0x800) { + setprg16(0x8000, (bank << 1) | ((cmdreg >> 12) & 1)); + setprg16(0xC000, (bank << 1) | ((cmdreg >> 12) & 1)); + } else + setprg32(0x8000, bank); + setchr8(0); + } +} + +static DECLFR(M235Read) { + if (openbus) { + openbus = 0; + return X.DB; + } + return CartBR(A); } static DECLFW(M235Write) { cmdreg = A; + reg = V; + Sync(); +} + +static void M235Close(void) { + if (CHRRAM) + free(CHRRAM); + CHRRAM = NULL; +} + +static void M235Reset(void) { + cmdreg = 0; + unrom = (unrom + type) & 1; Sync(); } static void M235Power(void) { - setchr8(0); SetWriteHandler(0x8000, 0xFFFF, M235Write); - SetReadHandler(0x8000, 0xFFFF, CartBR); + SetReadHandler(0x8000, 0xFFFF, M235Read); cmdreg = 0; Sync(); } @@ -57,7 +99,24 @@ static void M235Restore(int version) { } void Mapper235_Init(CartInfo *info) { + info->Reset = M235Reset; info->Power = M235Power; + info->Close = M235Close; GameStateRestore = M235Restore; AddExState(&StateRegs, ~0, 0, 0); + + /* some nes 2.0 header do can have no chr-ram. + * one such cart is 210-in-1 and Contra 4-in-1 (212-in-1,212 Hong Kong,Reset Based)(Unl).nes (0x745A6791) + */ + if (CHRsize[0] == 0) { + CHRRAMSIZE = 8192; + CHRRAM = (uint8*)FCEU_gmalloc(CHRRAMSIZE); + SetupCartCHRMapping(0, CHRRAM, CHRRAMSIZE, 1); + AddExState(CHRRAM, CHRRAMSIZE, 0, "CRAM"); + } + + type = 0; + /* carts with unrom game, reset-based */ + if ((info->CRC32) == 0x745A6791) /* 210-in-1 and Contra 4-in-1 (212-in-1,212 Hong Kong,Reset Based)(Unl).nes */ + type = 1; } diff --git a/src/ines-correct.h b/src/ines-correct.h index f2d4cb2..3fda31e 100644 --- a/src/ines-correct.h +++ b/src/ines-correct.h @@ -316,6 +316,11 @@ {0xd09f778d, 217, -1}, /* 9999999-in-1 (Static Splash, Alt Mapper)[p1][!] */ {0x62ef6c79, 232, 8}, /* Quattro Sports -Aladdin */ {0x2705eaeb, 234, -1}, /* Maxi 15 */ + {0x80CBCACB, 235, -1}, /* 100-in-1 (Unl).nes */ + {0x6175B9A0, 235, -1}, /* 150_in_1_199x-ASp */ + {0x745A6791, 235, -1}, /* 210-in-1 and Contra 4-in-1 (212-in-1,212 Hong Kong,Reset Based)(Unl).nes */ + {0xDF81364D, 235, -1}, /* 260-in-1 [p1][!].nes */ + {0xA38F2F1D, 235, -1}, /* 1500-in-1.nes */ {0x6f12afc5, 235, -1}, /* Golden Game 150-in-1 */ {0x2537b3e6, 241, -1}, /* Dance Xtreme - Prima (Unl) */ {0x11611e89, 241, -1}, /* Darkseed (Unl) [p1] */ diff --git a/src/ines.c b/src/ines.c index f4423e1..80f2b59 100644 --- a/src/ines.c +++ b/src/ines.c @@ -630,7 +630,7 @@ static BMAPPINGLocal bmap[] = { {(uint8_t*)"BMC QUATTRO", 232, Mapper232_Init}, {(uint8_t*)"BMC 22+20-in-1 RST", 233, Mapper233_Init}, {(uint8_t*)"BMC MAXI", 234, Mapper234_Init}, - {(uint8_t*)"", 235, Mapper235_Init}, + {(uint8_t*)"Golden Game", 235, Mapper235_Init}, /* {(uint8_t*)"", 236, Mapper236_Init}, */ {(uint8_t*)"Teletubbies / Y2K", 237, Mapper237_Init}, {(uint8_t*)"UNL6035052", 238, UNL6035052_Init},