Esempio n. 1
0
bool NDS2SF::make_mini2sf(const std::string& nds2sf_path, uint32_t address, size_t size, uint32_t num, std::map<std::string, std::string>& tags)
{
	uint8_t exe[NDS2SF_EXE_HEADER_SIZE + 4];

	// limit size
	if (size > 4)
	{
		return false;
	}

	// make exe
	put_2sf_exe_header(exe, address, (uint32_t)size);
	mput4l(num, &exe[NDS2SF_EXE_HEADER_SIZE]);

	// write mini2sf file
	return exe2sf(nds2sf_path, exe, NDS2SF_EXE_HEADER_SIZE + size, tags);
}
Esempio n. 2
0
void NDS2SF::put_2sf_exe_header(uint8_t *exe, uint32_t load_offset, uint32_t rom_size)
{
	mput4l(load_offset, &exe[0]);
	mput4l(rom_size, &exe[4]);
}
Esempio n. 3
0
bool procyon_ripper::save_2sfs(const std::string & basename)
{
	if (exe == NULL || driver_offset == 0 || bgm_play_function_offset == 0) {
		return false;
	}

	// NOP mass attack
	for (size_t i = 0; i < nopRegions.size(); i++) {
		Region & region = nopRegions[i];
		for (uint32_t offset = region.offset; offset < region.offset + region.size; offset += 4) {
			mput4l(0xE1A00000, &arm9[offset]);
		}
	}

	// install driver code:
	// LDR             R0, =0x1
	// LDR             R1, =0x0
	// LDR             R2, =0x100
	// BL              bgm_play
	// 
	// infinite_loop:
	// SWI             #0x40000 ; IntrWait
	// B               infinite_loop
	int32_t bl_bgm_play_rel = (bgm_play_function_offset / 4) - ((driver_offset + 12 + 8) / 4);
	uint32_t bl_bgm_play_op = 0xEB000000 | (bl_bgm_play_rel & 0xffffff);
	mput4l(0xE59F0010, &arm9[driver_offset]);
	mput4l(0xE59F1010, &arm9[driver_offset + 4]);
	mput4l(0xE59F2010, &arm9[driver_offset + 8]);
	mput4l(bl_bgm_play_op, &arm9[driver_offset + 12]);
	mput4l(0xEF040000, &arm9[driver_offset + 16]);
	mput4l(0xEAFFFFFD, &arm9[driver_offset + 20]);
	mput4l(0x00000001, &arm9[driver_offset + 24]);
	mput4l(0x00000000, &arm9[driver_offset + 28]);
	mput4l(0x00000100, &arm9[driver_offset + 32]);

	// export 2sflib
	std::string nds2sflib_path = basename + ".2sflib";
	if (verbose) {
		printf("Output \"%s\"\n", nds2sflib_path.c_str());
	}
	if (!NDS2SF::exe2sf(nds2sflib_path, exe, NDS2SF_EXE_HEADER_SIZE + rom_size)) {
		fprintf(stderr, "Error: Unable to save 2sflib file.\n");
		return false;
	}

	// get 2sflib filename for mini2sf tagging
	char nds2sflib_filename[PATH_MAX];
	strcpy(nds2sflib_filename, nds2sflib_path.c_str());
	path_basename(nds2sflib_filename);

	std::map<std::string, std::string> tags;
	tags["_lib"] = nds2sflib_filename;

	int mini2sf_count = 256;
	uint32_t mini2sf_offset = arm9_rom_offset + driver_offset + 24;
	for (int num = 0; num < mini2sf_count; num++) {
		char mini2sf_path[PATH_MAX];
		sprintf(mini2sf_path, "%s-%04d.mini2sf", basename.c_str(), num);
		
		if (verbose) {
			printf("Output \"%s\"\n", mini2sf_path);
		}
		NDS2SF::make_mini2sf(mini2sf_path, mini2sf_offset, 1, num, tags);
	}

	return true;
}