示例#1
0
def FatalError(text, sourcefile="", sourceline="", lineno=0):

    global Asm, Flags

    dec.Asm.List_Line = ''

    message = ""
    if not dec.Flags.ErrorPrinted and sourcefile != '':
        message = "Source file: " + sourcefile + dec.EOL + dec.EOL
    message = message + "*** Fatal Error: " + text + dec.EOL
    if sourcefile != '' or sourceline != '':
        message = message + listing.ListLineNo(lineno) + sourceline.rstrip()
    message = message + dec.EOL + dec.EOL
    sys.stderr.write(message)
    if dec.Flags.ErrorBell:
        sys.stderr.write('\a')  # Bell won't work on all systems

    if dec.Asm.Error_File is not None:
        dec.Asm.Error_File.write(message)
    if dec.Asm.List_File != sys.stdout:
        # Print error to error file separatly.
        # Print lines one by one with maximum length
        parts = message.rstrip().split(dec.EOL)
        message = ""
        for i in parts:
            message = message + i[:dec.Asm.List_Length] + dec.EOL
        dec.Asm.List_File.write(message + dec.EOL)
    dec.Asm.Errors = dec.Asm.Errors + 1

    ShowErrors()

    files.CloseAllFiles()

    sys.exit(dec.ERRLVL_FATAL)
示例#2
0
文件: assem.py 项目: tomsim/sbasm3
def Assemble(sourcename):
    """
    Entry point for both assembly passes. Initialize symbol table, open main
    source file and parse each program line.
    """

    global Asm, Flags

    Prepare_For_Pass()

    print("")
    if dec.Asm.Pass == 1:
        print("Pass one")
    else:
        print("Pass two")

    files.OpenSourceFile(sourcename)  # Open main source file

    dec.Flags.CodeWarn = False

    while len(dec.Asm.File_Handle) > 0:
        # Do this until all source files are closed again

        dec.Flags.Comment = False
        dec.Asm.Macro_Def = ''

        while True:
            # Parse each line until end of file

            if len(dec.Asm.Macro_Stack) > 0:
                # Expanding macros, stay there until done
                macros.ExpandMacro()
                if dec.Flags.EndFile:
                    # Macro expansion found .EN directive
                    dec.Flags.EndFile = False
                    break

            # Normal assembly, get next line from source and parse it
            index = len(dec.Asm.File_Handle) - 1
            dec.Asm.Parse_Line = dec.Asm.File_Handle[index].readline()
            dec.Asm.File_LineNo[index] = dec.Asm.File_LineNo[index] + 1
            lastline = dec.Asm.File_LineNo[index]
            # Save this, may change by .CH
            lineno = dec.Asm.File_LineNo[index]
            if len(dec.Asm.Parse_Line) > 0:
                # Not end of file
                # Now expand tabs, get rid of eol, truncate the line to a
                # sensible length and append trailing space.
                # This trailing space will ease parsing the string.
                # Windows tends to crash when the line length > 184
                dec.Asm.Parse_Line = \
                    dec.Asm.Parse_Line.expandtabs(8).rstrip() + " "
                ParseLine()  # Parse this source line
                listing.ListLine(lineno, dec.Asm.Parse_Line)
                if dec.Flags.EndFile:
                    # .EN directive was encountered, close this file
                    dec.Flags.EndFile = False
                    break
            else:
                # End of file reached
                break

        # Close youngest source file in source stack
        dec.Asm.File_Handle[len(dec.Asm.File_Handle) - 1].close()
        dec.Asm.File_Handle.pop()
        dec.Asm.File_LineNo.pop()
        dec.Asm.File_Name.pop()

    # We may need this in case of errors during cleanup
    dec.Asm.File_Name.append(sourcename)
    dec.Asm.File_LineNo.append(lastline)

    if dec.Cross.Name != "":
        # Allow the cross overlay to do some final house keeping
        dec.Cross.CleanUp()

    target.CloseTarget(0)  # Close code memory buffer
    target.CloseTarget(2)  # Close EEPROM memory buffer

    dec.Asm.File_Name = []  # We won't need this anymore now
    dec.Asm.File_LineNo = []

    files.SymbolFile()
    files.CloseAllFiles()