Ejemplo n.º 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, "ビルド成功 => 実行可能モジュールが生成される");
        }
Ejemplo n.º 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' のビットの個数");
        }
Ejemplo n.º 3
0
 public void Assemble_MachineInstructions_2x()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       ADDA GR7,#FEDC,GR6",
             "       SUBA GR5,#BA98,GR4",
             "       ADDL GR3,#7654,GR2",
             "       SUBL GR1,#3210,GR7",
             "       ADDA GR1,GR2",
             "       SUBA GR3,GR4",
             "       ADDL GR5,GR6",
             "       SUBL GR7,GR1",
             "       END"),
         WordTest.MakeArray(
             0x2076, 0xFEDC,         // ADDA r,adr,x
             0x2154, 0xBA98,         // SUBA r,adr,x
             0x2232, 0x7654,         // ADDL r,adr,x
             0x2317, 0x3210,         // SUBL r,adr,x
             0x2412,                 // ADDA r1,r2
             0x2534,                 // SUBA r1,r2
             0x2656,                 // ADDL r1,r2
             0x2771),                // SUBL r1,r2
         "オペコードが 2x の機械語命令");
 }
Ejemplo n.º 4
0
 public void GenerateCode()
 {
     Word[] expectedWords = WordTest.MakeArray(0x0000);
     ICodeGeneratorTest.CheckGenerateCode(
         m_target, expectedWords,
         "あどでラベルのアドレスに置き換えるために、値が 0x0000 の語が追加される");
 }
        private void CheckGenerateCode(Int32 value, UInt16 expected, String message)
        {
            HexaDecimalConstant target = new HexaDecimalConstant(value);

            Word[] expectedWords = WordTest.MakeArray(expected);
            ICodeGeneratorTest.CheckGenerateCode(target, expectedWords, message);
        }
Ejemplo n.º 6
0
        public void Execute_UndefinedInstruction()
        {
            Word[] program = WordTest.MakeArray(
                0xff00                  // 未定義命令
                );

            CheckExecute(program, false, "未定義命令で例外が発生する");
        }
Ejemplo n.º 7
0
 public void GenerateCode()
 {
     CheckGenerateCode(
         m_rAdrXOrR1R2_RAdrX, WordTest.MakeArray(0x1012, 0xabcd),
         "r,adr,x or r1,r2 で r,adr,x の場合: opcode=0x10, r/r1=1, x/r2=2, adr=0xabcd");
     CheckGenerateCode(
         m_rAdrXOrR1R2_R1R2, WordTest.MakeArray(0x1434),
         "r,adr,x or r1,r2 で r1,r2 の場合: opcode=0x14, r/r1=3, x/r2=4, adr=なし");
 }
Ejemplo n.º 8
0
        public void Add_Value()
        {
            const Int16 One   = 1;
            const Int16 Two   = 2;
            const Int16 Three = 3;

            CheckAdd_Value(One, WordTest.MakeArray(One), "1 語目");
            CheckAdd_Value(Two, WordTest.MakeArray(One, Two), "2 語目");
            CheckAdd_Value(Three, WordTest.MakeArray(One, Two, Three), "3 語目");
        }
        public void GenerateCode()
        {
            const UInt16 LabelPlaceHolder = 0x0000;

            ICodeGeneratorTest.CheckGenerateCode(
                m_constants,
                WordTest.MakeArray(
                    DecimalValue, HexaDecimalValue, LabelPlaceHolder,
                    AValue, BValue, CValue),
                "それぞれの Constant のコードが順に生成される");
        }
Ejemplo n.º 10
0
 public void Assemble_MachineInstructions_Fx()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       SVC  #ABCD,GR3",
             "       END"),
         WordTest.MakeArray(
             0xF003, 0xABCD),        // CALL adr,x
         "オペコードが Fx の機械語命令");
 }
Ejemplo n.º 11
0
        public void GenerateCode()
        {
            const UInt16    Adr = 0xABCD;
            RegisterOperand DontCareRegister = RegisterOperandTest.GR1;
            RAdrXOperand    target           = RAdrXOperand.MakeForUnitTest(
                DontCareRegister,
                AdrXOperand.MakeForUnitTest(new HexaDecimalConstant(Adr), DontCareRegister));

            Word[] expectedWords = WordTest.MakeArray(Adr);
            ICodeGeneratorTest.CheckGenerateCode(target, expectedWords, "adr の値がコードとして生成される");
        }
Ejemplo n.º 12
0
 public void Assemble_MachineInstructions_0x()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       NOP",
             "       END"),
         WordTest.MakeArray(
             0x0000),                // NOP
         "オペコードが 0x の機械語命令");
 }
Ejemplo n.º 13
0
 public void Assemble_MachineInstructions_8x()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       CALL #9ABC,GR2",
             "       RET",
             "       END"),
         WordTest.MakeArray(
             0x8002, 0x9ABC,         // CALL adr,x
             0x8100),                // RET
         "オペコードが 8x の機械語命令");
 }
