aboutsummaryrefslogtreecommitdiffstats
path: root/src/asm_pass3.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/asm_pass3.py')
-rw-r--r--src/asm_pass3.py20
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,
)