Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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));
            }
        }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        //翻訳用のよくあるテキスト集の作成.
        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);
        }