Ejemplo n.º 14
0
 public void Assemble_MachineInstructions_7x()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       PUSH #89AB,GR5",
             "       POP  GR6",
             "       END"),
         WordTest.MakeArray(
             0x7005, 0x89AB,         // PUSH adr,x
             0x7160),                // POP  r
         "オペコードが 7x の機械語命令");
 }
Ejemplo n.º 15
0
 public void GenerateCode()
 {
     CheckGenerateCode(
         " !1Aa~",
         WordTest.MakeArray(0x0020, 0x0021, 0x0031, 0x0041, 0x0061, 0x007E),
         "間隔、記号、数字、英大文字、英小文字、7 ビットの最後の文字 '~'");
     CheckGenerateCode(
         @"\¥",
         WordTest.MakeArray(0x005C, 0x005C),
         "バックスラッシュと円記号、JISX0201 だと どちらも 0x005C");
     CheckGenerateCode(
         "。アァ",
         WordTest.MakeArray(0x00A1, 0x00B1, 0x00A7),
         "半角かな");
 }
Ejemplo n.º 16
0
 public void Assemble_MachineInstructions_4x()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       CPA  GR0,#01EF,GR7",
             "       CPL  GR2,#23CD,GR5",
             "       CPA  GR1,GR6",
             "       CPL  GR3,GR4",
             "       END"),
         WordTest.MakeArray(
             0x4007, 0x01EF,         // CPA  r,adr,x
             0x4125, 0x23CD,         // CPL  r,adr,x
             0x4416,                 // CPA  r1,r2
             0x4534),                // CPL  r1,r2
         "オペコードが 4x の機械語命令");
 }
Ejemplo n.º 17
0
 public void Assemble_MachineInstructions_1x()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       LD   GR1,#1234,GR2",
             "       ST   GR3,#2345,GR4",
             "       LAD  GR5,#3456",
             "       LD   GR6,GR7",
             "       END"),
         WordTest.MakeArray(
             0x1012, 0x1234,         // LD   r,adr,x
             0x1134, 0x2345,         // ST   r,adr,x
             0x1250, 0x3456,         // LOD  r,adr,x
             0x1467),                // LD   r1,r2
         "オペコードが 1x の機械語命令");
 }
Ejemplo n.º 18
0
 public void Assemble_MachineInstructions_5x()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       SLA  GR7,#7654,GR6",
             "       SRA  GR5,#5432,GR4",
             "       SLL  GR3,#3210,GR2",
             "       SRL  GR1,#10FE,GR7",
             "       END"),
         WordTest.MakeArray(
             0x5076, 0x7654,         // SLA  r,adr,x
             0x5154, 0x5432,         // SRA  r,adr,x
             0x5232, 0x3210,         // SLL  r,adr,x
             0x5317, 0x10FE),        // SRL  r,adr,x
         "オペコードが 5x の機械語命令");
 }
Ejemplo n.º 19
0
        public void Assemble_GenerateCode()
        {
            CheckGenerateCode(
                TestUtils.MakeArray(
                    "ENTRY  START",
                    "       LD GR6,LBL001,GR7",
                    "LBL001 DC #1234",
                    "       END"),
                WordTest.MakeArray(
                    0x1067,             // OP: 0x10, r/r1: 6, x/r2: 7 => 0x1067
                    0x0000,             // あとで LBL001 のアドレスを入れるための場所取り
                    0x1234),            // DC で指定した 16 進定数の値
                "再配置可能モジュールにコードとラベル情報が生成される");

            CheckGenerateCode(
                TestUtils.MakeArray(
                    "ENTRY  START",
                    "LBL001 DC -9876",
                    "LBL002 DC #2468",
                    "LBL003 DC 'ABCアイウ'",
                    "LBL004 DC LBL002",
                    "       END"),
                WordTest.MakeArray(
                    0xD96c,             // -9876 => 0xD96C
                    0x2468,             // #2468 => 0x2468
                    0x0041,             // 'A' => 0x0041
                    0x0042,             // 'B' => 0x0042
                    0x0043,             // 'C' => 0x0043
                    0x00B1,             // 'ア' => 0x00B1
                    0x00B2,             // 'イ' => 0x00B2
                    0x00B3,             // 'ウ' => 0x00B3
                    0x0000),            //  あとで LBL002 のアドレスを入れるための場所取り
                "10 進定数, 16 進定数, 文字定数, アドレス定数のそれぞれの定数のコード生成");

            CheckGenerateCode(
                TestUtils.MakeArray(
                    "ENTRY  START",
                    "       LD GR1,=#2468",
                    "       END"),
                WordTest.MakeArray(
                    0x1010,             // OP: 0x10, r/r1: 1, x/r2: 0 => 0x1010
                    0x0000,             // あとでリテラルのアドレスを入れるための場所取り
                    0x2468),            // 16 進定数 #2468 の値
                "リテラルの値を定義する DC 命令が作成されコードが生成される");
        }
