#Binary to ASCII
#Converts DASM -F1 file to Apple 1 Monitor format

#DASM -F1 File two byte load address in LSB, MSB order
#followed by binary object coda

#Apple 1 Monitor Format
#ADDR: BYTE BYTE BYTE...
#0300: 00 01 02 03 04 05 06 07
#0308: 08 09 0A 0B 0C 0D 0E 0F

import os
import sys

def getArgs():
    argCount = len(sys.argv)
    if argCount != 2:
        print("Usage:", sys.argv[0], "objfile")
        exit(2)
    return sys.argv[1]

def splitFileSpec(filePath):
    fileDir, fileSpec = os.path.split(filePath)
    fileName, fileExt = os.path.splitext(fileSpec)
    if fileExt == '': fileExt = '.obj'
    return fileDir, fileName, fileExt

def readPrgFile(fileSpec):
    with open(fileSpec, "rb") as prgFile:
        prgAddr = prgFile.read(2)
        prgData = prgFile.read()
    address = prgAddr[0] + prgAddr[1] * 256
    return address, prgData

def writeAscFile(dir, name, addr, data):
    ascName = os.path.join(dir, name + ".asc")
    line = "";
    with open(ascName, "w") as ascFile:
        for i in range(len(data)):
            if i & 7 == 0:
                if len(line): ascFile.write(line + '\n')
                line = "{:04X}:".format(addr + i)
            line = line + " {:02X}".format(data[i])
        ascFile.write(line + '\n')
    return ascName

objFile = getArgs()
fileDir, fileName, fileExt = splitFileSpec(objFile)
inName = os.path.join(fileDir, fileName + fileExt)
print("Reading file", inName)
inAddr, inData = readPrgFile(inName)
outName = writeAscFile(fileDir, fileName, inAddr, inData)
print ("Wrote file", outName)
