예제 #1
0
 def test_orig(self):
     words = ".ORIG x3000".split()
     result = process_pseudo_ops(words, self.state)
     self.assertEqual(result, Result.FOUND)
     output = produce_output(self.state.swap, self.state.memory,
                             self.state.pc, self.state.orig)
     self.assertEqual(output, b'\x30\x00')
예제 #2
0
    def test_jsr_and_ldr(self):
        words_1 = "JSR FOO".split()
        words_2 = "HALT".split()
        words_3 = "HALT".split()
        words_4 = "FOO LDR R4, R2, x5".split()

        result = process_instr(words_1, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_instr(words_2, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_instr(words_3, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_label(words_4, self.state)
        self.assertEqual(result, Result.FOUND)

        link_labels_def_to_labels_usage(self.state.labels_usage_address,
                                        self.state.labels_def_address,
                                        self.state.memory)
        output = produce_output(self.state.swap, self.state.memory,
                                self.state.pc, self.state.orig)

        self.assertEqual(output.hex()[4:8], '4802')
        self.assertEqual(output.hex()[8:12], output.hex()[12:16], 'f025')
        self.assertEqual(output.hex()[16:20], '6885')
예제 #3
0
 def test_stringz_1(self):
     words = ".STRINGZ \"Sunday\"".split()
     result = process_pseudo_ops(words, self.state)
     self.assertEqual(result, Result.FOUND)
     output = produce_output(self.state.swap, self.state.memory,
                             self.state.pc, self.state.orig)
     self.assertEqual(output.hex()[4:], '00530075006e0064006100790000')
예제 #4
0
    def test_fill_3_label_usage(self):
        self.test_orig()
        words_1 = "LD R1, N".split()
        words_2 = "AND R0, R0, #0".split()
        words_3 = "ADD R0, R0, R1".split()
        words_4 = "N .FILL x5".split()

        result = process_instr(words_1, self.state)
        self.assertEqual(result, Result.FOUND)
        label_usage_address = self.state.labels_usage_address['N'][0][0]
        self.assertEqual(label_usage_address, 0x3000)

        result = process_instr(words_2, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_instr(words_3, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_pseudo_ops(words_4, self.state)
        self.assertEqual(result, Result.FOUND)
        label_def = self.state.memory[self.state.labels_def_address['N']]
        self.assertEqual(label_def, 0x5)

        link_labels_def_to_labels_usage(self.state.labels_usage_address,
                                        self.state.labels_def_address,
                                        self.state.memory)
        output = produce_output(self.state.swap, self.state.memory,
                                self.state.pc, self.state.orig)
        self.assertEqual(output.hex()[4:8], '2202')
예제 #5
0
    def test_br_and_ret(self):
        words_1 = "BRnp FOO".split()
        words_2 = "HALT".split()
        words_3 = "FOO AND R3, R0, #14".split()
        words_4 = "RET".split()

        result = process_instr(words_1, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_instr(words_2, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_label(words_3, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_instr(words_4, self.state)
        self.assertEqual(result, Result.FOUND)

        link_labels_def_to_labels_usage(self.state.labels_usage_address,
                                        self.state.labels_def_address,
                                        self.state.memory)

        output = produce_output(self.state.swap, self.state.memory,
                                self.state.pc, self.state.orig)
        self.assertEqual(output.hex()[4:8], '0a01')
        self.assertEqual(output.hex()[8:12], 'f025')
        self.assertEqual(output.hex()[12:16], '562e')
        self.assertEqual(output.hex()[16:20], 'c1c0')
예제 #6
0
 def test_and_2(self):
     words = "AND R3, R0, #14".split()
     result = process_instr(words, self.state)
     self.assertEqual(result, Result.FOUND)
     output = produce_output(self.state.swap, self.state.memory,
                             self.state.pc, self.state.orig)
     self.assertEqual(output.hex()[4:8], '562e')
예제 #7
0
 def test_add_2(self):
     words = "ADD R0, R1, x5".split()
     result = process_instr(words, self.state)
     self.assertEqual(result, Result.FOUND)
     output = produce_output(self.state.swap, self.state.memory,
                             self.state.pc, self.state.orig)
     self.assertEqual(output.hex()[4:8], '1065')
예제 #8
0
    def test_blkw_1(self):
        words = ".BLKW #2".split()
        result = process_pseudo_ops(words, self.state)
        self.assertEqual(result, Result.FOUND)

        output = produce_output(self.state.swap, self.state.memory,
                                self.state.pc, self.state.orig)
        self.assertEqual(output.hex()[4:], '00000000')
예제 #9
0
    def test_putsp(self):
        words_1 = "PUTSP".split()

        result = process_instr(words_1, self.state)
        self.assertEqual(result, Result.FOUND)

        output = produce_output(self.state.swap, self.state.memory,
                                self.state.pc, self.state.orig)
        self.assertEqual(output.hex()[4:8], 'f024')
예제 #10
0
    def test_str(self):
        words_1 = "STR R2, R1, #5".split()

        result = process_instr(words_1, self.state)
        self.assertEqual(result, Result.FOUND)

        output = produce_output(self.state.swap, self.state.memory,
                                self.state.pc, self.state.orig)
        self.assertEqual(output.hex()[4:8], '7445')
예제 #11
0
    def test_jsrr(self):
        words_1 = "JSRR R2".split()

        result = process_instr(words_1, self.state)
        self.assertEqual(result, Result.FOUND)

        output = produce_output(self.state.swap, self.state.memory,
                                self.state.pc, self.state.orig)
        self.assertEqual(output.hex()[4:8] , '2080')
예제 #12
0
 def test_fill_1(self):
     self.test_orig() #start from x3000
     words = ".FILL x5".split()
     result = process_pseudo_ops(words, self.state)
     self.assertEqual(result, Result.FOUND)
     self.assertEqual(self.state.pc, 0x3001)
     output = produce_output(self.state.swap, self.state.memory,
                             self.state.pc, self.state.orig)
     self.assertEqual(output, b'\x30\x00\x00\x05')
예제 #13
0
 def test_fill_2_label(self):
     self.test_orig()
     words = "N .FILL #5".split()
     result = process_pseudo_ops(words, self.state)
     self.assertEqual(result, Result.FOUND)
     self.assertEqual(self.state.pc, 0x3001)
     self.assertEqual(self.state.labels_def_address['N'], 0x3000)
     output = produce_output(self.state.swap, self.state.memory,
                             self.state.pc, self.state.orig)
     self.assertEqual(output.hex(), '30000005')
예제 #14
0
    def work_with_label(self, words_1, hex_output_result):
        words_2 = "HALT".split()
        words_3 = "FOO .FILL xFF".split()

        result = process_instr(words_1, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_instr(words_2, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_pseudo_ops(words_3, self.state)
        self.assertEqual(result, Result.FOUND)

        link_labels_def_to_labels_usage(self.state.labels_usage_address,
                                        self.state.labels_def_address,
                                        self.state.memory)

        output = produce_output(self.state.swap, self.state.memory,
                                self.state.pc, self.state.orig)
        self.assertEqual(output.hex()[4:8], hex_output_result)
        self.assertEqual(output.hex()[8:12], 'f025')
        self.assertEqual(output.hex()[12:16], '00ff')
예제 #15
0
    def test_stringz_3_label_usage(self):
        self.test_orig()
        words_1 = "LEA R3, N".split()
        words_2 = "HALT".split()
        words_3 = "N .STRINGZ \"Sunday\"".split()

        result = process_instr(words_1, self.state)
        self.assertEqual(result, Result.FOUND)
        label_usage_address = self.state.labels_usage_address['N'][0][0]
        self.assertEqual(label_usage_address, 0x3000)

        result = process_instr(words_2, self.state)
        self.assertEqual(result, Result.FOUND)

        result = process_pseudo_ops(words_3, self.state)
        self.assertEqual(result, Result.FOUND)

        link_labels_def_to_labels_usage(self.state.labels_usage_address,
                                        self.state.labels_def_address,
                                        self.state.memory)

        output = produce_output(self.state.swap, self.state.memory,
                                self.state.pc, self.state.orig)
        self.assertEqual(output.hex()[4:8], 'e601')