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 (C) 2012 CaH4e3
* Copyright (C) 2022 NewRisingSun
*
* 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
@@ -23,7 +24,8 @@
#include "mapinc.h"
static uint8 reg;
static uint8 submapper;
static uint8 reg, outer;
static uint32 IRQCount, IRQa;
static SFORMAT StateRegs[] =
@@ -31,34 +33,51 @@ static SFORMAT StateRegs[] =
{ &IRQCount, 4, "IRQC" },
{ &IRQa, 4, "IRQA" },
{ &reg, 1, "REG" },
{ &reg, 1, "OUTE" },
{ 0 }
};
static void Sync(void) {
setprg8(0x6000, ~1);
setprg8(0x8000, ~3);
setprg8(0xa000, ~2);
setprg8(0xc000, reg);
setprg8(0xe000, ~0);
setchr8(0);
if (outer &0x08) {
if (outer &0x10)
setprg32(0x8000, 2 | outer >>6);
else {
setprg16(0x8000, 4 | outer >>5);
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) {
switch (A & 0xe000) {
case 0x8000: IRQa = 0; IRQCount = 0; X6502_IRQEnd(FCEU_IQEXT); break;
case 0xa000: IRQa = 1; break;
case 0xc000: if (submapper ==1) { outer =A &0xFF; Sync(); } break;
case 0xe000: reg = V & 7; Sync(); break;
}
}
static void M40Power(void) {
reg = 0;
outer = 0;
IRQa = 0;
X6502_IRQEnd(FCEU_IQEXT);
Sync();
SetReadHandler(0x6000, 0xffff, CartBR);
SetWriteHandler(0x8000, 0xffff, M40Write);
}
static void M40Reset(void) {
outer = 0;
Sync();
}
static void FP_FASTAPASS(1) M40IRQHook(int a) {
@@ -77,6 +96,7 @@ static void StateRestore(int version) {
}
void Mapper40_Init(CartInfo *info) {
submapper =info->submapper;
info->Reset = M40Reset;
info->Power = M40Power;
MapIRQHook = M40IRQHook;