-
Notifications
You must be signed in to change notification settings - Fork 0
/
assembler.py
64 lines (64 loc) · 1.9 KB
/
assembler.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
at=[
'Add 3 3 3',
'Output 0 3',
'Jump 0 3',
'1'
]
def setdp():
pass#Delete this
def con():
import re
global lt
lt=[]
for i in at:
lp = False
try:
tp = int(re.split(r' ', i)[0])
except ValueError:
lp = True
if lp:
lt.append(tuple(re.split(r' ', i)))
else:
lt.append(int(re.split(r' ', i)[0]))
def loop(iac):
if len(lt[iac]) == 4:
if lt[iac][0] == 'Add':
lt[int(lt[iac][1])] = (lt[int(lt[iac][2])] + lt[int(lt[iac][3])])
elif lt[iac][0] == 'And':
lt[int(lt[iac][1])] = (int(lt[int(lt[iac][2])] and lt[int(lt[iac][3])]))
elif lt[iac][0] == 'Or':
lt[int(lt[iac][1])] = (int(lt[int(lt[iac][2])] or lt[int(lt[iac][3])]))
elif lt[iac][0] == 'Xor':
lt[int(lt[iac][1])] = (int(int(lt[int(lt[iac][2])]) + int(lt[int(lt[iac][3])]) == 1))
else:
raise Exception()
elif len(lt[iac]) == 3:
if lt[iac][0] == 'Isneg':
lt[int(lt[iac][1])]=(lt[int(lt[iac][2])] < 0)
elif lt[iac][0] == 'Iszero':
lt[int(lt[iac][1])]=(lt[int(lt[iac][2])] == 0)
elif lt[iac][0] == 'Jump':
iac = lt[iac][1] if lt[int(lt[iac][2])] else iac
elif lt[iac][0] == 'Output':
print(lt[iac][1]+":"+lt[int(lt[iac][2])])
elif lt[iac][0] == 'Input':
lt[int(lt[iac][1])] = datapins[int(lt[iac][2])]
elif lt[iac][0] == 'Isnot':
lt[int(lt[iac][1])] = (int(not lt[int(lt[iac][2])]))
else:
raise Exception()
elif len(lt[iac]) == 1:
if lt[iac][0] == 'Halt':
raise Exception('HALT!!!')
else:
raise Exception()
iac+=1
return None
def init():
datapins=[]*(2**32)
setdp()
con()
iac=0
init()
while True:
loop(iac)