Ejemplo n.º 20
0
        public void Execute_CallingSuperVisor()
        {
            Word[] program = WordTest.MakeArray(
                0xF000, 0x2468,         // 0000:        SVC     #2468
                0x8100                  // 0002:        RET
                );

            CheckExecute(program, true, "SVC 命令で CallingSuperVisor イベントが発生する");

            String expected = TestLogger.ExpectedLog(
                "OnCallingSuperVisor: Operand=9320 (0x2468)",
                "OnReturingFromSubroutine: SP: 0 (0x0000)",
                "    Setting e.Cancel to \"True\"");
            String actual = m_logger.Log;

            Assert.AreEqual(
                expected, actual,
                "e.Operand に SVC 命令のオペランドの値が格納される");
        }
Ejemplo n.º 21
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, "各再配置可能モジュールの語が結合される");
        }
Ejemplo n.º 22
0
        public void GenerateCode()
        {
            ProgramLine instructionLine = ProgramLine.Parse(" LD GR1,GR2");

            CheckGenerateCode(
                instructionLine, WordTest.MakeArray(0x1412),
                "命令行 => その命令のコードを生成する");

            ProgramLine commentLine = ProgramLine.Parse("; コメント行");

            CheckGenerateCode(
                commentLine, WordTest.MakeArray(),
                "コメント行 => コードを生成しない");

            ProgramLine errorLine = ProgramLine.Parse(" 未定義命令");

            CheckGenerateCode(
                errorLine, WordTest.MakeArray(),
                "エラー行 => コードを生成しない");
        }
Ejemplo n.º 23
0
 public void Assemble_MachineInstructions_6x()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       JMI  #1111,GR2",
             "       JNZ  #2222,GR3",
             "       JZE  #3333,GR4",
             "       JUMP #4444,GR5",
             "       JPL  #5555,GR6",
             "       JOV  #6666,GR7",
             "       END"),
         WordTest.MakeArray(
             0x6102, 0x1111,         // JMI  adr,x
             0x6203, 0x2222,         // JNZ  adr,x
             0x6304, 0x3333,         // JZE  adr,x
             0x6405, 0x4444,         // JUMP adr,x
             0x6506, 0x5555,         // JPL  adr,x
             0x6607, 0x6666),        // JOV  adr,x
         "オペコードが 6x の機械語命令");
 }
Ejemplo n.º 24
0
 public void Assemble_MachineInstructions_3x()
 {
     CheckGenerateCode(
         TestUtils.MakeArray(
             "ENTRY  START",
             "       AND  GR1,#1357,GR3",
             "       OR   GR5,#9BDF,GR7",
             "       XOR  GR2,#2468,GR4",
             "       AND  GR0,GR2",
             "       OR   GR4,GR6",
             "       XOR  GR3,GR5",
             "       END"),
         WordTest.MakeArray(
             0x3013, 0x1357,         // AND  r,adr,x
             0x3157, 0x9BDF,         // OR   r,adr,x
             0x3224, 0x2468,         // XOR  r,adr,x
             0x3402,                 // AND  r1,r2
             0x3546,                 // OR   r1,r2
             0x3635),                // XOR  r1,r2
         "オペコードが 3x の機械語命令");
 }
Ejemplo n.º 25
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");
        }
Ejemplo n.º 26
0
        public void Execute_ReturingFromSubroutine()
        {
            Word[] program = WordTest.MakeArray(
                0x8000, 0x0003,         // 0000:        CALL    SUB
                0x8100,                 // 0002:        RET
                0x8100                  // 0003: SUB    RET
                );
            // 2 回目の RET で実行を終了する。
            m_cancelData = new TestData <Boolean>(false, true);

            CheckExecute(program, true, "RET 命令で ReturingFromSubroutine イベントが発生する");

            String expected = TestLogger.ExpectedLog(
                "OnReturingFromSubroutine: SP: 65535 (0xffff)",
                "    Setting e.Cancel to \"False\"",
                "OnReturingFromSubroutine: SP: 0 (0x0000)",
                "    Setting e.Cancel to \"True\"");
            String actual = m_logger.Log;

            Assert.AreEqual(
                expected, actual,
                "e.Cancel=False ならば実行を継続し、e.Cancel=True ならば実行を終了する");
        }
Ejemplo n.º 27
0
 private void CheckGenerateCode(AdrXOperand target, UInt16 expected, String message)
 {
     Word[] expectedWords = WordTest.MakeArray(expected);
     ICodeGeneratorTest.CheckGenerateCode(target, expectedWords, message);
 }