Ejemplo n.º 1
0
def main():
    print("dasm: Simple dcpu assembler\n")
    l = lark.Lark(grammar.grammar, start="start")

    parser = argparse.ArgumentParser(description='dcpu assembler')
    parser.add_argument("-i",
                        help="Assembly input file",
                        action="store",
                        metavar="<input file>",
                        type=str,
                        required=True,
                        dest="input_filename")
    parser.add_argument(
        "-o",
        help="Binary output file basename (without file extension)",
        metavar="<output file base name>",
        action="store",
        type=str,
        required=False,
        dest="output_filebase")

    args = parser.parse_args()

    try:
        fn = args.input_filename
        with open(fn) as f:
            lines = f.readlines()
    except:
        print(f"ERROR: Cannot open file {fn}")
        return 2

    contents = "".join(lines)

    t = l.parse(contents)
    # print(t.pretty())
    # print(t)

    n = dcpuTransformer().transform(t)

    program = Program(n.children)

    (path, name) = os.path.split(fn)  # remove path
    if args.output_filebase == None:
        outfn_noext = os.path.splitext(name)[0]  # remove extension
    else:
        outfn_noext = args.output_filebase

    program.write_as_bin(outfn_noext + ".bin")
    program.write_as_memfile(outfn_noext + ".mem")
    program.write_as_cfile(outfn_noext + ".c")
    program.write_as_listing(outfn_noext + ".list", lines)
    program.write_symbols(outfn_noext + ".symbols")
    program.write_as_simdata(outfn_noext + ".sim", lines)

    size = program.end_address - program.start_address + 1
    print(f"File '{name}' assembled\nOutput size: {size} words")