mirror of
https://github.com/fadden/6502bench.git
synced 2025-01-21 21:32:09 +00:00
fac2d6a51f
We were failing to update properly when a label changed if the label was one that a plugin cared about. The problem is that a label add/remove operation skips the code analysis, and a label edit skips everything but the display update. Plugins only run during the code analysis pass, so changes weren't being reflected in the display list until something caused it to refresh. The solution is to ask the plugin if the label being changed is one that it cares about. This allows the plugin to use the same wildcard-match logic that it uses elsewhere. For efficiency, and to reduce clutter in plugins that don't care about symbols, a new interface class has been created to handle the "here are the symbols" call and the "do you care about this label" call. The program in Examples/Scripts has been updated to show a very simple single-call plugin and a slightly more complex multi-call plugin.
98 lines
4.1 KiB
C#
98 lines
4.1 KiB
C#
// Copyright 2019 faddenSoft. All Rights Reserved.
|
|
// See the LICENSE.txt file for distribution terms (Apache 2.0).
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
using PluginCommon;
|
|
|
|
namespace RuntimeData.Test2022 {
|
|
public class Test2022B : MarshalByRefObject, IPlugin, IPlugin_InlineBrk {
|
|
private IApplication mAppRef;
|
|
private byte[] mFileData;
|
|
private AddressTranslate mAddrTrans;
|
|
|
|
public string Identifier {
|
|
get {
|
|
return "Test 2022-extension-scripts B";
|
|
}
|
|
}
|
|
|
|
public void Prepare(IApplication appRef, byte[] fileData, AddressTranslate addrTrans) {
|
|
mAppRef = appRef;
|
|
mFileData = fileData;
|
|
mAddrTrans = addrTrans;
|
|
|
|
mAppRef.DebugLog("Test2022-B(id=" + AppDomain.CurrentDomain.Id + "): prepare()");
|
|
}
|
|
|
|
public void CheckBrk(int offset, bool twoByteBrk, out bool noContinue) {
|
|
noContinue = true;
|
|
|
|
// need BRK, function byte, and two-byte address
|
|
if (!Util.IsInBounds(mFileData, offset, 4)) {
|
|
return;
|
|
}
|
|
byte func = mFileData[offset + 1];
|
|
if (func < 0x01 || func > 0x02) {
|
|
return;
|
|
}
|
|
|
|
Util.FormatBrkByte(mAppRef, twoByteBrk, offset, DataSubType.Hex, null);
|
|
mAppRef.SetInlineDataFormat(offset + 2, 2, DataType.NumericLE,
|
|
DataSubType.Address, null);
|
|
noContinue = false;
|
|
|
|
int structAddr = Util.GetWord(mFileData, offset + 2, 2, false);
|
|
int structOff = mAddrTrans.AddressToOffset(offset, structAddr);
|
|
if (structOff < 0) {
|
|
mAppRef.DebugLog("Unable to get offset for address $" + structAddr.ToString("x6"));
|
|
return;
|
|
}
|
|
|
|
switch (func) {
|
|
case 0x01:
|
|
if (!Util.IsInBounds(mFileData, structOff, 27)) {
|
|
mAppRef.DebugLog("Struct doesn't fit in file");
|
|
return;
|
|
}
|
|
mAppRef.SetInlineDataFormat(structOff + 0, 2, DataType.NumericLE,
|
|
DataSubType.Decimal, null);
|
|
mAppRef.SetInlineDataFormat(structOff + 2, 2, DataType.NumericBE,
|
|
DataSubType.Hex, null);
|
|
mAppRef.SetInlineDataFormat(structOff + 4, 4, DataType.NumericLE,
|
|
DataSubType.Hex, null);
|
|
mAppRef.SetInlineDataFormat(structOff + 8, 4, DataType.NumericBE,
|
|
DataSubType.Hex, null);
|
|
mAppRef.SetInlineDataFormat(structOff + 12, 1, DataType.NumericLE,
|
|
DataSubType.Ascii, null);
|
|
mAppRef.SetInlineDataFormat(structOff + 13, 1, DataType.NumericLE,
|
|
DataSubType.HighAscii, null);
|
|
mAppRef.SetInlineDataFormat(structOff + 14, 8, DataType.StringDci,
|
|
DataSubType.Ascii, null);
|
|
mAppRef.SetInlineDataFormat(structOff + 22, 3, DataType.NumericLE,
|
|
DataSubType.Address, null);
|
|
mAppRef.SetInlineDataFormat(structOff + 25, 2, DataType.NumericLE,
|
|
DataSubType.Symbol, "data02");
|
|
break;
|
|
case 0x02:
|
|
if (!Util.IsInBounds(mFileData, structOff, 2)) {
|
|
mAppRef.DebugLog("Struct doesn't fit in file");
|
|
return;
|
|
}
|
|
mAppRef.SetInlineDataFormat(structOff, 2, DataType.NumericLE,
|
|
DataSubType.Address, null);
|
|
int nextAddr = Util.GetWord(mFileData, structOff + 2, 2, false);
|
|
int nextOff = mAddrTrans.AddressToOffset(structOff, nextAddr);
|
|
if (!Util.IsInBounds(mFileData, nextOff, 1)) {
|
|
mAppRef.DebugLog("Struct doesn't fit in file");
|
|
return;
|
|
}
|
|
mAppRef.SetInlineDataFormat(nextOff, 8, DataType.StringGeneric,
|
|
DataSubType.HighAscii, null);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|