a little bit of latest mapper changes

code/data logger now can log data access from the RAM code
the new button to save unused data to the code/data logger
This commit is contained in:
CaH4e3 2011-09-24 06:36:44 +00:00
parent bf32a2bcce
commit e9e97b774e
15 changed files with 1971 additions and 2264 deletions

View File

@ -1,7 +1,7 @@
/* FCE Ultra - NES/Famicom Emulator
*
* Copyright notice for this file:
* Copyright (C) 2005 CaH4e3
* Copyright (C) 2005-2011 CaH4e3
*
* 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
@ -16,52 +16,143 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Super Game (Sugar Softec) protected mapper
* Pocahontas 2 (Unl) [U][!], etc.
* TODO: 9in1 LION KING HANGS!
*/
#include "mapinc.h"
#include "mmc3.h"
static uint8 cmdin;
static uint8 UNL8237_perm[8] = {0, 2, 6, 1, 7, 3, 4, 5};
static uint8 regperm[8][8] =
{
{0, 1, 2, 3, 4, 5, 6, 7},
{0, 2, 6, 1, 7, 3, 4, 5},
{0, 5, 4, 1, 7, 2, 6, 3}, // unused
{0, 6, 3, 7, 5, 2, 4, 1},
{0, 2, 5, 3, 6, 1, 7, 4},
{0, 1, 2, 3, 4, 5, 6, 7}, // empty
{0, 1, 2, 3, 4, 5, 6, 7}, // empty
{0, 1, 2, 3, 4, 5, 6, 7}, // empty
};
static uint8 adrperm[8][8] =
{
{0, 1, 2, 3, 4, 5, 6, 7},
{3, 2, 0, 4, 1, 5, 6, 7},
{0, 1, 2, 3, 4, 5, 6, 7}, // unused
{5, 0, 1, 2, 3, 7, 6, 4},
{3, 1, 0, 5, 2, 4, 6, 7},
{0, 1, 2, 3, 4, 5, 6, 7}, // empty
{0, 1, 2, 3, 4, 5, 6, 7}, // empty
{0, 1, 2, 3, 4, 5, 6, 7}, // empty
};
static void UNL8237CW(uint32 A, uint8 V)
{
setchr1(A,((EXPREGS[1]&4)<<6)|V);
if(EXPREGS[0]&0x40)
setchr1(A,((EXPREGS[1]&0xc)<<6)|(V&0x7F)|((EXPREGS[1]&0x20)<<2));
else
setchr1(A,((EXPREGS[1]&0xc)<<6)|V);
}
static void UNL8237PW(uint32 A, uint8 V)
{
if(EXPREGS[0]&0x40)
{
uint8 sbank = (EXPREGS[1]&0x10);
if(EXPREGS[0]&0x80)
{
uint8 bank = ((EXPREGS[1]&3)<<4)|(EXPREGS[0]&0x7)|(sbank>>1);
if(EXPREGS[0]&0x20)
setprg32(0x8000,(EXPREGS[0]&0xF)>>1);
setprg32(0x8000,bank>>1);
else
{
setprg16(0x8000,(EXPREGS[0]&0x1F));
setprg16(0xC000,(EXPREGS[0]&0x1F));
setprg16(0x8000,bank);
setprg16(0xC000,bank);
}
}
else
setprg8(A,V&0x3F);
setprg8(A,((EXPREGS[1]&3)<<5)|(V&0x0F)|sbank);
}
else
{
if(EXPREGS[0]&0x80)
{
uint8 bank = ((EXPREGS[1]&3)<<4)|(EXPREGS[0]&0xF);
if(EXPREGS[0]&0x20)
setprg32(0x8000,bank>>1);
else
{
setprg16(0x8000,bank);
setprg16(0xC000,bank);
}
}
else
setprg8(A,((EXPREGS[1]&3)<<5)|(V&0x1F));
}
}
static void UNL8237ACW(uint32 A, uint8 V)
{
if(EXPREGS[0]&0x40)
setchr1(A,((EXPREGS[1]&0xE)<<7)|(V&0x7F)|((EXPREGS[1]&0x20)<<2));
else
setchr1(A,((EXPREGS[1]&0xE)<<7)|V);
}
static void UNL8237APW(uint32 A, uint8 V)
{
if(EXPREGS[0]&0x40)
{
uint8 sbank = (EXPREGS[1]&0x10);
if(EXPREGS[0]&0x80)
{
uint8 bank = ((EXPREGS[1]&3)<<4)|((EXPREGS[1]&8)<<3)|(EXPREGS[0]&0x7)|(sbank>>1);
if(EXPREGS[0]&0x20)
setprg32(0x8000,bank>>1);
else
{
setprg16(0x8000,bank);
setprg16(0xC000,bank);
}
}
else
setprg8(A,((EXPREGS[1]&3)<<5)|((EXPREGS[1]&8)<<4)|(V&0x0F)|sbank);
}
else
{
if(EXPREGS[0]&0x80)
{
uint8 bank = ((EXPREGS[1]&3)<<4)|((EXPREGS[1]&8)<<3)|(EXPREGS[0]&0xF);
if(EXPREGS[0]&0x20)
setprg32(0x8000,bank>>1);
else
{
setprg16(0x8000,bank);
setprg16(0xC000,bank);
}
}
else
setprg8(A,((EXPREGS[1]&3)<<5)|((EXPREGS[1]&8)<<4)|(V&0x1F));
}
}
static DECLFW(UNL8237Write)
{
if((A&0xF000)==0xF000)
IRQCount=V;
else if((A&0xF000)==0xE000)
X6502_IRQEnd(FCEU_IQEXT);
else switch(A&0xE001)
uint8 dat = V;
uint8 adr = adrperm[EXPREGS[2]][((A>>12)&6)|(A&1)];
uint16 addr = (adr & 1)|((adr & 6)<<12)|0x8000;
if(adr < 4)
{
case 0x8000: setmirror(((V|(V>>7))&1)^1); break;
case 0xA000: MMC3_CMDWrite(0x8000,(V&0xC0)|(UNL8237_perm[V&7])); cmdin=1; break;
case 0xC000: if(cmdin)
{
MMC3_CMDWrite(0x8001,V);
cmdin=0;
}
break;
if(!adr)
dat = (dat & 0xC0)|(regperm[EXPREGS[2]][dat & 7]);
MMC3_CMDWrite(addr,dat);
}
else
MMC3_IRQWrite(addr,dat);
}
static DECLFW(UNL8237ExWrite)
@ -69,14 +160,15 @@ static DECLFW(UNL8237ExWrite)
switch(A)
{
case 0x5000: EXPREGS[0]=V; FixMMC3PRG(MMC3_cmd); break;
case 0x5001: EXPREGS[1]=V; FixMMC3CHR(MMC3_cmd); break;
case 0x5001: EXPREGS[1]=V; FixMMC3PRG(MMC3_cmd); FixMMC3CHR(MMC3_cmd); break;
case 0x5007: EXPREGS[2]=V; break;
}
}
static void UNL8237Power(void)
{
IRQa=1;
EXPREGS[0]=EXPREGS[1]=0;
EXPREGS[0]=EXPREGS[2]=0;
EXPREGS[1]=3;
GenMMC3Power();
SetWriteHandler(0x8000,0xFFFF,UNL8237Write);
SetWriteHandler(0x5000,0x7FFF,UNL8237ExWrite);
@ -91,3 +183,13 @@ void UNL8237_Init(CartInfo *info)
AddExState(EXPREGS, 3, 0, "EXPR");
AddExState(&cmdin, 1, 0, "CMDIN");
}
void UNL8237A_Init(CartInfo *info)
{
GenMMC3_Init(info, 256, 256, 0, 0);
cwrap=UNL8237ACW;
pwrap=UNL8237APW;
info->Power=UNL8237Power;
AddExState(EXPREGS, 3, 0, "EXPR");
AddExState(&cmdin, 1, 0, "CMDIN");
}

