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, "ビルド成功 => 実行可能モジュールが生成される"); }
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 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 の機械語命令"); }
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); }
public void Execute_UndefinedInstruction() { Word[] program = WordTest.MakeArray( 0xff00 // 未定義命令 ); CheckExecute(program, false, "未定義命令で例外が発生する"); }
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=なし"); }
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 のコードが順に生成される"); }
public void Assemble_MachineInstructions_Fx() { CheckGenerateCode( TestUtils.MakeArray( "ENTRY START", " SVC #ABCD,GR3", " END"), WordTest.MakeArray( 0xF003, 0xABCD), // CALL adr,x "オペコードが Fx の機械語命令"); }
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 の値がコードとして生成される"); }
public void Assemble_MachineInstructions_0x() { CheckGenerateCode( TestUtils.MakeArray( "ENTRY START", " NOP", " END"), WordTest.MakeArray( 0x0000), // NOP "オペコードが 0x の機械語命令"); }
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 の機械語命令"); }
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 の機械語命令"); }
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), "半角かな"); }
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 の機械語命令"); }
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 の機械語命令"); }
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 の機械語命令"); }
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 命令が作成されコードが生成される"); }
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 命令のオペランドの値が格納される"); }
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, "各再配置可能モジュールの語が結合される"); }
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(), "エラー行 => コードを生成しない"); }
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 の機械語命令"); }
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 の機械語命令"); }
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"); }
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 ならば実行を終了する"); }
private void CheckGenerateCode(AdrXOperand target, UInt16 expected, String message) { Word[] expectedWords = WordTest.MakeArray(expected); ICodeGeneratorTest.CheckGenerateCode(target, expectedWords, message); }