From 195ca3c9fa4d7981b51daeb9c713a91034e22380 Mon Sep 17 00:00:00 2001 From: Timon Date: Sun, 4 Jan 2026 13:39:51 +0100 Subject: [PATCH] Dodal tabelo opcodeu, main, mal prilagodil strukturo --- ass3/zbirnik/src/zbirnik/EmitCtx.py | 8 +- .../__pycache__/EmitCtx.cpython-310.pyc | Bin 530 -> 601 bytes .../zbirnik/__pycache__/code.cpython-310.pyc | Bin 0 -> 1540 bytes ass3/zbirnik/src/zbirnik/code.py | 7 +- ass3/zbirnik/src/zbirnik/main.py | 32 +++++++ .../src/zbirnik/mnemoniki/mnemoniki_tabela.py | 2 +- ass3/zbirnik/src/zbirnik/opcodes.py | 61 ++++++++++++ ass3/zbirnik/src/zbirnik/parser.py | 87 ++++++++++++------ .../ukazi/__pycache__/storage.cpython-310.pyc | Bin 0 -> 1659 bytes ass3/zbirnik/src/zbirnik/ukazi/f2.py | 4 +- ass3/zbirnik/src/zbirnik/ukazi/storage.py | 13 ++- .../{src/zbirnik => tests}/test_emit.py | 0 ass3/zbirnik/tests/test_passes.py | 41 +++++++++ 13 files changed, 216 insertions(+), 39 deletions(-) create mode 100644 ass3/zbirnik/src/zbirnik/__pycache__/code.cpython-310.pyc create mode 100644 ass3/zbirnik/src/zbirnik/main.py create mode 100644 ass3/zbirnik/src/zbirnik/opcodes.py create mode 100644 ass3/zbirnik/src/zbirnik/ukazi/__pycache__/storage.cpython-310.pyc rename ass3/zbirnik/{src/zbirnik => tests}/test_emit.py (100%) create mode 100644 ass3/zbirnik/tests/test_passes.py diff --git a/ass3/zbirnik/src/zbirnik/EmitCtx.py b/ass3/zbirnik/src/zbirnik/EmitCtx.py index 35bf24f..d60955a 100644 --- a/ass3/zbirnik/src/zbirnik/EmitCtx.py +++ b/ass3/zbirnik/src/zbirnik/EmitCtx.py @@ -1,6 +1,10 @@ class EmitContext: - def __init__(self, opcodes, registers, symtab): + REGISTERS = { + 'A': 0, 'X': 1, 'L': 2, + 'B': 3, 'S': 4, 'T': 5, 'F': 6 + } + + def __init__(self, opcodes, symtab): self.opcodes = opcodes - self.registers = registers self.symtab = symtab self.base = None diff --git a/ass3/zbirnik/src/zbirnik/__pycache__/EmitCtx.cpython-310.pyc b/ass3/zbirnik/src/zbirnik/__pycache__/EmitCtx.cpython-310.pyc index 91fac21d7cfa8b2aebc0b5fe06b3b109141109d2..f1955e16c7268fcfd66be1703d993f3644e27cb4 100644 GIT binary patch delta 389 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 literal 0 HcmV?d00001 diff --git a/ass3/zbirnik/src/zbirnik/ukazi/f2.py b/ass3/zbirnik/src/zbirnik/ukazi/f2.py index f9f7e7d..f686434 100644 --- a/ass3/zbirnik/src/zbirnik/ukazi/f2.py +++ b/ass3/zbirnik/src/zbirnik/ukazi/f2.py @@ -14,14 +14,14 @@ class f2(Node): opcode = ctx.opcodes[self.mnemonic] if isinstance(self.r1, str): - r1_val = ctx.registers[self.r1] + r1_val = ctx.REGISTERS[self.r1] else: r1_val = self.r1 if self.r2 is None: r2_val = 0 elif isinstance(self.r2, str): - r2_val = ctx.registers[self.r2] + r2_val = ctx.REGISTERS[self.r2] else: r2_val = self.r2 diff --git a/ass3/zbirnik/src/zbirnik/ukazi/storage.py b/ass3/zbirnik/src/zbirnik/ukazi/storage.py index 9a488e5..1e1ca8a 100644 --- a/ass3/zbirnik/src/zbirnik/ukazi/storage.py +++ b/ass3/zbirnik/src/zbirnik/ukazi/storage.py @@ -1,13 +1,22 @@ from zbirnik.ukazi.node import Node class storage(Node): - def __init__(self, val : str | int, name : str, label : str | None = None): + def __init__(self, value : str | int, name : str, label : str | None = None): super().__init__(label) - self.val = val + self.value = value self.name = name def size(self) -> int: + if self.name == "WORD": + return 3 + if self.name == "BYTE": + return len(self.emit(None)) + if self.name == "RESB": + return self.value + if self.name == "RESW": + return 3 * self.value return 0 + def emit(self, ctx): if self.name == "WORD": diff --git a/ass3/zbirnik/src/zbirnik/test_emit.py b/ass3/zbirnik/tests/test_emit.py similarity index 100% rename from ass3/zbirnik/src/zbirnik/test_emit.py rename to ass3/zbirnik/tests/test_emit.py diff --git a/ass3/zbirnik/tests/test_passes.py b/ass3/zbirnik/tests/test_passes.py new file mode 100644 index 0000000..a0f7913 --- /dev/null +++ b/ass3/zbirnik/tests/test_passes.py @@ -0,0 +1,41 @@ +from zbirnik.code import Code +from zbirnik.EmitCtx import EmitContext +from zbirnik.ukazi.f3 import f3 +from zbirnik.ukazi.storage import storage +from zbirnik.adressing import AddrMode + +OPCODES = { + "LDA": 0x00, + "STA": 0x0C, +} + +REGISTERS = { + "A": 0, "X": 1, "L": 2, + "B": 3, "S": 4, "T": 5, "F": 6 +} + +code = Code("TEST") + +code.add(f3( + operand="A", + mnemonic="LDA", + label=None, + index=False, + adr_mode=AddrMode.SIMPLE +)) + +code.add(storage( + name="WORD", + value=5, + label="A" +)) + +code.pass1() +print("SYMTAB:", code.symtab) +print("START:", hex(code.start_address)) +print("LENGTH:", code.program_length) + +ctx = EmitContext(opcodes=OPCODES, symtab=code.symtab) +binary = code.pass2(ctx) + +print("BINARY:", binary.hex())