View File

@ -1,148 +0,0 @@
/* FCE Ultra - NES/Famicom Emulator
*
* Copyright notice for this file:
* Copyright (C) 2007 CaH4e3
*
* 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
0000 - 1FFF - RAM
2000 - 23FF - PPU
2400 - 27FF - Write: "PAG" / Read: --
2800 - 2BFF - Write: "BNK" / Read: "STS"
2C00 - 2FFF - Write: "UWR" / Read: "URD"
3000 - 3FFF - Small Flash Page (â ðåãèñòðå BNK)
4000 - 7FFF - Free
8000 - FFFF - Cart/Big Flash Page (ñìîòðè ðåãèñòð PAG)
Áèòû:
Ðåãèñòð [PAG], ïî ñáðîñó äîëæåí áûòü = $00.
D3-D0 - Big Page High Address (D3,D2,D1,D0,A14,A13,A12,A11,A10,A9,A8,A7,A6,A5,A4,A3,A2,A1,A0)
D4 - VMD áèò. Åñëè =0, òî ê PPU ïîäêëþ÷åíî âíóòðåíåå ÎÇó íà 8Êá, åñëè =1 - òî êàðòðèäæ.
D5 - STR áèò. Åñëè =0, òî âìåñòî êàðòà ïî àäðåñàì 8000-FFFF âíóòðåííÿÿ ôëýø, =1 - êàðò.
Ðåãèñòð [BNK], íå ïðåäóñòàíàâëèâàåòñÿ
D6-D0 - Small Page High Address (D6,D5,D4,D3,D2,D1,D0,A11,A10,A9,A8,A7,A6,A5,A4,A3,A2,A1,A0)
D7 - S/W áèò. Óïðàâëÿåò USB ìîñòîì, â ýìóëå ðåàëèçîâûâàòü íå íàäî.
Ðåãèñòðû [UWR]/[URD], íå ïðåäóñòàíàâëèâàþòñÿ, â ýìóëå ðåàëèçîâûâàòü íå íàäî.
[UWR] - Ðåãèñòð çàïèñè äàííûõ â USB ìîñò.
[URD] - Ðåãèñòð ÷òåíèÿ èç USB ìîñòà.
*/
#include "mapinc.h"
#include "mmc3.h"
static uint8 reg[3];
static uint8 *CHRRAM=NULL; // there is no more extern CHRRAM in mmc3.h
// I need chrram here and local static == local
static uint32 CHRRAMSIZE;
static SFORMAT StateRegs[]=
{
{reg, 3, "REGS"},
{0}
};
static void Sync(void)
{
setprg4r(1,0x3000,reg[1]&0x7F);
FixMMC3PRG(MMC3_cmd);
FixMMC3CHR(MMC3_cmd);
}
static void MCopyFamiMMC3PW(uint32 A, uint8 V)
{
if(reg[0]&0x20)
setprg8r(0,A,V);
else
setprg32r(1,0x8000,reg[0]&0x0F);
}
static void MCopyFamiMMC3CW(uint32 A, uint8 V)
{
if(reg[0]&0x20)
setchr1r(0,A,V);
else
setchr8r(0x10,0);
}
static DECLFW(MCopyFamiMMC3WritePAG)
{
reg[0]=V;
Sync();
}
static DECLFW(MCopyFamiMMC3WriteBNK)
{
reg[1]=V;
Sync();
}
static DECLFW(MCopyFamiMMC3WriteUSB)
{
reg[2]=V;
}
static void MCopyFamiMMC3Power(void)
{
reg[0] = 0;
GenMMC3Power();
Sync();
SetReadHandler(0x3000,0x3FFF,CartBR);
SetWriteHandler(0x3000,0x3FFF,CartBW);
SetWriteHandler(0x2400,0x27FF,MCopyFamiMMC3WritePAG);
SetWriteHandler(0x2800,0x2BFF,MCopyFamiMMC3WriteBNK);
SetWriteHandler(0x2C00,0x2FFF,MCopyFamiMMC3WriteUSB);
}
static void MCopyFamiMMC3Reset(void)
{
reg[0] = 0;
MMC3RegReset();
Sync();
}
static void MCopyFamiMMC3Close(void)
{
if(CHRRAM)
FCEU_gfree(CHRRAM);
CHRRAM=NULL;
}
static void StateRestore(int version)
{
Sync();
}
void MapperCopyFamiMMC3_Init(CartInfo *info)
{
GenMMC3_Init(info, 512, 512, 0, 0);
cwrap=MCopyFamiMMC3CW;
pwrap=MCopyFamiMMC3PW;
info->Reset=MCopyFamiMMC3Reset;
info->Power=MCopyFamiMMC3Power;
info->Close=MCopyFamiMMC3Close;
GameStateRestore=StateRestore;
CHRRAMSIZE=8192;
CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSIZE);
SetupCartPRGMapping(0x10,CHRRAM,CHRRAMSIZE,1);
AddExState(CHRRAM, CHRRAMSIZE, 0, "SRAM");
AddExState(&StateRegs, ~0, 0, 0);
}

