-
Notifications
You must be signed in to change notification settings - Fork 0
/
pass_two.py
237 lines (190 loc) · 5.88 KB
/
pass_two.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# Made By Mohammed Hijazi
from typing import Dict, List
import sys
OPTAB: Dict[str,str] = {}
SYMTAB: Dict[str,str] = {}
DIREC = ["RSUB","WORD","BYTE","RESW","RESB"]
PRGNAME = ""
CODE = []
def read_OPTAB() :
appendix = open("Appendix.txt","r")
for line in appendix:
parts = line.strip().split()
OPTAB[parts[0]] = parts[1]
appendix.close()
print("🚀 OPTAB was Loaded!")
def read_SYMTAB():
sym = open("SymbolTable.txt", "r")
for line in sym:
parts = line.strip().split()
SYMTAB[parts[0]] = parts[1]
sym.close()
print("🚀 SYMTAB was Loaded!")
def open_files():
source = "intermideate.txt"
dest = "output.obj"
if len(sys.argv) > 2 :
source = sys.argv[1]
dest = sys.argv[2]
elif len(sys.argv) == 2 :
source = sys.argv[1]
mdt = open(source,"r")
listing_file = open("ListingFile.txt","w")
obj = open(dest,"w")
mdt.readline()
mdt.readline()
print("intermideate File is: ", source)
print("object File is: ", dest)
return mdt, listing_file, obj
def get_program_length():
END = int(SYMTAB["END"],16)
LEN = hex(END - LOCCTR)
print("🚀 LOCCTR At : ",hex(LOCCTR))
print("🚀 END At : ",hex(END))
print("🚀 Program Lenght is: ",LEN)
return LEN
def read_program_name():
line = mdt.readline()
listing_file.write(f"{line}")
parts = line.strip().split()
if parts[0] not in OPTAB.keys():
obj.write(f"H^{parts[0]}^{extend_number(hex(LOCCTR)[2:],6)}^{extend_number(PRGLGTH[2:],6)}\n")
print("🚀 Program Name is: ", parts[0])
return parts[0]
obj.write(f"H^{PRGNAME}^{hex(LOCCTR)[2:]}^{PRGLGTH[2:]}\n")
return ""
def extend_number(number:str,extent):
if len(number) >= extent:
return number
while len(number) != extent:
number = "0" + number
return number
def subtract(one,two):
one = int(one,16)
two = int(two,16)
return hex(one - two)
def handle_directives(parts,index):
if not listing_file:
return
opcode = parts[index]
if opcode == "RESW" :
listing_file.write("\n")
return
elif opcode == "RESB":
listing_file.write("\n")
elif opcode == "RSUB":
listing_file.write("4C0000\n")
CODE.append("4C0000")
return
elif opcode == "BYTE":
operand = parts[index+1]
val = operand[2:len(operand)-1]
if operand.find("X") != -1:
listing_file.write(f"{val} \n")
CODE.append(val)
elif operand.find("C") != -1:
tmp = ""
for c in val:
hexa = str(hex(ord(c)))
tmp += hexa[2:]
listing_file.write(f"{tmp} \n")
CODE.append(tmp)
elif opcode == "WORD":
operand = str(hex(int(parts[index+1])))
operand = operand[2:]
if len(operand) < 6:
operand = extend_number(operand,6)
listing_file.write(f"{operand} \n")
CODE.append(operand)
def handle_indexed(opcode,operand):
if not listing_file:
return
code = OPTAB[opcode]
address = int(SYMTAB[operand],16)
address += 2**15
hexa = hex(address)[2:]
code += hexa
listing_file.write(code)
CODE.append(code)
def handle_direct(opcode,operand):
if not listing_file:
return
code = OPTAB[opcode]
code += SYMTAB[operand][2:]
listing_file.write(code)
CODE.append(code)
def write_instruction(line:str):
parts = line.strip().split()
if parts[0] == '.':
return
flag = False
if len(parts) <= 5:
line = line.strip()
while len(line) != 50:
line += " "
listing_file.write(line)
else:
flag = True
index = 0
while parts[index] not in OPTAB.keys() and parts[index] not in DIREC:
index += 1
if index == len(parts) and "END" not in parts:
print(f"⚠️ WARNING!! line :{parts[0]} Does not have Opcode or Directive")
return
if index == len(parts):
return
opcode = parts[index]
if flag:
line = line.strip().split(parts[index+2])[0]
while len(line) != 50:
line += " "
listing_file.write(line)
if opcode in DIREC:
handle_directives(parts,index)
return
operand = parts[index+1]
if operand not in SYMTAB.keys():
x = operand.find(",")
if x == -1 or operand[:x] not in SYMTAB.keys():
print(f"⚠️ WARNING!! line :{parts[0]}. SYMBOL: {parts[index+1]} is Not Defined")
return
if operand.find(",") != -1 :
handle_indexed(opcode,operand[:len(operand)-1])
else :
handle_direct(opcode,operand)
listing_file.write("\n")
def to_hex(x):
return hex(x)[2:]
def to_dec(x):
return int(x,16)
def write_headers():
listing_file = open("ListingFile.txt","r")
listing_file.readline()
TMP = ""
LOCCTR2 = int(SYMTAB["START"],16)
for line in listing_file:
parts = line.strip().split()
LOCCTR = int(parts[1],16)
X = LOCCTR - LOCCTR2
if X + 3 > 30 or parts[len(parts)-1] not in CODE or "RESB" in parts or "RESW" in parts:
obj.write(f"T^{extend_number(hex(LOCCTR2)[2:],6)}^{hex(X)[2:]}{extend_number(TMP,6)}\n")
while "RESW" in parts or "RESB" in parts:
line = listing_file.readline()
parts = line.strip().split()
LOCCTR = int(parts[1],16)
LOCCTR2 = LOCCTR
TMP = ""
TMP += f"^{parts[len(parts)-1]}"
obj.write(f"E^{extend_number(SYMTAB['START'],6)}")
mdt, listing_file, obj = open_files()
read_OPTAB()
read_SYMTAB()
LOCCTR = int(SYMTAB["START"], 16)
PRGLGTH = get_program_length()
PRGNAME = read_program_name()
for line in mdt:
write_instruction(line)
listing_file.close()
write_headers()
mdt.close()
# Made By Mohammed Hijazi