-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimple.py
More file actions
146 lines (138 loc) · 5.65 KB
/
simple.py
File metadata and controls
146 lines (138 loc) · 5.65 KB
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
"""
Syntax:
[x, y, x], where:
x = opcode
y = address
z = flag
opcodes:
0 => HALT
Halts execution and returns specified status code
1 => GOTO
Sets memory index as specified
2 => PRINT
Prints specified value to Console
3 => SET
Sets Clipboard value to specified address
4 => LOAD
Loads specified value to clipboard
5 => ADD
Adds specified value to clipboard
6 => IF
If the clipboard value = 0, goto specified address, else continue as normal
flags:
0 => Absolute
1 => Relative
2 => Clipboard
3 => Value
Examples:
[3, y, 2] => Set clipboard value to current index
[4, 5, 3] => Load value 5 to clipboard
[2, -3, 1] => Print value at memory address 3 left of current
[0, 10, 0] => Halt, returning value at address 10 as status code
"""
class Machine:
def __init__(self, memory_size=1024):
self.memory = []
self.address = 0
self.clipboard = 0
for i in range(0, memory_size):
self.memory.append(0)
def run(self, address=0):
self.address == address
while "True":
opcode = self.memory[self.address]
if opcode == 0: # HALT
if self.memory[self.address + 2] == 0:
return self.memory[self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 1:
return self.memory[self.address + self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 2:
return self.clipboard
else:
return self.memory[self.address + 1]
elif opcode == 1: # GOTO
if self.memory[self.address + 2] == 0:
self.address = self.memory[self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 1:
self.address = self.memory[self.address + self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 2:
self.address = self.clipboard
else:
self.address = self.memory[self.address + 1]
continue
elif opcode == 2: # PRINT
if self.memory[self.address + 2] == 0:
print(self.memory[self.memory[self.address + 1]])
elif self.memory[self.address + 2] == 1:
print(self.memory[self.address + self.memory[self.address + 1]])
elif self.memory[self.address + 2] == 2:
print(self.clipboard)
else:
print(self.memory[self.address + 1])
elif opcode == 3: # SET
if self.memory[self.address + 2] == 0:
self.memory[self.memory[self.address + 1]] = self.clipboard
elif self.memory[self.address + 2] == 1:
self.memory[self.address + self.memory[self.address + 1]] = self.clipboard
elif self.memory[self.address + 2] == 2:
self.memory[self.clipboard] = self.clipboard
else:
self.memory[self.address] = self.clipboard
elif opcode == 4: # LOAD
if self.memory[self.address + 2] == 0:
self.clipboard = self.memory[self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 1:
self.clipboard = self.memory[self.address + self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 2:
self.clipboard = self.clipboard
else:
self.clipboard = self.memory[self.address + 1]
elif opcode == 5: # ADD
if self.memory[self.address + 2] == 0:
self.clipboard += self.memory[self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 1:
self.clipboard += self.memory[self.address + self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 2:
self.clipboard += self.clipboard
else:
self.clipboard += self.memory[self.address + 1]
elif opcode == 6: # IF
if self.clipboard == 0:
if self.memory[self.address + 2] == 0:
self.address = self.memory[self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 1:
self.address = self.memory[self.address + self.memory[self.address + 1]]
elif self.memory[self.address + 2] == 2:
self.address = self.clipboard
else:
self.address = self.memory[self.address + 1]
continue
else:
return -1
self.address += 3
def load(self, start=0, stack=[0]):
for address in range(start, start + len(stack)):
self.memory[address] = stack[address - start]
"""
#Uncomment this block for a simple example of how to program the machine.
#The following code counts from 0 to 10 in an infinite loop.
machine = Machine()
machine.load(0, [
4, 1, 3,
3, 101, 0,
4, 100, 0,
5, 101, 0,
3, 100, 0,
2, 100, 0,
6, 39, 3,
5, -10, 3,
6, 30, 3,
1, 6, 3,
4, -1, 3,
3, 101, 0,
1, 6, 3,
4, 1, 3,
3, 101, 0,
1, 27, 3])
print(machine.run())
"""