@@ -21,65 +21,70 @@
|
|||||||
|
|
||||||
#include "mapinc.h"
|
#include "mapinc.h"
|
||||||
|
|
||||||
static uint8 prgr, chrr[4];
|
static uint8 preg, creg[4];
|
||||||
static uint8 *WRAM = NULL;
|
static uint8 *WRAM = NULL;
|
||||||
|
|
||||||
static void Mapper190_Sync(void) {
|
static SFORMAT StateRegs[] =
|
||||||
|
{
|
||||||
|
{ &preg, 1, "PREG" },
|
||||||
|
{ creg, 4, "CREG" },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static void Sync(void) {
|
||||||
setprg8r(0x10, 0x6000, 0);
|
setprg8r(0x10, 0x6000, 0);
|
||||||
|
setprg16(0x8000, preg);
|
||||||
setprg16(0x8000, prgr);
|
|
||||||
setprg16(0xC000, 0);
|
setprg16(0xC000, 0);
|
||||||
setchr2(0x0000, chrr[0]);
|
setchr2(0x0000, creg[0]);
|
||||||
setchr2(0x0800, chrr[1]);
|
setchr2(0x0800, creg[1]);
|
||||||
setchr2(0x1000, chrr[2]);
|
setchr2(0x1000, creg[2]);
|
||||||
setchr2(0x1800, chrr[3]);
|
setchr2(0x1800, creg[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DECLFW(Mapper190_Write89) { prgr = V&7; Mapper190_Sync(); }
|
static DECLFW(M190Write89) {
|
||||||
static DECLFW(Mapper190_WriteCD) { prgr = 8|(V&7); Mapper190_Sync(); }
|
preg = V & 7;
|
||||||
|
Sync();
|
||||||
static DECLFW(Mapper190_WriteAB) {
|
|
||||||
int bank = A&3;
|
|
||||||
chrr[bank] = V&63;
|
|
||||||
Mapper190_Sync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DECLFW(M190WriteCD) {
|
||||||
|
preg = 8 | (V & 7);
|
||||||
|
Sync();
|
||||||
|
}
|
||||||
|
|
||||||
static void Mapper190_Power(void) {
|
static DECLFW(M190WriteAB) {
|
||||||
|
creg[A & 3] = V;
|
||||||
|
Sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void M190Power(void) {
|
||||||
|
creg[0] = creg[1] = creg[2] = creg[3] = 0;
|
||||||
|
preg = 0;
|
||||||
FCEU_CheatAddRAM(0x2000 >> 10, 0x6000, WRAM);
|
FCEU_CheatAddRAM(0x2000 >> 10, 0x6000, WRAM);
|
||||||
|
|
||||||
SetReadHandler(0x6000, 0xFFFF, CartBR);
|
SetReadHandler(0x6000, 0xFFFF, CartBR);
|
||||||
|
|
||||||
SetWriteHandler(0x6000, 0x7FFF, CartBW);
|
SetWriteHandler(0x6000, 0x7FFF, CartBW);
|
||||||
SetWriteHandler(0x8000, 0x9FFF, Mapper190_Write89);
|
SetWriteHandler(0x8000, 0x9FFF, M190Write89);
|
||||||
SetWriteHandler(0xA000, 0xBFFF, Mapper190_WriteAB);
|
SetWriteHandler(0xA000, 0xBFFF, M190WriteAB);
|
||||||
SetWriteHandler(0xC000, 0xDFFF, Mapper190_WriteCD);
|
SetWriteHandler(0xC000, 0xDFFF, M190WriteCD);
|
||||||
Mapper190_Sync();
|
|
||||||
|
|
||||||
setmirror(MI_V);
|
setmirror(MI_V);
|
||||||
|
Sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Mapper190_Close(void) {
|
static void M190Close(void) {
|
||||||
|
if (WRAM)
|
||||||
FCEU_gfree(WRAM);
|
FCEU_gfree(WRAM);
|
||||||
WRAM = NULL;
|
WRAM = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Mapper190_Restore(int version) {
|
static void StateRestore(int version) {
|
||||||
Mapper190_Sync();
|
Sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Mapper190_Init(CartInfo *info) {
|
void Mapper190_Init(CartInfo *info) {
|
||||||
info->Power = Mapper190_Power;
|
info->Power = M190Power;
|
||||||
info->Close = Mapper190_Close;
|
info->Close = M190Close;
|
||||||
GameStateRestore = Mapper190_Restore;
|
|
||||||
|
|
||||||
WRAM = (uint8*)FCEU_gmalloc(0x2000);
|
WRAM = (uint8*)FCEU_gmalloc(0x2000);
|
||||||
SetupCartPRGMapping(0x10, WRAM, 0x2000, 1);
|
SetupCartPRGMapping(0x10, WRAM, 0x2000, 1);
|
||||||
|
|
||||||
chrr[0] = chrr[1] = chrr[2] = chrr[3] = prgr = 0;
|
|
||||||
|
|
||||||
AddExState(&prgr, 1, 0, "PRGR");
|
|
||||||
AddExState(chrr, 4, 0, "CHRR");
|
|
||||||
AddExState(WRAM, 0x2000, 0, "WRAM");
|
AddExState(WRAM, 0x2000, 0, "WRAM");
|
||||||
|
GameStateRestore = StateRestore;
|
||||||
|
AddExState(&StateRegs, ~0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,30 +21,25 @@
|
|||||||
|
|
||||||
#include "mapinc.h"
|
#include "mapinc.h"
|
||||||
|
|
||||||
static uint8 prg_reg;
|
static uint8 regs[2];
|
||||||
static uint8 chr_reg;
|
|
||||||
static uint8 hrd_flag;
|
static uint8 hrd_flag;
|
||||||
|
|
||||||
static SFORMAT StateRegs[] =
|
static SFORMAT StateRegs[] =
|
||||||
{
|
{
|
||||||
{ &hrd_flag, 1, "DPSW" },
|
{ &hrd_flag, 1, "DPSW" },
|
||||||
{ &prg_reg, 1, "PRG" },
|
{ regs, 2, "REGS" },
|
||||||
{ &chr_reg, 1, "CHR" },
|
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
static void Sync(void) {
|
static void Sync(void) {
|
||||||
if (prg_reg & 0x10)
|
if (regs[1] & 0x10)
|
||||||
setprg32(0x8000, (prg_reg >> 6) & 3);
|
setprg32(0x8000, (regs[1] >> 6) & 3);
|
||||||
else {
|
else {
|
||||||
setprg16(0x8000, (prg_reg >> 5) & 7);
|
setprg16(0x8000, (regs[1] >> 5) & 7);
|
||||||
setprg16(0xC000, (prg_reg >> 5) & 7);
|
setprg16(0xC000, (regs[1] >> 5) & 7);
|
||||||
}
|
}
|
||||||
/* Mirroring (0=Vert, 1=Horz)
|
setmirror((regs[1] & 8) >> 3 ^ 1);
|
||||||
* https://wiki.nesdev.com/w/index.php/INES_Mapper_057
|
setchr8((regs[0] & 7) | (regs[1] & 7) | ((regs[0] & 0x40) >> 3));
|
||||||
*/
|
|
||||||
setmirror((prg_reg & 8) ? MI_H : MI_V);
|
|
||||||
setchr8((chr_reg & 7) | (prg_reg & 7) | ((chr_reg & 0x40) >> 3));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static DECLFR(M57Read) {
|
static DECLFR(M57Read) {
|
||||||
@@ -52,16 +47,14 @@ static DECLFR(M57Read) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static DECLFW(M57Write) {
|
static DECLFW(M57Write) {
|
||||||
if ((A & 0x8800) == 0x8800)
|
switch (A & 0x8800) {
|
||||||
prg_reg = V;
|
case 0x8000: regs[0] = V; Sync(); break;
|
||||||
else
|
case 0x8800: regs[1] = V; Sync(); break;
|
||||||
chr_reg = V;
|
}
|
||||||
Sync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void M57Power(void) {
|
static void M57Power(void) {
|
||||||
prg_reg = 0;
|
regs[1] = regs[0] = 0;
|
||||||
chr_reg = 0;
|
|
||||||
hrd_flag = 0;
|
hrd_flag = 0;
|
||||||
SetReadHandler(0x8000, 0xFFFF, CartBR);
|
SetReadHandler(0x8000, 0xFFFF, CartBR);
|
||||||
SetWriteHandler(0x8000, 0xFFFF, M57Write);
|
SetWriteHandler(0x8000, 0xFFFF, M57Write);
|
||||||
|
|||||||
@@ -89,9 +89,12 @@ static DECLFW(M69Write1) {
|
|||||||
case 0xA: preg[1] = V; Sync(); break;
|
case 0xA: preg[1] = V; Sync(); break;
|
||||||
case 0xB: preg[2] = V; Sync(); break;
|
case 0xB: preg[2] = V; Sync(); break;
|
||||||
case 0xC: mirr = V & 3; Sync();break;
|
case 0xC: mirr = V & 3; Sync();break;
|
||||||
|
/* 17/10/17- reg $0D should awknowledge IRQ and no other
|
||||||
|
* http://forums.nesdev.com/viewtopic.php?f=2&t=12436&start=15
|
||||||
|
*/
|
||||||
case 0xD: IRQa = V; X6502_IRQEnd(FCEU_IQEXT); break;
|
case 0xD: IRQa = V; X6502_IRQEnd(FCEU_IQEXT); break;
|
||||||
case 0xE: IRQCount &= 0xFF00; IRQCount |= V; X6502_IRQEnd(FCEU_IQEXT); break;
|
case 0xE: IRQCount &= 0xFF00; IRQCount |= V; break;
|
||||||
case 0xF: IRQCount &= 0x00FF; IRQCount |= V << 8; X6502_IRQEnd(FCEU_IQEXT); break;
|
case 0xF: IRQCount &= 0x00FF; IRQCount |= V << 8; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,80 +24,80 @@
|
|||||||
#include "mapinc.h"
|
#include "mapinc.h"
|
||||||
#include "mmc3.h"
|
#include "mmc3.h"
|
||||||
|
|
||||||
//#define DEBUG_SERIAL
|
/* #define DEBUG_SERIAL */
|
||||||
|
|
||||||
// *** COPY FAMICOM EMULATION ***
|
/* *** COPY FAMICOM EMULATION *** */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
*
|
||||||
|
*
|
||||||
$0000-$1FFF
|
* $0000-$1FFF
|
||||||
$2000-$200F PPU
|
* $2000-$200F PPU
|
||||||
$2010-$3FFB
|
* $2010-$3FFB
|
||||||
$3FFC-$3FFF
|
* $3FFC-$3FFF
|
||||||
$4000-$7FFF APU /
|
* $4000-$7FFF APU /
|
||||||
$8000-$FFF9 CART/ROM
|
* $8000-$FFF9 CART/ROM
|
||||||
$FFFA-$FFFB CART/ NMI
|
* $FFFA-$FFFB CART/ NMI
|
||||||
$FFFE-$FFFF CART/ IRQ
|
* $FFFE-$FFFF CART/ IRQ
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
CTRL R/W $3FFC ---aenic ($00 at reset)
|
* CTRL R/W $3FFC ---aenic ($00 at reset)
|
||||||
|
*
|
||||||
c -
|
* c -
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
i - IRQ
|
* i - IRQ
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
n - NMI
|
* n - NMI
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
e - NMI
|
* e - NMI
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
a - AROM
|
* a - AROM
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
|
*
|
||||||
BANK R/W $3FFD ---mbbbb
|
* BANK R/W $3FFD ---mbbbb
|
||||||
|
*
|
||||||
b -
|
* b -
|
||||||
m - ROM
|
* m - ROM
|
||||||
|
*
|
||||||
USBDATA R/W $3FFE dddddddd
|
* USBDATA R/W $3FFE dddddddd
|
||||||
|
*
|
||||||
d - /
|
* d - /
|
||||||
|
*
|
||||||
STATUS R $3FFF vmnicptr
|
* STATUS R $3FFF vmnicptr
|
||||||
|
*
|
||||||
r - USB
|
* r - USB
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
t - USB
|
* t - USB
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
p - USB
|
* p - USB
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
c -
|
* c -
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
i - IRQ
|
* i - IRQ
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
n - NMI
|
* n - NMI
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
m - 10 VRAM ()
|
* m - 10 VRAM ()
|
||||||
v - VRAM
|
* v - VRAM
|
||||||
0 -
|
* 0 -
|
||||||
1 -
|
* 1 -
|
||||||
|
*
|
||||||
AROM
|
* AROM
|
||||||
|
*
|
||||||
VRAM
|
* VRAM
|
||||||
8000-FFFF
|
* 8000-FFFF
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CTRL 0x00
|
#define CTRL 0x00
|
||||||
@@ -196,7 +196,7 @@ static DECLFW(MCopyFamiWriteReg) {
|
|||||||
;
|
;
|
||||||
#endif
|
#endif
|
||||||
bytes_count++;
|
bytes_count++;
|
||||||
// FCEU_printf(" %02X",V);
|
/* FCEU_printf(" %02X",V); */
|
||||||
} else {
|
} else {
|
||||||
regs[A & 3] = V;
|
regs[A & 3] = V;
|
||||||
Sync();
|
Sync();
|
||||||
|
|||||||
@@ -18,10 +18,10 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// *** COPY FAMICOM HARDWARE INTERFACE ***
|
|
||||||
|
|
||||||
#ifdef COPYFAMI
|
#ifdef COPYFAMI
|
||||||
|
|
||||||
|
/* *** COPY FAMICOM HARDWARE INTERFACE *** */
|
||||||
|
|
||||||
#define MESSAGE_LOG
|
#define MESSAGE_LOG
|
||||||
#define NO_CACHE
|
#define NO_CACHE
|
||||||
#define NO_RAM
|
#define NO_RAM
|
||||||
@@ -42,45 +42,45 @@
|
|||||||
|
|
||||||
static uint8 *WRAM = NULL;
|
static uint8 *WRAM = NULL;
|
||||||
|
|
||||||
uint8 InitVector[] = { 0xDE, 0xAD, 0xBE, 0xEF };// args none, return DE AD BE EF
|
uint8 InitVector[] = { 0xDE, 0xAD, 0xBE, 0xEF };/* args none, return DE AD BE EF */
|
||||||
uint8 ResetCmd[] = { 0x00 }; // args none, return none
|
uint8 ResetCmd[] = { 0x00 }; /* args none, return none */
|
||||||
uint8 StateCmd[] = { 0x01 }; // args none, return 7 bytes status
|
uint8 StateCmd[] = { 0x01 }; /* args none, return 7 bytes status */
|
||||||
uint8 StatusCmd[] = { 0x02 }; // args none, return 32 bytes status
|
uint8 StatusCmd[] = { 0x02 }; /* args none, return 32 bytes status */
|
||||||
uint8 LoadPlugCmd[] = { 0x03, 0x00, 0x00 }; // args 2b size, Nb data return none
|
uint8 LoadPlugCmd[] = { 0x03, 0x00, 0x00 }; /* args 2b size, Nb data return none */
|
||||||
uint8 RunPlugCmd[] = { 0x04 }; // args none, return none
|
uint8 RunPlugCmd[] = { 0x04 }; /* args none, return none */
|
||||||
uint8 RunGameCmd[] = { 0x05 }; // args none, return none
|
uint8 RunGameCmd[] = { 0x05 }; /* args none, return none */
|
||||||
uint8 NROMSave[] = { 0x06 }; // args none, return 16b + 32kb + 8kb
|
uint8 NROMSave[] = { 0x06 }; /* args none, return 16b + 32kb + 8kb */
|
||||||
|
|
||||||
uint8 PRGWBCmd[] = { 0x08, 0x00, 0x00, 0x00 }; // args 2b addr, 1b data return none
|
uint8 PRGWBCmd[] = { 0x08, 0x00, 0x00, 0x00 }; /* args 2b addr, 1b data return none */
|
||||||
uint8 PRGRBCmd[] = { 0x09, 0x00, 0x00 }; // args 2b addr return 1b data
|
uint8 PRGRBCmd[] = { 0x09, 0x00, 0x00 }; /* args 2b addr return 1b data */
|
||||||
uint8 CHRWBCmd[] = { 0x0A, 0x00, 0x00, 0x00 }; // args 2b addr, 1b data return none
|
uint8 CHRWBCmd[] = { 0x0A, 0x00, 0x00, 0x00 }; /* args 2b addr, 1b data return none */
|
||||||
uint8 CHRRBCmd[] = { 0x0B, 0x00, 0x00 }; // args 2b addr, return 1b data
|
uint8 CHRRBCmd[] = { 0x0B, 0x00, 0x00 }; /* args 2b addr, return 1b data */
|
||||||
|
|
||||||
uint8 PRGSUMCmd[] = { 0x10, 0x00, 0x00 }; // args 1b addr, 1b size return (256 * N)b
|
uint8 PRGSUMCmd[] = { 0x10, 0x00, 0x00 }; /* args 1b addr, 1b size return (256 * N)b */
|
||||||
uint8 PRG32KSUMCmd[] = { 0x10, 0x80, 0x80 }; // args 1b addr, 1b size return 32kb
|
uint8 PRG32KSUMCmd[] = { 0x10, 0x80, 0x80 }; /* args 1b addr, 1b size return 32kb */
|
||||||
uint8 PRG16KSUMCmd[] = { 0x10, 0x00, 0x40 }; // args 1b addr, 1b size return 16kb
|
uint8 PRG16KSUMCmd[] = { 0x10, 0x00, 0x40 }; /* args 1b addr, 1b size return 16kb */
|
||||||
uint8 PRG8KSUMCmd[] = { 0x10, 0x00, 0x20 }; // args 1b addr, 1b size return 8kb
|
uint8 PRG8KSUMCmd[] = { 0x10, 0x00, 0x20 }; /* args 1b addr, 1b size return 8kb */
|
||||||
uint8 PRG4KSUMCmd[] = { 0x10, 0x00, 0x10 }; // args 1b addr, 1b size return 4kb
|
uint8 PRG4KSUMCmd[] = { 0x10, 0x00, 0x10 }; /* args 1b addr, 1b size return 4kb */
|
||||||
|
|
||||||
uint8 CHRSUMCmd[] = { 0x11, 0x00, 0x00 }; // args 1b addr, 1b size return (256 * N)b
|
uint8 CHRSUMCmd[] = { 0x11, 0x00, 0x00 }; /* args 1b addr, 1b size return (256 * N)b */
|
||||||
uint8 CHR8KSUMCmd[] = { 0x11, 0x00, 0x20 }; // args 1b addr, 1b size return 8kb
|
uint8 CHR8KSUMCmd[] = { 0x11, 0x00, 0x20 }; /* args 1b addr, 1b size return 8kb */
|
||||||
uint8 CHR4KSUMCmd[] = { 0x11, 0x00, 0x10 }; // args 1b addr, 1b size return 4kb
|
uint8 CHR4KSUMCmd[] = { 0x11, 0x00, 0x10 }; /* args 1b addr, 1b size return 4kb */
|
||||||
uint8 CHR2KSUMCmd[] = { 0x11, 0x00, 0x08 }; // args 1b addr, 1b size return 2kb
|
uint8 CHR2KSUMCmd[] = { 0x11, 0x00, 0x08 }; /* args 1b addr, 1b size return 2kb */
|
||||||
uint8 CHR1KSUMCmd[] = { 0x11, 0x00, 0x04 }; // args 1b addr, 1b size return 1kb
|
uint8 CHR1KSUMCmd[] = { 0x11, 0x00, 0x04 }; /* args 1b addr, 1b size return 1kb */
|
||||||
|
|
||||||
uint8 PRGGetCmd[] = { 0x12, 0x00, 0x00 }; // args 1b addr, 1b size return (256 * N)b
|
uint8 PRGGetCmd[] = { 0x12, 0x00, 0x00 }; /* args 1b addr, 1b size return (256 * N)b */
|
||||||
uint8 PRG32KGetCmd[] = { 0x12, 0x80, 0x80 }; // args 1b addr, 1b size return 32kb
|
uint8 PRG32KGetCmd[] = { 0x12, 0x80, 0x80 }; /* args 1b addr, 1b size return 32kb */
|
||||||
uint8 PRG16KGetCmd[] = { 0x12, 0x00, 0x40 }; // args 1b addr, 1b size return 16kb
|
uint8 PRG16KGetCmd[] = { 0x12, 0x00, 0x40 }; /* args 1b addr, 1b size return 16kb */
|
||||||
uint8 PRG8KGetCmd[] = { 0x12, 0x00, 0x20 }; // args 1b addr, 1b size return 8kb
|
uint8 PRG8KGetCmd[] = { 0x12, 0x00, 0x20 }; /* args 1b addr, 1b size return 8kb */
|
||||||
uint8 PRG4KGetCmd[] = { 0x12, 0x00, 0x10 }; // args 1b addr, 1b size return 4kb
|
uint8 PRG4KGetCmd[] = { 0x12, 0x00, 0x10 }; /* args 1b addr, 1b size return 4kb */
|
||||||
|
|
||||||
uint8 CHRGetCmd[] = { 0x13, 0x00, 0x00 }; // args 1b addr, 1b size return (256 * N)b
|
uint8 CHRGetCmd[] = { 0x13, 0x00, 0x00 }; /* args 1b addr, 1b size return (256 * N)b */
|
||||||
uint8 CHR8KGetCmd[] = { 0x13, 0x00, 0x20 }; // args 1b addr, 1b size return 8kb
|
uint8 CHR8KGetCmd[] = { 0x13, 0x00, 0x20 }; /* args 1b addr, 1b size return 8kb */
|
||||||
uint8 CHR4KGetCmd[] = { 0x13, 0x00, 0x10 }; // args 1b addr, 1b size return 4kb
|
uint8 CHR4KGetCmd[] = { 0x13, 0x00, 0x10 }; /* args 1b addr, 1b size return 4kb */
|
||||||
uint8 CHR2KGetCmd[] = { 0x13, 0x00, 0x08 }; // args 1b addr, 1b size return 2kb
|
uint8 CHR2KGetCmd[] = { 0x13, 0x00, 0x08 }; /* args 1b addr, 1b size return 2kb */
|
||||||
uint8 CHR1KGetCmd[] = { 0x13, 0x00, 0x04 }; // args 1b addr, 1b size return 1kb
|
uint8 CHR1KGetCmd[] = { 0x13, 0x00, 0x04 }; /* args 1b addr, 1b size return 1kb */
|
||||||
|
|
||||||
uint8 CPUTestCmd[] = { 0x14, 0x00, 0x00 }; // args 1b addr, 1b size return (2b + 1b) * N + 3b
|
uint8 CPUTestCmd[] = { 0x14, 0x00, 0x00 }; /* args 1b addr, 1b size return (2b + 1b) * N + 3b */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32 mirror;
|
int32 mirror;
|
||||||
@@ -326,8 +326,9 @@ static void UpdateCmd(uint32 val) {
|
|||||||
if (cmd.size < CMD_MAX_SIZE) {
|
if (cmd.size < CMD_MAX_SIZE) {
|
||||||
index = cmd.size++;
|
index = cmd.size++;
|
||||||
} else {
|
} else {
|
||||||
// åñëè äîñòèãíóò ìàêñèìóì äëÿ êîìàíäû, âûáðîñèòü ïîñëåäíóþþ, äîáàâèòü íîâóþ,
|
/* åñëè äîñòèãíóò ìàêñèìóì äëÿ êîìàíäû, âûáðîñèòü ïîñëåäíóþþ, äîáàâèòü íîâóþ,
|
||||||
// ïðîäîëæàòü äî áàíêñâè÷èíãà
|
* ïðîäîëæàòü äî áàíêñâè÷èíãà
|
||||||
|
*/
|
||||||
cmd.hash = 0;
|
cmd.hash = 0;
|
||||||
for (index = 0; index < (CMD_MAX_SIZE - 1); index++) {
|
for (index = 0; index < (CMD_MAX_SIZE - 1); index++) {
|
||||||
cmd.seq[index] = cmd.seq[index + 1];
|
cmd.seq[index] = cmd.seq[index + 1];
|
||||||
@@ -361,10 +362,11 @@ static DECLFW(MCopyFamiWrite) {
|
|||||||
Sync();
|
Sync();
|
||||||
#else
|
#else
|
||||||
UpdateCmd((A << 8) | V);
|
UpdateCmd((A << 8) | V);
|
||||||
// èùåì êîìàíäó â êåøå
|
/* èùåì êîìàíäó â êåøå */
|
||||||
if (cmd.found == -1) {
|
if (cmd.found == -1) {
|
||||||
// íå íàéäåíà, ïðîâåðÿåì, èçìåíèëîñü ëè ñîñòîÿíèå áàíêîâ
|
/* íå íàéäåíà, ïðîâåðÿåì, èçìåíèëîñü ëè ñîñòîÿíèå áàíêîâ
|
||||||
// ëèáî íå ïðåäåëüíîé ëè îíà äëèíû äëÿ êîìàíäû
|
* ëèáî íå ïðåäåëüíîé ëè îíà äëèíû äëÿ êîìàíäû
|
||||||
|
*/
|
||||||
cmd_cache[cmd.hashf].index = cmd.found = cmds.count++;
|
cmd_cache[cmd.hashf].index = cmd.found = cmds.count++;
|
||||||
cmd_cache[cmd.hashf].retest = 0;
|
cmd_cache[cmd.hashf].retest = 0;
|
||||||
cmd_cache[cmd.hashf].verify = 0;
|
cmd_cache[cmd.hashf].verify = 0;
|
||||||
@@ -378,15 +380,15 @@ static DECLFW(MCopyFamiWrite) {
|
|||||||
cmd.hash = 0;
|
cmd.hash = 0;
|
||||||
Sync();
|
Sync();
|
||||||
} else {
|
} else {
|
||||||
// åñëè äîáàâëåíà ïîëíàÿ êîìàíäà áåç áàíêñâèò÷èíãà
|
/* åñëè äîáàâëåíà ïîëíàÿ êîìàíäà áåç áàíêñâèò÷èíãà */
|
||||||
cmd_cache[cmd.hashf].index = -2;
|
cmd_cache[cmd.hashf].index = -2;
|
||||||
}
|
}
|
||||||
} else if (cmd.found == -2) {
|
} else if (cmd.found == -2) {
|
||||||
// ÷àñòè÷íîå ñîâïàäåíèå, åñëè ÷èñëî ïðîâåðîê íå ïðåâûñèëî ëèìèò
|
/* ÷àñòè÷íîå ñîâïàäåíèå, åñëè ÷èñëî ïðîâåðîê íå ïðåâûñèëî ëèìèò */
|
||||||
if (cmd_cache[cmd.hashf].retest < CMD_MAX_RETEST) {
|
if (cmd_cache[cmd.hashf].retest < CMD_MAX_RETEST) {
|
||||||
// òî ïðîâåðèì ñîñòîÿíèå áàíêîâ
|
/* òî ïðîâåðèì ñîñòîÿíèå áàíêîâ */
|
||||||
if (CheckStatus()) {
|
if (CheckStatus()) {
|
||||||
// èçìåíèëîñü, çàïèøåì íîâóþ êîìàíäó
|
/* èçìåíèëîñü, çàïèøåì íîâóþ êîìàíäó */
|
||||||
cmd_cache[cmd.hashf].index = cmd.found = cmds.count++;
|
cmd_cache[cmd.hashf].index = cmd.found = cmds.count++;
|
||||||
cmd_cache[cmd.hashf].retest = 0;
|
cmd_cache[cmd.hashf].retest = 0;
|
||||||
cmd_cache[cmd.hashf].verify = 0;
|
cmd_cache[cmd.hashf].verify = 0;
|
||||||
@@ -399,17 +401,16 @@ static DECLFW(MCopyFamiWrite) {
|
|||||||
cmd.hash = 0;
|
cmd.hash = 0;
|
||||||
Sync();
|
Sync();
|
||||||
} else {
|
} else {
|
||||||
// íå èçìåíèëîñü, îòìåòèì óâåëè÷èì ñ÷åò÷èê ïðîâåðîê
|
/* íå èçìåíèëîñü, îòìåòèì óâåëè÷èì ñ÷åò÷èê ïðîâåðîê */
|
||||||
cmd_cache[cmd.hashf].retest++;
|
cmd_cache[cmd.hashf].retest++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// íàéäåíà, ïîñëåäíèé ðóáåæ îáîðîíû îò ãîâíà
|
/* íàéäåíà, ïîñëåäíèé ðóáåæ îáîðîíû îò ãîâíà */
|
||||||
/*
|
#if 0
|
||||||
if(cmd_cache[cmd.hashf].verify < CMD_MAX_VERIFY) {
|
if(cmd_cache[cmd.hashf].verify < CMD_MAX_VERIFY) {
|
||||||
if(CheckStatus()) {
|
if(CheckStatus()) {
|
||||||
int32 changed = 0;
|
int32 changed = 0;
|
||||||
// ,
|
|
||||||
if(cmds.states[cmd.found].mirror != state_new.mirror)
|
if(cmds.states[cmd.found].mirror != state_new.mirror)
|
||||||
changed = 1;
|
changed = 1;
|
||||||
for(i=0; i<8; i++)
|
for(i=0; i<8; i++)
|
||||||
@@ -426,8 +427,10 @@ static DECLFW(MCopyFamiWrite) {
|
|||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
cmd_cache[cmd.hashf].verify++;
|
cmd_cache[cmd.hashf].verify++;
|
||||||
} else */{
|
} else
|
||||||
// ïðèìåíÿåì áåç ìàëåéøåãî çàçðåíèÿ ñîâåñòè
|
#endif
|
||||||
|
{
|
||||||
|
/* ïðèìåíÿåì áåç ìàëåéøåãî çàçðåíèÿ ñîâåñòè */
|
||||||
ApplyStatus();
|
ApplyStatus();
|
||||||
cmd.size = 0;
|
cmd.size = 0;
|
||||||
cmd.hash = 0;
|
cmd.hash = 0;
|
||||||
@@ -453,7 +456,7 @@ static void MCopyFamiReset(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void MCopyFamiPower(void) {
|
static void MCopyFamiPower(void) {
|
||||||
// uint32 resp, presp;
|
/* uint32 resp, presp; */
|
||||||
|
|
||||||
FCEU_printf("NOW POWERING... ");
|
FCEU_printf("NOW POWERING... ");
|
||||||
|
|
||||||
@@ -466,7 +469,7 @@ static void MCopyFamiPower(void) {
|
|||||||
SetReadHandler(0x6000, 0x7fff, CartBR);
|
SetReadHandler(0x6000, 0x7fff, CartBR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#if 0
|
||||||
FCEU_printf("READING MEMORY MAP...\n");
|
FCEU_printf("READING MEMORY MAP...\n");
|
||||||
CPUTestCmd[1] = 0x50;
|
CPUTestCmd[1] = 0x50;
|
||||||
CPUTestCmd[2] = 0x30;
|
CPUTestCmd[2] = 0x30;
|
||||||
@@ -477,10 +480,10 @@ static void MCopyFamiPower(void) {
|
|||||||
GET(resp, 3);
|
GET(resp, 3);
|
||||||
if(presp != 0xffffffff) {
|
if(presp != 0xffffffff) {
|
||||||
switch(presp & 0x00FF0000) {
|
switch(presp & 0x00FF0000) {
|
||||||
case 0x00000000: // BUS
|
case 0x00000000: /* BUS */
|
||||||
FCEU_printf(" %04X-%04X OPEN BUS\n",presp & 0x7fff, (resp - 1) & 0x7fff);
|
FCEU_printf(" %04X-%04X OPEN BUS\n",presp & 0x7fff, (resp - 1) & 0x7fff);
|
||||||
break;
|
break;
|
||||||
case 0x00010000: // RAM
|
case 0x00010000: /* RAM */
|
||||||
FCEU_printf(" %04X-%04X RAM\n",presp & 0x7fff, (resp - 1) & 0x7fff);
|
FCEU_printf(" %04X-%04X RAM\n",presp & 0x7fff, (resp - 1) & 0x7fff);
|
||||||
SetWriteHandler(presp & 0x7fff, (resp - 1) & 0x7fff, CartBW);
|
SetWriteHandler(presp & 0x7fff, (resp - 1) & 0x7fff, CartBW);
|
||||||
SetReadHandler(presp & 0x7fff, (resp - 1) & 0x7fff, CartBR);
|
SetReadHandler(presp & 0x7fff, (resp - 1) & 0x7fff, CartBR);
|
||||||
@@ -489,7 +492,7 @@ static void MCopyFamiPower(void) {
|
|||||||
}
|
}
|
||||||
presp = resp;
|
presp = resp;
|
||||||
}
|
}
|
||||||
*/
|
#endif
|
||||||
SetWriteHandler(0x8000, 0xffff, MCopyFamiWrite);
|
SetWriteHandler(0x8000, 0xffff, MCopyFamiWrite);
|
||||||
SetReadHandler(0x8000, 0xffff, CartBR);
|
SetReadHandler(0x8000, 0xffff, CartBR);
|
||||||
|
|
||||||
@@ -528,17 +531,17 @@ void MapperCopyFami_Init(CartInfo *info) {
|
|||||||
info->Close = MCopyFamiClose;
|
info->Close = MCopyFamiClose;
|
||||||
GameStateRestore = StateRestore;
|
GameStateRestore = StateRestore;
|
||||||
|
|
||||||
size = 1024 * CHR_CACHE_SIZE; // ðàçìåð ñòðàíèöû 1êá
|
size = 1024 * CHR_CACHE_SIZE; /* ðàçìåð ñòðàíèöû 1êá */
|
||||||
chr_data.buf = (uint8*)FCEU_gmalloc(size);
|
chr_data.buf = (uint8*)FCEU_gmalloc(size);
|
||||||
SetupCartCHRMapping(1, chr_data.buf, size, 1); // ïðîâåðÿòü ïïó ðàì, èíà÷å èãðà ìîæåò ïîðòèòü äàííûå
|
SetupCartCHRMapping(1, chr_data.buf, size, 1); /* ïðîâåðÿòü ïïó ðàì, èíà÷å èãðà ìîæåò ïîðòèòü äàííûå */
|
||||||
AddExState(chr_data.buf, size, 0, "CCHR");
|
AddExState(chr_data.buf, size, 0, "CCHR");
|
||||||
|
|
||||||
size = 8192; // ðàçìåð ñòðàíèöû 8êá
|
size = 8192; /* ðàçìåð ñòðàíèöû 8êá */
|
||||||
WRAM = (uint8*)FCEU_gmalloc(size);
|
WRAM = (uint8*)FCEU_gmalloc(size);
|
||||||
SetupCartPRGMapping(1, WRAM, size, 1);
|
SetupCartPRGMapping(1, WRAM, size, 1);
|
||||||
AddExState(WRAM, size, 0, "CPRM");
|
AddExState(WRAM, size, 0, "CPRM");
|
||||||
|
|
||||||
size = 8192 * PRG_CACHE_SIZE; // ðàçìåð ñòðàíèöû 8êá
|
size = 8192 * PRG_CACHE_SIZE; /* ðàçìåð ñòðàíèöû 8êá */
|
||||||
prg_data.buf = (uint8*)FCEU_gmalloc(size);
|
prg_data.buf = (uint8*)FCEU_gmalloc(size);
|
||||||
SetupCartPRGMapping(2, prg_data.buf, size, 0);
|
SetupCartPRGMapping(2, prg_data.buf, size, 0);
|
||||||
AddExState(prg_data.buf, size, 0, "CPPR");
|
AddExState(prg_data.buf, size, 0, "CPPR");
|
||||||
|
|||||||
Reference in New Issue
Block a user