Files
ci-libretro-fceumm/src/boards/468_fme7.h
NewRisingSun 07284ca4af Add mapper 468
2022-12-30 23:56:50 +01:00

73 lines
1.7 KiB
C

#define FME7_reg regByte
#define FME7_index regByte[15]
#define FME7_counter regWord[0]
static void FME7_sync() {
int AND =mapperFlags &8? 0xFF: 0x7F;
switch(FME7_reg[8] &0xC0) {
case 0x00: case 0x80:
setprg8(0x6000, FME7_reg[0x8] &prgAND | prgOR &~prgAND);
break;
case 0x40:
/* Open Bus */
break;
case 0xC0:
setprg8r(0x10, 0x6000, 0);
break;
}
setprg8(0x8000, FME7_reg[0x9] &prgAND | prgOR &~prgAND);
setprg8(0xA000, FME7_reg[0xA] &prgAND | prgOR &~prgAND);
setprg8(0xC000, FME7_reg[0xB] &prgAND | prgOR &~prgAND);
setprg8(0xE000, prgAND | prgOR &~prgAND);
setchr1(0x0000, FME7_reg[0x0] &AND);
setchr1(0x0400, FME7_reg[0x1] &AND);
setchr1(0x0800, FME7_reg[0x2] &AND);
setchr1(0x0C00, FME7_reg[0x3] &AND);
setchr1(0x1000, FME7_reg[0x4] &AND);
setchr1(0x1400, FME7_reg[0x5] &AND);
setchr1(0x1800, FME7_reg[0x6] &AND);
setchr1(0x1C00, FME7_reg[0x7] &AND);
setmirror(FME7_reg[0xC] &3 ^(FME7_reg[0xC] &2? 0: 1));
}
static DECLFW(FME7_writeIndex) {
FME7_index =V &0xF;
}
static DECLFW(FME7_writeReg) {
switch(FME7_index) {
case 0xE:
FME7_counter =FME7_counter &0xFF00 |V;
break;
case 0xF:
FME7_counter =FME7_counter &0x00FF |V <<8;
break;
case 0xD:
X6502_IRQEnd(FCEU_IQEXT);
/* Falling through */
default:
FME7_reg[FME7_index] =V;
sync();
}
}
static void FP_FASTAPASS(1) FME7_cpuCycle(int a) {
while (a--) {
if (FME7_reg[0xD] &0x80 && !--FME7_counter && FME7_reg[0xD] &0x01) X6502_IRQBegin(FCEU_IQEXT);
}
}
void FME7_reset(uint8 clearRegs) {
sync =FME7_sync;
prgAND =mapperFlags &2? 0x0F: 0x1F;
MapIRQHook =FME7_cpuCycle;
SetWriteHandler(0x8000, 0x9FFF, FME7_writeIndex);
SetWriteHandler(0xA000, 0xBFFF, FME7_writeReg);
sync();
}
#undef FME7_reg
#undef FME7_index
#undef FME7_counter