Example #1
0
        public static draw_font_enum SearchDrawFontPatch(ROM rom)
        {
            PatchTableSt[] table = new PatchTableSt[] {
                new PatchTableSt {
                    name = "DrawSingle", ver = "FE7J", addr = 0x56e2, data = new byte[] { 0x00, 0x00, 0x00, 0x49, 0x8F, 0x46 }
                },
                new PatchTableSt {
                    name = "DrawSingle", ver = "FE8J", addr = 0x40c2, data = new byte[] { 0x00, 0x00, 0x00, 0x49, 0x8F, 0x46 }
                },
                new PatchTableSt {
                    name = "DrawMulti", ver = "FE7U", addr = 0x5BD6, data = new byte[] { 0x00, 0x00, 0x00, 0x4B, 0x9F, 0x46 }
                },
                new PatchTableSt {
                    name = "DrawMulti", ver = "FE8U", addr = 0x44D2, data = new byte[] { 0x00, 0x00, 0x00, 0x49, 0x8F, 0x46 }
                },
                new PatchTableSt {
                    name = "DrawUTF8", ver = "FE7U", addr = 0x5B6A, data = new byte[] { 0x00, 0x00, 0x00, 0x4B, 0x18, 0x47 }
                },
                new PatchTableSt {
                    name = "DrawUTF8", ver = "FE8U", addr = 0x44D2, data = new byte[] { 0x00, 0x00, 0x00, 0x4B, 0x18, 0x47 }
                },
            };

            string version = rom.RomInfo.VersionToFilename();

            foreach (PatchTableSt t in table)
            {
                if (t.ver != version)
                {
                    continue;
                }

                //チェック開始アドレス
                byte[] data = rom.getBinaryData(t.addr, t.data.Length);
                if (U.memcmp(t.data, data) != 0)
                {
                    continue;
                }
                if (t.name == "DrawSingle")
                {
                    return(draw_font_enum.DrawSingleByte);
                }
                if (t.name == "DrawMulti")
                {
                    return(draw_font_enum.DrawMultiByte);
                }
                if (t.name == "DrawUTF8")
                {
                    return(draw_font_enum.DrawUTF8);
                }
            }
            return(draw_font_enum.NO);
        }
Example #2
0
        public OneCode DisAseemble(byte[] data, uint startaddr)
        {
            OneCode code     = new OneCode();
            uint    leftsize = ((uint)data.Length) - startaddr;

            for (int i = 0; i < Scripts.Length; i++)
            {
                if (leftsize < Scripts[i].Size)
                {//長さが足りないのだから、マッチするわけない.
                    continue;
                }

                //マッチテスト
                int pos = 0;
                int n   = 0;
                for ( ; n < Scripts[i].Args.Length; n++)
                {
                    if (Scripts[i].Args[n].Type == ArgType.ArgType_FIXED)
                    {
                        int m = 0;
                        for ( ; m < Scripts[i].Args[n].Size; m++)
                        {
                            if (data[startaddr + pos] != Scripts[i].Data[pos])
                            {
                                break;
                            }
                            pos++;
                        }
                        if (m < Scripts[i].Args[n].Size)
                        { //途中で不一致があった
                            break;
                        }
                    }
                    else
                    { //変数
                        pos += Scripts[i].Args[n].Size;
                    }
                }
                if (n >= Scripts[i].Args.Length)
                {//マッチ
                    code.ByteData    = ROM.getBinaryData(data, startaddr, (uint)Scripts[i].Size);
                    code.Script      = Scripts[i];
                    code.JisageCount = 0;
                    return(code);
                }
            }

            //見つからない不明な命令.
            code.ByteData    = ROM.getBinaryData(data, startaddr, (uint)this.Unknown.Size);
            code.Script      = this.Unknown;
            code.JisageCount = 0;
            return(code);
        }
        private void ApplyButton_Click(object sender, EventArgs e)
        {
            if (InputFormRef.IsPleaseWaitDialog(this))
            {//2重割り込み禁止
                return;
            }

            string errorMessage = MainFormUtil.CheckOrignalROM(OrignalFilename.Text);

            if (errorMessage != "")
            {
                R.ShowStopError("無改造ROMを指定してください。" + "\r\n" + errorMessage);
                OrignalFilename.ErrorMessage = R._("無改造ROMを指定してください。" + "\r\n" + errorMessage);
                return;
            }
            OrignalFilename.ErrorMessage = "";

            ROM    rom = new ROM();
            string version;
            bool   r = rom.Load(OrignalFilename.Text, out version);

            if (!r)
            {
                R.ShowStopError("未対応のROMです。\r\ngame version={0}", version);
                return;
            }

            Undo.UndoData undodata = Program.Undo.NewUndoData(this);
            byte[]        bin      = rom.getBinaryData(0, 0x100);
            Program.ROM.write_range(0, bin, undodata);
            Program.Undo.Push(undodata);
            R.ShowOK("ROMヘッダーを復旧させました");

            this.DialogResult = System.Windows.Forms.DialogResult.OK;
            this.Close();
        }