Пример #1
0
		Result Patcher::Load(std::istream& patchStream,std::istream& srcStream)
		{
			Result result = Load( patchStream );

			if (NES_SUCCEEDED(result))
			{
				result = Test( srcStream );

				if (NES_FAILED(result))
					Destroy();
			}

			return result;
		}
Пример #2
0
		void Fds::LoadState(State::Loader& state)
		{
			uint saveDisks[3] = {~0U,~0U,~0U};

			while (const dword chunk = state.Begin())
			{
				switch (chunk)
				{
					case AsciiId<'I','O'>::V:
					{
						State::Loader::Data<4> data( state );

						io.ctrl = data[0];
						io.port = data[1];
						break;
					}

					case AsciiId<'R','A','M'>::V:

						state.Uncompress( ram.mem );
						break;

					case AsciiId<'C','H','R'>::V:

						state.Uncompress( ppu.GetChrMem().Source().Mem(), SIZE_8K );
						break;

					case AsciiId<'I','R','Q'>::V:
					case AsciiId<'D','R','V'>::V:

						adapter.LoadState( state, chunk, ppu );
						break;

					case AsciiId<'D','S','K'>::V:
					{
						State::Loader::Data<4> data( state );

						if (data[0] != disks.sides.count)
							throw RESULT_ERR_INVALID_FILE;

						saveDisks[0] = data[1];
						saveDisks[1] = data[2];
						saveDisks[2] = data[3];
						break;
					}

					case AsciiId<'S','N','D'>::V:

						sound.LoadState( state );
						break;

					default:

						for (uint i=0; i < disks.sides.count; ++i)
						{
							if (chunk == AsciiId<'D','0','A'>::R( 0, i / 2, i % 2 ))
							{
								byte* const data = disks.sides[i];
								state.Uncompress( data, SIDE_SIZE );

								for (uint j=0; j < SIDE_SIZE; ++j)
									data[j] ^= 0xFFU;

								break;
							}
						}
						break;
				}

				state.End();
			}

			disks.mounting = 0;

			if (saveDisks[0] != ~0U)
			{
				disks.writeProtected = saveDisks[0] & 0x2U;

				if (saveDisks[0] & 0x1U)
				{
					if (NES_FAILED(InsertDisk( saveDisks[1] / 2, saveDisks[1] % 2 )))
						throw RESULT_ERR_CORRUPT_FILE;

					disks.mounting = saveDisks[2];
				}
				else
				{
					EjectDisk();
				}
			}

			adapter.Mount
			(
				disks.current != Disks::EJECTED && !disks.mounting ? disks.sides[disks.current] : NULL,
				disks.writeProtected
			);
		}
Пример #3
0
		Cartridge::Cartridge(Context& context)
		: Image(CARTRIDGE), board(NULL), vs(NULL), favoredSystem(context.favoredSystem)
		{
			try
			{
				ProfileEx profileEx;

				switch (Stream::In(&context.stream).Peek32())
				{
					case INES_ID:

						Ines::Load
						(
							context.stream,
							context.patch,
							context.patchBypassChecksum,
							context.patchResult,
							prg,
							chr,
							context.favoredSystem,
							profile,
							profileEx,
							context.database
						);
						break;

					case UNIF_ID:

						Unif::Load
						(
							context.stream,
							context.patch,
							context.patchBypassChecksum,
							context.patchResult,
							prg,
							chr,
							context.favoredSystem,
							profile,
							profileEx,
							context.database
						);
						break;

					default:

						Romset::Load
						(
							context.stream,
							context.patch,
							context.patchBypassChecksum,
							context.patchResult,
							prg,
							chr,
							context.favoredSystem,
							context.askProfile,
							profile
						);
						break;
				}

				if (profile.dump.state == Profile::Dump::BAD)
					context.result = RESULT_WARN_BAD_DUMP;
				else
					context.result = RESULT_OK;

				const Result result = SetupBoard( prg, chr, &board, &context, profile, profileEx, &prgCrc );

				if (NES_FAILED(result))
					throw result;

				board->Load( savefile );

				switch (profile.system.type)
				{
					case Profile::System::VS_UNISYSTEM:

						vs = VsSystem::Create
						(
							context.cpu,
							context.ppu,
							static_cast<PpuModel>(profile.system.ppu),
							prgCrc
						);

						profile.system.ppu = static_cast<Profile::System::Ppu>(vs->GetPpuModel());
						break;

					case Profile::System::VS_DUALSYSTEM:
						throw RESULT_ERR_UNSUPPORTED_VSSYSTEM;
				}

				if (Cartridge::QueryExternalDevice( EXT_DIP_SWITCHES ))
					Log::Flush( "Cartridge: DIP Switches present" NST_LINEBREAK );
			}
			catch (...)
			{
				Destroy();
				throw;
			}
		}