Exemple #1
0
        public void Build_Success()
        {
            Casl2Program subProgram = Casl2Program.MakeForUnitTest(
                "SUB",
                TestUtils.MakeArray(
                    "ADDSUB  START",
                    "        ADDA  GR1,GR2",
                    "        RET",
                    "        END"));
            Casl2Program mainProgram = Casl2Program.MakeForUnitTest(
                "MAIN",
                TestUtils.MakeArray(
                    "MAIN    START",
                    "        CALL  ADDSUB",
                    "        RET",
                    "        END"));
            Casl2Project project = Casl2Project.MakeForUnitTest(subProgram, mainProgram);

            project.Programs.SelectItem(mainProgram);

            MemoryAddress expectedLoadAddress      = MemoryAddress.Zero;
            MemoryAddress expectedExecStartAddress = new MemoryAddress(2);

            Word[] expectedWords = WordTest.MakeArray(
                // Sub
                0x2412,                     //         ADDA  GR1,GR2
                0x8100,                     //         RET
                // Main
                0x8000, 0x0000,             //         CALL  ADDSUB
                0x8100);                    //         RET
            ExecutableModule expected =
                new ExecutableModule(expectedLoadAddress, expectedExecStartAddress, expectedWords);

            CheckBuild(project, expected, "ビルド成功 => 実行可能モジュールが生成される");
        }
Exemple #2
0
        public void Execute()
        {
            Word[] program = WordTest.MakeArray(
                // 処理: GR1 中の '1' のビットの個数を数える。
                // 出力: GR0: GR1 中の '1' のビットの個数。
                0x1010, 0x000F,         // 0000:        LD      GR1,DATA,0  ;
                0x2522,                 // 0002:        SUBA    GR2,GR2     ; Count = 0
                0x3411,                 // 0003:        AND     GR1,GR1     ; 全部のビットが '0'?
                0x6300, 0x000D,         // 0004:        JZE     RETURN      ; 全部のビットが '0' なら終了
                0x1222, 0x0001,         // 0006: MORE   LAD     GR2,1,GR2   ; Count = Count + 1
                0x1201, 0xffff,         // 0008:        LAD     GR0,-1,GR1  ; 最下位の '1' のビット 1 個を
                0x3410,                 // 000A:        AND     GR1,GR0     ;   '0' に変える。
                0x6200, 0x0006,         // 000B:        JNZ     MORE        ; '1' のビットが残っていれば繰返し
                0x1402,                 // 000D: RETURN LD      GR0,GR2     ; GR0 = Count
                0x8100,                 // 000E:        RET                 ; 呼び出しプログラムへ戻る。
                0x1234                  // 000F: DATA   DC      0x1234      ; 0001 0010 0011 0100 => '1' は 5 つ
                );
            ExecutableModule exeModule = new ExecutableModule(LoadAddress, StartAddress, program);

            CheckExecute(exeModule, true, "指定の実行可能モジュールを実行する");

            const UInt16 Expected   = 5;
            Word         actualWord = m_cpu.RegisterSet.GR[0].Value;

            WordTest.Check(actualWord, Expected, "GR0: GR1 中の '1' のビットの個数");
        }
        public void Link_LoadAddress()
        {
            ExecutableModule exeModule = Linker.Link(m_relModules);
            MemoryAddress    expected  = MemoryAddress.Zero;
            MemoryAddress    actual    = exeModule.LoadAddress;

            MemoryAddressTest.Check(expected, actual, "LoadAddress は 0 番地");
        }
Exemple #4
0
 internal static void Check(ExecutableModule expected, ExecutableModule actual, String message)
 {
     MemoryAddressTest.Check(
         expected.LoadAddress, actual.LoadAddress, "LoadAddress: " + message);
     MemoryAddressTest.Check(
         expected.ExecStartAddress, actual.ExecStartAddress, "ExecStartAddress: " + message);
     TestUtils.CheckEnumerable(
         expected.Words, actual.Words, "Words: " + message);
 }
        public void Link_ExecStartAddress()
        {
            ExecutableModule exeModule = Linker.Link(m_relModules);

            MemoryAddress expected = new MemoryAddress(MAIN_Address);
            MemoryAddress actual   = exeModule.ExecStartAddress;

            MemoryAddressTest.Check(
                expected, actual,
                "選択された再配置可能モジュールの実行開始アドレスが実行可能モジュールに設定される");
        }
Exemple #6
0
 private void CheckExecute(ExecutableModule exeModule, Boolean success, String message)
 {
     try
     {
         m_os.Execute(exeModule);
         Assert.IsTrue(success, message);
     }
     catch (Casl2SimulatorException)
     {
         Assert.IsFalse(success, message);
     }
 }
