RAM = {}
ROM = {}
IP = 0
HALT = False
BREAK = False
STEP = False
STACK = []
ERR_UNDERFLOW = ValueError("Stack underflow occured.")

def Get(addr):
	global RAM
	global STACK
	if addr < 0:
		if (-addr - 1) < len(STACK):
			return STACK[-addr - 1]
		else:
			return 0
	elif addr in RAM:
		return RAM[addr]
	else:
		return 0

def Set(addr, value):
	global RAM
	global STACK
	if addr < 0:
		while (-addr - 1) >= len(STACK):
			STACK += [0]
		STACK[-addr - 1] = value
	else:
		RAM[addr] = value

def Execute():
	global ROM
	global IP
	global HALT
	global BREAK
	global STEP

	BREAK = False
	while not HALT:
		if not IP in ROM:
			raise ValueError("Instruction pointer is out of bounds.")
		ROM[IP]()
		IP += 1
		if STEP or BREAK:
			return

SP = 0

