static int StateAction(StateMem *sm, int load, int data_only) { SFORMAT StateRegs[] = { SFVARN(reg_select, "FM7S"), SFVARN(wram_control, "FM7W"), SFARRAYN(sr, 0x10, "FM7SR"), SFVARN(sr_index, "FM7I"), SFARRAY(PRGRegs, 3), SFARRAY(CHRRegs, 8), SFVAR(Mirroring), SFARRAY32(vcount, 3), SFARRAY32(dcount, 3), SFVAR(IRQa), SFVAR(IRQCount), SFARRAY(WRAM, 8192), SFEND }; int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); if(load) { SyncCHR(); SyncPRG(); SyncMirroring(); } return(ret); }
void CCart::StateAction(StateMem *sm, const unsigned load, const bool data_only) { SFORMAT CartRegs[] = { SFVAR(mCounter), SFVAR(mShifter), SFVAR(mAddrData), SFVAR(mStrobe), SFVAR(mShiftCount0), SFVAR(mCountMask0), SFVAR(mShiftCount1), SFVAR(mCountMask1), SFVAR(mBank), SFVAR(mWriteEnableBank0), SFVAR(mWriteEnableBank1), SFVAR(last_strobe), SFARRAYN(mCartBank1.get(), mCartRAM ? mMaskBank1 + 1 : 0, "mCartBank1"), SFEND }; MDFNSS_StateAction(sm, load, data_only, CartRegs, "CART"); if(load) { } }
static int MMC4_StateAction(StateMem *sm, int load, int data_only) { SFORMAT StateRegs[] = { SFARRAYN(CHRBanks, 4, "CHRBanks"), SFVARN(PRGBank, "PRGBank"), SFARRAYN(latches, 2, "latches"), SFARRAYN(MMC4_WRAM, 8192, "WRAM"), SFEND }; int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MMC2"); if(load) { CHRSync(); setmirror(Mirroring ^ 1); setprg16(0x8000, PRGBank); } return(ret); }
static int StateAction(StateMem *sm, int load, int data_only) { SFORMAT StateRegs[] = { SFARRAYN(CHRRAM, 8192, "CHRR"), SFARRAYN(DRegBuf, 8, "DREG"), SFVARN(IRQCount, "IRQC"), SFVARN(IRQLatch, "IQL1"), SFVARN(IRQa, "IRQA"), SFVARN(sizer, "SIZA"), SFVARN(bigbank, "BIG1"), SFVARN(bigbank2, "BIG2"), SFEND }; int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); if(load) { FixMMC3PRG(MMC3_cmd); FixMMC3CHR(MMC3_cmd); setmirror((mbia & 1) ^ 1); } return(ret); }
static int StateAction(StateMem *sm, int load, int data_only) { SFORMAT StateRegs[] = { SFVAR(SoftResetCount), SFVAR(sms.cycle_counter), SFARRAYN(sms.wram, 0x2000, "RAM"), SFVAR(sms.paused), SFVAR(input.pad[0]), SFVAR(input.pad[1]), SFVAR(input.analog[0]), SFVAR(input.analog[1]), SFVAR(input.system), SFVAR(sms.fm_detect), SFVAR(sms.memctrl), //SFVAR(z80_runtime), //SFARRAY(CPUExRAM, 16384), //SFVAR(FlashStatusEnable), SFEND }; int ret = 1; ret &= MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); ret &= z80_state_action(sm, load, data_only, "Z80"); ret &= SMS_CartStateAction(sm, load, data_only); ret &= SMS_PIOStateAction(sm, load, data_only); ret &= SMS_SoundStateAction(sm, load, data_only); ret &= SMS_VDPStateAction(sm, load, data_only); if(load) { if(sms.cycle_counter > 1000) { sms.cycle_counter = 1000; puts("sms.cycle_counter sanity failed"); } } return(ret); }
static int StateAction(StateMem *sm, int load, int data_only) { SFORMAT StateRegs[]={ SFARRAYN(DRegs, 8, "DREG"), SFVARN(cmd, "CMD"), SFVARN(lastA, "LAST"), SFVAR(lastmc), SFEND }; int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); if(load) DBSync(); return(ret); }
int CCart::StateAction(StateMem *sm, int load, int data_only) { SFORMAT CartRegs[] = { SFVAR(mCounter), SFVAR(mShifter), SFVAR(mAddrData), SFVAR(mStrobe), SFVAR(mShiftCount0), SFVAR(mCountMask0), SFVAR(mShiftCount1), SFVAR(mCountMask1), SFVAR(mBank), SFVAR(mWriteEnableBank0), SFVAR(mWriteEnableBank1), SFVAR(last_strobe), SFARRAYN(mCartBank1, mCartRAM ? mMaskBank1 + 1 : 0, "mCartBank1"), SFEND }; int ret = MDFNSS_StateAction(sm, load, data_only, CartRegs, "CART"); return(ret); }
int GBA_Flash_StateAction(StateMem *sm, int load, int data_only) { SFORMAT flashSaveData[] = { SFVAR(flashState), SFVAR(flashReadState), SFVAR(flashSize), SFVAR(flashBank), SFARRAYN(flashSaveMemory, 0x20000, "flashSaveMemory"), SFEND }; int ret = MDFNSS_StateAction(sm, load, data_only, flashSaveData, "FLSH", false); if(load) { flashBank &= 1; if(flashSize > 0x20000) flashSize = 0x20000; } return(ret); };
uint8 eepromData[0x2000]; static uint8 eepromBuffer[16]; bool eepromInUse = false; int eepromSize = 512; #include "../state.h" SFORMAT eepromSaveData[] = { SFVAR(eepromMode), SFVAR(eepromByte), SFVAR(eepromBits), SFVAR(eepromAddress), SFVAR(eepromInUse), SFVAR(eepromSize), SFARRAYN(eepromData, 0x2000, "eepromData"), SFARRAYN(eepromBuffer, 16, "eepromBuffer"), SFEND }; bool GBA_EEPROM_SaveFile(const char *filename) { if(eepromInUse) { if(!MDFN_DumpToFile(filename, 0, eepromData, eepromSize)) return(0); } return(1); }
namespace MDFN_IEN_GBA { extern int cpuDmaCount; int eepromMode = EEPROM_IDLE; int eepromByte = 0; int eepromBits = 0; int eepromAddress = 0; uint8 eepromData[0x2000]; static uint8 eepromBuffer[16]; bool eepromInUse = false; int eepromSize = 512; #include "../state.h" SFORMAT eepromSaveData[] = { SFVAR(eepromMode), SFVAR(eepromByte), SFVAR(eepromBits), SFVAR(eepromAddress), SFVAR(eepromInUse), SFVAR(eepromSize), SFARRAYN(eepromData, 0x2000, "eepromData"), SFARRAYN(eepromBuffer, 16, "eepromBuffer"), SFEND }; bool GBA_EEPROM_SaveFile(const char *filename) { if(eepromInUse) { if(!MDFN_DumpToFile(filename, 0, eepromData, eepromSize)) return(0); } return(1); } bool GBA_EEPROM_LoadFile(const char *filename) { FILE *fp = fopen(filename, "rb"); if(fp) { long size; fseek(fp, 0, SEEK_END); size = ftell(fp); fseek(fp, 0, SEEK_SET); if(size == 512 || size == 0x2000) { if((long)fread(eepromData, 1, size, fp) == size) { eepromInUse = TRUE; eepromSize = size; fclose(fp); return(1); } } fclose(fp); } return(0); } void eepromInit(void) { memset(eepromData, 0xFF, sizeof(eepromData)); } void eepromReset(void) { eepromMode = EEPROM_IDLE; eepromByte = 0; eepromBits = 0; eepromAddress = 0; eepromInUse = false; eepromSize = 512; } int eepromRead(uint32 /* address */) { switch(eepromMode) { case EEPROM_IDLE: case EEPROM_READADDRESS: case EEPROM_WRITEDATA: return 1; case EEPROM_READDATA: { eepromBits++; if(eepromBits == 4) { eepromMode = EEPROM_READDATA2; eepromBits = 0; eepromByte = 0; } return 0; } case EEPROM_READDATA2: { int data = 0; int address = eepromAddress << 3; int mask = 1 << (7 - (eepromBits & 7)); data = (eepromData[address+eepromByte] & mask) ? 1 : 0; eepromBits++; if((eepromBits & 7) == 0) eepromByte++; if(eepromBits == 0x40) eepromMode = EEPROM_IDLE; return data; } default: return 0; } return 1; } void eepromWrite(uint32 /* address */, uint8 value) { if(cpuDmaCount == 0) return; int bit = value & 1; switch(eepromMode) { case EEPROM_IDLE: eepromByte = 0; eepromBits = 1; eepromBuffer[eepromByte] = bit; eepromMode = EEPROM_READADDRESS; break; case EEPROM_READADDRESS: eepromBuffer[eepromByte] <<= 1; eepromBuffer[eepromByte] |= bit; eepromBits++; if((eepromBits & 7) == 0) { eepromByte++; } if(cpuDmaCount == 0x11 || cpuDmaCount == 0x51) { if(eepromBits == 0x11) { eepromInUse = true; eepromSize = 0x2000; eepromAddress = ((eepromBuffer[0] & 0x3F) << 8) | ((eepromBuffer[1] & 0xFF)); if(!(eepromBuffer[0] & 0x40)) { eepromBuffer[0] = bit; eepromBits = 1; eepromByte = 0; eepromMode = EEPROM_WRITEDATA; } else { eepromMode = EEPROM_READDATA; eepromByte = 0; eepromBits = 0; } } } else { if(eepromBits == 9) { eepromInUse = true; eepromAddress = (eepromBuffer[0] & 0x3F); if(!(eepromBuffer[0] & 0x40)) { eepromBuffer[0] = bit; eepromBits = 1; eepromByte = 0; eepromMode = EEPROM_WRITEDATA; } else { eepromMode = EEPROM_READDATA; eepromByte = 0; eepromBits = 0; } } } break; case EEPROM_READDATA: case EEPROM_READDATA2: // should we reset here? eepromMode = EEPROM_IDLE; break; case EEPROM_WRITEDATA: eepromBuffer[eepromByte] <<= 1; eepromBuffer[eepromByte] |= bit; eepromBits++; if((eepromBits & 7) == 0) { eepromByte++; } if(eepromBits == 0x40) { eepromInUse = true; // write data; for(int i = 0; i < 8; i++) { eepromData[(eepromAddress << 3) + i] = eepromBuffer[i]; } } else if(eepromBits == 0x41) { eepromMode = EEPROM_IDLE; eepromByte = 0; eepromBits = 0; } break; } } }