Beispiel #1
0
        public static void WriteEA(string EA, uint freearea, uint org_sp, Undo.UndoData undodata, SymbolUtil.DebugSymbol storeSymbol)
        {
            string output;
            string symbol;
            bool   r;

            try
            {
                r = MainFormUtil.CompilerEventAssembler(EA, freearea, org_sp, out output, out symbol);
            }
            catch (Win32Exception e)
            {
                r      = false;
                symbol = "";
                output = R._("プロセスを実行できません。\r\nfilename:{0}\r\n{1}", EA, e.ToString());
            }
            if (!r)
            {
                throw new PatchForm.PatchException(output);
            }

            r = Program.ROM.SwapNewROMData(File.ReadAllBytes(output)
                                           , "event_assembler", undodata);
            if (!r)
            {
                throw new PatchForm.PatchException(R.Notify("変更をユーザーが取り消しました"));
            }
            SymbolUtil.ProcessSymbol(EA, symbol, storeSymbol, 0);

            //EAの結果作成したROMを消します. 残すとROMがPATCHディレクトリに残るのでいろいろよろしくない.
            File.Delete(output);
        }
        private void RunButton_Click(object sender, EventArgs e)
        {
            this.ComplieBinFilename = "";
            string fullpath = this.SRCFilename.Text;

            if (!File.Exists(fullpath))
            {
                R.ShowStopError(("ファイルがありません。\r\nファイル名:{0}"), fullpath);
                return;
            }

            string result;
            string symbol;
            bool   r = MainFormUtil.Compile(fullpath, out result, out symbol, IsSaveElf());

            if (r == false)
            {
                R.ShowStopError("エラーが返されました。\r\n{0}", result);
                return;
            }

            this.ComplieBinFilename = result;
            if (this.Method.SelectedIndex == 0)
            {
                SymbolUtil.ProcessSymbol(fullpath, symbol, GetPlanOfDebugSymbol(), 0);

                //ROMに書き込まない場合、成果物を選択しよう.
                U.SelectFileByExplorer(result, false);
                return;
            }

            uint addr = U.toOffset((uint)this.Address.Value);

            if (!U.CheckZeroAddressWrite(addr))
            {
                return;
            }
            if (!U.isSafetyOffset(addr))
            {
                if (addr != Program.ROM.Data.Length)
                {
                    R.ShowStopError("無効なポインタです。\r\nこの設定は危険です。");
                    return;
                }
            }

            if (!File.Exists(result))
            {
                R.ShowStopError("ファイルがありません。\r\nファイル名:{0}", result);
                return;
            }
            byte[] bin = File.ReadAllBytes(result);
            if (bin.Length <= 0)
            {
                R.ShowStopError("ファイルがゼロバイトです。\r\nファイル名:{0}", result);
                return;
            }
            if (bin.Length > 1024 * 10)
            {
                DialogResult dr = R.ShowNoYes("このファイルは {0}バイトも書き換えますが、本当によろしいですか?\r\n\r\n(ORG指定を間違って利用していませんか?)\r\nファイル名:{1}", bin.Length, result);
                if (dr != System.Windows.Forms.DialogResult.Yes)
                {
                    return;
                }
            }

            Undo.UndoData undodata = Program.Undo.NewUndoData(this);
            if (this.Method.SelectedIndex == 1)
            {
                uint newlength = addr + (uint)bin.Length;
                if (!U.isSafetyOffset(newlength))
                {
                    Program.ROM.write_resize_data(newlength);
                }
                Program.ROM.write_range(addr, bin, undodata);
                Program.CommentCache.RemoveRange(addr, addr + (uint)bin.Length);
                SymbolUtil.ProcessSymbol(fullpath, symbol, GetPlanOfDebugSymbol(), addr);
            }
            else
            {
                uint freeaddr = U.toOffset((uint)this.FREEAREA.Value);
                if (!U.CheckZeroAddressWrite(freeaddr))
                {
                    return;
                }
                //フックに利用する場所
                undodata.list.Add(new Undo.UndoPostion(addr, 2 * 4));

                uint endaddr = freeaddr + (uint)bin.Length;
                undodata.list.Add(new Undo.UndoPostion(freeaddr, (uint)bin.Length));

                if (endaddr > Program.ROM.Data.Length)
                {//長さが増える場合、ROMを増設する.
                    Program.ROM.write_resize_data(endaddr);
                }
                Program.ROM.write_range(freeaddr, bin);
                uint usereg = GetSaftyRegister();

                byte[] jumpCode = DisassemblerTrumb.MakeInjectJump(addr, freeaddr, usereg);
                Program.ROM.write_range(addr, jumpCode, undodata);

                Program.CommentCache.RemoveRange(freeaddr, freeaddr + (uint)bin.Length);
                SymbolUtil.ProcessSymbol(fullpath, symbol, GetPlanOfDebugSymbol(), freeaddr);
            }
            Program.Undo.Push(undodata);
            InputFormRef.ShowWriteNotifyAnimation(this, addr);

            this.UndoButton.Show();
        }