Mapper 40: Add multicart variant

This commit is contained in:
NewRisingSun
2022-08-17 21:59:46 +02:00
parent b8517ef637
commit f9c9557f44

View File

@@ -2,6 +2,7 @@
* *
* Copyright notice for this file: * Copyright notice for this file:
* Copyright (C) 2012 CaH4e3 * Copyright (C) 2012 CaH4e3
* Copyright (C) 2022 NewRisingSun
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -23,7 +24,8 @@
#include "mapinc.h" #include "mapinc.h"
static uint8 reg; static uint8 submapper;
static uint8 reg, outer;
static uint32 IRQCount, IRQa; static uint32 IRQCount, IRQa;
static SFORMAT StateRegs[] = static SFORMAT StateRegs[] =
@@ -31,34 +33,51 @@ static SFORMAT StateRegs[] =
{ &IRQCount, 4, "IRQC" }, { &IRQCount, 4, "IRQC" },
{ &IRQa, 4, "IRQA" }, { &IRQa, 4, "IRQA" },
{ &reg, 1, "REG" }, { &reg, 1, "REG" },
{ &reg, 1, "OUTE" },
{ 0 } { 0 }
}; };
static void Sync(void) { static void Sync(void) {
setprg8(0x6000, ~1); if (outer &0x08) {
setprg8(0x8000, ~3); if (outer &0x10)
setprg8(0xa000, ~2); setprg32(0x8000, 2 | outer >>6);
setprg8(0xc000, reg); else {
setprg8(0xe000, ~0); setprg16(0x8000, 4 | outer >>5);
setchr8(0); setprg16(0xC000, 4 | outer >>5);
}
} else {
setprg8(0x6000, 6);
setprg8(0x8000, 4);
setprg8(0xa000, 5);
setprg8(0xc000, reg &7);
setprg8(0xe000, 7);
}
setchr8(outer >>1);
setmirror(outer &1? MI_H: MI_V);
} }
static DECLFW(M40Write) { static DECLFW(M40Write) {
switch (A & 0xe000) { switch (A & 0xe000) {
case 0x8000: IRQa = 0; IRQCount = 0; X6502_IRQEnd(FCEU_IQEXT); break; case 0x8000: IRQa = 0; IRQCount = 0; X6502_IRQEnd(FCEU_IQEXT); break;
case 0xa000: IRQa = 1; break; case 0xa000: IRQa = 1; break;
case 0xc000: if (submapper ==1) { outer =A &0xFF; Sync(); } break;
case 0xe000: reg = V & 7; Sync(); break; case 0xe000: reg = V & 7; Sync(); break;
} }
} }
static void M40Power(void) { static void M40Power(void) {
reg = 0; reg = 0;
outer = 0;
IRQa = 0;
X6502_IRQEnd(FCEU_IQEXT);
Sync(); Sync();
SetReadHandler(0x6000, 0xffff, CartBR); SetReadHandler(0x6000, 0xffff, CartBR);
SetWriteHandler(0x8000, 0xffff, M40Write); SetWriteHandler(0x8000, 0xffff, M40Write);
} }
static void M40Reset(void) { static void M40Reset(void) {
outer = 0;
Sync();
} }
static void FP_FASTAPASS(1) M40IRQHook(int a) { static void FP_FASTAPASS(1) M40IRQHook(int a) {
@@ -77,6 +96,7 @@ static void StateRestore(int version) {
} }
void Mapper40_Init(CartInfo *info) { void Mapper40_Init(CartInfo *info) {
submapper =info->submapper;
info->Reset = M40Reset; info->Reset = M40Reset;
info->Power = M40Power; info->Power = M40Power;
MapIRQHook = M40IRQHook; MapIRQHook = M40IRQHook;