blargg_err_t Nes_Cart::load_ines( Auto_File_Reader in )
{
	RETURN_ERR( in.open() );
	
	ines_header_t h;
	RETURN_ERR( in->read( &h, sizeof h ) );
	
	if ( 0 != memcmp( h.signature, "NES\x1A", 4 ) )
		return not_ines_file;
	
	if ( h.zero [7] ) // handle header defaced by a f*****g idiot's handle
		h.flags2 = 0;
	
	set_mapper( h.flags, h.flags2 );
	
	if ( h.flags & 0x04 ) // skip trainer
		RETURN_ERR( in->skip( 512 ) );
	
	RETURN_ERR( resize_prg( h.prg_count * 16 * 1024L ) );
	RETURN_ERR( resize_chr( h.chr_count * 8 * 1024L ) );
	
	RETURN_ERR( in->read( prg(), prg_size() ) );
	RETURN_ERR( in->read( chr(), chr_size() ) );
	
	return 0;
}
blargg_err_t Nes_Cart::load_patched_ines( Auto_File_Reader in, Auto_File_Reader patch )
{
	RETURN_ERR( in.open() );
	RETURN_ERR( patch.open() );
	
	// read file into memory
	long size = in->remain();
	byte* ines = (byte*) malloc( size );
	CHECK_ALLOC( ines );
	const char* err = in->read( ines, size );
	
	// apply patch
	if ( !err )
		err = apply_ips_patch( *patch, &ines, &size );
	
	// load patched file
	if ( !err )
	{
		Mem_File_Reader patched( ines, size );
		err = load_ines( patched );
	}
	
	free( ines );
	
	return err;
}
blargg_err_t Nes_Cart::apply_ips_to_chr( Auto_File_Reader patch )
{
	RETURN_ERR( patch.open() );

	long size = chr_size();

	byte* chr_copy = (byte*) malloc( size );
	CHECK_ALLOC( chr_copy );
	memcpy( chr_copy, chr(), size );

	const char* err = apply_ips_patch( *patch, &chr_copy, &size );

	if ( !err )
	{
		resize_chr( size );
		memcpy( chr(), chr_copy, size );
	}

	free( chr_copy );

	return err;
}
Exemple #4
0
blargg_err_t Nes_Emu::load_battery_ram( Auto_File_Reader in )
{
    RETURN_ERR( in.open() );
    emu.sram_present = true;
    return in->read( emu.impl->sram, emu.impl->sram_size );
}