Beispiel #1
0
        private LabelReference(Label referringLabel, MemoryOffset wordOffset)
        {
            ArgChecker.CheckNotNull(referringLabel, nameof(referringLabel));

            m_referringLabel = referringLabel;
            m_wordOffset     = wordOffset;
        }
        private void CheckAssignAbsAddress(
            UInt16 relOffsetValue, UInt16 baseAddressValue,
            Boolean success, UInt16 expectedAbsAddressValue, String message)
        {
            Label           label  = new Label("LBL001");
            LabelDefinition target = new LabelDefinition(label);

            MemoryOffset relOffset = new MemoryOffset(relOffsetValue);

            target.SetRelOffset(relOffset);

            MemoryAddress baseAddress = new MemoryAddress(baseAddressValue);

            try
            {
                target.AssignAbsAddress(baseAddress);
                Assert.IsTrue(success, message);

                MemoryAddress expectedAbsAddress = new MemoryAddress(expectedAbsAddressValue);
                MemoryAddress actualAbsAddress   = target.AbsAddress;
                MemoryAddressTest.Check(expectedAbsAddress, actualAbsAddress, message);
            }
            catch (Casl2SimulatorException)
            {
                Assert.IsFalse(success, message);
            }
        }
Beispiel #3
0
        public void AddReferenceWord()
        {
            Word word1 = new Word(0x1234);
            Word word2 = new Word(0x5678);

            m_relModule.AddWord(word1);
            m_relModule.AddWord(word2);
            MemoryOffset wordOffset = new MemoryOffset(2);

            m_relModule.AddReferenceWord(m_label);

            IEnumerable <Word> actualWords = m_relModule.Words;

            Word[] expectedWords = TestUtils.MakeArray(word1, word2, Word.Zero);
            TestUtils.CheckEnumerable(
                expectedWords, actualWords,
                "語のコレクションに、リンク時にラベルのアドレスと置き換わる値が 0 の語が追加される");

            Int32 labelRefsCount = m_relModule.LabelRefs.Count();

            Assert.AreEqual(1, labelRefsCount, "ラベル参照のコレクションに、ラベルへの参照が 1 つ追加される");

            LabelReference expectedLabelRef = LabelReference.MakeForUnitTest(m_label, wordOffset);
            LabelReference actualLabelRef   = m_relModule.LabelRefs.First();

            LabelReferenceTest.Check(
                expectedLabelRef, actualLabelRef,
                "ラベルへの参照には、参照するラベルとそのラベルのアドレスが入る語のオフセットが記録される");
        }
        private void CheckGetOffset(UInt16 expectedValue, String message)
        {
            MemoryOffset expectedOffset = new MemoryOffset(expectedValue);
            MemoryOffset actualOffset   = m_words.GetOffset();

            MemoryOffsetTest.Check(expectedOffset, actualOffset, message);
        }
Beispiel #5
0
        /// <summary>
        /// ラベルへの参照を作成します。指定の語のコレクションに、参照するラベルのアドレスが入る場所を確保するため
        /// 値が 0 の語を追加します。
        /// </summary>
        /// <param name="referringLabel">参照するラベルです。</param>
        /// <param name="words">参照するラベルのアドレスが入る語を追加する語のコレクションです。</param>
        /// <returns>作成したラベルへの参照を返します。</returns>
        internal static LabelReference Make(Label referringLabel, WordCollection words)
        {
            MemoryOffset wordOffset = words.GetOffset();

            words.Add(PlaceHolder);
            return(new LabelReference(referringLabel, wordOffset));
        }
Beispiel #6
0
 internal void SetLabelOffset(LabelTable lblTable, MemoryOffset offset)
 {
     if (m_label != null)
     {
         LabelDefinition labelDef = lblTable.GetDefinitionFor(m_label);
         labelDef.SetRelOffset(offset);
     }
 }
Beispiel #7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Mov"/> class.
 /// </summary>
 /// <param name="destination">The destination register.</param>
 /// <param name="source">The source memory offset.</param>
 public Mov(RegisterOperand destination, MemoryOffset source)
     : this((Operand)destination, (Operand)source)
 {
     #region Contract
     Contract.Requires <ArgumentNullException>(destination != null);
     Contract.Requires <ArgumentNullException>(source != null);
     #endregion
 }
        private void CheckIndexer_Index(
            WordCollection words, UInt16 ui16Index, Boolean success, String message)
        {
            MemoryOffset index = new MemoryOffset(ui16Index);

            CheckGetIndexer_Index(words, index, success, message);
            CheckSetIndexer_Index(words, index, success, message);
        }
        internal static LabelDefinition Make(String name, UInt16 relOffsetValue, UInt16 absAddressValue)
        {
            Label         label      = new Label(name);
            MemoryOffset  relOffset  = new MemoryOffset(relOffsetValue);
            MemoryAddress absAddress = new MemoryAddress(absAddressValue);

            return(LabelDefinition.MakeForUnitTest(label, relOffset, absAddress));
        }
