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); }
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(); }