78 lines
1.8 KiB
Python
78 lines
1.8 KiB
Python
mem = [0]*1000
|
|
reg = [0]*10
|
|
iReg = 0
|
|
pReg = 0
|
|
|
|
def loadProgram(file):
|
|
global mem, reg, iReg, pReg
|
|
fil = open(file,'r')
|
|
first = True
|
|
lineno = 0
|
|
while True:
|
|
line = fil.readline()
|
|
lineno += 1
|
|
if line == '':
|
|
break
|
|
fids = line.split()
|
|
try:
|
|
address = int(fids[0])
|
|
instruc = int(fids[1])
|
|
if first:
|
|
pReg = address
|
|
first = False
|
|
mem[address] = instruc
|
|
except:
|
|
print(f'File {file} line {lineno} has error')
|
|
pass
|
|
fil.close
|
|
|
|
def cycle():
|
|
global mem, reg, iReg, pReg
|
|
|
|
iReg = mem[pReg]
|
|
pReg = pReg + 1
|
|
|
|
opcode = (iReg//10000)
|
|
r = (iReg//1000) % 10
|
|
addr = (iReg) % 1000
|
|
|
|
if opcode == 0:
|
|
return False
|
|
elif opcode == 1: # mov1 Rx Ay
|
|
reg[r] = mem[addr]
|
|
elif opcode == 2: # mov2 Ay Rx
|
|
mem[addr] = reg[r]
|
|
elif opcode == 3: # mov3 Rx n
|
|
reg[r] = addr
|
|
elif opcode == 4: # mov4 Rx (Ry)
|
|
reg[r] = mem[reg[addr]]
|
|
elif opcode == 5: # add Rx Ry
|
|
reg[r] = reg[r] + reg[addr]
|
|
elif opcode == 6: # sub Rx Ry
|
|
reg[r] = reg[r] - reg[addr]
|
|
elif opcode == 7: # mul Rx Ry
|
|
reg[r] = reg[r] * reg[addr]
|
|
elif opcode == 8: # div Rx Ry
|
|
reg[r] = reg[r] // reg[addr]
|
|
elif opcode == 10: # jmp Ax
|
|
pReg = addr
|
|
elif opcode == 11: # jz Rx Ay
|
|
if reg[r] == 0:
|
|
pReg = addr
|
|
else:
|
|
print(f'Unknow opcode {opcode}')
|
|
return True
|
|
|
|
def run(file):
|
|
global mem, reg, iReg, pReg
|
|
|
|
loadProgram(file)
|
|
|
|
while True:
|
|
if not cycle():
|
|
break
|
|
|
|
run('D:/python/test.toy')
|
|
|
|
|