コード例 #1
0
        static uint CheckMoveToUnuseSpaceTop(
            uint index_start_addr                                                       //indexの開始
            , uint index_end_addr                                                       //indexの終端
            , uint data_start_addr                                                      //データの開始
            , uint data_end_addr                                                        //データの終端
            , Func <uint, bool, MoveToUnuseSpace.ADDR_AND_LENGTH> get_data_pos_callback //データサイズを求める.
            )
        {
            uint free_size = 0;

            for (uint addr = index_start_addr; addr < index_end_addr; addr += 4)
            {
                //uHuffman patchを使っているかどうか.
                bool useUnHuffmanPatch = false;

                uint data_s = Program.ROM.u32(addr);
                if (!U.isPointer(data_s))
                {     //ポインタではない
                    if (!FETextEncode.IsUnHuffmanPatchPointer(data_s))
                    { //不明
                        continue;
                    }
                    //unHuffman patch適応データ
                    useUnHuffmanPatch = true;
                    data_s            = FETextEncode.ConvertUnHuffmanPatchToPointer(data_s);
                }
                data_s = U.toOffset(data_s);

                ADDR_AND_LENGTH aal = get_data_pos_callback(data_s, useUnHuffmanPatch);
                if (aal.addr < data_start_addr || aal.addr + aal.length > data_end_addr)
                {            //独自拡張され、データ領域以外に設置されている.
                    continue;
                }
                if (aal.length >= 0x00200000)
                {//長すぎる.
                    continue;
                }
                uint aaladdr = aal.addr + aal.length;

                //次のデータのポインタを取得
                uint next_addr = Program.ROM.u32(addr + 4);
                if (FETextEncode.IsUnHuffmanPatchPointer(next_addr))
                {
                    next_addr = FETextEncode.ConvertUnHuffmanPatchToPointer(next_addr);
                }
                next_addr = U.toOffset(next_addr);
                if (next_addr == aaladdr)
                {//ちょうど利用している.空き領域なし.次に行ってみよう.
                    continue;
                }
                if (next_addr < aaladdr)
                {//アドレスが逆転している...放置
                    continue;
                }

                //フリーサイズ
                free_size += (next_addr - aaladdr);
            }
            return(free_size);
        }
コード例 #2
0
        static bool RunMoveToUnuseSpaceTop(
            uint index_start_addr                                                       //indexの開始
            , uint index_end_addr                                                       //indexの終端
            , uint data_start_addr                                                      //データの開始
            , uint data_end_addr                                                        //データの終端
            , Func <uint, bool, MoveToUnuseSpace.ADDR_AND_LENGTH> get_data_pos_callback //データサイズを求める.
            , List <Undo.UndoPostion> undolist
            )
        {
            uint use_data_addr = data_start_addr;
            uint addr;

            for (addr = index_start_addr; addr < index_end_addr; addr += 4)
            {
                //uHuffman patchを使っているかどうか.
                bool useUnHuffmanPatch = false;

                uint data_s = Program.ROM.u32(addr);
                if (!U.isPointer(data_s))
                {     //ポインタではない
                    if (!FETextEncode.IsUnHuffmanPatchPointer(data_s))
                    { //不明
                        continue;
                    }
                    //unHuffman patch適応データ
                    useUnHuffmanPatch = true;
                    data_s            = FETextEncode.ConvertUnHuffmanPatchToPointer(data_s);
                }
                data_s = U.toOffset(data_s);

                ADDR_AND_LENGTH aal = get_data_pos_callback(data_s, useUnHuffmanPatch);
                if (aal.addr < data_start_addr || aal.addr + aal.length > data_end_addr)
                {//独自拡張され、データ領域以外に設置されている.
                    //無視して次行ってみよう.
                    continue;
                }

                //空き領域を作るためにデータを移動 movemem
                byte[] original = Program.ROM.getBinaryData(aal.addr, aal.length);
                undolist.Add(new Undo.UndoPostion(aal.addr, original));
                Program.ROM.write_range(use_data_addr, original);

                //移動したので挿げ替え.
                undolist.Add(new Undo.UndoPostion(addr, 4));
                if (useUnHuffmanPatch)
                {
                    Program.ROM.write_u32(addr, FETextEncode.ConvertPointerToUnHuffmanPatchPointer(U.toPointer(use_data_addr)));
                }
                else
                {
                    Program.ROM.write_p32(addr, use_data_addr);
                }

                use_data_addr += aal.length;
            }

            return(true);
        }