private void MoveButton_Click(object sender, EventArgs e) { uint moveAddr = U.toOffset((uint)MoveFromAddress.Value); uint toAddr = U.toOffset((uint)MoveToAddress.Value); uint length = (uint)MoveLength.Value; if (length == 0) {//自動推測できたらいいなあ return; } if (!U.isSafetyOffset(moveAddr) || !U.isSafetyOffset(moveAddr + length)) { R.ShowStopError("FROMに指定されたアドレスがROMの範囲外です"); return; } if (toAddr != 0) { if (!U.isSafetyOffset(toAddr) || !U.isSafetyOffset(toAddr + length)) { R.ShowStopError("TOに指定されたアドレスがROMの範囲外です"); return; } } DialogResult dr; { byte[] moveBytes = Program.ROM.getBinaryData(moveAddr, length); if (U.IsEmptyRange(moveBytes)) { R.ShowStopError("FROMに指定された{0}のコンテンツが全部nullです。\r\n既に移動済みの利用域をしていると思いますので、処理を停止します。", U.To0xHexString(moveAddr)); return; } if (toAddr != 0) { byte[] toBytes = Program.ROM.getBinaryData(toAddr, length); if (!U.IsEmptyRange(toBytes)) { dr = R.ShowNoYes("TOに指定された{0}のコンテンツが全部nullではありません。\r\n既に別のデータで利用しているかもしれません。続行してもよろしいですか?", U.To0xHexString(toAddr)); if (dr != DialogResult.Yes) { return; } } } } dr = R.ShowNoYes("{0}から{1}までの領域({2} bytes)を{3}に移動してもよろしいですか?", U.To0xHexString(moveAddr), U.To0xHexString(moveAddr + length), length, U.To0xHexString(toAddr)); if (dr != DialogResult.Yes) { return; } using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(this)) { List <uint> movepointerlist = MoveToFreeSapceForm.SearchPointer(moveAddr); if (movepointerlist.Count != 1) { dr = R.ShowNoYes("この移動で{0}か所のポインタの置換が行われます。\r\n本当に継続してもよろしいですか?", movepointerlist.Count); if (dr != DialogResult.Yes) { return; } } } Undo.UndoData undodata = Program.Undo.NewUndoData(R._("MoveAddress {0}-{1} => {2} ({3}size)", U.To0xHexString(moveAddr), U.To0xHexString(moveAddr + length), U.To0xHexString(toAddr), length)); uint r = InputFormRef.MoveBinaryData(this, moveAddr, toAddr, length, undodata); if (r == U.NOT_FOUND) { return; } Program.Undo.Push(undodata); }