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); }
void WriteTextUnHffman(uint id, string text, Undo.UndoData undodata) { uint addr = this.TextBaseAddress + (id * 4); uint paddr = Program.ROM.u32(addr); if (TextForm.Is_RAMPointerArea(paddr)) {//iw-ram / ew-ram にデータをおいている人がいるらしい return; } byte[] encode; Program.FETextEncoder.UnHuffmanEncode(text, out encode); string undoname = "Text:" + U.ToHexString(id); uint newaddr = this.Recycle.Write(encode, undodata); if (newaddr == U.NOT_FOUND) { return; } newaddr = U.toPointer(newaddr); newaddr = FETextEncode.ConvertPointerToUnHuffmanPatchPointer(newaddr); Program.ROM.write_u32(addr, newaddr, undodata); }