//Ctrl押しながら100件一気にマージ
        private bool AddressList_KeyDownWithCtrl(object sender, KeyEventArgs e)
        {
            if (!e.Control)
            {
                return(false);
            }

            int index = this.AddressList.SelectedIndex;

            if (index < 0 || index >= this.ChangeDataList.Count)
            {
                return(false);
            }

            int  limit     = Math.Min(index + 100, this.ChangeDataList.Count);
            uint startaddr = this.ChangeDataList[index].addr;

            Undo.UndoData undodata = Program.Undo.NewUndoData("marge " + U.To0xHexString(startaddr) + " With Control");

            for (; index < limit; index++)
            {
                ChangeDataSt code = this.ChangeDataList[index];

                byte[] bin;
                if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1)
                {
                    bin = U.subrange(this.AData, code.addr, code.addr + code.length);
                    code.SetMargeMethod(MargeMethod.A);
                }
                else if (e.KeyCode == Keys.D2 || e.KeyCode == Keys.NumPad2)
                {
                    bin = U.subrange(this.BData, code.addr, code.addr + code.length);
                    code.SetMargeMethod(MargeMethod.B);
                }
                else if (e.KeyCode == Keys.D3 || e.KeyCode == Keys.NumPad3)
                {
                    bin = U.subrange(this.CData, code.addr, code.addr + code.length);
                    code.SetMargeMethod(MargeMethod.C);
                }
                else if (e.KeyCode == Keys.D0 || e.KeyCode == Keys.NumPad0)
                {
                    bin = U.subrange(this.CData, code.addr, code.addr + code.length);
                    code.SetMargeMethod(MargeMethod.NONE);
                }
                else
                {
                    return(false);
                }

                if (Program.ROM.Data.Length < code.addr + bin.Length)
                {
                    Program.ROM.write_resize_data(code.addr + (uint)bin.Length);
                }
                Program.ROM.write_range(code.addr, bin, undodata);
            }


            InputFormRef.ShowWriteNotifyAnimation(this, startaddr);
            Program.Undo.Push(undodata);

            if (!e.Shift)
            {//面倒なので操作を逆にする. Shiftが押されていなければ、次へ移動する.
                if (index < this.AddressList.Items.Count)
                {
                    this.AddressList.SelectedIndex = index;
                }
                else
                {
                    this.AddressList.SelectedIndex = this.AddressList.Items.Count - 1;
                }
            }
            this.AddressList.Invalidate();
            UpdateTitle();
            return(true);
        }
        private void AddressList_KeyDown(object sender, KeyEventArgs e)
        {
            if (AddressList_KeyDownWithCtrl(sender, e))
            {
                return;
            }

            int index = this.AddressList.SelectedIndex;

            if (index < 0 || index >= this.ChangeDataList.Count)
            {
                return;
            }
            ChangeDataSt code = this.ChangeDataList[index];

            byte[] bin;
            if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1)
            {
                bin = U.subrange(this.AData, code.addr, code.addr + code.length);
                code.SetMargeMethod(MargeMethod.A);
            }
            else if (e.KeyCode == Keys.D2 || e.KeyCode == Keys.NumPad2)
            {
                bin = U.subrange(this.BData, code.addr, code.addr + code.length);
                code.SetMargeMethod(MargeMethod.B);
            }
            else if (e.KeyCode == Keys.D3 || e.KeyCode == Keys.NumPad3)
            {
                bin = U.subrange(this.CData, code.addr, code.addr + code.length);
                code.SetMargeMethod(MargeMethod.C);
            }
            else if (e.KeyCode == Keys.D0 || e.KeyCode == Keys.NumPad0)
            {
                bin = U.subrange(this.CData, code.addr, code.addr + code.length);
                code.SetMargeMethod(MargeMethod.NONE);
            }
            else if (e.KeyCode == Keys.M)
            {
                code.ToggleMark();
                this.AddressList.InvalidateLine();
                return;
            }
            else if (e.KeyCode == Keys.L)
            {
                MarkListButton_Click(sender, e);
                return;
            }
            else
            {
                return;
            }


            Program.Undo.Push("marge " + U.To0xHexString(code.addr), code.addr, (uint)bin.Length);
            if (Program.ROM.Data.Length < code.addr + bin.Length)
            {
                Program.ROM.write_resize_data(code.addr + (uint)bin.Length);
            }
            Program.ROM.write_range(code.addr, bin);
            InputFormRef.ShowWriteNotifyAnimation(this, code.addr);

            if (!e.Shift)
            {//面倒なので操作を逆にする. Shiftが押されていなければ、次へ移動する.
                if (this.AddressList.SelectedIndex + 1 < this.AddressList.Items.Count)
                {
                    this.AddressList.SelectedIndex++;
                }
                else
                {
                    this.AddressList.SelectedIndex = this.AddressList.Items.Count - 1;
                    this.AddressList.InvalidateLine();
                }
            }
            else
            {
                this.AddressList.InvalidateLine();
            }
            UpdateTitle();
        }