uint ScanNazo8DataPointerTable(uint pointer, string prefix, ROM rom) { uint startAddr = U.toOffset(pointer); uint addr = startAddr; for (int i = 0; addr < rom.Data.Length; addr += 4, i++) { uint d = rom.u32(addr); if (!U.isSafetyPointer(d, rom)) { break; } if (this.AsmMap.ContainsKey(d)) { continue; } AsmMapSt p = new AsmMapSt(); p.Length = 8; p.Name = prefix + " NAZO8 " + U.ToHexString(i); this.AsmMap[d] = p; } return(addr - startAddr); }
uint ScanASMPointerTable(uint pointer, string prefix, ROM rom) { uint startAddr = U.toOffset(pointer); uint addr = startAddr; for (int i = 0; addr < rom.Data.Length; addr += 4, i++) { uint d = rom.u32(addr); if (!U.isSafetyPointer(d, rom)) { break; } d = DisassemblerTrumb.ProgramAddrToPlain(d); if (this.AsmMap.ContainsKey(d)) { continue; } AsmMapSt p = new AsmMapSt(); p.Length = 0; p.Name = prefix + " ASM " + U.ToHexString(i); this.AsmMap[d] = p; } return(addr - startAddr); }
public static uint GetArgValue(OneCode code, int arg_count) { Arg arg = code.Script.Args[arg_count]; if (arg.Size == 1) {//1バイト return(ROM.u8(code.ByteData, (uint)arg.Position)); } else if (arg.Size == 2) {//2バイト return(ROM.u16(code.ByteData, (uint)arg.Position)); } else //if (arg.Size == 4) {//4バイト return(ROM.u32(code.ByteData, (uint)arg.Position)); } }
public static string GetArg(OneCode code, int arg_count, out uint v) { Arg arg = code.Script.Args[arg_count]; if (arg.Size == 1) {//1バイト v = ROM.u8(code.ByteData, (uint)arg.Position); } else if (arg.Size == 2) {//2バイト v = ROM.u16(code.ByteData, (uint)arg.Position); } else //if (arg.Size == 4) {//4バイト v = ROM.u32(code.ByteData, (uint)arg.Position); } if (arg.Size == 1) {//1バイト if (arg.Type == ArgType.ArgType_X || arg.Type == ArgType.ArgType_Y) { return(v.ToString()); } return("0x" + v.ToString("X")); } else if (arg.Size == 2) {//2バイト if (arg.Type == ArgType.ArgType_X || arg.Type == ArgType.ArgType_Y) { return(v.ToString()); } return("0x" + v.ToString("X")); } else //if (arg.Size == 4) {//4バイト if (arg.Type == ArgType.ArgType_X || arg.Type == ArgType.ArgType_Y) { return(v.ToString()); } return("0x" + v.ToString("X")); } //return v.ToString(); }
uint ScanSECONDARYOAMTable(uint pointer, string prefix, ROM rom) { uint startAddr = U.toOffset(pointer); uint addr = startAddr; for (int i = 0; addr < rom.Data.Length; addr += 4, i++) { uint d = rom.u32(addr); if (!U.isSafetyPointer(d, rom)) { break; } AsmMapSt p = new AsmMapSt(); p.Length = 14; p.Name = prefix + " SECONDARYOAM " + U.ToHexString(i); this.AsmMap[d] = p; } return(addr - startAddr); }
uint ScanOAMREGSTable(uint pointer, string prefix, ROM rom) { uint startAddr = U.toOffset(pointer); uint addr = startAddr; for ( ; addr < rom.Data.Length; addr += 4) { uint d = rom.u32(addr); if (!U.isSafetyPointer(d)) { break; } AsmMapSt p = new AsmMapSt(); p.Length = U.OAMREGSLength(U.toOffset(d), rom); p.Name = prefix + " Count_" + ((p.Length - 2) / (3 * 2)); this.AsmMap[d] = p; } return(addr - startAddr); }
//翻訳用のよくあるテキスト集の作成. public static Dictionary <string, string> LoadTranslateDic(string from, string to, string rom_from, string rom_to) { Dictionary <string, string> dic = new Dictionary <string, string>(); ROM rom_f = new ROM(); string version; if (!rom_f.Load(rom_from, out version)) { return(dic); } ROM rom_t = new ROM(); if (!rom_t.Load(rom_to, out version)) { return(dic); } if (rom_f.RomInfo.version() != rom_t.RomInfo.version()) { return(dic); } SystemTextEncoder from_tbl, to_tbl; int from_n; bool trimEnd1F = true; if (from == "ja") { from_n = 0; from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.Shift_JIS, rom_f); } else if (from == "en") { from_n = 1; if (rom_f.RomInfo.version() == 6) { from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.EN_TBL, rom_f); } else { from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.Shift_JIS, rom_f); } trimEnd1F = false; } else if (from == "zh" || from == "zh-CN") { from_n = 0; from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.ZH_TBL, rom_f); } else if (from == "ko" || from == "ko-KR") { from_n = 0; from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.KO_TBL, rom_f); } else {//fromが対応外. return(dic); } int to_n; if (to == "ja") { to_n = 0; to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.Shift_JIS, rom_t); } else if (to == "en") { to_n = 1; if (rom_t.RomInfo.version() == 6) { to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.EN_TBL, rom_t); } else { to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.Shift_JIS, rom_t); } } else if (to == "zh" || to == "zh-CN") { to_n = 0; to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.ZH_TBL, rom_t); } else if (to == "ko" || to == "ko-KR") { to_n = 0; to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.KO_TBL, rom_t); } else {//toが対応外. return(dic); } //FE8は、日本語版と英語版で顔画像の並びが違うので補正するかどうかのチェック FE8FaceCode48Fix fe8faceCode48Fix = is_FE8FaceCode48Fix(rom_f, rom_t); string filename = U.ConfigDataFilename("translate_textid_", rom_f); string[] lines = File.ReadAllLines(filename); FETextDecode from_decoder = new FETextDecode(rom_f, from_tbl); FETextDecode to_decoder = new FETextDecode(rom_t, to_tbl); for (int i = 0; i < lines.Length; i++) { if (U.IsComment(lines[i])) { continue; } string line = U.ClipComment(lines[i]); string[] sp = line.Split('\t'); if (sp.Length < 2) { continue; } string from_string, to_string; uint from_key = U.atoh(sp[from_n]); uint orignal_from_key = from_key; if (from_key <= 0) { continue; } if (U.isSafetyPointer(from_key, rom_f)) {//ポインタの場合、実アドレスを求める. from_key = rom_f.u32(U.toOffset(from_key)); if (!U.isSafetyPointer(from_key, rom_f)) { continue; } } from_string = from_decoder.Decode(from_key); from_string = from_string.ToUpper(); uint to_key = U.atoh(sp[to_n]); int change_string_pos = sp[to_n].IndexOf('|'); if (change_string_pos < 0) { if (to_key <= 0) { dic[U.ToHexString(orignal_from_key) + "#NOTFOUND#" + from_string] = ""; continue; } if (U.isSafetyPointer(to_key, rom_t)) {//ポインタの場合、実アドレスを求める. to_key = rom_t.u32(U.toOffset(to_key)); if (!U.isSafetyPointer(to_key, rom_t)) { dic[U.ToHexString(orignal_from_key) + "#NOTFOUND#" + from_string] = ""; continue; } } to_string = to_decoder.Decode(to_key); } else {//長さ当の問題で置換できないものは、代替えテキストを入れます. to_string = sp[to_n].Substring(change_string_pos + 1); } //FE8顔画像の修正. if (fe8faceCode48Fix != FE8FaceCode48Fix.NONE) { to_string = FE8SkipFace48(to_string, fe8faceCode48Fix); } if (trimEnd1F) { //末尾の001Fを消す to_string = Trim001F(to_string); } dic[from_string] = to_string; dic[U.ToHexString(orignal_from_key) + "|" + from_string] = to_string; } return(dic); }