public void WillBeAbleToCreateEachOpCode(OpCodeItem opCode) { var addressMode = addressModeFactory.Create(opCode.Mode); addressMode.Should().NotBeNull(); addressMode.Name.Should().Be(opCode.Mode); }
/// <summary> /// Add a library inherited from <see>IMuftecClassLibrary</see> /// </summary> /// <param name="classLibrary">Class containing opcodes</param> public void AddLibrary(IMuftecClassLibrary classLibrary) { // Ignore if already loaded if (_libraryList.Contains(classLibrary)) return; // Get all opcode methods var methods = classLibrary.Classes.SelectMany(t => t.GetMethods()).Where(m => m.GetCustomAttributes(typeof(OpCodeAttribute), false).Length > 0); // Add opcodes to index foreach (var info in methods) { var code = info.GetCustomAttributes(typeof(OpCodeAttribute), false).FirstOrDefault() as OpCodeAttribute; if (code != null) { var opc = (OpCodePointer)Delegate.CreateDelegate(typeof(OpCodePointer), info); var opi = new OpCodeItem {Attribute = code, Pointer = opc}; try { AddOpToCache(opi); } catch (ArgumentException) { // OpCode already exists, ignore if (!Shared.IsDebug()) continue; } } Console.WriteLine(); } // Add fixed defines to index foreach (var def in classLibrary.Defines) { if (_globalDefineList.ContainsKey(def.Key)) { _globalDefineList[def.Key] = def.Value; } else { _globalDefineList.Add(def.Key, def.Value); } } // Add to library list _libraryList.Add(classLibrary); }
/// <summary> /// Add an opcode to the cache. /// </summary> /// <param name="pointer">Opcode pointer to add.</param> private void AddOpToCache(OpCodePointer pointer) { var newItem = new OpCodeItem { Pointer = pointer, Attribute = pointer.Method.GetCustomAttributes(typeof(OpCodeAttribute), false).FirstOrDefault() as OpCodeAttribute }; AddOpToCache(newItem); }
/// <summary> /// Add an opcode to the cache. /// </summary> /// <param name="item">Opcode item to add.</param> private void AddOpToCache(OpCodeItem item) { _opcodeCache.Add(item.Attribute.OpCodeName, item); if (item.Attribute.Aliases != null) { foreach (var alias in item.Attribute.Aliases) { _opcodeCache.Add(alias, item); } } }
public void WillConvertToOpCodeCorrectly(OpCodeItem expectedOpCode) { var opCodes = opCodeReader.GetAll(); opCodes.Should().ContainEquivalentOf(expectedOpCode); }
public void CanReturnOpCodeByAddress(OpCodeItem opCode) { var returnedOpCode = opCodeReader.Get(opCode.Value); returnedOpCode.Should().BeEquivalentTo(opCode); }