Ejemplo n.º 1
0
        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);
        }