public static MoveToUnuseSpace.ADDR_AND_LENGTH gbawave_length(uint addr)
        {
            MoveToUnuseSpace.ADDR_AND_LENGTH aal = new MoveToUnuseSpace.ADDR_AND_LENGTH();
            uint length = Program.ROM.u32(addr + 12);

            aal.addr   = addr;
            aal.length = 12 + 4 + length;
            return(aal);
        }
        //APの長さを求めるコールバック
        public static MoveToUnuseSpace.ADDR_AND_LENGTH get_data_pos_callback_ap(uint addr)
        {
            addr = U.toOffset(addr);

            MoveToUnuseSpace.ADDR_AND_LENGTH aal = new MoveToUnuseSpace.ADDR_AND_LENGTH();
            aal.addr = addr;
            aal.length = ImageUtilAP.CalcAPLength(addr);
            return aal;
        }
Exemple #3
0
        public static MoveToUnuseSpace.ADDR_AND_LENGTH get_data_pos_callback(uint addr)
        {
            int    length = 0;
            string str    = Program.ROM.getString(addr, out length);

            MoveToUnuseSpace.ADDR_AND_LENGTH aal = new MoveToUnuseSpace.ADDR_AND_LENGTH();
            aal.addr   = addr;
            aal.length = (uint)length + 1; //nullを入れる.
            return(aal);
        }
        //道データの長さを求める.
        static MoveToUnuseSpace.ADDR_AND_LENGTH get_path_data_length_callback(uint addr)
        {
            addr = U.toOffset(addr);

            uint length = WorldMapPathForm.CalcPathDataLength(addr);

            MoveToUnuseSpace.ADDR_AND_LENGTH aal = new MoveToUnuseSpace.ADDR_AND_LENGTH();
            aal.addr   = addr;
            aal.length = length;
            return(aal);
        }
Exemple #5
0
        private MoveToUnuseSpace.ADDR_AND_LENGTH get_data_pos_callback(uint addr)
        {
            uint length = CalcLength(addr);

            //範囲外探索 00 00 00 00 が続く限り検索してみる.
            uint more = MoveToFreeSapceForm.SearchOutOfRange(addr + length);

            //8バイトアライメント
            more = (more / 8) * 8;

            MoveToUnuseSpace.ADDR_AND_LENGTH aal = new MoveToUnuseSpace.ADDR_AND_LENGTH();
            aal.addr   = addr;
            aal.length = length + more;
            return(aal);
        }
        private MoveToUnuseSpace.ADDR_AND_LENGTH get_data_pos_callback(uint addr)
        {
            uint length = CalcLength(addr);

            //範囲外探索 00 00 00 00 が続く限り検索してみる.
            uint more = Program.ROM.getBlockDataCount(addr + length + 4, 4
                                                      , (i, p) => { return(Program.ROM.u32(p) == 0x00000000); }) * 4;

            //8バイトアライメント
            more = (more / 8) * 8;

            MoveToUnuseSpace.ADDR_AND_LENGTH aal = new MoveToUnuseSpace.ADDR_AND_LENGTH();
            aal.addr   = addr;
            aal.length = length + more;
            return(aal);
        }
Exemple #7
0
        //道データの長さを求める.
        static MoveToUnuseSpace.ADDR_AND_LENGTH get_path_data_length_callback(uint addr)
        {
            addr = U.toOffset(addr);

            uint length;

            if (Program.ROM.u32(addr) == 0x0)
            {//道データがnull 必須0x01 があるので 0はありえない
                length = 0;
            }
            else
            {
                length = Program.ROM.getBlockDataCount(addr, 4, (i, p) => { return(Program.ROM.u32(p) != 0xFF); });
                length = (length + 1);
            }
            MoveToUnuseSpace.ADDR_AND_LENGTH aal = new MoveToUnuseSpace.ADDR_AND_LENGTH();
            aal.addr   = addr;
            aal.length = length;
            return(aal);
        }
        public static uint OriginalDataSize(
            uint index_start_addr                                                       //indexの開始
            , uint index_end_addr                                                       //indexの終端
            , uint data_start_addr                                                      //データの開始
            , uint data_end_addr                                                        //データの終端
            , uint now_index                                                            //データを入れたいindex場所
            , Func <uint, bool, MoveToUnuseSpace.ADDR_AND_LENGTH> get_data_pos_callback //データサイズを求める.
            )
        {
            //uHuffman patchを使っているかどうか.
            bool useUnHuffmanPatch = false;

            uint addr   = index_start_addr + (now_index * 4);
            uint data_s = Program.ROM.u32(addr);

            //他と共有していないか調べる.
            for (uint p = index_start_addr; p < index_end_addr; p += 4)
            {
                uint data_s2 = Program.ROM.u32(p);
                if (p == addr)
                {
                    continue;
                }
                if (data_s2 == data_s)
                {//他と共有しているのでリサイクルしてはいけません.
                    return(0);
                }
            }

            if (!U.isPointer(data_s))
            {//ポインタではない 単体データ
                if (!FETextEncode.IsUnHuffmanPatchPointer(data_s))
                {
                    MoveToUnuseSpace.ADDR_AND_LENGTH aal = get_data_pos_callback(data_s, false);
                    return(ConvertSafetyLength(aal.length, index_start_addr, index_end_addr, data_s));
                }
                //unHuffman patch適応データ
                useUnHuffmanPatch = true;
                data_s            = FETextEncode.ConvertUnHuffmanPatchToPointer(data_s);
            }

            data_s = U.toOffset(data_s);
            if (data_s < data_start_addr || data_s >= data_end_addr)
            {//拡張領域にあるらしいので基底サイズは不明. 自サイズしかわからない.
                MoveToUnuseSpace.ADDR_AND_LENGTH aal = get_data_pos_callback(data_s, useUnHuffmanPatch);
                return(ConvertSafetyLength(aal.length, index_start_addr, index_end_addr, data_s));
            }

            uint i = 1;
            uint data_s_next;

            do
            {
                uint next_addr = index_start_addr + ((now_index + i) * 4);
                data_s_next = Program.ROM.u32(next_addr);

                if (!U.isPointer(data_s_next))
                {
                    if (!FETextEncode.IsUnHuffmanPatchPointer(data_s_next))
                    {//次のポインタが不明なので自サイズしかわからない.
                        MoveToUnuseSpace.ADDR_AND_LENGTH aal = get_data_pos_callback(data_s, useUnHuffmanPatch);
                        return(ConvertSafetyLength(aal.length, index_start_addr, index_end_addr, data_s));
                    }
                    //unHuffman patch適応データ
                    useUnHuffmanPatch = true;
                    data_s_next       = FETextEncode.ConvertUnHuffmanPatchToPointer(data_s_next);
                }
                data_s_next = U.toOffset(data_s_next);
                if (data_s_next < data_start_addr || data_s_next >= data_end_addr)
                {//拡張領域にあるらしいので次のデータを参照したい
                    i++;
                    continue;
                }
                if (data_s_next < data_s)
                {
                    //アドレスが逆転してます. 危険なので自分のデータの長さだけを求めます.input
                    MoveToUnuseSpace.ADDR_AND_LENGTH aal = get_data_pos_callback(data_s, useUnHuffmanPatch);
                    return(ConvertSafetyLength(aal.length, index_start_addr, index_end_addr, data_s));
                }
                break;
            }while(true);

            uint length = data_s_next - data_s;

            return(ConvertSafetyLength(length, index_start_addr, index_end_addr, data_s));
        }