fix: при выполнении арифметических операций теперь меняет флаги

This commit is contained in:
ElectronixTM
2025-03-29 00:29:44 +03:00
parent b73f92ef88
commit 5dea5b81db

View File

@ -16,13 +16,18 @@ class Condition:
self.n: bool = bool(cond & (1 << 1))
self.z: bool = bool(cond & (1 << 0))
class VMCC(IntFlag):
OVERFLOW = 1 << 2
NEGATIVE = 1 << 1
ZERO = 1 << 0
@dataclass
class VM:
instr_callbacks: ClassVar[dict[OpcodeDescription, Callable]]
def __init__(self, mem):
self.mem: bytearray = mem
self.cc: c_uint8 = c_uint8(0)
self.cc: VMCC = VMCC(0)
self.pc: c_uint32 = c_uint32(0)
self.registers: list[c_int32] = [c_int32(0) for _ in range(256)]
self.breakpoints: set[int] = field(default_factory=set)
@ -193,6 +198,7 @@ class VM:
lhs = self.registers[r1].value
rhs = self.registers[r2].value
self.registers[r3] = c_int32(operation(lhs, rhs))
return callback
def _math_quick_callback_gen(
@ -208,8 +214,19 @@ class VM:
операций с пометкой QUICK
"""
def callback(self, r3: int, r1: int, i8: int) -> None:
self.cc = VMCC(0)
lhs = self.registers[r1].value
self.registers[r3] = c_int32(operation(lhs, i8))
result = operation(lhs, i8)
if result < 0:
self.cc |= VMCC.NEGATIVE
elif result == 0:
self.cc |= VMCC.ZERO
# самая дорогая проверка на переполнение)
try:
struct.pack('i', result)
except struct.error:
self.cc |= VMCC.OVERFLOW
self.registers[r3] = c_int32(result)
return callback
def _load_callback(self, r3: int, r1: int, disp: int) -> None: