aboutsummaryrefslogtreecommitdiffstats
path: root/src/asm_pass1.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/asm_pass1.py')
-rw-r--r--src/asm_pass1.py52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/asm_pass1.py b/src/asm_pass1.py
new file mode 100644
index 0000000..6537aea
--- /dev/null
+++ b/src/asm_pass1.py
@@ -0,0 +1,52 @@
+import importlib
+from dataclasses import dataclass
+from assembler_ops import *
+from assembler_eval import *
+
+@dataclass
+class Result1Line:
+ line_num: int
+ parts: list[str]
+
+@dataclass
+class Result1:
+ lines: list[Result1Line]
+ options: Options
+ operations: OpExpansionDict
+
+def pass_1(lines: list[str]) -> Result1:
+ options = Options()
+ result_lines: list[Result1Line] = []
+ operations: OpExpansionDict = default_expansions.copy()
+
+ for (line_num, line) in enumerate(lines):
+ line = line.split(";")[0].strip()
+ if line == "": continue
+ keyword, *args = line.lower().split()
+ match keyword:
+ case "@opt":
+ opt_name, opt_value = args
+ match opt_name:
+ case "stack_pointer": options.stack_pointer = opt_value
+ case "csr_scratch": options.csr_scratch = opt_value
+ case _: raise Exception("Unknown @opt: " + opt_name)
+ case "@use":
+ module_name, ops = args[0].split(":")
+ ops_split = ops.split(",")
+ module = importlib.import_module(module_name)
+ mod_expansions: OpExpansionDict = module.expansions
+ for op in mod_expansions:
+ expansion = mod_expansions[op]
+ if ops == "*" or op in ops_split:
+ operations[op] = expansion
+ case _:
+ result_lines.append(Result1Line(
+ line_num=line_num,
+ parts=[keyword, *args]
+ ))
+
+ return Result1(
+ operations=operations,
+ options=options,
+ lines=result_lines
+ )