diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2024-02-25 00:06:13 +0200 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2024-02-25 00:17:07 +0200 |
| commit | e63c309f3517ef64b2f5fe190864bd2b85b84c79 (patch) | |
| tree | 9119a0a64f4661e21d683bde34fde06a98d65d68 /atk16_asm/assembler.py | |
| parent | 6dd1e346d330e662e42dd8bc75d17317223908fd (diff) | |
Add debug symbols, improve debugger, fix bugs
Diffstat (limited to 'atk16_asm/assembler.py')
| -rwxr-xr-x | atk16_asm/assembler.py | 36 |
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() |
