diff options
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, ) |