Exemple #7
0
 private void CheckBuild(Casl2Project project, ExecutableModule expected, String message)
 {
     try
     {
         ExecutableModule actual = project.Build();
         Assert.IsNotNull(expected, message);
         ExecutableModuleTest.Check(expected, actual, message);
     }
     catch (Casl2SimulatorException)
     {
         Assert.IsNull(expected, message);
     }
 }
        public void Link_RegisterEntryPoints()
        {
            ExecutableModule notUsed = Linker.Link(m_relModules);

            EntryPoint[] expected = TestUtils.MakeArray(
                EntryPointTest.Make("ADD1234", "SUB", ADD1234_Address),
                EntryPointTest.Make("MAIN", "MAIN", MAIN_Address));
            EntryPointTable          entryPointTable = Linker.EntryPointTableForUnitTest;
            IEnumerable <EntryPoint> actual          = entryPointTable.EntryPoints;

            TestUtils.CheckEnumerable(
                expected, actual, EntryPointTest.Check,
                "各再配置可能モジュールの EntryPoint にアドレスが設定され、EntryPointTable に登録される");
        }
Exemple #9
0
        /// <summary>
        /// 指定の実行可能モジュールを CPU で実行します。
        /// </summary>
        /// <param name="exeModule">CPU で実行する実行可能モジュールです。</param>
        internal void Execute(ExecutableModule exeModule)
        {
            SetupMemory(exeModule);
            SetupRegisterSet(exeModule.ExecStartAddress);

            try
            {
                AddHandlers();
                m_cpu.Execute();
            }
            finally
            {
                RemoveHandlers();
            }
        }
Exemple #10
0
        public void Link_AssignLabelAddress()
        {
            ExecutableModule notUsed = Linker.Link(m_relModules);

            CheckAssignedLabelAddress(
                TestUtils.MakeArray(
                    LabelDefinitionTest.Make("SUB", 0x0000, SUB_Address),
                    LabelDefinitionTest.Make("ADDEND", 0x0000, ADDEND_Address),
                    LabelDefinitionTest.Make("ADD1234", 0x0001, ADD1234_Address)),
                m_subRelModule, "SUB プログラムのラベル");
            CheckAssignedLabelAddress(
                TestUtils.MakeArray(
                    LabelDefinitionTest.Make("MAIN", 0x0000, MAIN_Address),
                    LabelDefinitionTest.Make("LBL101", 0x0000, LBL101_Address),
                    LabelDefinitionTest.Make("LTRL0001", 0x0005, LTRL0001_Address)),
                m_mainRelModule, "MAIN プログラムのラベル。'=3456' のリテラルのラベルが生成される");
        }
Exemple #11
0
        public void Link_LinkedWords()
        {
            ExecutableModule exeModule = Linker.Link(m_relModules);

            Word[] expected = WordTest.MakeArray(
                // Sub
                0x1234,                     // ADDEND     DC    #1234
                0x2010, ADDEND_Address,     // ADD1234    ADDA  GR1,ADDEND
                0x8100,                     //            RET
                // Main
                0x1010, LTRL0001_Address,   // LBL101    LD    GR1,=3456
                0x8000, ADD1234_Address,    //           CALL  SUB
                0x8100,                     //           RET
                3456);                      // LTRL0001  DC    3456
            IEnumerable <Word> actual = exeModule.Words;

            TestUtils.CheckEnumerable(
                expected, actual, "各再配置可能モジュールの語が結合される");
        }
Exemple #12
0
        public void Link_ResolveLabelReferences()
        {
            ExecutableModule notUsed = Linker.Link(m_relModules);

            Word[] expectedSubWords = WordTest.MakeArray(
                0x1234,                     // ADDEND     DC    #1234
                0x2010, ADDEND_Address,     // ADD1234    ADDA  GR1,ADDEND
                0x8100);                    //            RET
            IEnumerable <Word> actualSubWords = m_subRelModule.Words;

            TestUtils.CheckEnumerable(
                expectedSubWords, actualSubWords, "ラベルを参照する語にラベルのアドレスが入る: Sub");

            Word[] expectedMainWords = WordTest.MakeArray(
                0x1010, LTRL0001_Address,   // LBL101    LD    GR1,=3456
                0x8000, ADD1234_Address,    //           CALL  SUB
                0x8100,                     //           RET
                3456);                      // LTRL0001  DC    3456
            IEnumerable <Word> actualMainWords = m_mainRelModule.Words;

            TestUtils.CheckEnumerable(
                expectedMainWords, actualMainWords, "ラベルを参照する語にラベルのアドレスが入る: Main");
        }
Exemple #13
0
 private void SetupMemory(ExecutableModule exeModule)
 {
     // メモリをクリアし、実行するプログラムを書き込む。
     m_memory.Clear();
     m_memory.WriteRange(exeModule.LoadAddress, exeModule.Words);
 }