Beispiel #10
0
        public FunctionHook <T> CreateHook <T>(MemoryOffset offset, string name, T hook)
            where T : Delegate
        {
            var address  = Memory.ToAddress(offset);
            var original = Marshal.GetDelegateForFunctionPointer <T>(address);
            var fh       = new FunctionHook <T>(address, name, original, hook);

            _hooks.Add(fh);

            return(fh);
        }
 private void CheckSetIndexer_Index(
     WordCollection words, MemoryOffset index, Boolean success, String message)
 {
     try
     {
         words[index] = Word.Zero;
         Assert.IsTrue(success, message);
     }
     catch (Casl2SimulatorException)
     {
         Assert.IsFalse(success, message);
     }
 }
        public void Indexer_Value()
        {
            MemoryOffset Index = MemoryOffset.Zero;

            m_words.Add(Word.Zero);

            Word wordSet = new Word(0x1234);

            m_words[Index] = wordSet;

            Word wordGot = m_words[Index];

            WordTest.Check(wordSet, wordGot, "設定した値が取得できる");
        }
Beispiel #13
0
        private static IEnumerable <ProgramLine> SetLabelOffset(
            this IEnumerable <ProgramLine> lines, LabelTable lblTable)
        {
            MemoryOffset offset = MemoryOffset.Zero;

            foreach (ProgramLine line in lines)
            {
                line.SetLabelOffset(lblTable, offset);
                Int32 wordCount = line.GetCodeWordCount();
                offset = offset.Add(wordCount);
            }

            return(lines);
        }
Beispiel #14
0
 internal Word this[MemoryOffset offset]
 {
     get
     {
         UInt16 index = offset.Value;
         CheckIndex(index);
         return(m_wordList[index]);
     }
     set
     {
         UInt16 index = offset.Value;
         CheckIndex(index);
         m_wordList[index] = value;
     }
 }
Beispiel #15
0
 public MemoryOffsetEditor(MemoryOffset offset) : this()
 {
     descriptionTextBox.Text = offset.Description;
     addressTextBox.Text     = offset.MemoryOffsetAddress.ToString("X");
     if (offset.OffsetType == OffsetType.IntPointer)
     {
         intPointerRadioButton.Checked = true;
     }
     else if (offset.OffsetType == OffsetType.LongPointer)
     {
         longPointerRadioButton.Checked = true;
     }
     else
     {
         absoluteOffsetRadioButton.Checked = true;
     }
 }
Beispiel #16
0
        public void SetLabelOffset()
        {
            ProgramLine instructionLine = ProgramLine.Parse("LBL001 LD GR1,GR2");
            LabelTable  lblTable        = new LabelTable();

            instructionLine.RegisterLabel(lblTable);

            MemoryOffset offsetSet = new MemoryOffset(0xABCD);

            instructionLine.SetLabelOffset(lblTable, offsetSet);

            LabelDefinition labelDef  = lblTable.GetDefinitionFor(instructionLine.Label);
            MemoryOffset    offsetGot = labelDef.RelOffset;

            MemoryOffsetTest.Check(
                offsetSet, offsetGot, "SetLabelOffset() で設定したラベルのオフセットが取得できる");
        }
        private void CheckAdd(
            UInt16 value, Int32 addend, Boolean success, UInt16 expectedValue, String message)
        {
            MemoryOffset target = new MemoryOffset(value);

            try
            {
                MemoryOffset actual = target.Add(addend);
                Assert.IsTrue(success, message);

                MemoryOffset expected = new MemoryOffset(expectedValue);
                Check(expected, actual, message);
            }
            catch (Casl2SimulatorException)
            {
                Assert.IsFalse(success, message);
            }
        }
