fix[?]: починил поведение после условного перехода
Не уверен, что это поможет на самом деле, но это временно решает проблему одного конкретного перехода
This commit is contained in:
@ -8,6 +8,7 @@ from enum import IntFlag, Enum, auto
|
||||
class VMFlags(IntFlag):
|
||||
# if last instruction is big, then you should
|
||||
# skip more memory on step
|
||||
AFTER_BRANCH = auto()
|
||||
EXPANDED_INSTR = auto()
|
||||
|
||||
class Condition:
|
||||
@ -131,9 +132,11 @@ class VM:
|
||||
# так, будто мы на 1 слово впереди опкода
|
||||
self.pc = c_uint32(self.pc.value + 1)
|
||||
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._vm_flags &= ~(VMFlags.EXPANDED_INSTR)
|
||||
self._vm_flags &= ~(VMFlags.AFTER_BRANCH)
|
||||
|
||||
def continue_(self) -> None:
|
||||
"""
|
||||
@ -277,12 +280,14 @@ class VM:
|
||||
c = Condition(cond)
|
||||
vm_c = Condition(self.cc)
|
||||
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)
|
||||
|
||||
def _branch_indexed_callback(self, cond: int, r1: int, disp: int) -> None:
|
||||
c = Condition(cond)
|
||||
vm_c = Condition(self.cc.value)
|
||||
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
|
||||
self.pc = c_uint32(addr)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user