コード例 #1
0
ファイル: fme7.cpp プロジェクト: Oggom/mednafen-git
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);
}
コード例 #2
0
ファイル: cart.cpp プロジェクト: Oggom/mednafen-git
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)
 {

 }
}
コード例 #3
0
ファイル: mmc2and4.cpp プロジェクト: ben401/OpenEmu
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);
}
コード例 #4
0
ファイル: super24.cpp プロジェクト: BadyRaty/Mednafen-Core
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);
}
コード例 #5
0
ファイル: system.cpp プロジェクト: XeresRazor/Provenance
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);
}
コード例 #6
0
ファイル: 95.cpp プロジェクト: BadyRaty/Mednafen-Core
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);
}
コード例 #7
0
ファイル: cart.cpp プロジェクト: gammy/wiimednafen
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);
}
コード例 #8
0
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);
};
コード例 #9
0
ファイル: gbaeeprom.cpp プロジェクト: gammy/wiimednafen
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);
}
コード例 #10
0
ファイル: eeprom.cpp プロジェクト: BadyRaty/Mednafen-Core
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;
  }
}

}