|
1
|
|
|
import os |
|
2
|
|
|
import struct |
|
3
|
|
|
|
|
4
|
|
|
|
|
5
|
|
|
def source_reader(path: str) -> str: |
|
6
|
|
|
""" Reads source code |
|
7
|
|
|
|
|
8
|
|
|
:param path: string pointing to source code file location |
|
9
|
|
|
:return: source code |
|
10
|
|
|
""" |
|
11
|
|
|
if not os.path.isfile(path): |
|
12
|
|
|
raise FileNotFoundError |
|
13
|
|
|
else: |
|
14
|
|
|
with open(path, 'r') as file: |
|
15
|
|
|
source = file.read() |
|
16
|
|
|
|
|
17
|
|
|
return source |
|
18
|
|
|
|
|
19
|
|
|
|
|
20
|
|
|
def output_writer(path: str, header: list, object_dict: dict, mode: str): |
|
21
|
|
|
""" Writes compiled program |
|
22
|
|
|
|
|
23
|
|
|
:param path: output file path |
|
24
|
|
|
:param header: a list containing order of writing |
|
25
|
|
|
:param object_dict: dictionary containing bytes |
|
26
|
|
|
:param mode: switch between binary writing ('b') or textual writing ('t') |
|
27
|
|
|
""" |
|
28
|
|
|
if mode == 'b': |
|
29
|
|
|
with open(path, 'wb+') as output: |
|
30
|
|
|
for memory_location in header: |
|
31
|
|
|
output.write(object_dict[memory_location]) |
|
32
|
|
|
elif mode == 't': |
|
33
|
|
|
with open(path, 'w+') as output: |
|
34
|
|
|
for memory_location in header: |
|
35
|
|
|
integer = struct.unpack('>i', object_dict[memory_location]) |
|
36
|
|
|
integer = integer[0] |
|
37
|
|
|
output.write(dec2bin(integer, 16) + '\n') |
|
38
|
|
|
|
|
39
|
|
|
|
|
40
|
|
|
def dec2bin(decimal, bits) -> str: |
|
41
|
|
|
""" Converts a decimal number to it's 2nd complement binary representation |
|
42
|
|
|
|
|
43
|
|
|
:param decimal: decimal to be converted |
|
44
|
|
|
:param bits: number of bits for binary representation |
|
45
|
|
|
:return: string containing binary representation of decimal number |
|
46
|
|
|
""" |
|
47
|
|
|
binary = bin(decimal & int("1" * bits, 2))[2:] |
|
48
|
|
|
return ("{0:0>%s}" % bits).format(binary) |
|
49
|
|
|
|