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; }
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); }
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); }
//道データの長さを求める. 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)); }