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); }
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]); }
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; }