Removed redundant opcodes.py
parent
be39222ff7
commit
f7214a1fe5
98
opcodes.py
98
opcodes.py
|
@ -1,98 +0,0 @@
|
|||
from operator import add, mul, eq, lt
|
||||
import enum
|
||||
|
||||
|
||||
@enum.unique
|
||||
class State(enum.Enum):
|
||||
"""Execution state class."""
|
||||
CONTINUE = 0
|
||||
HALT = 1
|
||||
WAIT = 2
|
||||
|
||||
|
||||
class Opcode:
|
||||
def __init__(self, func, parnum):
|
||||
self.parnum = parnum
|
||||
self.run = func
|
||||
|
||||
|
||||
def operation(operator):
|
||||
"""Make opcode from operator."""
|
||||
def opcode(state, p1, p2, p3):
|
||||
state.memory.write(p3, operator(state.memory.read(p1), state.memory.read(p2)))
|
||||
state.i += 4
|
||||
return State.CONTINUE
|
||||
return Opcode(opcode, 3)
|
||||
|
||||
def jump(flag):
|
||||
def opcode(state, p1, p2):
|
||||
state.i = state.memory.read(p2) if (state.memory.read(p1) > 0)==flag else state.i+3
|
||||
return State.CONTINUE
|
||||
return Opcode(opcode, 2)
|
||||
|
||||
def adjust_base(state, p1):
|
||||
state.rel_base += state.memory.read(p1)
|
||||
state.i += 2
|
||||
return State.CONTINUE
|
||||
|
||||
def input(state, p1):
|
||||
if state.IO.wait_for_input():
|
||||
return State.WAIT
|
||||
state.memory.write(p1, state.IO.input())
|
||||
state.i += 2
|
||||
return State.CONTINUE
|
||||
|
||||
def output(state, p1):
|
||||
state.IO.output(state.memory.read(p1))
|
||||
state.i += 2
|
||||
return State.CONTINUE
|
||||
|
||||
|
||||
op_add = operation(add)
|
||||
|
||||
op_mul = operation(mul)
|
||||
|
||||
op_lt = operation(lt)
|
||||
|
||||
op_eq = operation(eq)
|
||||
|
||||
op_jump_if_true = jump(True)
|
||||
|
||||
op_jump_if_false = jump(False)
|
||||
|
||||
op_adjust_relative_base = Opcode(adjust_base, 1)
|
||||
|
||||
op_input = Opcode(input, 1)
|
||||
|
||||
op_output = Opcode(output, 1)
|
||||
|
||||
op_halt = Opcode(lambda x: State.HALT, 0)
|
||||
|
||||
opcodes = {1 : op_add,
|
||||
2 : op_mul,
|
||||
3 : op_input,
|
||||
4 : op_output,
|
||||
5 : op_jump_if_true,
|
||||
6 : op_jump_if_false,
|
||||
7 : op_lt,
|
||||
8 : op_eq,
|
||||
9 : op_adjust_relative_base,
|
||||
99 : op_halt}
|
||||
|
||||
def parse_op(op):
|
||||
op = str(op)
|
||||
par_modes, op = op[:-2][::-1], int(op[-2:])
|
||||
par_modes = par_modes + '0'*(opcodes[op].parnum - len(par_modes))
|
||||
return op, map(int, par_modes)
|
||||
|
||||
def run_op(state):
|
||||
op, par_modes = parse_op(state.memory.read(state.i))
|
||||
pars = []
|
||||
for pn, mode in enumerate(par_modes, start=1):
|
||||
p = state.i + pn
|
||||
if mode == 0:
|
||||
p = state.memory.read(p)
|
||||
elif mode == 2:
|
||||
p = state.rel_base + state.memory.read(p)
|
||||
pars.append(p)
|
||||
return opcodes[op].run(state, *pars)
|
Loading…
Reference in New Issue