68 lines
1.5 KiB
C
68 lines
1.5 KiB
C
#define MMC24_reg regByte
|
|
|
|
static void MMC2_sync() {
|
|
setprg8(0x8000, MMC24_reg[0] &prgAND | prgOR &~prgAND);
|
|
setprg8(0xA000, 0xFD &prgAND | prgOR &~prgAND);
|
|
setprg8(0xC000, 0xFE &prgAND | prgOR &~prgAND);
|
|
setprg8(0xE000, 0xFF &prgAND | prgOR &~prgAND);
|
|
setchr4(0x0000, MMC24_reg[1 +MMC24_reg[6]]);
|
|
setchr4(0x1000, MMC24_reg[3 +MMC24_reg[7]]);
|
|
setmirror(MMC24_reg[5] &1? MI_H: MI_V);
|
|
}
|
|
|
|
static void MMC4_sync() {
|
|
int AND =prgAND >>1;
|
|
int OR =prgOR >>1;
|
|
setprg16(0x8000, MMC24_reg[0] &AND | OR &~AND);
|
|
setprg16(0xC000, 0xFF &AND | OR &~AND);
|
|
setchr4(0x0000, MMC24_reg[1 +MMC24_reg[6]]);
|
|
setchr4(0x1000, MMC24_reg[3 +MMC24_reg[7]]);
|
|
setmirror(MMC24_reg[5] &1? MI_H: MI_V);
|
|
}
|
|
|
|
static DECLFW(MMC24_writeReg) {
|
|
MMC24_reg[(A >>12) -0xA] =V;
|
|
sync();
|
|
}
|
|
|
|
static void FP_FASTAPASS(1) MMC24_ppuHook(uint32 A) {
|
|
uint8 l, h = A >> 8;
|
|
if (h >= 0x20 || ((h & 0xF) != 0xF)) return;
|
|
l = A & 0xF0;
|
|
if (h < 0x10) {
|
|
if (l == 0xD0) {
|
|
MMC24_reg[6] =0;
|
|
sync();
|
|
} else if (l == 0xE0) {
|
|
MMC24_reg[6] =1;
|
|
sync();
|
|
}
|
|
} else {
|
|
if (l == 0xD0) {
|
|
MMC24_reg[7] =0;
|
|
sync();
|
|
} else if (l == 0xE0) {
|
|
MMC24_reg[7] =1;
|
|
sync();
|
|
}
|
|
}
|
|
}
|
|
|
|
void MMC2_reset(uint8 clearRegs) {
|
|
sync =MMC2_sync;
|
|
prgAND =0x0F;
|
|
PPU_hook =MMC24_ppuHook;
|
|
SetWriteHandler(0xA000, 0xFFFF, MMC24_writeReg);
|
|
sync();
|
|
}
|
|
|
|
void MMC4_reset(uint8 clearRegs) {
|
|
sync =MMC4_sync;
|
|
prgAND =mapperFlags &2? 0x0F: 0x1F;
|
|
PPU_hook =MMC24_ppuHook;
|
|
SetWriteHandler(0xA000, 0xFFFF, MMC24_writeReg);
|
|
sync();
|
|
}
|
|
|
|
#undef MMC24_reg
|