X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=boards%2Fdatalatch.c;h=b3452fe1bf4549912253362eb368c474e7c935eb;hp=217adb41b39b52215b51c476a54845be895ac599;hb=e2d0dd92bfad989cce4270fc0ac5a712476c7c50;hpb=971a1d07d2f5b5a6f991ed5712275c04b933734f diff --git a/boards/datalatch.c b/boards/datalatch.c index 217adb4..b3452fe 100644 --- a/boards/datalatch.c +++ b/boards/datalatch.c @@ -20,188 +20,253 @@ #include "mapinc.h" -static uint8 latche; +static uint8 latche, latcheinit; +static uint16 addrreg0, addrreg1; +static void(*WSync)(void); -//------------------ CPROM --------------------------- - -static DECLFW(CPROMWrite) +static DECLFW(LatchWrite) { - latche=V&3; - setchr4(0x1000,latche); + latche=V; + WSync(); } -static void CPROMReset(void) +static void LatchPower(void) { - setprg32(0x8000,0); - setchr8(0); + latche=latcheinit; + WSync(); SetReadHandler(0x8000,0xFFFF,CartBR); - SetWriteHandler(0x8000,0xffff,CPROMWrite); + SetWriteHandler(addrreg0,addrreg1,LatchWrite); } -static void CPROMRestore(int version) +static void StateRestore(int version) { - setchr4(0x1000,latche); + WSync(); } -void CPROM_Init(CartInfo *info) +void Latch_Init(CartInfo *info, void (*proc)(void), uint8 init, uint16 adr0, uint16 adr1) { - info->Power=CPROMReset; - GameStateRestore=CPROMRestore; + latcheinit=init; + addrreg0=adr0; + addrreg1=adr1; + WSync=proc; + info->Power=LatchPower; + GameStateRestore=StateRestore; AddExState(&latche, 1, 0, "LATC"); } -//------------------ CNROM --------------------------- +//------------------ CPROM --------------------------- -DECLFW(CNROMWrite) +static void CPROMSync(void) { - latche=V&3; - setchr8(latche); + setchr4(0x0000,0); + setchr4(0x1000,latche&3); + setprg16(0x8000,0); + setprg16(0xC000,1); } -static void CNROMReset(void) +void CPROM_Init(CartInfo *info) { - setprg16(0x8000,0); - setprg16(0xC000,1); - SetReadHandler(0x8000,0xFFFF,CartBR); - SetWriteHandler(0x8000,0xffff,CNROMWrite); + Latch_Init(info, CPROMSync, 0, 0x8000, 0xFFFF); } -static void CNROMRestore(int version) +//------------------ CNROM --------------------------- + +static void CNROMSync(void) { - setchr8(latche); + setchr8(latche&3); + setprg16(0x8000,0); + setprg16(0xC000,1); } void CNROM_Init(CartInfo *info) { - info->Power=CNROMReset; - GameStateRestore=CNROMRestore; - AddExState(&latche, 1, 0, "LATC"); + Latch_Init(info, CNROMSync, 0, 0x8000, 0xFFFF); } -//------------------ NROM128 --------------------------- +//------------------ ANROM --------------------------- -static void NROM128Reset(void) +static void ANROMSync() { - setprg16(0x8000,0); - setprg16(0xC000,0); + setprg32(0x8000,latche&0xf); + setmirror(MI_0+((latche>>4)&1)); setchr8(0); - SetReadHandler(0x8000,0xFFFF,CartBR); } -void NROM128_Init(CartInfo *info) +void ANROM_Init(CartInfo *info) { - info->Power=NROM128Reset; + Latch_Init(info, ANROMSync, 0, 0x8000, 0xFFFF); } -//------------------ NROM256 --------------------------- +//------------------ Map 70 --------------------------- -static void NROM256Reset(void) +static void M70Sync() { - setprg16(0x8000,0); - setprg16(0xC000,1); - setchr8(0); - SetReadHandler(0x8000,0xFFFF,CartBR); + setprg16(0x8000,latche>>4); + setprg16(0xc000,~0); + setchr8(latche&0xf); } -void NROM256_Init(CartInfo *info) +void Mapper70_Init(CartInfo *info) { - info->Power=NROM256Reset; + Latch_Init(info, M70Sync, 0, 0x8000, 0xFFFF); } -//------------------ MHROM --------------------------- +//------------------ Map 152 --------------------------- -static DECLFW(MHROMWrite) +static void M152Sync() { - setprg32(0x8000,V>>4); - setchr8(V); - latche=V; + setprg16(0x8000,(latche>>4)&7); + setprg16(0xc000,~0); + setchr8(latche&0xf); + setmirror(MI_0+((latche>>7)&1)); /* Saint Seiya...hmm. */ } -static void MHROMReset(void) +void Mapper152_Init(CartInfo *info) { - setprg32(0x8000,0); - setchr8(0); - latche=0; - SetReadHandler(0x8000,0xFFFF,CartBR); + Latch_Init(info, M152Sync, 0, 0x8000, 0xFFFF); } -static void MHROMRestore(int version) +//------------------ Map 78 --------------------------- +/* Should be two separate emulation functions for this "mapper". Sigh. URGE TO KILL RISING. */ +static void M78Sync() { - setprg32(0x8000,latche); - setchr8(latche); - SetWriteHandler(0x8000,0xffff,MHROMWrite); + setprg16(0x8000,(latche&7)); + setprg16(0xc000,~0); + setchr8(latche>>4); + setmirror(MI_0+((latche>>3)&1)); +} + +void Mapper78_Init(CartInfo *info) +{ + Latch_Init(info, M78Sync, 0, 0x8000, 0xFFFF); +} + +//------------------ MHROM --------------------------- + +static void MHROMSync(void) +{ + setprg32(0x8000,latche>>4); + setchr8(latche&0xf); } void MHROM_Init(CartInfo *info) { - info->Power=MHROMReset; - AddExState(&latche, 1, 0,"LATC"); - PRGmask32[0]&=1; - CHRmask8[0]&=1; - GameStateRestore=MHROMRestore; + Latch_Init(info, MHROMSync, 0, 0x8000, 0xFFFF); +} + +void Mapper140_Init(CartInfo *info) +{ + Latch_Init(info, MHROMSync, 0, 0x6000, 0x7FFF); +} + +//------------------ Map 87 --------------------------- + +static void M87Sync(void) +{ + setprg16(0x8000,0); + setprg16(0xC000,1); + setchr8(latche>>1); +} + +void Mapper87_Init(CartInfo *info) +{ + Latch_Init(info, M87Sync, ~0, 0x6000, 0xFFFF); +} + +//------------------ Map 11 --------------------------- + +static void M11Sync(void) +{ + setprg32(0x8000,latche&0xf); + setchr8(latche>>4); +} + +void Mapper11_Init(CartInfo *info) +{ + Latch_Init(info, M11Sync, 0, 0x8000, 0xFFFF); +} + +void Mapper144_Init(CartInfo *info) +{ + Latch_Init(info, M11Sync, 0, 0x8001, 0xFFFF); } //------------------ UNROM --------------------------- -static void UNROMRestore(int version) +static void UNROMSync(void) { setprg16(0x8000,latche); + setprg16(0xc000,~0); + setchr8(0); } -static DECLFW(UNROMWrite) +void UNROM_Init(CartInfo *info) { - setprg16(0x8000,V); - latche=V; + Latch_Init(info, UNROMSync, 0, 0x8000, 0xFFFF); } -static void UNROMReset(void) +//------------------ Map 93 --------------------------- + +static void SSUNROMSync(void) { - setprg16(0x8000,0); + setprg16(0x8000,latche>>4); setprg16(0xc000,~0); setchr8(0); - SetWriteHandler(0x8000,0xffff,UNROMWrite); - SetReadHandler(0x8000,0xFFFF,CartBR); - latche=0; } -void UNROM_Init(CartInfo *info) +void SUNSOFT_UNROM_Init(CartInfo *info) { - info->Power=UNROMReset; - PRGmask16[0]&=7; - AddExState(&latche, 1, 0, "LATC"); - GameStateRestore=UNROMRestore; + Latch_Init(info, SSUNROMSync, 0, 0x8000, 0xFFFF); } -//------------------ GNROM --------------------------- +//------------------ Map 94 --------------------------- -static void GNROMSync() +static void M94Sync(void) { - setchr8(latche&3); - setprg32(0x8000,(latche>>4)&3); + setprg16(0x8000,latche>>2); + setprg16(0xc000,~0); + setchr8(0); } -static DECLFW(GNROMWrite) +void Mapper94_Init(CartInfo *info) { - latche=V&0x33; - GNROMSync(); + Latch_Init(info, M94Sync, 0, 0x8000, 0xFFFF); } -static void GNROMStateRestore(int version) +//------------------ Map 107 --------------------------- + +static void M107Sync(void) { - GNROMSync(); + setprg32(0x8000,(latche>>1)&3); + setchr8(latche&7); } -static void GNROMReset(void) +void Mapper107_Init(CartInfo *info) { - latche=0; - GNROMSync(); - SetWriteHandler(0x8000,0xffff,GNROMWrite); + Latch_Init(info, M107Sync, ~0, 0x8000, 0xFFFF); +} + +//------------------ NROM --------------------------- + +#ifdef DEBUG_MAPPER +static DECLFW(WriteHandler) +{ + FCEU_printf("$%04x:$%02x\n",A,V); +} +#endif + +static void NROMPower(void) +{ + setprg16(0x8000,0); + setprg16(0xC000,~0); + setchr8(0); SetReadHandler(0x8000,0xFFFF,CartBR); + #ifdef DEBUG_MAPPER + SetWriteHandler(0x4020,0xFFFF,WriteHandler); + #endif } -void GNROM_Init(CartInfo *info) +void NROM_Init(CartInfo *info) { - info->Power=GNROMReset; - AddExState(&latche, 1, 0, "LATC"); - GameStateRestore=GNROMStateRestore; + info->Power=NROMPower; }