datalatch.cpp restore line endings accidentally changed in r3142

This commit is contained in:
rainwarrior 2015-09-03 17:15:50 +00:00
parent 276d5ed556
commit 73f0db33e4
1 changed files with 498 additions and 498 deletions

View File

@ -1,501 +1,501 @@
/* FCE Ultra - NES/Famicom Emulator /* FCE Ultra - NES/Famicom Emulator
* *
* Copyright notice for this file: * Copyright notice for this file:
* Copyright (C) 2002 Xodnizel * Copyright (C) 2002 Xodnizel
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "mapinc.h" #include "mapinc.h"
#include "../ines.h" #include "../ines.h"
static uint8 latche, latcheinit, bus_conflict; static uint8 latche, latcheinit, bus_conflict;
static uint16 addrreg0, addrreg1; static uint16 addrreg0, addrreg1;
static uint8 *WRAM = NULL; static uint8 *WRAM = NULL;
static uint32 WRAMSIZE; static uint32 WRAMSIZE;
static void (*WSync)(void); static void (*WSync)(void);
static DECLFW(LatchWrite) { static DECLFW(LatchWrite) {
// FCEU_printf("bs %04x %02x\n",A,V); // FCEU_printf("bs %04x %02x\n",A,V);
if (bus_conflict) if (bus_conflict)
latche = V & CartBR(A); latche = V & CartBR(A);
else else
latche = V; latche = V;
WSync(); WSync();
} }
static void LatchPower(void) { static void LatchPower(void) {
latche = latcheinit; latche = latcheinit;
WSync(); WSync();
if (WRAM) { if (WRAM) {
SetReadHandler(0x6000, 0xFFFF, CartBR); SetReadHandler(0x6000, 0xFFFF, CartBR);
SetWriteHandler(0x6000, 0x7FFF, CartBW); SetWriteHandler(0x6000, 0x7FFF, CartBW);
FCEU_CheatAddRAM(WRAMSIZE >> 10, 0x6000, WRAM); FCEU_CheatAddRAM(WRAMSIZE >> 10, 0x6000, WRAM);
} else { } else {
SetReadHandler(0x8000, 0xFFFF, CartBR); SetReadHandler(0x8000, 0xFFFF, CartBR);
} }
SetWriteHandler(addrreg0, addrreg1, LatchWrite); SetWriteHandler(addrreg0, addrreg1, LatchWrite);
} }
static void LatchClose(void) { static void LatchClose(void) {
if (WRAM) if (WRAM)
FCEU_gfree(WRAM); FCEU_gfree(WRAM);
WRAM = NULL; WRAM = NULL;
} }
static void StateRestore(int version) { static void StateRestore(int version) {
WSync(); WSync();
} }
static void Latch_Init(CartInfo *info, void (*proc)(void), uint8 init, uint16 adr0, uint16 adr1, uint8 wram, uint8 busc) { static void Latch_Init(CartInfo *info, void (*proc)(void), uint8 init, uint16 adr0, uint16 adr1, uint8 wram, uint8 busc) {
bus_conflict = busc; bus_conflict = busc;
latcheinit = init; latcheinit = init;
addrreg0 = adr0; addrreg0 = adr0;
addrreg1 = adr1; addrreg1 = adr1;
WSync = proc; WSync = proc;
info->Power = LatchPower; info->Power = LatchPower;
info->Close = LatchClose; info->Close = LatchClose;
GameStateRestore = StateRestore; GameStateRestore = StateRestore;
if (wram) { if (wram) {
WRAMSIZE = 8192; WRAMSIZE = 8192;
WRAM = (uint8*)FCEU_gmalloc(WRAMSIZE); WRAM = (uint8*)FCEU_gmalloc(WRAMSIZE);
SetupCartPRGMapping(0x10, WRAM, WRAMSIZE, 1); SetupCartPRGMapping(0x10, WRAM, WRAMSIZE, 1);
if (info->battery) { if (info->battery) {
info->SaveGame[0] = WRAM; info->SaveGame[0] = WRAM;
info->SaveGameLen[0] = WRAMSIZE; info->SaveGameLen[0] = WRAMSIZE;
} }
AddExState(WRAM, WRAMSIZE, 0, "WRAM"); AddExState(WRAM, WRAMSIZE, 0, "WRAM");
} }
AddExState(&latche, 1, 0, "LATC"); AddExState(&latche, 1, 0, "LATC");
AddExState(&bus_conflict, 1, 0, "BUSC"); AddExState(&bus_conflict, 1, 0, "BUSC");
} }
//------------------ Map 0 --------------------------- //------------------ Map 0 ---------------------------
#ifdef DEBUG_MAPPER #ifdef DEBUG_MAPPER
static DECLFW(NROMWrite) { static DECLFW(NROMWrite) {
FCEU_printf("bs %04x %02x\n", A, V); FCEU_printf("bs %04x %02x\n", A, V);
CartBW(A, V); CartBW(A, V);
} }
#endif #endif
static void NROMPower(void) { static void NROMPower(void) {
setprg8r(0x10, 0x6000, 0); // Famili BASIC (v3.0) need it (uses only 4KB), FP-BASIC uses 8KB setprg8r(0x10, 0x6000, 0); // Famili BASIC (v3.0) need it (uses only 4KB), FP-BASIC uses 8KB
setprg16(0x8000, 0); setprg16(0x8000, 0);
setprg16(0xC000, ~0); setprg16(0xC000, ~0);
setchr8(0); setchr8(0);
SetReadHandler(0x6000, 0x7FFF, CartBR); SetReadHandler(0x6000, 0x7FFF, CartBR);
SetWriteHandler(0x6000, 0x7FFF, CartBW); SetWriteHandler(0x6000, 0x7FFF, CartBW);
SetReadHandler(0x8000, 0xFFFF, CartBR); SetReadHandler(0x8000, 0xFFFF, CartBR);
FCEU_CheatAddRAM(WRAMSIZE >> 10, 0x6000, WRAM); FCEU_CheatAddRAM(WRAMSIZE >> 10, 0x6000, WRAM);
#ifdef DEBUG_MAPPER #ifdef DEBUG_MAPPER
SetWriteHandler(0x4020, 0xFFFF, NROMWrite); SetWriteHandler(0x4020, 0xFFFF, NROMWrite);
#endif #endif
} }
void NROM_Init(CartInfo *info) { void NROM_Init(CartInfo *info) {
info->Power = NROMPower; info->Power = NROMPower;
info->Close = LatchClose; info->Close = LatchClose;
WRAMSIZE = 8192; WRAMSIZE = 8192;
WRAM = (uint8*)FCEU_gmalloc(WRAMSIZE); WRAM = (uint8*)FCEU_gmalloc(WRAMSIZE);
SetupCartPRGMapping(0x10, WRAM, WRAMSIZE, 1); SetupCartPRGMapping(0x10, WRAM, WRAMSIZE, 1);
if (info->battery) { if (info->battery) {
info->SaveGame[0] = WRAM; info->SaveGame[0] = WRAM;
info->SaveGameLen[0] = WRAMSIZE; info->SaveGameLen[0] = WRAMSIZE;
} }
AddExState(WRAM, WRAMSIZE, 0, "WRAM"); AddExState(WRAM, WRAMSIZE, 0, "WRAM");
} }
//------------------ Map 2 --------------------------- //------------------ Map 2 ---------------------------
static void UNROMSync(void) { static void UNROMSync(void) {
// static uint32 mirror_in_use = 0; // static uint32 mirror_in_use = 0;
// if (PRGsize[0] <= 128 * 1024) { // if (PRGsize[0] <= 128 * 1024) {
// setprg16(0x8000, latche & 0x7); // setprg16(0x8000, latche & 0x7);
// if (latche & 8) mirror_in_use = 1; // if (latche & 8) mirror_in_use = 1;
// if (mirror_in_use) // if (mirror_in_use)
// setmirror(((latche >> 3) & 1) ^ 1); // Higway Star Hacked mapper, disabled till new mapper defined // setmirror(((latche >> 3) & 1) ^ 1); // Higway Star Hacked mapper, disabled till new mapper defined
// } else // } else
setprg16(0x8000, latche); setprg16(0x8000, latche);
setprg16(0xc000, ~0); setprg16(0xc000, ~0);
setchr8(0); setchr8(0);
} }
void UNROM_Init(CartInfo *info) { void UNROM_Init(CartInfo *info) {
Latch_Init(info, UNROMSync, 0, 0x8000, 0xFFFF, 0, 1); Latch_Init(info, UNROMSync, 0, 0x8000, 0xFFFF, 0, 1);
} }
//------------------ Map 3 --------------------------- //------------------ Map 3 ---------------------------
static void CNROMSync(void) { static void CNROMSync(void) {
setchr8(latche); setchr8(latche);
setprg32(0x8000, 0); setprg32(0x8000, 0);
setprg8r(0x10, 0x6000, 0); // Hayauchy IGO uses 2Kb or RAM setprg8r(0x10, 0x6000, 0); // Hayauchy IGO uses 2Kb or RAM
} }
void CNROM_Init(CartInfo *info) { void CNROM_Init(CartInfo *info) {
Latch_Init(info, CNROMSync, 0, 0x8000, 0xFFFF, 1, 1); Latch_Init(info, CNROMSync, 0, 0x8000, 0xFFFF, 1, 1);
} }
//------------------ Map 7 --------------------------- //------------------ Map 7 ---------------------------
static void ANROMSync() { static void ANROMSync() {
setprg32(0x8000, latche & 0xF); setprg32(0x8000, latche & 0xF);
setmirror(MI_0 + ((latche >> 4) & 1)); setmirror(MI_0 + ((latche >> 4) & 1));
setchr8(0); setchr8(0);
} }
void ANROM_Init(CartInfo *info) { void ANROM_Init(CartInfo *info) {
Latch_Init(info, ANROMSync, 0, 0x4020, 0xFFFF, 0, 0); Latch_Init(info, ANROMSync, 0, 0x4020, 0xFFFF, 0, 0);
} }
//------------------ Map 8 --------------------------- //------------------ Map 8 ---------------------------
static void M8Sync() { static void M8Sync() {
setprg16(0x8000, latche >> 3); setprg16(0x8000, latche >> 3);
setprg16(0xc000, 1); setprg16(0xc000, 1);
setchr8(latche & 3); setchr8(latche & 3);
} }
void Mapper8_Init(CartInfo *info) { void Mapper8_Init(CartInfo *info) {
Latch_Init(info, M8Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M8Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 11 --------------------------- //------------------ Map 11 ---------------------------
static void M11Sync(void) { static void M11Sync(void) {
setprg32(0x8000, latche & 0xF); setprg32(0x8000, latche & 0xF);
setchr8(latche >> 4); setchr8(latche >> 4);
} }
void Mapper11_Init(CartInfo *info) { void Mapper11_Init(CartInfo *info) {
Latch_Init(info, M11Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M11Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }
void Mapper144_Init(CartInfo *info) { void Mapper144_Init(CartInfo *info) {
Latch_Init(info, M11Sync, 0, 0x8001, 0xFFFF, 0, 0); Latch_Init(info, M11Sync, 0, 0x8001, 0xFFFF, 0, 0);
} }
//------------------ Map 13 --------------------------- //------------------ Map 13 ---------------------------
static void CPROMSync(void) { static void CPROMSync(void) {
setchr4(0x0000, 0); setchr4(0x0000, 0);
setchr4(0x1000, latche & 3); setchr4(0x1000, latche & 3);
setprg32(0x8000, 0); setprg32(0x8000, 0);
} }
void CPROM_Init(CartInfo *info) { void CPROM_Init(CartInfo *info) {
Latch_Init(info, CPROMSync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, CPROMSync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 29 --------------------------- //Used by Glider, http://www.retrousb.com/product_info.php?cPath=30&products_id=58 //------------------ Map 29 --------------------------- //Used by Glider, http://www.retrousb.com/product_info.php?cPath=30&products_id=58
static void M29Sync() { static void M29Sync() {
setprg16(0x8000, (latche & 0x1C) >> 2); setprg16(0x8000, (latche & 0x1C) >> 2);
setprg16(0xc000, ~0); setprg16(0xc000, ~0);
setchr8r(0, latche & 3); setchr8r(0, latche & 3);
setprg8r(0x10, 0x6000, 0); setprg8r(0x10, 0x6000, 0);
} }
void Mapper29_Init(CartInfo *info) { void Mapper29_Init(CartInfo *info) {
Latch_Init(info, M29Sync, 0, 0x8000, 0xFFFF, 1, 0); Latch_Init(info, M29Sync, 0, 0x8000, 0xFFFF, 1, 0);
} }
//------------------ Map 38 --------------------------- //------------------ Map 38 ---------------------------
static void M38Sync(void) { static void M38Sync(void) {
setprg32(0x8000, latche & 3); setprg32(0x8000, latche & 3);
setchr8(latche >> 2); setchr8(latche >> 2);
} }
void Mapper38_Init(CartInfo *info) { void Mapper38_Init(CartInfo *info) {
Latch_Init(info, M38Sync, 0, 0x7000, 0x7FFF, 0, 0); Latch_Init(info, M38Sync, 0, 0x7000, 0x7FFF, 0, 0);
} }
//------------------ Map 66 --------------------------- //------------------ Map 66 ---------------------------
static void MHROMSync(void) { static void MHROMSync(void) {
setprg32(0x8000, latche >> 4); setprg32(0x8000, latche >> 4);
setchr8(latche & 0xF); setchr8(latche & 0xF);
} }
void MHROM_Init(CartInfo *info) { void MHROM_Init(CartInfo *info) {
Latch_Init(info, MHROMSync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, MHROMSync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 70 --------------------------- //------------------ Map 70 ---------------------------
static void M70Sync() { static void M70Sync() {
setprg16(0x8000, latche >> 4); setprg16(0x8000, latche >> 4);
setprg16(0xc000, ~0); setprg16(0xc000, ~0);
setchr8(latche & 0xf); setchr8(latche & 0xf);
} }
void Mapper70_Init(CartInfo *info) { void Mapper70_Init(CartInfo *info) {
Latch_Init(info, M70Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M70Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 78 --------------------------- //------------------ Map 78 ---------------------------
/* Should be two separate emulation functions for this "mapper". Sigh. URGE TO KILL RISING. */ /* Should be two separate emulation functions for this "mapper". Sigh. URGE TO KILL RISING. */
static void M78Sync() { static void M78Sync() {
setprg16(0x8000, (latche & 7)); setprg16(0x8000, (latche & 7));
setprg16(0xc000, ~0); setprg16(0xc000, ~0);
setchr8(latche >> 4); setchr8(latche >> 4);
setmirror(MI_0 + ((latche >> 3) & 1)); setmirror(MI_0 + ((latche >> 3) & 1));
} }
void Mapper78_Init(CartInfo *info) { void Mapper78_Init(CartInfo *info) {
Latch_Init(info, M78Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M78Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 86 --------------------------- //------------------ Map 86 ---------------------------
static void M86Sync(void) { static void M86Sync(void) {
setprg32(0x8000, (latche >> 4) & 3); setprg32(0x8000, (latche >> 4) & 3);
setchr8((latche & 3) | ((latche >> 4) & 4)); setchr8((latche & 3) | ((latche >> 4) & 4));
} }
void Mapper86_Init(CartInfo *info) { void Mapper86_Init(CartInfo *info) {
Latch_Init(info, M86Sync, ~0, 0x6000, 0x6FFF, 0, 0); Latch_Init(info, M86Sync, ~0, 0x6000, 0x6FFF, 0, 0);
} }
//------------------ Map 87 --------------------------- //------------------ Map 87 ---------------------------
static void M87Sync(void) { static void M87Sync(void) {
setprg32(0x8000, 0); setprg32(0x8000, 0);
setchr8(((latche >> 1) & 1) | ((latche << 1) & 2)); setchr8(((latche >> 1) & 1) | ((latche << 1) & 2));
} }
void Mapper87_Init(CartInfo *info) { void Mapper87_Init(CartInfo *info) {
Latch_Init(info, M87Sync, ~0, 0x6000, 0xFFFF, 0, 0); Latch_Init(info, M87Sync, ~0, 0x6000, 0xFFFF, 0, 0);
} }
//------------------ Map 89 --------------------------- //------------------ Map 89 ---------------------------
static void M89Sync(void) { static void M89Sync(void) {
setprg16(0x8000, (latche >> 4) & 7); setprg16(0x8000, (latche >> 4) & 7);
setprg16(0xc000, ~0); setprg16(0xc000, ~0);
setchr8((latche & 7) | ((latche >> 4) & 8)); setchr8((latche & 7) | ((latche >> 4) & 8));
setmirror(MI_0 + ((latche >> 3) & 1)); setmirror(MI_0 + ((latche >> 3) & 1));
} }
void Mapper89_Init(CartInfo *info) { void Mapper89_Init(CartInfo *info) {
Latch_Init(info, M89Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M89Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 93 --------------------------- //------------------ Map 93 ---------------------------
static void SSUNROMSync(void) { static void SSUNROMSync(void) {
setprg16(0x8000, latche >> 4); setprg16(0x8000, latche >> 4);
setprg16(0xc000, ~0); setprg16(0xc000, ~0);
setchr8(0); setchr8(0);
} }
void SUNSOFT_UNROM_Init(CartInfo *info) { void SUNSOFT_UNROM_Init(CartInfo *info) {
Latch_Init(info, SSUNROMSync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, SSUNROMSync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 94 --------------------------- //------------------ Map 94 ---------------------------
static void M94Sync(void) { static void M94Sync(void) {
setprg16(0x8000, latche >> 2); setprg16(0x8000, latche >> 2);
setprg16(0xc000, ~0); setprg16(0xc000, ~0);
setchr8(0); setchr8(0);
} }
void Mapper94_Init(CartInfo *info) { void Mapper94_Init(CartInfo *info) {
Latch_Init(info, M94Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M94Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 97 --------------------------- //------------------ Map 97 ---------------------------
static void M97Sync(void) { static void M97Sync(void) {
setchr8(0); setchr8(0);
setprg16(0x8000, ~0); setprg16(0x8000, ~0);
setprg16(0xc000, latche & 15); setprg16(0xc000, latche & 15);
switch (latche >> 6) { switch (latche >> 6) {
case 0: break; case 0: break;
case 1: setmirror(MI_H); break; case 1: setmirror(MI_H); break;
case 2: setmirror(MI_V); break; case 2: setmirror(MI_V); break;
case 3: break; case 3: break;
} }
setchr8(((latche >> 1) & 1) | ((latche << 1) & 2)); setchr8(((latche >> 1) & 1) | ((latche << 1) & 2));
} }
void Mapper97_Init(CartInfo *info) { void Mapper97_Init(CartInfo *info) {
Latch_Init(info, M97Sync, ~0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M97Sync, ~0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 101 --------------------------- //------------------ Map 101 ---------------------------
static void M101Sync(void) { static void M101Sync(void) {
setprg32(0x8000, 0); setprg32(0x8000, 0);
setchr8(latche); setchr8(latche);
} }
void Mapper101_Init(CartInfo *info) { void Mapper101_Init(CartInfo *info) {
Latch_Init(info, M101Sync, ~0, 0x6000, 0x7FFF, 0, 0); Latch_Init(info, M101Sync, ~0, 0x6000, 0x7FFF, 0, 0);
} }
//------------------ Map 107 --------------------------- //------------------ Map 107 ---------------------------
static void M107Sync(void) { static void M107Sync(void) {
setprg32(0x8000, (latche >> 1) & 3); setprg32(0x8000, (latche >> 1) & 3);
setchr8(latche & 7); setchr8(latche & 7);
} }
void Mapper107_Init(CartInfo *info) { void Mapper107_Init(CartInfo *info) {
Latch_Init(info, M107Sync, ~0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M107Sync, ~0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 113 --------------------------- //------------------ Map 113 ---------------------------
static void M113Sync(void) { static void M113Sync(void) {
setprg32(0x8000, (latche >> 3) & 7); setprg32(0x8000, (latche >> 3) & 7);
setchr8(((latche >> 3) & 8) | (latche & 7)); setchr8(((latche >> 3) & 8) | (latche & 7));
// setmirror(latche>>7); // only for HES 6in1 // setmirror(latche>>7); // only for HES 6in1
} }
void Mapper113_Init(CartInfo *info) { void Mapper113_Init(CartInfo *info) {
Latch_Init(info, M113Sync, 0, 0x4100, 0x7FFF, 0, 0); Latch_Init(info, M113Sync, 0, 0x4100, 0x7FFF, 0, 0);
} }
//------------------ Map 140 --------------------------- //------------------ Map 140 ---------------------------
void Mapper140_Init(CartInfo *info) { void Mapper140_Init(CartInfo *info) {
Latch_Init(info, MHROMSync, 0, 0x6000, 0x7FFF, 0, 0); Latch_Init(info, MHROMSync, 0, 0x6000, 0x7FFF, 0, 0);
} }
//------------------ Map 152 --------------------------- //------------------ Map 152 ---------------------------
static void M152Sync() { static void M152Sync() {
setprg16(0x8000, (latche >> 4) & 7); setprg16(0x8000, (latche >> 4) & 7);
setprg16(0xc000, ~0); setprg16(0xc000, ~0);
setchr8(latche & 0xf); setchr8(latche & 0xf);
setmirror(MI_0 + ((latche >> 7) & 1)); /* Saint Seiya...hmm. */ setmirror(MI_0 + ((latche >> 7) & 1)); /* Saint Seiya...hmm. */
} }
void Mapper152_Init(CartInfo *info) { void Mapper152_Init(CartInfo *info) {
Latch_Init(info, M152Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M152Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 180 --------------------------- //------------------ Map 180 ---------------------------
static void M180Sync(void) { static void M180Sync(void) {
setprg16(0x8000, 0); setprg16(0x8000, 0);
setprg16(0xc000, latche); setprg16(0xc000, latche);
setchr8(0); setchr8(0);
} }
void Mapper180_Init(CartInfo *info) { void Mapper180_Init(CartInfo *info) {
Latch_Init(info, M180Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M180Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 184 --------------------------- //------------------ Map 184 ---------------------------
static void M184Sync(void) { static void M184Sync(void) {
setchr4(0x0000, latche); setchr4(0x0000, latche);
setchr4(0x1000, latche >> 4); setchr4(0x1000, latche >> 4);
setprg32(0x8000, 0); setprg32(0x8000, 0);
} }
void Mapper184_Init(CartInfo *info) { void Mapper184_Init(CartInfo *info) {
Latch_Init(info, M184Sync, 0, 0x6000, 0x7FFF, 0, 0); Latch_Init(info, M184Sync, 0, 0x6000, 0x7FFF, 0, 0);
} }
//------------------ Map 203 --------------------------- //------------------ Map 203 ---------------------------
static void M203Sync(void) { static void M203Sync(void) {
setprg16(0x8000, (latche >> 2) & 3); setprg16(0x8000, (latche >> 2) & 3);
setprg16(0xC000, (latche >> 2) & 3); setprg16(0xC000, (latche >> 2) & 3);
setchr8(latche & 3); setchr8(latche & 3);
} }
void Mapper203_Init(CartInfo *info) { void Mapper203_Init(CartInfo *info) {
Latch_Init(info, M203Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, M203Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ Map 240 --------------------------- //------------------ Map 240 ---------------------------
static void M240Sync(void) { static void M240Sync(void) {
setprg8r(0x10, 0x6000, 0); setprg8r(0x10, 0x6000, 0);
setprg32(0x8000, latche >> 4); setprg32(0x8000, latche >> 4);
setchr8(latche & 0xF); setchr8(latche & 0xF);
} }
void Mapper240_Init(CartInfo *info) { void Mapper240_Init(CartInfo *info) {
Latch_Init(info, M240Sync, 0, 0x4020, 0x5FFF, 1, 0); Latch_Init(info, M240Sync, 0, 0x4020, 0x5FFF, 1, 0);
} }
//------------------ Map 241 --------------------------- //------------------ Map 241 ---------------------------
// Mapper 7 mostly, but with SRAM or maybe prot circuit // Mapper 7 mostly, but with SRAM or maybe prot circuit
// figure out, which games do need 5xxx area reading // figure out, which games do need 5xxx area reading
static void M241Sync(void) { static void M241Sync(void) {
setchr8(0); setchr8(0);
setprg8r(0x10, 0x6000, 0); setprg8r(0x10, 0x6000, 0);
if (latche & 0x80) if (latche & 0x80)
setprg32(0x8000, latche | 8); // no 241 actually, but why not afterall? setprg32(0x8000, latche | 8); // no 241 actually, but why not afterall?
else else
setprg32(0x8000, latche); setprg32(0x8000, latche);
} }
void Mapper241_Init(CartInfo *info) { void Mapper241_Init(CartInfo *info) {
Latch_Init(info, M241Sync, 0, 0x8000, 0xFFFF, 1, 0); Latch_Init(info, M241Sync, 0, 0x8000, 0xFFFF, 1, 0);
} }
//------------------ A65AS --------------------------- //------------------ A65AS ---------------------------
// actually, there is two cart in one... First have extra mirroring // actually, there is two cart in one... First have extra mirroring
// mode (one screen) and 32K bankswitching, second one have only // mode (one screen) and 32K bankswitching, second one have only
// 16 bankswitching mode and normal mirroring... But there is no any // 16 bankswitching mode and normal mirroring... But there is no any
// correlations between modes and they can be used in one mapper code. // correlations between modes and they can be used in one mapper code.
static void BMCA65ASSync(void) { static void BMCA65ASSync(void) {
if (latche & 0x40) if (latche & 0x40)
setprg32(0x8000, (latche >> 1) & 0x0F); setprg32(0x8000, (latche >> 1) & 0x0F);
else { else {
setprg16(0x8000, ((latche & 0x30) >> 1) | (latche & 7)); setprg16(0x8000, ((latche & 0x30) >> 1) | (latche & 7));
setprg16(0xC000, ((latche & 0x30) >> 1) | 7); setprg16(0xC000, ((latche & 0x30) >> 1) | 7);
} }
setchr8(0); setchr8(0);
if (latche & 0x80) if (latche & 0x80)
setmirror(MI_0 + (((latche >> 5) & 1))); setmirror(MI_0 + (((latche >> 5) & 1)));
else else
setmirror(((latche >> 3) & 1) ^ 1); setmirror(((latche >> 3) & 1) ^ 1);
} }
void BMCA65AS_Init(CartInfo *info) { void BMCA65AS_Init(CartInfo *info) {
Latch_Init(info, BMCA65ASSync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, BMCA65ASSync, 0, 0x8000, 0xFFFF, 0, 0);
} }
//------------------ BMC-11160 --------------------------- //------------------ BMC-11160 ---------------------------
// Simple BMC discrete mapper by TXC // Simple BMC discrete mapper by TXC
static void BMC11160Sync(void) { static void BMC11160Sync(void) {
uint32 bank = (latche >> 4) & 7; uint32 bank = (latche >> 4) & 7;
setprg32(0x8000, bank); setprg32(0x8000, bank);
setchr8((bank << 2) | (latche & 3)); setchr8((bank << 2) | (latche & 3));
setmirror((latche >> 7) & 1); setmirror((latche >> 7) & 1);
} }
void BMC11160_Init(CartInfo *info) { void BMC11160_Init(CartInfo *info) {
Latch_Init(info, BMC11160Sync, 0, 0x8000, 0xFFFF, 0, 0); Latch_Init(info, BMC11160Sync, 0, 0x8000, 0xFFFF, 0, 0);
} }