From fbe23d3506e8f0ab3000ad20633ddf2588f0ee9a Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Mon, 3 Nov 2025 22:04:20 -0600 Subject: [PATCH] assembler: add support for binary output --- regs/assembler/fs/__main__.py | 24 ++++++++++++++++++++---- regs/assembler/vs/__main__.py | 20 +++++++++++++++++--- regs/pvs_disassemble.py | 13 ++++++++++--- regs/us_disassemble.py | 12 +++++++++--- regs/us_disassemble2.py | 13 ++++++++++--- 5 files changed, 66 insertions(+), 16 deletions(-) diff --git a/regs/assembler/fs/__main__.py b/regs/assembler/fs/__main__.py index 9dd9519..4c509ca 100644 --- a/regs/assembler/fs/__main__.py +++ b/regs/assembler/fs/__main__.py @@ -1,4 +1,5 @@ import sys +import struct from assembler.lexer import Lexer, LexerError from assembler.parser import ParserError @@ -17,12 +18,11 @@ def frontend_inner(buf): ins = validate_instruction(ins_ast) code = [0] * 6 emit_instruction(code, ins) - print("\n".join(f"0x{code[i]:08x}," for i in range(6))) - print() + yield code def frontend(filename, buf): try: - frontend_inner(buf) + yield from frontend_inner(buf) except LexerError as e: print_error(filename, buf, e) raise @@ -34,7 +34,23 @@ def frontend(filename, buf): raise if __name__ == "__main__": + assert len(sys.argv) in {2, 3} input_filename = sys.argv[1] + binary = len(sys.argv) == 3 + if binary: + output_filename = sys.argv[2] + with open(input_filename, 'rb') as f: buf = f.read() - frontend(input_filename, buf) + + code_gen = list(frontend(input_filename, buf)) + + if not binary: + for cw in code_gen: + print("\n".join(f"0x{cw[i]:08x}," for i in range(6))) + print() + else: + with open(output_filename, 'wb') as f: + for cw in code_gen: + data = struct.pack("