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 Link_LoadAddress() { ExecutableModule exeModule = Linker.Link(m_relModules); MemoryAddress expected = MemoryAddress.Zero; MemoryAddress actual = exeModule.LoadAddress; MemoryAddressTest.Check(expected, actual, "LoadAddress は 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, "選択された再配置可能モジュールの実行開始アドレスが実行可能モジュールに設定される"); }
private void CheckExecute(ExecutableModule exeModule, Boolean success, String message) { try { m_os.Execute(exeModule); Assert.IsTrue(success, message); } catch (Casl2SimulatorException) { Assert.IsFalse(success, message); } }
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 に登録される"); }
/// <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(); } }
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' のリテラルのラベルが生成される"); }
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 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"); }
private void SetupMemory(ExecutableModule exeModule) { // メモリをクリアし、実行するプログラムを書き込む。 m_memory.Clear(); m_memory.WriteRange(exeModule.LoadAddress, exeModule.Words); }