Add mapper 543, 550, 516
This commit is contained in:
@@ -36,11 +36,21 @@ static uint32 NONSaveRAMSIZE = 0;
|
||||
|
||||
static void (*MMC1CHRHook4)(uint32 A, uint8 V);
|
||||
static void (*MMC1PRGHook16)(uint32 A, uint8 V);
|
||||
/* Used to override default wram behavior */
|
||||
/* NULL uses default MMC1 wram. Set after GenMMC1Init() is called to override */
|
||||
static void (*MMC1WRAMHook8)(void);
|
||||
|
||||
static uint8 *WRAM = NULL;
|
||||
static uint8 *CHRRAM = NULL;
|
||||
static int is155, is171;
|
||||
|
||||
static uint32 MMC1GetCHRBank (uint32 bank) {
|
||||
if (DRegs[0] & 0x10) /* 4 KiB mode */
|
||||
return (DRegs[1 + bank]);
|
||||
else /* 8 KiB mode */
|
||||
return ((DRegs[1] & ~1) | bank);
|
||||
}
|
||||
|
||||
static uint8 MMC1WRAMEnabled(void) {
|
||||
return !(DRegs[3] & 0x10);
|
||||
}
|
||||
@@ -56,14 +66,26 @@ static DECLFR(MAWRAM) {
|
||||
return(Page[A >> 11][A]);
|
||||
}
|
||||
|
||||
static void MMC1CHR(void) {
|
||||
static void MMC1WRAM(void) {
|
||||
if (WRAMSIZE > 8192) {
|
||||
if (WRAMSIZE > 16384)
|
||||
setprg8r(0x10, 0x6000, (DRegs[1] >> 2) & 3);
|
||||
else
|
||||
setprg8r(0x10, 0x6000, (DRegs[1] >> 3) & 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void MMC1CHR(void) {
|
||||
if (MMC1WRAMHook8) /* Use custom wram hook, currently used for M543 */
|
||||
MMC1WRAMHook8();
|
||||
else { /* Use default MMC1 wram behavior */
|
||||
if (WRAMSIZE > 8192) {
|
||||
if (WRAMSIZE > 16384)
|
||||
setprg8r(0x10, 0x6000, (DRegs[1] >> 2) & 3);
|
||||
else
|
||||
setprg8r(0x10, 0x6000, (DRegs[1] >> 3) & 1);
|
||||
}
|
||||
}
|
||||
if (MMC1CHRHook4) {
|
||||
if (DRegs[0] & 0x10) {
|
||||
MMC1CHRHook4(0x0000, DRegs[1]);
|
||||
@@ -313,7 +335,7 @@ static void GenMMC1Init(CartInfo *info, int prg, int chr, int wram, int saveram)
|
||||
is155 = 0;
|
||||
|
||||
info->Close = GenMMC1Close;
|
||||
MMC1PRGHook16 = MMC1CHRHook4 = 0;
|
||||
MMC1PRGHook16 = MMC1CHRHook4 = MMC1WRAMHook8 = 0;
|
||||
WRAMSIZE = wram * 1024;
|
||||
NONSaveRAMSIZE = (wram - saveram) * 1024;
|
||||
PRGmask16[0] &= (prg >> 14) - 1;
|
||||
@@ -555,3 +577,127 @@ void Mapper297_Init(CartInfo *info) {
|
||||
AddExState(&latch, 1, 0, "LATC");
|
||||
AddExState(&mode, 1, 0, "MODE");
|
||||
}
|
||||
|
||||
/* ---------------------------- Mapper 543 -------------------------------- */
|
||||
|
||||
/* NES 2.0 Mapper 543 - 1996 無敵智カ卡 5-in-1 (CH-501) */
|
||||
|
||||
static uint8_t outerBank;
|
||||
static uint8_t bits;
|
||||
static uint8_t shift;
|
||||
|
||||
static void M543PRG16(uint32 A, uint8 V) {
|
||||
setprg16(A, (V & 0x0F) | (outerBank << 4));
|
||||
}
|
||||
|
||||
static void M543CHR4(uint32 A, uint8 V) {
|
||||
setchr4(A, (V & 7));
|
||||
}
|
||||
|
||||
static void M543WRAM8(void) {
|
||||
uint32 wramBank;
|
||||
if (outerBank & 2)
|
||||
wramBank = 4 | ((outerBank >> 1) & 2) | (outerBank & 1) ;
|
||||
else
|
||||
wramBank = ((outerBank << 1) & 2) | ((MMC1GetCHRBank(0) >> 3) & 1);
|
||||
setprg8r(0x10, 0x6000, wramBank);
|
||||
}
|
||||
|
||||
static DECLFW(M543Write) {
|
||||
bits |= ((V >> 3) & 1) << shift++;
|
||||
if (shift == 4) {
|
||||
outerBank = bits;
|
||||
bits = shift = 0;
|
||||
MMC1PRG();
|
||||
MMC1CHR();
|
||||
}
|
||||
}
|
||||
|
||||
static void M543Reset(void) {
|
||||
bits = 0;
|
||||
shift = 0;
|
||||
outerBank = 0;
|
||||
MMC1CMReset();
|
||||
}
|
||||
|
||||
static void M543Power(void) {
|
||||
bits = 0;
|
||||
shift = 0;
|
||||
outerBank = 0;
|
||||
GenMMC1Power();
|
||||
SetWriteHandler(0x5000, 0x5FFF, M543Write);
|
||||
}
|
||||
|
||||
void Mapper543_Init(CartInfo *info) {
|
||||
/* M543 has 32K CHR RAM but only uses 8K, so its safe to set this chr to 0 */
|
||||
GenMMC1Init(info, 2048, 32, 64, info->battery ? 64 : 0);
|
||||
info->Power = M543Power;
|
||||
info->Reset = M543Reset;
|
||||
MMC1CHRHook4 = M543CHR4;
|
||||
MMC1PRGHook16 = M543PRG16;
|
||||
MMC1WRAMHook8 = M543WRAM8;
|
||||
AddExState(&bits, 1, 0, "BITS");
|
||||
AddExState(&shift, 1, 0, "SHFT");
|
||||
AddExState(&outerBank, 1, 0, "BANK");
|
||||
}
|
||||
|
||||
/* ---------------------------- Mapper 550 -------------------------------- */
|
||||
|
||||
/* NES 2.0 Mapper 550 - 7-in-1 1993 Chess Series (JY-015) */
|
||||
|
||||
static uint8_t latch;
|
||||
static uint8_t outerBank;
|
||||
|
||||
static void M550PRG16(uint32 A, uint8 V) {
|
||||
if ((outerBank & 6) == 6)
|
||||
setprg16(A, (V & 7) | (outerBank << 2));
|
||||
else
|
||||
setprg32(0x8000, (latch >> 4) | (outerBank << 1));
|
||||
}
|
||||
|
||||
static void M550CHR4(uint32 A, uint8 V) {
|
||||
if ((outerBank & 6) == 6)
|
||||
setchr4(A, (V & 7) | ((outerBank << 2) & 0x18));
|
||||
else
|
||||
setchr8((latch & 3) | ((outerBank << 1) & 0x0C));
|
||||
}
|
||||
|
||||
static DECLFW(M550Write7) {
|
||||
if (!(outerBank & 8)) {
|
||||
outerBank = A & 15;
|
||||
MMC1PRG();
|
||||
MMC1CHR();
|
||||
}
|
||||
}
|
||||
|
||||
static DECLFW(M550Write8) {
|
||||
latch = V;
|
||||
if ((outerBank & 6) == 6)
|
||||
MMC1_write(A, V);
|
||||
MMC1PRG();
|
||||
MMC1CHR();
|
||||
}
|
||||
|
||||
static void M550Reset(void) {
|
||||
latch = 0;
|
||||
outerBank = 0;
|
||||
MMC1CMReset();
|
||||
}
|
||||
|
||||
static void M550Power(void) {
|
||||
latch = 0;
|
||||
outerBank = 0;
|
||||
GenMMC1Power();
|
||||
SetWriteHandler(0x7000, 0x7FFF, M550Write7);
|
||||
SetWriteHandler(0x8000, 0xFFFF, M550Write8);
|
||||
}
|
||||
|
||||
void Mapper550_Init(CartInfo *info) {
|
||||
GenMMC1Init(info, 512, 128, 8, 0);
|
||||
info->Power = M550Power;
|
||||
info->Reset = M550Reset;
|
||||
MMC1CHRHook4 = M550CHR4;
|
||||
MMC1PRGHook16 = M550PRG16;
|
||||
AddExState(&latch, 1, 0, "LATC");
|
||||
AddExState(&outerBank, 1, 0, "BANK");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user