fix[?]: починил поведение после условного перехода

Не уверен, что это поможет на самом деле, но это временно решает проблему одного конкретного перехода
This commit is contained in:
ElectronixTM
2025-03-30 02:37:25 +03:00
parent 12a662d8bb
commit ca2e19ae0a

View File

@ -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)