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("