diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2023-04-13 14:48:34 +0300 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2023-04-13 14:49:59 +0300 |
| commit | 9d4c6fc299294ac36f7082599edce19286fa0f99 (patch) | |
| tree | e7601bb1cd9950482f125377d25b6d5d40b72e62 /src/asm_pass3.py | |
| parent | afd5f32e56d3d30bfa98fb35deff51febf50e594 (diff) | |
Add @let directive, start pondering interrupt control
Diffstat (limited to 'src/asm_pass3.py')
| -rw-r--r-- | src/asm_pass3.py | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/asm_pass3.py b/src/asm_pass3.py index 76e7b84..5221f6d 100644 --- a/src/asm_pass3.py +++ b/src/asm_pass3.py @@ -16,21 +16,24 @@ class Result3: lines: list[Result3Line] options: Options operations: OpExpansionDict - labels: dict[str, int] + symbols: dict[str, int] def pass_3(result2: Result2) -> Result3: result_lines: list[Result3Line] = [] - labels: dict[str, int] = {} + symbols: dict[str, int] = {} address = 0 for line in result2.lines: keyword, *args = line.parts match keyword: case "@address": - address = eval(args[0]) + address = eval_expr(symbols, args[0]) continue case "@label": - labels[args[0]] = address + symbols[args[0]] = address + continue + case "@let": + symbols[args[0]] = eval_expr(symbols, args[1]) continue case _: result_lines.append(Result3Line( @@ -42,9 +45,16 @@ def pass_3(result2: Result2) -> Result3: )) address += 1 + result_lines.sort(key=lambda l: l.address) + for result_line in result_lines: + rows_with_same_addr = list(filter(lambda l: l.address == result_line.address, result_lines)) + n = len(rows_with_same_addr) + if n > 1: + formatted = "\n".join(map(lambda l: " ".join(l.parts), rows_with_same_addr)) + raise Exception(f"Overlapping segments: address 0x{result_line.address:>04x} has conflicting definitions:\n{formatted}") return Result3( operations=result2.operations, options=result2.options, lines=result_lines, - labels=labels, + symbols=symbols, ) |
