mirror of
https://github.com/irmen/prog8.git
synced 2024-11-04 04:05:00 +00:00
51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
|
#! /usr/bin/env python3
|
||
|
|
||
|
"""
|
||
|
Intermediate Language for 6502/6510 microprocessors, codename 'Sick'
|
||
|
This is the main program that drives the rest.
|
||
|
|
||
|
Written by Irmen de Jong (irmen@razorvine.net)
|
||
|
License: GNU GPL 3.0, see LICENSE
|
||
|
"""
|
||
|
|
||
|
import os
|
||
|
import argparse
|
||
|
from .parse import Parser, Optimizer
|
||
|
from .preprocess import PreprocessingParser
|
||
|
from .codegen import CodeGenerator, Assembler64Tass
|
||
|
|
||
|
|
||
|
def main() -> None:
|
||
|
description = "Compiler for IL65 language, code name 'Sick'"
|
||
|
ap = argparse.ArgumentParser(description=description)
|
||
|
ap.add_argument("-o", "--output", help="output directory")
|
||
|
ap.add_argument("sourcefile", help="the source .ill/.il65 file to compile")
|
||
|
args = ap.parse_args()
|
||
|
assembly_filename = os.path.splitext(args.sourcefile)[0] + ".asm"
|
||
|
program_filename = os.path.splitext(args.sourcefile)[0] + ".prg"
|
||
|
if args.output:
|
||
|
os.makedirs(args.output, mode=0o700, exist_ok=True)
|
||
|
assembly_filename = os.path.join(args.output, os.path.split(assembly_filename)[1])
|
||
|
program_filename = os.path.join(args.output, os.path.split(program_filename)[1])
|
||
|
|
||
|
print("\n" + description)
|
||
|
|
||
|
pp = PreprocessingParser(args.sourcefile)
|
||
|
sourcelines, symbols = pp.preprocess()
|
||
|
symbols.print_table(True)
|
||
|
|
||
|
p = Parser(args.sourcefile, args.output, sourcelines, ppsymbols=symbols)
|
||
|
parsed = p.parse()
|
||
|
if parsed:
|
||
|
opt = Optimizer(parsed)
|
||
|
parsed = opt.optimize()
|
||
|
cg = CodeGenerator(parsed)
|
||
|
cg.generate()
|
||
|
cg.optimize()
|
||
|
with open(assembly_filename, "wt") as out:
|
||
|
cg.write_assembly(out)
|
||
|
assembler = Assembler64Tass(parsed.format)
|
||
|
assembler.assemble(assembly_filename, program_filename)
|
||
|
print("Output file: ", program_filename)
|
||
|
print()
|