73 lines
1.7 KiB
C
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
|