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