Beispiel #1
0
void BaseMapper::ProcessNotification(ConsoleNotificationType type, void* parameter)
{
	switch(type) {
		case ConsoleNotificationType::CheatAdded:
		case ConsoleNotificationType::CheatRemoved:
			ApplyCheats();
			break;
		default:
			break;
	}
}
Beispiel #2
0
void EmuUpdate() {
    // Do not allow hotkeys inside a softcall from HLE BIOS
    if (!Config.HLE || !hleSoftCall)
        SysUpdate();

    ApplyCheats();

    // reamed hack
    {
        extern void pl_frame_limit(void);
        pl_frame_limit();
    }
}
Beispiel #3
0
void EmuUpdate() {
	// Do not allow hotkeys inside a softcall from HLE BIOS
	if (!Config.HLE || !hleSoftCall)
		SysUpdate();

	ApplyCheats();

	if (vblank_count_hideafter) {
		if (!(--vblank_count_hideafter)) {
			GPU_showScreenPic(NULL);
		}
	}

	if (Config.RewindInterval > 0 && !(++rewind_counter%Config.RewindInterval)) {
		CreateRewindState();
	}
}
Beispiel #4
0
void BaseMapper::Initialize(RomData &romData)
{
	_mapperID = romData.MapperID;
	_subMapperID = romData.SubMapperID;

	_databaseInfo = romData.DatabaseInfo;

	_romName = romData.RomName;
	_romFilename = romData.Filename;
	_batteryFilename = GetBatteryFilename();
	
	_hasBattery = (romData.HasBattery || ForceBattery());

	if(romData.SaveRamSize == -1 || ForceSaveRamSize()) {
		_saveRamSize = GetSaveRamSize();
	} else {
		_saveRamSize = romData.SaveRamSize;
	}

	if(_saveRamSize == 0) {
		_hasBattery = false;
	}

	if(romData.WorkRamSize == -1 || ForceWorkRamSize()) {
		_workRamSize = GetWorkRamSize();
	} else {
		_workRamSize = romData.WorkRamSize;
	}

	_allowRegisterRead = AllowRegisterRead();

	memset(_isReadRegisterAddr, 0, sizeof(_isReadRegisterAddr));
	memset(_isWriteRegisterAddr, 0, sizeof(_isWriteRegisterAddr));
	AddRegisterRange(RegisterStartAddress(), RegisterEndAddress(), MemoryOperation::Any);

	_nesHeader = romData.NesHeader;
	_romFormat = romData.Format;

	_mirroringType = romData.Mirroring;

	_prgSize = (uint32_t)romData.PrgRom.size();
	_chrRomSize = (uint32_t)romData.ChrRom.size();
	_originalPrgRom = romData.PrgRom;
	_originalChrRom = romData.ChrRom;

	_prgRom = new uint8_t[_prgSize];
	_chrRom = new uint8_t[_chrRomSize];
	memcpy(_prgRom, romData.PrgRom.data(), _prgSize);
	if(_chrRomSize > 0) {
		memcpy(_chrRom, romData.ChrRom.data(), _chrRomSize);
	}

	_hasChrBattery = romData.SaveChrRamSize > 0 || ForceChrBattery();

	_gameSystem = romData.System;
	_hashInfo.Crc32Hash = romData.Crc32;
	_hashInfo.PrgCrc32Hash = romData.PrgCrc32;
	_hashInfo.PrgChrCrc32Hash = romData.PrgChrCrc32;
	_hashInfo.Sha1Hash = romData.Sha1;
	_hashInfo.PrgChrMd5Hash = romData.PrgChrMd5;
	switch(romData.BusConflicts) {
		case BusConflictType::Default: _hasBusConflicts = HasBusConflicts(); break;
		case BusConflictType::Yes: _hasBusConflicts = true; break;
		case BusConflictType::No: _hasBusConflicts = false; break;
	}	

	_saveRam = new uint8_t[_saveRamSize];
	_workRam = new uint8_t[_workRamSize];

	BaseMapper::InitializeRam(_saveRam, _saveRamSize);
	BaseMapper::InitializeRam(_workRam, _workRamSize);

	memset(_prgPageNumbers, 0xEE, sizeof(_prgPageNumbers));
	memset(_chrPageNumbers, 0xEE, sizeof(_chrPageNumbers));

	memset(_cartNametableRam, 0, sizeof(_cartNametableRam));
	memset(_nametableIndexes, 0, sizeof(_nametableIndexes));

	for(int i = 0; i <= 0xFF; i++) {
		//Allow us to map a different page every 256 bytes
		_prgPages[i] = nullptr;
		_prgPageAccessType[i] = MemoryAccessType::NoAccess;
		_chrPages[i] = nullptr;
		_chrPageAccessType[i] = MemoryAccessType::NoAccess;
	}

	if(_chrRomSize == 0) {
		//Assume there is CHR RAM if no CHR ROM exists
		_onlyChrRam = true;
		InitializeChrRam(romData.ChrRamSize);

		//Map CHR RAM to 0x0000-0x1FFF by default when no CHR ROM exists
		SetPpuMemoryMapping(0x0000, 0x1FFF, 0, ChrMemoryType::ChrRam);
		_chrRomSize = _chrRamSize;
	} else if(romData.ChrRamSize >= 0) {
		InitializeChrRam(romData.ChrRamSize);
	} else if(GetChrRamSize()) {
		InitializeChrRam();
	}
	
	//Load battery data if present
	LoadBattery();

	if(romData.HasTrainer) {
		if(_workRamSize >= 0x2000) {
			memcpy(_workRam + 0x1000, romData.TrainerData.data(), 512);
		} else if(_saveRamSize >= 0x2000) {
			memcpy(_saveRam + 0x1000, romData.TrainerData.data(), 512);
		}
	}

	//Setup a default work/save ram in 0x6000-0x7FFF space
	if(HasBattery() && _saveRamSize > 0) {
		SetCpuMemoryMapping(0x6000, 0x7FFF, 0, PrgMemoryType::SaveRam);
	} else if(_workRamSize > 0) {
		SetCpuMemoryMapping(0x6000, 0x7FFF, 0, PrgMemoryType::WorkRam);
	}

	InitMapper();
	InitMapper(romData);

	MessageManager::RegisterNotificationListener(this);

	ApplyCheats();
}