def doPushSym( self ): symbol = self.m_postfix[ self.m_index] self.m_index = self.m_index + 1 if symbols.isDefined( symbol ): self.m_stack.append( symbols.get( symbol ) ) else: self.m_undefined = True self.m_stack.append( 1 )
def assembleLine( line, phaseNumber=0 ): global gLoc for k,v in gDefines.items(): line = line.replace(k,v) clearLineBytes() tokenizer = tok.Tokenizer( line ) # # Set '*' psuedo-symbol at the start of each line # symbols.set( '*', gLoc ) # # SYMBOL = VALUE # if tokenizer.curTok() == tok.SYMBOL and tokenizer.peek(1) == '=': sym = tokenizer.curValue() tokenizer.advance( 2 ) expr = eval.Expression( tokenizer ) if not tokenizer.atEnd(): raise Exception( "Bad expression (extra gunk)" ) value = expr.eval() if phaseNumber > 0 and value == None: raise Exception( str.format( "Undefined expression" ) ) symbols.set( sym, expr.eval() ) if gListingFile != None and phaseNumber > 0: generateListingLine( line ) return # # handle SYMBOL: at start of line # NOTE: could enforce leadingWhitespace, but we have a ':' # instead of that. # if tokenizer.curTok() == tok.SYMBOL and tokenizer.peek(1) == ':': sym = tokenizer.curValue() tokenizer.advance( 2 ) if phaseNumber == 0: symbols.set( sym, gLoc ) else: # # check that the symbol has the same value in # subsequent phases # symbols.setScope( sym ) if symbols.get( sym ) != gLoc: raise Exception( str.format( "Symbol phase error (expected {0}, have {1})", symbols.get(sym), gLoc ) ) # # handle ops # if tokenizer.curTok() == tok.SYMBOL: op = tokenizer.curValue().lower() tokenizer.advance() if op in gPsuedoOps: gPsuedoOps[op]( tokenizer, phaseNumber ) elif op in preOps: if preOps[op](line): raise Exception("define syntax error") elif op in gOps: assembleInstruction( op, tokenizer, phaseNumber ) else: raise Exception( str.format( 'Unknown op: {0}', op ) ) if gListingFile != None and phaseNumber > 0: generateListingLine( line )
def assembleLine(line, phaseNumber=0): global gLoc for k, v in gDefines.items(): line = line.replace(k, v) clearLineBytes() tokenizer = tok.Tokenizer(line) # # Set '*' psuedo-symbol at the start of each line # symbols.set('*', gLoc) # # SYMBOL = VALUE # if tokenizer.curTok() == tok.SYMBOL and tokenizer.peek(1) == '=': sym = tokenizer.curValue() tokenizer.advance(2) expr = eval.Expression(tokenizer) if not tokenizer.atEnd(): raise Exception("Bad expression (extra gunk)") value = expr.eval() if phaseNumber > 0 and value == None: raise Exception(str.format("Undefined expression")) symbols.set(sym, expr.eval()) if gListingFile != None and phaseNumber > 0: generateListingLine(line) return # # handle SYMBOL: at start of line # NOTE: could enforce leadingWhitespace, but we have a ':' # instead of that. # if tokenizer.curTok() == tok.SYMBOL and tokenizer.peek(1) == ':': sym = tokenizer.curValue() tokenizer.advance(2) if phaseNumber == 0: symbols.set(sym, gLoc) else: # # check that the symbol has the same value in # subsequent phases # symbols.setScope(sym) if symbols.get(sym) != gLoc: raise Exception( str.format("Symbol phase error (expected {0}, have {1})", symbols.get(sym), gLoc)) # # handle ops # if tokenizer.curTok() == tok.SYMBOL: op = tokenizer.curValue().lower() tokenizer.advance() if op in gPsuedoOps: gPsuedoOps[op](tokenizer, phaseNumber) elif op in preOps: if preOps[op](line): raise Exception("define syntax error") elif op in gOps: assembleInstruction(op, tokenizer, phaseNumber) else: raise Exception(str.format('Unknown op: {0}', op)) if gListingFile != None and phaseNumber > 0: generateListingLine(line)