Mapper 40: Add multicart variant
This commit is contained in:
@@ -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" },
|
||||||
{ ®, 1, "REG" },
|
{ ®, 1, "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;
|
||||||
|
|||||||
Reference in New Issue
Block a user