1
0
mirror of https://github.com/fadden/6502bench.git synced 2024-08-13 12:29:01 +00:00
6502bench/SourceGen/RuntimeData/Apple/GSOS.cs
Andy McFadden fac2d6a51f Invoke extension scripts when labels they care about change
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.
2019-10-13 18:32:53 -07:00

95 lines
3.3 KiB
C#

/*
* Copyright 2018 faddenSoft
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using PluginCommon;
/*
# inline_entry equ $e100a8
# jsl inline_entry
# dc i2'callnum'
# dc i4'parmblock'
# bcs error
# stack_entry equ $e100b0
# pea parmblock|-16
# pea parmblock
# pea callnum
# jsl stack_entry
# bcs error
*/
namespace RuntimeData.Apple {
public class GSOS : MarshalByRefObject, IPlugin, IPlugin_SymbolList, IPlugin_InlineJsl {
private const string GSOS_FUNC_TAG = "AppleIIgs-GSOS-Functions"; // tag used in .sym65 file
private bool VERBOSE = false;
private IApplication mAppRef;
private byte[] mFileData;
private Dictionary<int, PlSymbol> mFunctionList;
public string Identifier {
get {
return "Apple IIgs GS/OS call handler";
}
}
public void Prepare(IApplication appRef, byte[] fileData, AddressTranslate addrTrans) {
mAppRef = appRef;
mFileData = fileData;
mAppRef.DebugLog("GSOS(id=" + AppDomain.CurrentDomain.Id + "): prepare()");
//System.Diagnostics.Debugger.Break();
}
public void UpdateSymbolList(List<PlSymbol> plSyms) {
// Extract the list of function name constants from the platform symbol file.
mFunctionList = PlSymbol.GeneratePlatformValueList(plSyms, GSOS_FUNC_TAG, mAppRef);
}
public bool IsLabelSignificant(string beforeLabel, string afterLabel) {
return false;
}
public void CheckJsl(int offset, out bool noContinue) {
noContinue = false;
if (offset + 7 < mFileData.Length && mFileData[offset + 1] == 0xa8 &&
mFileData[offset + 2] == 0x00 && mFileData[offset + 3] == 0xe1) {
// match!
int req = Util.GetWord(mFileData, offset + 4, 2, false);
if (VERBOSE) {
int addr = Util.GetWord(mFileData, offset + 6, 4, false);
mAppRef.DebugLog("GSOS call detected at +" + offset.ToString("x6") +
", cmd=$" + req.ToString("x4") + " addr=$" + addr.ToString("x6"));
}
PlSymbol sym;
if (mFunctionList.TryGetValue(req, out sym)) {
mAppRef.SetInlineDataFormat(offset + 4, 2, DataType.NumericLE,
DataSubType.Symbol, sym.Label);
} else {
mAppRef.SetInlineDataFormat(offset + 4, 2, DataType.NumericLE,
DataSubType.None, null);
}
mAppRef.SetInlineDataFormat(offset + 6, 4, DataType.NumericLE,
DataSubType.Address, null);
}
}
}
}