From f1e083d7bba0fabb4421cf64e33a3ebeb37a98d8 Mon Sep 17 00:00:00 2001 From: ElectronixTM Date: Sat, 29 Mar 2025 01:05:21 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BF=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D0=BC=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20=D0=B2?= =?UTF-8?q?=D0=B8=D1=80=D1=82=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BC=D0=B0=D1=88=D0=B8=D0=BD=D1=8B=20=D0=B8=20=D0=B8=D1=81?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BA=D0=BE=D1=81=D1=8F?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=20=D0=BF=D0=B0=D0=BC=D1=8F=D1=82=D1=8C?= =?UTF-8?q?=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vm.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vm.py b/src/vm.py index e2427b5..ec17f3f 100644 --- a/src/vm.py +++ b/src/vm.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import ClassVar, Callable -from ctypes import c_uint32, c_int32, c_uint8 +from ctypes import c_uint32, c_int32 import struct from optable import OPCODES, OpcodeDescription, OpL, OpA, OpF, OpD from enum import IntFlag, auto @@ -27,8 +27,14 @@ class Breakpoint(Exception): @dataclass class VM: instr_callbacks: ClassVar[dict[OpcodeDescription, Callable]] + mem: bytearray + cc: VMCC + pc: c_uint32 + registers: list[c_int32] + breakpoints: set[int] + _vm_flags: VMFlags - def __init__(self, mem): + def __init__(self, mem: bytearray): self.mem: bytearray = mem self.cc: VMCC = VMCC(0) self.pc: c_uint32 = c_uint32(0) @@ -134,7 +140,7 @@ class VM: return OPCODES[opcode] def _parse_arguments(self, opdesc: OpcodeDescription) -> tuple[int, ...]: - addr = self.pc.value + addr = self.pc.value * 4 main_part = struct.unpack(">BBBb", self.mem[addr:addr+4]) if not OpF.UNEXPANDED in opdesc.flags or OpF.QUICK in opdesc.flags: @@ -243,7 +249,7 @@ class VM: def _branch_callback(self, cond: int, disp: int) -> None: c = Condition(cond) - vm_c = Condition(self.cc.value) + 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)