diff --git a/src/boards/40.c b/src/boards/40.c index 80d1ad0..e64c16d 100644 --- a/src/boards/40.c +++ b/src/boards/40.c @@ -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" }, { ®, 1, "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;