CodexByte_Runtime / codexbyte_vm.py
LordXido's picture
Create codexbyte_vm.py
77051f2 verified
import hashlib
import time
class CodexByteVM:
def __init__(self):
self.reg = [0] * 8
self.mem = {}
self.pc = 0
self.flags = {"Z": False}
self.ledger = []
def _hash(self, v):
return hashlib.sha256(str(v).encode()).hexdigest()
def step(self, prog):
op = prog[self.pc]
self.pc += 1
if op == 0x00: # HALT
return False
elif op == 0x01: # LOAD_IMM r v
r, v = prog[self.pc], prog[self.pc + 1]
self.pc += 2
self.reg[r] = v
elif op == 0x02: # LOAD_MEM r a
r, a = prog[self.pc], prog[self.pc + 1]
self.pc += 2
self.reg[r] = self.mem.get(a, 0)
elif op == 0x03: # STORE r a
r, a = prog[self.pc], prog[self.pc + 1]
self.pc += 2
self.mem[a] = self.reg[r]
elif op == 0x04: # ADD r1 r2
r1, r2 = prog[self.pc], prog[self.pc + 1]
self.pc += 2
self.reg[r1] += self.reg[r2]
elif op == 0x08: # CMP r1 r2
r1, r2 = prog[self.pc], prog[self.pc + 1]
self.pc += 2
self.flags["Z"] = (self.reg[r1] == self.reg[r2])
elif op == 0x0A: # JZ addr
addr = prog[self.pc]
self.pc += 1
if self.flags["Z"]:
self.pc = addr
elif op == 0x0C: # HASH r
r = prog[self.pc]
self.pc += 1
self.reg[r] = self._hash(self.reg[r])
elif op == 0x0F: # COMMIT
state = (tuple(self.reg), dict(self.mem))
self.ledger.append(self._hash(state))
elif op == 0x11: # EMIT r
r = prog[self.pc]
self.pc += 1
self.mem["LAST_PROOF"] = self.reg[r]
return True
def run(self, prog):
self.pc = 0
self.ledger.clear()
while self.step(prog):
pass
return self.ledger