Compare commits

...

2 Commits

Author SHA1 Message Date
ca2e19ae0a fix[?]: починил поведение после условного перехода
Не уверен, что это поможет на самом деле, но это временно решает проблему одного конкретного перехода
2025-03-30 02:37:25 +03:00
12a662d8bb chore: удалил ненужные строки, где делал мелкие проверки 2025-03-30 02:35:49 +03:00
2 changed files with 6 additions and 4 deletions

View File

@ -66,6 +66,3 @@ OPCODES = {
0x41: OpD(OpF(0), OpL.BRANCH, OpA.IND_BRANCH),
}
if __name__ == "__main__":
print(hex(12))
print(~12)

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)