aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_asm/assembler.py
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2024-02-25 00:06:13 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2024-02-25 00:17:07 +0200
commite63c309f3517ef64b2f5fe190864bd2b85b84c79 (patch)
tree9119a0a64f4661e21d683bde34fde06a98d65d68 /atk16_asm/assembler.py
parent6dd1e346d330e662e42dd8bc75d17317223908fd (diff)
Add debug symbols, improve debugger, fix bugs
Diffstat (limited to 'atk16_asm/assembler.py')
-rwxr-xr-xatk16_asm/assembler.py36
1 files changed, 31 insertions, 5 deletions
diff --git a/atk16_asm/assembler.py b/atk16_asm/assembler.py
index 993472e..4cd2cef 100755
--- a/atk16_asm/assembler.py
+++ b/atk16_asm/assembler.py
@@ -7,11 +7,17 @@ from .asm_eval import *
from .asm_pass0 import pass_0
from .asm_pass1 import pass_1
from .asm_pass2 import pass_2
-from .asm_pass3 import pass_3
+from .asm_pass3 import pass_3, DbgLabelTable, DbgSourceTable
from .asm_pass4 import pass_4
from .pad_bin import pad_binary
-def assemble(source: str, file_name: str) -> bytearray:
+@dataclass
+class AssemblyResult:
+ program: bytearray
+ dbg_label_table: DbgLabelTable
+ dbg_source_table: DbgSourceTable
+
+def assemble(source: str, file_name: str) -> AssemblyResult:
src_lines = source.splitlines()
result0 = pass_0(src_lines, file_name)
@@ -40,7 +46,11 @@ def assemble(source: str, file_name: str) -> bytearray:
result[2 * line.address + 0] = ((line.word >> 8) & 0xff)
result[2 * line.address + 1] = ((line.word >> 0) & 0xff)
- return result
+ return AssemblyResult(
+ program=result,
+ dbg_label_table=result4.dbg_label_table,
+ dbg_source_table=result4.dbg_source_table,
+ )
def main():
if len(sys.argv) != 3:
@@ -62,11 +72,27 @@ def main():
result = assemble(src, infile_path)
with open(outfile_path, "wb") as f:
- f.write(result)
+ f.write(result.program)
pad_binary(outfile_path, 64 * 1024)
- print(f"Wrote 64 KB to {outfile_path} ({len(result)} B without padding)")
+ print(f"Wrote 64 KB to {outfile_path} ({len(result.program)} B without padding)")
+
+ dbg_outfile_path = outfile_path + ".dbg"
+
+ with open(dbg_outfile_path, "w") as f:
+ for i in range(32 * 1024): # 32K words
+ line = f"0x{i:>04x};"
+ if i not in result.dbg_source_table:
+ continue
+
+ dbg_source_info = result.dbg_source_table[i]
+ line += f"{dbg_source_info.src_file}:{dbg_source_info.line_num};{dbg_source_info.expanded_text};{dbg_source_info.original_text};"
+
+ if i in result.dbg_label_table:
+ line += f"{';'.join(result.dbg_label_table[i])}"
+
+ f.write(line + "\n")
if __name__ == "__main__":
main()