diff options
Diffstat (limited to 'src/asm_pass1.py')
| -rw-r--r-- | src/asm_pass1.py | 52 |
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 + ) |