Beispiel #18
0
 public ProcessManager(Process p, MemoryOffset memoryOffset, RulesConfig config, int pollIntervall)
 {
     _process = p;
     if (memoryOffset.OffsetType == OffsetType.IntPointer)
     {
         _baseMemoryOffset = p.Read <int>(new IntPtr(memoryOffset.MemoryOffsetAddress));
     }
     else if (memoryOffset.OffsetType == OffsetType.LongPointer)
     {
         _baseMemoryOffset = p.Read <long>(new IntPtr(memoryOffset.MemoryOffsetAddress));
     }
     else
     {
         _baseMemoryOffset = memoryOffset.MemoryOffsetAddress;
     }
     _config        = config;
     _pollIntervall = pollIntervall;
     _nextConfig    = null;
 }
        public void ResolveExecStartAddress()
        {
            EntryPoint    registeredEntryPoint       = Make("EXESTRT", "REGED");
            EntryPoint    unregisteredEntryPoint     = Make("NOTDEF", "UNREGED");
            MemoryAddress registeredExecStartAddress = new MemoryAddress(0x1234);
            MemoryAddress DontCareAddress            = MemoryAddress.Zero;
            MemoryOffset  DontCareOffset             = MemoryOffset.Zero;

            LabelDefinition labelDef = LabelDefinition.MakeForUnitTest(
                registeredEntryPoint.ExecStartLabel, DontCareOffset, registeredExecStartAddress);

            m_lblTable.RegisterForUnitTest(labelDef);

            CheckResolveExecStartAddress(
                registeredEntryPoint, true, registeredExecStartAddress,
                "実行開始ラベルが LabelTable に登録されている => 実行開始アドレスが解決され設定される");
            CheckResolveExecStartAddress(
                unregisteredEntryPoint, false, DontCareAddress,
                "実行開始ラベルが LabelTable に登録されていない => 例外");
        }
Beispiel #20
0
        public void ResolveReferringAddress()
        {
            LabelAddressResolver labelAddrResolver = LabelAddressResolverTest.Make();
            const UInt16         LabelAddress      = 0x2468;
            LabelDefinition      labelDef          = LabelDefinitionTest.Make("LBL001", 0, LabelAddress);

            labelAddrResolver.LabelTable.RegisterForUnitTest(labelDef);

            const Int32    WordCount   = 4;
            WordCollection actualWords = WordCollectionTest.MakeWords(WordCount);
            MemoryOffset   wordOffset  = new MemoryOffset(1);
            LabelReference labelRef    = LabelReference.MakeForUnitTest(labelDef.Label, wordOffset);

            labelRef.ResolveReferringAddress(labelAddrResolver, actualWords);

            WordCollection expectedWords = WordCollectionTest.MakeWords(WordCount);

            expectedWords[wordOffset] = new Word(LabelAddress);
            TestUtils.CheckEnumerable(
                expectedWords, actualWords,
                "ラベルを参照する語の値がそのラベルのアドレスに置き換えられる");
        }
Beispiel #21
0
        public void Make()
        {
            Label          referringLabel = new Label("LBL001");
            WordCollection actualWords    = new WordCollection();

            // actualWords に 1 語追加して、語のオフセットを初期値の 0 以外の値にする。
            MemoryOffset wordOffset = new MemoryOffset(1);
            Word         addedWord  = new Word(0x55AA);

            actualWords.Add(addedWord);

            LabelReference actualLabelRef = LabelReference.Make(referringLabel, actualWords);

            Word[] expectedWords = TestUtils.MakeArray(addedWord, Word.Zero);
            TestUtils.CheckEnumerable(
                expectedWords, actualWords,
                "オブジェクトコードに、参照するラベルのアドレスを入れる場所として、値が 0 の語が追加される");

            LabelReference expectedLabelRef = LabelReference.MakeForUnitTest(referringLabel, wordOffset);

            Check(
                expectedLabelRef, actualLabelRef,
                "作成された labelRef には、参照するラベルとそのアドレスを入れるオフセットが入る");
        }
Beispiel #22
0
        private MemoryAddress AddOffset(MemoryAddress address, UInt16 offsetValue)
        {
            MemoryOffset offset = new MemoryOffset(offsetValue);

            return(address.Add(offset));
        }
 private LabelDefinition(Label label, MemoryOffset relOffset, MemoryAddress absAddress)
 {
     m_label      = label;
     m_relOffset  = relOffset;
     m_absAddress = absAddress;
 }
 /// <summary>
 /// 定義したラベルの再配置可能モジュール内のオフセットを設定します。
 /// </summary>
 /// <param name="relOffset">設定する再配置可能モジュール内のオフセットです。</param>
 internal void SetRelOffset(MemoryOffset relOffset)
 {
     m_relOffset = relOffset;
 }
Beispiel #25
0
 internal static LabelReference MakeForUnitTest(Label referringLabel, MemoryOffset wordOffset)
 {
     return(new LabelReference(referringLabel, wordOffset));
 }
 internal static LabelDefinition MakeForUnitTest(
     Label label, MemoryOffset relOffset, MemoryAddress absAddress)
 {
     return(new LabelDefinition(label, relOffset, absAddress));
 }
 internal static void Check(MemoryOffset expected, MemoryOffset actual, String message)
 {
     Assert.AreEqual(expected.Value, actual.Value, "Value: " + message);
 }