|
|
|
@ -8,6 +8,7 @@ from enum import IntFlag, Enum, auto
|
|
|
|
class VMFlags(IntFlag):
|
|
|
|
class VMFlags(IntFlag):
|
|
|
|
# if last instruction is big, then you should
|
|
|
|
# if last instruction is big, then you should
|
|
|
|
# skip more memory on step
|
|
|
|
# skip more memory on step
|
|
|
|
|
|
|
|
AFTER_BRANCH = auto()
|
|
|
|
EXPANDED_INSTR = auto()
|
|
|
|
EXPANDED_INSTR = auto()
|
|
|
|
|
|
|
|
|
|
|
|
class Condition:
|
|
|
|
class Condition:
|
|
|
|
@ -131,9 +132,11 @@ class VM:
|
|
|
|
# так, будто мы на 1 слово впереди опкода
|
|
|
|
# так, будто мы на 1 слово впереди опкода
|
|
|
|
self.pc = c_uint32(self.pc.value + 1)
|
|
|
|
self.pc = c_uint32(self.pc.value + 1)
|
|
|
|
self._run_callback(opdesc, args)
|
|
|
|
self._run_callback(opdesc, args)
|
|
|
|
if VMFlags.EXPANDED_INSTR in self._vm_flags:
|
|
|
|
if (VMFlags.EXPANDED_INSTR in self._vm_flags
|
|
|
|
|
|
|
|
and not VMFlags.AFTER_BRANCH in self._vm_flags):
|
|
|
|
self.pc = c_uint32(self.pc.value + 1)
|
|
|
|
self.pc = c_uint32(self.pc.value + 1)
|
|
|
|
self._vm_flags &= ~(VMFlags.EXPANDED_INSTR)
|
|
|
|
self._vm_flags &= ~(VMFlags.EXPANDED_INSTR)
|
|
|
|
|
|
|
|
self._vm_flags &= ~(VMFlags.AFTER_BRANCH)
|
|
|
|
|
|
|
|
|
|
|
|
def continue_(self) -> None:
|
|
|
|
def continue_(self) -> None:
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
@ -277,12 +280,14 @@ class VM:
|
|
|
|
c = Condition(cond)
|
|
|
|
c = Condition(cond)
|
|
|
|
vm_c = Condition(self.cc)
|
|
|
|
vm_c = Condition(self.cc)
|
|
|
|
if (c.v & vm_c.v) | (c.n & vm_c.n) | (c.z & vm_c.z) == c.i:
|
|
|
|
if (c.v & vm_c.v) | (c.n & vm_c.n) | (c.z & vm_c.z) == c.i:
|
|
|
|
|
|
|
|
self._vm_flags = VMFlags.AFTER_BRANCH
|
|
|
|
self.pc = c_uint32(self.pc.value + disp)
|
|
|
|
self.pc = c_uint32(self.pc.value + disp)
|
|
|
|
|
|
|
|
|
|
|
|
def _branch_indexed_callback(self, cond: int, r1: int, disp: int) -> None:
|
|
|
|
def _branch_indexed_callback(self, cond: int, r1: int, disp: int) -> None:
|
|
|
|
c = Condition(cond)
|
|
|
|
c = Condition(cond)
|
|
|
|
vm_c = Condition(self.cc.value)
|
|
|
|
vm_c = Condition(self.cc.value)
|
|
|
|
if (c.v & vm_c.v) | (c.n & vm_c.n) | (c.z & vm_c.z) == c.i:
|
|
|
|
if (c.v & vm_c.v) | (c.n & vm_c.n) | (c.z & vm_c.z) == c.i:
|
|
|
|
|
|
|
|
self._vm_flags = VMFlags.AFTER_BRANCH
|
|
|
|
addr = self.registers[r1].value + disp
|
|
|
|
addr = self.registers[r1].value + disp
|
|
|
|
self.pc = c_uint32(addr)
|
|
|
|
self.pc = c_uint32(addr)
|
|
|
|
|
|
|
|
|
|
|
|
|