aboutsummaryrefslogtreecommitdiffstats
path: root/atk16-asm/asm_pass4.py
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2024-02-20 16:55:14 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2024-02-20 16:56:09 +0200
commit549901c85044b6ccd912688d6be007c2fdacc6c6 (patch)
tree15d1123eedb4347472e4b47fec880e2e5b79927e /atk16-asm/asm_pass4.py
parentabf0594c78087434bced59054896f7f411e18faf (diff)
Refactor dir structure
Diffstat (limited to 'atk16-asm/asm_pass4.py')
-rw-r--r--atk16-asm/asm_pass4.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/atk16-asm/asm_pass4.py b/atk16-asm/asm_pass4.py
new file mode 100644
index 0000000..2fff870
--- /dev/null
+++ b/atk16-asm/asm_pass4.py
@@ -0,0 +1,61 @@
+from dataclasses import dataclass
+from asm_ops import *
+from asm_eval import *
+from asm_pass3 import *
+
+@dataclass
+class Result4Line:
+ line_num: int
+ src_file: str
+ address: int
+ word: int
+ text: str
+ original_text: str
+
+@dataclass
+class Result4:
+ lines: list[Result4Line]
+ operations: OpExpansionDict
+ symbols: dict[str, int]
+
+def pass_4(result3: Result3) -> Result4:
+ result_lines: list[Result4Line] = []
+
+ for line in result3.lines:
+ keyword, *args = line.parts
+ meta = Meta(
+ address=line.address,
+ )
+
+ text = " ".join([keyword, *args])
+ original_text = " ".join(line.original_parts)
+
+ if keyword in operations:
+ fn = operations[keyword]
+ word = fn(meta, result3.symbols, *args)
+ result_lines.append(Result4Line(
+ line_num=line.line_num,
+ src_file=line.src_file,
+ address=line.address,
+ word=word,
+ text=text,
+ original_text=original_text,
+ ))
+ else:
+ try:
+ result_lines.append(Result4Line(
+ line_num=line.line_num,
+ src_file=line.src_file,
+ address=line.address,
+ word=eval_expr(result3.symbols, keyword),
+ text=text,
+ original_text=original_text,
+ ))
+ except:
+ raise Exception(f"Invalid assembly at {line.src_file}:{line.line_num + 1}\n\n{line}")
+
+ return Result4(
+ operations=result3.operations,
+ symbols=result3.symbols,
+ lines=result_lines,
+ )