View File

@ -28,13 +28,12 @@
#include "mmc3.h"
uint8 MMC3_cmd;
uint8 *WRAM;
uint8 *CHRRAM;
uint32 CHRRAMSize;
uint8 DRegBuf[8];
uint8 EXPREGS[8]; /* For bootleg games, mostly. */
static uint8 *WRAM;
static uint8 *CHRRAM;
static uint8 A000B,A001B;
uint8 A000B,A001B;
#undef IRQCount
#undef IRQLatch
@ -102,6 +101,8 @@ void FixMMC3CHR(int V)
cwrap(cbase^0x1400,DRegBuf[3]);
cwrap(cbase^0x1800,DRegBuf[4]);
cwrap(cbase^0x1c00,DRegBuf[5]);
if(mwrap) mwrap(A000B);
}
void MMC3RegReset(void)
@ -128,9 +129,7 @@ DECLFW(MMC3_CMDWrite)
{
case 0x8000:
if((V&0x40) != (MMC3_cmd&0x40))
{
FixMMC3PRG(V);
}
if((V&0x80) != (MMC3_cmd&0x80))
FixMMC3CHR(V);
MMC3_cmd = V;
@ -226,20 +225,18 @@ static void MMC3_hb_PALStarWarsHack(void)
void GenMMC3Restore(int version)
{
if(mwrap) mwrap(A000B);
FixMMC3PRG(MMC3_cmd);
FixMMC3CHR(MMC3_cmd);
}
static void GENCWRAP(uint32 A, uint8 V)
{
// if(!UNIFchrrama) // Yong Zhe Dou E Long - Dragon Quest VI (As).nes NEEDS THIS
setchr1(A,V); // Business Wars NEEDS THIS
setchr1(A,V); // Business Wars NEEDS THIS for 8K CHR-RAM
}
static void GENPWRAP(uint32 A, uint8 V)
{
setprg8(A,V&0x3F);
setprg8(A,V&0x7F); // [NJ102] Mo Dao Jie (C) has 1024Mb MMC3 BOARD, maybe something other will be broken
}
static void GENMWRAP(uint8 V)
@ -253,16 +250,6 @@ static void GENNOMWRAP(uint8 V)
A000B=V;
}
static DECLFW(MBWRAM)
{
WRAM[A-0x6000]=V;
}
static DECLFR(MAWRAM)
{
return(WRAM[A-0x6000]);
}
static DECLFW(MBWRAMMMC6)
{
WRAM[A&0x3ff]=V;
@ -292,9 +279,10 @@ void GenMMC3Power(void)
}
else
{
FCEU_CheatAddRAM(wrams>>10,0x6000,WRAM);
SetReadHandler(0x6000,0x6000+wrams-1,MAWRAM);
SetWriteHandler(0x6000,0x6000+wrams-1,MBWRAM);
FCEU_CheatAddRAM((wrams&0x1fff)>>10,0x6000,WRAM);
SetWriteHandler(0x6000,0x6000 + ((wrams - 1) & 0x1fff),CartBW);
SetReadHandler(0x6000,0x6000 + ((wrams - 1) & 0x1fff),CartBR);
setprg8r(0x10,0x6000,0);
}
if(!(mmc3opts&2))
FCEU_dwmemset(WRAM,0,wrams);
@ -313,15 +301,6 @@ static void GenMMC3Close(void)
CHRRAM=WRAM=NULL;
}
//static uint16 _a12;
//static void MMC3_PPU(uint32 A)
//{
// if(A&0x2000)return;
// if((!_a12)&&(A&0x1000))
// ClockMMC3Counter();
// _a12=A&0x1000;
//}
void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery)
{
pwrap=GENPWRAP;
@ -338,7 +317,8 @@ void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery)
{
mmc3opts|=1;
WRAM=(uint8*)FCEU_gmalloc(wrams);
AddExState(WRAM, wrams, 0, "WRAM");
SetupCartPRGMapping(0x10,WRAM,wrams,1);
AddExState(WRAM, wrams, 0, "MMC3WRAM");
}
if(battery)
@ -348,14 +328,6 @@ void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery)
info->SaveGameLen[0]=wrams;
}
// if(!chr) // duplicated CHR RAM set up
// {
// CHRRAM=(uint8*)FCEU_gmalloc(8192);
// CHRRAMSize=8192;
// SetupCartCHRMapping(0, CHRRAM, 8192, 1);
// AddExState(CHRRAM, 8192, 0, "CHRR");
// }
AddExState(MMC3_StateRegs, ~0, 0, 0);
info->Power=GenMMC3Power;
@ -370,7 +342,6 @@ void GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery)
GameHBIRQHook = MMC3_hb_PALStarWarsHack;
else
GameHBIRQHook=MMC3_hb;
// PPU_hook=MMC3_PPU;
GameStateRestore=GenMMC3Restore;
}
@ -786,25 +757,15 @@ static void M114PWRAP(uint32 A, uint8 V)
static DECLFW(M114Write)
{
if(A==0xE003)
switch(A&0xE001)
{
IRQa=1;
IRQLatch=V;
IRQReload=1;
}
else if(A==0xE002)
{
IRQa=0;
X6502_IRQEnd(FCEU_IQEXT);
}
else switch(A&0xE000)
{
case 0x8000: setmirror((V&1)^1); break;
case 0x8001: MMC3_CMDWrite(0xA000,V); break;
case 0xA000: MMC3_CMDWrite(0x8000,(V&0xC0)|(m114_perm[V&7])); cmdin=1; break;
case 0xC000: if(!cmdin) break;
MMC3_CMDWrite(0x8001,V);
cmdin=0;
break;
case 0xC000: if(!cmdin) break; MMC3_CMDWrite(0x8001,V); cmdin=0; break;
case 0xA001: IRQLatch=V; break;
case 0xC001: IRQReload=1; break;
case 0xE000: X6502_IRQEnd(FCEU_IQEXT);IRQa=0; break;
case 0xE001: IRQa=1; break;
}
}
@ -832,6 +793,7 @@ static void M114Reset(void)
void Mapper114_Init(CartInfo *info)
{
isRevB=0;
GenMMC3_Init(info, 256, 256, 0, 0);
pwrap=M114PWRAP;
info->Power=M114Power;
@ -941,15 +903,6 @@ static void TKSWRAP(uint32 A, uint8 V)
setmirror(MI_0+(V>>7));
}
//void Mapper118_Init(CartInfo *info)
//{
// GenMMC3_Init(info, 512, 256, 8, info->battery);
// cwrap=TKSWRAP;
// mwrap=GENNOMWRAP;
// PPU_hook=TKSPPU;
// AddExState(&PPUCHRBus, 1, 0, "PPUC");
//}
// ---------------------------- Mapper 119 ------------------------------
static void TQWRAP(uint32 A, uint8 V)
@ -1076,41 +1029,6 @@ void Mapper165_Init(CartInfo *info)
AddExState(EXPREGS, 4, 0, "EXPR");
}
// ---------------------------- Mapper 182 ------------------------------
// òàáëèöà ïåðìóòàöè àíàëîãè÷íà 114 ìàïïåðó, ðåãèñòðû ìàïïåðà ãîðàçäî ñëîæíåå,
// ÷åì èñïîëüçóþòñÿ çäåñü, õîòÿ âñå ïðåêðàñíî ðàáîòàåò.
//static uint8 m182_perm[8] = {0, 3, 1, 5, 6, 7, 2, 4};
static DECLFW(M182Write)
{
switch(A&0xF003)
{
case 0x8001: setmirror((V&1)^1); break;
case 0xA000: MMC3_CMDWrite(0x8000,m114_perm[V&7]); break;
case 0xC000: MMC3_CMDWrite(0x8001,V); break;
case 0xE003: if(V)
{
IRQLatch=V;
IRQReload=1;
IRQa=1;
}
X6502_IRQEnd(FCEU_IQEXT);
break;
}
}
static void M182Power(void)
{
GenMMC3Power();
SetWriteHandler(0x8000,0xFFFF,M182Write);
}
void Mapper182_Init(CartInfo *info)
{
GenMMC3_Init(info, 256, 256, 0, 0);
info->Power=M182Power;
}
// ---------------------------- Mapper 191 ------------------------------
static void M191CW(uint32 A, uint8 V)
@ -1318,190 +1236,11 @@ void Mapper205_Init(CartInfo *info)
AddExState(EXPREGS, 1, 0, "EXPR");
}
// ---------------------------- Mapper 215 ------------------------------
static uint8 m215_perm[8] = {0, 2, 5, 3, 6, 1, 7, 4};
//static uint8 m215_perm[8] = {0, 1, 2, 3, 4, 5, 6, 7};
static void M215CW(uint32 A, uint8 V)
{
if(EXPREGS[1]&0x04)
setchr1(A,V|0x100);
else
setchr1(A,(V&0x7F)|((EXPREGS[1]&0x10)<<3));
}
static void M215PW(uint32 A, uint8 V)
{
if(EXPREGS[0]&0x80)
{
setprg16(0x8000,(EXPREGS[0]&0x0F)|(EXPREGS[1]&0x10));
setprg16(0xC000,(EXPREGS[0]&0x0F)|(EXPREGS[1]&0x10));
}
else if(EXPREGS[1]&0x08)
setprg8(A,(V&0x1F)|0x20);
else
setprg8(A,(V&0x0F)|(EXPREGS[1]&0x10));
}
static DECLFW(M215Write)
{
// FCEU_printf("bs %04x %02x\n",A,V);
if(!(EXPREGS[2]))
{
if(A >= 0xc000)
MMC3_IRQWrite(A,V);
else
MMC3_CMDWrite(A,V);
}
else switch(A&0xE001)
{
case 0xC001: IRQLatch=V; break;
case 0xA001: IRQReload=1; break;
case 0xE001: IRQa=1; break;
case 0xE000: X6502_IRQEnd(FCEU_IQEXT); IRQa=0; break;
case 0xC000: setmirror(((V|(V>>7))&1)^1); break;
case 0xA000: MMC3_CMDWrite(0x8000,(V&0xC0)|(m215_perm[V&7])); cmdin=1; break;
case 0x8001: if(!cmdin) break;
MMC3_CMDWrite(0x8001,V);
cmdin=0;
break;
}
}
static DECLFW(M215ExWrite)
{
// FCEU_printf("bs %04x %02x (%04x)\n",A,V,A&0x5007);
switch(A)
{
// case 0x6000:
case 0x5000:
EXPREGS[0]=V;
FixMMC3PRG(MMC3_cmd);
break;
// case 0x6001:
case 0x5001:
EXPREGS[1]=V;
FixMMC3CHR(MMC3_cmd);
break;
// case 0x6007:
case 0x5007:
EXPREGS[2]=V;
MMC3RegReset();
break;
}
}
static void M215Power(void)
{
EXPREGS[0]=0;
EXPREGS[1]=0xFF;
EXPREGS[2]=4;
GenMMC3Power();
SetWriteHandler(0x8000,0xFFFF,M215Write);
SetWriteHandler(0x5000,0x7FFF,M215ExWrite);
}
void Mapper215_Init(CartInfo *info)
{
GenMMC3_Init(info, 256, 256, 0, 0);
cwrap=M215CW;
pwrap=M215PW;
info->Power=M215Power;
AddExState(EXPREGS, 3, 0, "EXPR");
AddExState(&cmdin, 1, 0, "CMDIN");
}
// ---------------------------- Mapper 217 ------------------------------
static uint8 m217_perm[8] = {0, 6, 3, 7, 5, 2, 4, 1};
static void M217CW(uint32 A, uint8 V)
{
if(EXPREGS[1]&0x08)
setchr1(A,V|((EXPREGS[1]&3)<<8));
else
setchr1(A,(V&0x7F)|((EXPREGS[1]&3)<<8)|((EXPREGS[1]&0x10)<<3));
}
static void M217PW(uint32 A, uint8 V)
{
if(EXPREGS[0]&0x80)
{
setprg16(0x8000,(EXPREGS[0]&0x0F)|((EXPREGS[1]&3)<<4));
setprg16(0xC000,(EXPREGS[0]&0x0F)|((EXPREGS[1]&3)<<4));
}
else if(EXPREGS[1]&0x08)
setprg8(A,(V&0x1F)|((EXPREGS[1]&3)<<5));
else
setprg8(A,(V&0x0F)|((EXPREGS[1]&3)<<5)|(EXPREGS[1]&0x10));
}
static DECLFW(M217Write)
{
if(!EXPREGS[2])
{
if(A >= 0xc000)
MMC3_IRQWrite(A, V);
else
MMC3_CMDWrite(A,V);
}
else switch(A&0xE001)
{
case 0x8000: IRQCount=V; break;
case 0xE000: X6502_IRQEnd(FCEU_IQEXT);IRQa=0; break;
case 0xC001: IRQa=1; break;
case 0xA001: setmirror((V&1)^1); break;
case 0x8001: MMC3_CMDWrite(0x8000,(V&0xC0)|(m217_perm[V&7])); cmdin=1; break;
case 0xA000: if(!cmdin) break;
MMC3_CMDWrite(0x8001,V);
cmdin=0;
break;
}
}
static DECLFW(M217ExWrite)
{
switch(A)
{
case 0x5000:
EXPREGS[0]=V;
FixMMC3PRG(MMC3_cmd);
break;
case 0x5001:
EXPREGS[1]=V;
FixMMC3PRG(MMC3_cmd);
break;
case 0x5007:
EXPREGS[2]=V;
break;
}
}
static void M217Power(void)
{
EXPREGS[0]=0;
EXPREGS[1]=0xFF;
EXPREGS[2]=3;
GenMMC3Power();
SetWriteHandler(0x8000,0xFFFF,M217Write);
SetWriteHandler(0x5000,0x7FFF,M217ExWrite);
}
void Mapper217_Init(CartInfo *info)
{
GenMMC3_Init(info, 256, 256, 0, 0);
cwrap=M217CW;
pwrap=M217PW;
info->Power=M217Power;
AddExState(EXPREGS, 3, 0, "EXPR");
AddExState(&cmdin, 1, 0, "CMDIN");
}
// ---------------------------- Mapper 245 ------------------------------
static void M245CW(uint32 A, uint8 V)
{
if(!UNIFchrrama) // Yong Zhe Dou E Long - Dragon Quest VI (As).nes NEEDS THIS for RAM cart
setchr1(A,V&7);
EXPREGS[0]=V;
FixMMC3PRG(MMC3_cmd);

View File

@ -395,9 +395,6 @@ void LogCDData(){
uint16 A = 0;
uint8 opcode[3] = {0}, memop = 0;
j = GetPRGAddress(_PC);
if(j != -1) {
opcode[0] = GetMem(_PC);
switch (opsize[opcode[0]]) {
case 2:
@ -409,6 +406,7 @@ void LogCDData(){
break;
}
if((j = GetPRGAddress(_PC)) != -1)
for (i = 0; i < opsize[opcode[0]]; i++) {
if(cdloggerdata[j+i] & 1)continue; //this has been logged so skip
cdloggerdata[j+i] |= 1;
@ -450,7 +448,6 @@ void LogCDData(){
}
}
}
}
//-----------debugger stuff

View File

@ -38,7 +38,7 @@ using namespace std;
void LoadCDLogFile();
void SaveCDLogFileAs();
void SaveCDLogFile();
void SaveStrippedRom();
void SaveStrippedRom(int invert);
extern iNES_HEADER head; //defined in ines.c
extern uint8 *trainerpoo;
@ -169,7 +169,10 @@ MB_OK);
SaveCDLogFile();
break;
case BTN_CDLOGGER_SAVE_STRIPPED:
SaveStrippedRom();
SaveStrippedRom(0);
break;
case BTN_CDLOGGER_SAVE_UNUSED:
SaveStrippedRom(1);
break;
}
break;
@ -319,7 +322,7 @@ void UpdateCDLogger(){
return;
}
void SaveStrippedRom(){ //this is based off of iNesSave()
void SaveStrippedRom(int invert){ //this is based off of iNesSave()
//todo: make this support nsfs
const char NESfilter[]="Stripped iNes Rom file (*.NES)\0*.nes\0All Files (*.*)\0*.*\0\0";
const char NSFfilter[]="Stripped NSF file (*.NSF)\0*.nsf\0All Files (*.*)\0*.*\0\0";
@ -376,8 +379,12 @@ void SaveStrippedRom(){ //this is based off of iNesSave()
fseek(fp,0x8,SEEK_SET);
for(i = 0;i < ((NSFMaxBank+1)*4096);i++){
if(cdloggerdata[i] & 3)fputc(NSFDATA[i],fp);
else fputc(0,fp);
unsigned char pchar;
if(cdloggerdata[i] & 3)
pchar = invert?0:NSFDATA[i];
else
pchar = invert?NSFDATA[i]:0;
fputc(pchar, fp);
}
}
@ -395,8 +402,12 @@ void SaveStrippedRom(){ //this is based off of iNesSave()
}
for(i = 0;i < head.ROM_size*0x4000;i++){
if(cdloggerdata[i] & 3)fputc(ROM[i],fp);
else fputc(0,fp);
unsigned char pchar;
if(cdloggerdata[i] & 3)
pchar = invert?0:ROM[i];
else
pchar = invert?ROM[i]:0;
fputc(pchar, fp);
}
//fwrite(ROM,0x4000,head.ROM_size,fp);

View File

@ -1386,7 +1386,7 @@ BEGIN
DEFPUSHBUTTON "&OK",IDOK,67,52,50,14
END
CDLOGGER DIALOGEX 0, 0, 322, 213
CDLOGGER DIALOGEX 0, 0, 315, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_ACCEPTFILES
CAPTION "Code Data Logger"
@ -1394,12 +1394,12 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "Load...",BTN_CDLOGGER_LOAD,7,81,50,14
PUSHBUTTON "Save",BTN_CDLOGGER_SAVE,257,81,50,14
GROUPBOX "Code Data Log Status",-1,2,4,316,119,BS_CENTER
GROUPBOX "Code Data Log Status",-1,3,4,308,131,BS_CENTER
PUSHBUTTON "Start",BTN_CDLOGGER_START_PAUSE,129,81,50,14
GROUPBOX "Address Label Logger",65534,3,128,315,79,BS_CENTER
PUSHBUTTON "Load...",111,7,182,50,14,WS_DISABLED
PUSHBUTTON "Start",112,127,181,50,14,WS_DISABLED
PUSHBUTTON "Save...",113,259,181,50,14,WS_DISABLED
GROUPBOX "Address Label Logger",65534,3,136,308,79,BS_CENTER
PUSHBUTTON "Load...",111,7,190,50,14,WS_DISABLED
PUSHBUTTON "Start",112,127,189,50,14,WS_DISABLED
PUSHBUTTON "Save...",113,256,189,50,14,WS_DISABLED
LTEXT "4067 - 29.5%",LBL_CDLOGGER_CODECOUNT,38,31,68,11
GROUPBOX "Bytes Logged As Code",65533,29,20,84,27
GROUPBOX "Bytes Logged as data",65532,117,20,84,27
@ -1409,7 +1409,8 @@ BEGIN
LTEXT "Itsa me the Code Data Logger! Press Start to play!",65530,69,56,172,12
PUSHBUTTON "Reset Log",BTN_CDLOGGER_RESET,7,66,50,14
PUSHBUTTON "Save as...",BTN_CDLOGGER_SAVE_AS,257,66,50,14
PUSHBUTTON "Save Stripped iNes Rom...",BTN_CDLOGGER_SAVE_STRIPPED,213,102,99,14
PUSHBUTTON "Save Stripped iNes Rom...",BTN_CDLOGGER_SAVE_STRIPPED,208,102,99,14
PUSHBUTTON "Save Unused Data...",BTN_CDLOGGER_SAVE_UNUSED,208,117,99,14
END
PPUVIEW DIALOGEX 44, 38, 355, 246
@ -1817,6 +1818,10 @@ BEGIN
BOTTOMMARGIN, 318
END
"TRACER", DIALOG
BEGIN
END
"ADDBP", DIALOG
BEGIN
RIGHTMARGIN, 185
@ -1882,6 +1887,7 @@ BEGIN
"CDLOGGER", DIALOG
BEGIN
BOTTOMMARGIN, 213
END
"ARCHIVECHOOSERDIALOG", DIALOG

View File

@ -103,6 +103,7 @@
#define IDC_ROMPATCHER_PATCH_DATA 109
#define IDC_ADDBP_MODE_X2 109
#define IDC_ADDBP_MODE_F 109
#define BTN_CDLOGGER_SAVE_UNUSED 109
#define IDC_CHEAT_VAL_LT_BY 110
#define MENU_SAVE_STATE 110
#define CB_ASK_EXIT 110

View File

@ -241,6 +241,8 @@
{0x22d6d5bd,4,1},
{0x6a03d3f3,114,-1},
{0x0d98db53,114,-1}, /* Pocahontas */
{0x4e7729ff,114,-1}, /* Super Donkey Kong */
{0x02c41438,176,-1}, /* Xing He Zhan Shi (C) */

View File

@ -580,7 +580,7 @@ static BMAPPINGLocal bmap[] = {
{"", 178, Mapper178_Init},
{"", 180, Mapper180_Init},
{"", 181, Mapper181_Init},
{"", 182, Mapper182_Init},
// {"", 182, Mapper182_Init}, // identical to 114
{"", 183, Mapper183_Init},
{"", 184, Mapper184_Init},
{"", 185, Mapper185_Init},
@ -603,9 +603,9 @@ static BMAPPINGLocal bmap[] = {
{"", 209, Mapper209_Init},
{"", 210, Mapper210_Init},
{"", 211, Mapper211_Init},
{"", 215, Mapper215_Init},
{"", 215, UNL8237_Init},
{"", 216, Mapper216_Init},
{"", 217, Mapper217_Init},
// {"", 217, Mapper217_Init},
{"UNLA9746", 219, UNLA9746_Init},
{"OneBus", 220, UNLOneBus_Init},

View File

@ -418,7 +418,7 @@ void Mapper177_Init(CartInfo *);
void Mapper178_Init(CartInfo *);
void Mapper180_Init(CartInfo *);
void Mapper181_Init(CartInfo *);
void Mapper182_Init(CartInfo *);
//void Mapper182_Init(CartInfo *);
void Mapper183_Init(CartInfo *);
void Mapper184_Init(CartInfo *);
void Mapper185_Init(CartInfo *);
@ -440,9 +440,9 @@ void Mapper208_Init(CartInfo *);
void Mapper209_Init(CartInfo *);
void Mapper210_Init(CartInfo *);
void Mapper211_Init(CartInfo *);
void Mapper215_Init(CartInfo *);
//void Mapper215_Init(CartInfo *);
void Mapper216_Init(CartInfo *);
void Mapper217_Init(CartInfo *);
//void Mapper217_Init(CartInfo *);
void Mapper220_Init(CartInfo *);
void Mapper222_Init(CartInfo *);
void Mapper226_Init(CartInfo *);

View File

@ -392,12 +392,12 @@ static BMAPPING bmap[] = {
{ "SMB2J", UNLSMB2J_Init, 0},
{ "AX5705", UNLAX5705_Init, 0},
{ "CC-21", UNLCC21_Init,0},
{ "H2288", UNLH2288_Init,0},
{ "KOF97", UNLKOF97_Init,0},
{ "SL1632", UNLSL1632_Init,0},
{ "SHERO", UNLSHeroes_Init,0},
{ "8237", UNL8237_Init,0},
{ "8237A", UNL8237A_Init,0},
{ "8157", UNL8157_Init,0},
{ "T-262", BMCT262_Init,0},
{ "FK23C", BMCFK23C_Init,0},

View File

@ -108,6 +108,7 @@ void UNLA9746_Init(CartInfo *info);
void UNLSHeroes_Init(CartInfo *info);
void UNLH2288_Init(CartInfo *info);
void UNL8237_Init(CartInfo *info);
void UNL8237A_Init(CartInfo *info);
void UNL8157_Init(CartInfo *info);
void UNL22211_Init(CartInfo *info);
void UNLTF1201_Init(CartInfo *info);

View File

@ -274,7 +274,6 @@
<ClCompile Include="..\src\boards\bmc70in1.cpp" />
<ClCompile Include="..\src\boards\bonza.cpp" />
<ClCompile Include="..\src\boards\bs-5.cpp" />
<ClCompile Include="..\src\boards\copyfami_mmc3.cpp" />
<ClCompile Include="..\src\boards\datalatch.cpp" />
<ClCompile Include="..\src\boards\deirom.cpp" />
<ClCompile Include="..\src\boards\dream.cpp" />

View File

@ -193,9 +193,6 @@
<ClCompile Include="..\src\boards\bs-5.cpp">
<Filter>boards</Filter>
</ClCompile>
<ClCompile Include="..\src\boards\copyfami_mmc3.cpp">
<Filter>boards</Filter>
</ClCompile>
<ClCompile Include="..\src\boards\datalatch.cpp">
<Filter>boards</Filter>
</ClCompile>