示例#1
0
	def cargarArchivo(self, rutaArchivo):
		"""
			Carga y evalúa un archivo que contenga código en ensamblador (HC12)
		"""
		#Variable de texto que será utilizada para guardar los Sxx que 
		#se generarán en el segundo paso
		sGenerado = ""
		#Bandera utilizada para saber si el archivo contiene el codop END
		banderaEnd = False
		#Bandera utilizada para saber si la tabla de símbolos ya fue creada
		banderaTabsimCreada = False
		#Bandera utilizada para saber si ya se usó la directiva ORG por lo menos
		#una vez
		banderaOrg = False
		#Las variables "direccionInicial" y "contLoc" estarán en base decimal 
		#pero a la hora de escribirlo en el archivo se hará de manera Hexadecimal
		#de 4 bytes
		#Variable utilizada para guardar el valor inicial del archivo de listado
		direccionInicial = 0
		#Variable utilizada para llevar la cuenta de en qué localidad se encuentra
		#la instrucción actual en el archivo de listado
		contLoc = 0
		if(Util.existeArchivo(rutaArchivo)):
			#Guardará la información de la instrucción que esté evaluando
			infoInstr = None
			#Guardará la información de la instrucción actual, en el modo actual
			infoInstrModo = None
			#Lista de directivas CONSTANTES y de RESERVA DE ESPACIO DE MEMORIA
			directivas = ["DW","DB","DC.W","DC.B","FCB","FDB","FCC","DS","DS.B","DS.W","RMB","RMW"]
			archivoCorto = rutaArchivo.split("/")
			archivoCorto = archivoCorto[len(archivoCorto)-1]
			nombreListado = str.join(".",archivoCorto.split(".")[0:-1]) + "tmp.txt"
			fileListado = Listado(nombreListado,"w")
			nombreTabsim = str.join(".",archivoCorto.split(".")[0:-1]) + "tabsim.txt"
			#nombreTabsim = "tabsim.txt"
			_file = open(rutaArchivo, "r")
			fileText = _file.read()
			_file.close()
			lineCount = 1
			fileTextBox = ""
			codMaqGenerado = ""
			variablesTextBox = ""
			errorTextBox = ""
			#Paso 1
			#Iterar sobre todas las lineas del archivo
			for line in fileText.split('\n'):
				#agregamos el número de línea en cada línea
				fileTextBox += str(lineCount) + "\t" + str( line ) + "\n"
				lineCount += 1

				#Mandamos la línea actual a la clase Linea
				currentLine = Linea(str(line))
				if (currentLine.comentario) :
					variablesTextBox += "Comentario\n\n"
				else:
					if contLoc > 65535:
						errorTextBox += str(lineCount - 2) + ": Desbordamiento del contador de localidades [valor máximo: 65535] [valor actual: "+str(contLoc)+"] (Se reiniciará a 0)\n"
						contLoc=0
					"""
					INICIO DIRECTIVAS
					"""
					#Validar EQU
					if str(currentLine.codop).upper() == "EQU":
						if(currentLine.etiqueta != None and currentLine.operando != None):
							#Sacar el valor del operando
							analisisCodop = Automata(currentLine.operando.text)
							if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
								if("Directo" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
									errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva EQU es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									continue
								elif("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva EQU tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
									continue
								#Ya se cuenta con el valor, ahora se trata de insertar en la tabsim
								elif(not banderaTabsimCreada):
									tabsim = Tabsim(nombreTabsim)
									banderaTabsimCreada = True
									tabsim.write(currentLine.etiqueta, analisisCodop.valor)
								elif(not tabsim.write(currentLine.etiqueta, analisisCodop.valor)):
									errorTextBox += str(lineCount - 1) + ": La etiqueta "+str(currentLine.etiqueta)+" ya fue usada\n"
								else:
									#Se escribe en el archivo de listado
									fileListado.write(analisisCodop.valor,currentLine.etiqueta,"EQU",currentLine.operando,None,"DVA",None,None,None,None)
						else:
							errorTextBox += str(lineCount - 1) + ": Para la directiva EQU tanto la etiqueta como el operando tienen que ser diferentes de NULL\n"
						continue
					
					#Validar ORG
					if str(currentLine.codop).upper() == "ORG":
						if(currentLine.operando == None):
							errorTextBox += str(lineCount - 1) + ": La directiva ORG debe de tener operando\n"
						else:
							if(banderaOrg):
								errorTextBox += str(lineCount - 1) + ": La directiva ORG debe existir una sola vez\n"
								continue
							analisisCodop = Automata(currentLine.operando.text)
							if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
								if("Directo" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
									errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva ORG es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									continue
								if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva ORG tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
									continue
								#Si se llegó a éste punto quiere decir que la directiva ORG no había sido usada con anterioridad y
								#su operando es un número válido
								banderaOrg = True
								direccionInicial = analisisCodop.valor					
								contLoc = analisisCodop.valor
								fileListado.write(contLoc,currentLine.etiqueta,"ORG",currentLine.operando,None,"DVA",None,None,None,None)
							else:
								errorTextBox += str(lineCount - 1) + ": El operando de la directiva ORG tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"

					#Escribir etiqueta en TABSIM, si es que existe
					if(currentLine.etiqueta != None):
						if(not banderaTabsimCreada):
							tabsim = Tabsim(nombreTabsim)
							banderaTabsimCreada = True
						if(not tabsim.write(currentLine.etiqueta, contLoc)):
							errorTextBox += str(lineCount - 1) + ": La etiqueta "+str(currentLine.etiqueta)+" ya fue usada\n"
							continue
					
					#Validar END
					if str(currentLine.codop).upper() == "END":
						if(currentLine.operando != None):
							errorTextBox += str(lineCount - 1) + ": La directiva END no puede tener operando\n"
							continue
						#if(banderaEnd):
							#errorTextBox += str(lineCount - 1) + ": La instrucción END puede existir una sola vez\n"
						if not banderaOrg:
							errorTextBox += str(lineCount - 1) + ": La directiva END no puede estar antes de ORG\n"
							continue
						banderaEnd = True
						fileListado.write(contLoc,currentLine.etiqueta,"END",currentLine.operando,None,"DVA",None,None,None,None)
						continue

					if str(currentLine.codop).upper() in directivas:
						if not banderaOrg:
							errorTextBox += str(lineCount - 1) + ": La directiva "+str(currentLine.codop)+" no puede estar antes de ORG\n"
						if currentLine.operando != None:
							analisisCodop = Automata(currentLine.operando.text)
							#DB, DC.B, FCB
							if str(currentLine.codop).upper() == "DB" or str(currentLine.codop).upper() == "DC.B" or str(currentLine.codop).upper() == "FCB":
								if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
									if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
										continue
									if(analisisCodop.valor > 255):
										errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva "+str(currentLine.codop).upper()+" es de 0 a 255, el valor actual es "+str(analisisCodop.valor)+"\n"
									else:
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc+=1
								else:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
								continue
							#DW, DC.W, FDB
							if str(currentLine.codop).upper() == "DW" or str(currentLine.codop).upper() == "DC.W" or str(currentLine.codop).upper() == "FDB":
								if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
									if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
										continue
									if(analisisCodop.valor > 65535):
										errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva "+str(currentLine.codop).upper()+" es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									else:
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc+=2
								else:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
								continue
							#FCC
							if str(currentLine.codop).upper() == "FCC":
								try:
									str(currentLine.operando).decode('ascii')
								except:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser una cadena de caracteres ASCII\n"
									continue
								else:
									if str(currentLine.operando)[0]=="\"" and str(currentLine.operando)[-1]=="\"" and (len(str(currentLine.operando))>1):
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc += len(str(currentLine.operando))-2
									else:
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser una cadena de caracteres ASCII que comience y termine con \" (no puede terminar en espacios)\n"
									continue
							#DS, DS.B, RMB 
							if str(currentLine.codop).upper() == "DS" or str(currentLine.codop).upper() == "DS.B" or str(currentLine.codop).upper() == "RMB":
								if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
									if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
										continue
									if(analisisCodop.valor > 65535):
										errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva "+str(currentLine.codop).upper()+" es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									else:
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc+=analisisCodop.valor
								else:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
								continue
							#DS.W, RMW
							if str(currentLine.codop).upper() == "DS.W" or str(currentLine.codop).upper() == "RMW":
								if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
									if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
										continue
									if(analisisCodop.valor > 65535):
										errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva "+str(currentLine.codop).upper()+" es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									else:
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc+=analisisCodop.valor*2
								else:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
								continue
						else:
							errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser diferente de NULL\n"
						continue
					"""
					FIN DIRECTIVAS
					"""

					atributos = currentLine.atributos()
					variablesTextBox += atributos[0] + "\n"
					variablesTextBox += atributos[1] + "\n"
					#Si la línea contiene un código de operación
					if(currentLine.codop != None):
						#Si el código de operación no se encuentra en la 
						#Tabla de operaciones
						if not currentLine.codop.text.upper() in self.tabop:
							if currentLine.codop.text.upper()!="ORG":
								currentLine.errores.append(currentLine.codop.text 
														   + " no se encuentra en"
														   + " la TABOP")
								variablesTextBox+=atributos[2]+"\n\n"
						else:
							infoInstr = self.tabop[currentLine.codop.text.upper()]
							if not banderaOrg:
								errorTextBox += str(lineCount - 1) + ": La directiva "+str(currentLine.codop)+" no puede estar antes de ORG\n"
							#Bandera utilizada para saber si el código de
							#operación de la línea admite tener o no operando
							permiteOperando = self.tabop[currentLine.codop.text.upper()]['operando']
							if permiteOperando and currentLine.operando == None:
								currentLine.errores.append("El CODOP "
														   +currentLine.codop.text
														   +" debe tener Operando")
							if not permiteOperando and currentLine.operando != None:
								currentLine.errores.append("El CODOP "
														   +currentLine.codop.text
														   +" NO debe tener Operando")
							if not permiteOperando and currentLine.operando == None:
								infoInstrModo = infoInstr['modos']['Inherente']
								fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"Inherente",infoInstrModo['codMaq'],infoInstrModo['bCalculados'],infoInstrModo['bCalcular'],infoInstrModo['bTotal'])
								contLoc += infoInstrModo['bTotal']
								variablesTextBox += "  Operando: Inherente " + str(infoInstrModo['bTotal']) + " bytes\n\n"
								continue
							#variablesTextBox += "  Operando: " + str(permiteOperando) + "\n"
							analisisCodop = Automata(currentLine.operando.text)
							variablesTextBox += atributos[2] + "\n"
							if len(analisisCodop.errores) != 0:
								variablesTextBox+="Error (detalles en el log de errores [linea "+str(lineCount-1)+"])\n\n"
								for error in analisisCodop.errores:
									errorTextBox += str(lineCount - 1) + ": " + error + "\n"
								continue
							else:
								banderaModoEncontrado = False
								#Se itera sobre todos los modos de direccionamiento que tenga el código de operación
								for modo in analisisCodop.modos:
									infoInstr = self.tabop[currentLine.codop.text.upper()]
									if modo in infoInstr['modos'] and not banderaModoEncontrado:
										banderaModoEncontrado = True
										infoInstrModo = infoInstr['modos']
										if modo == 'IDX':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['IDX']['bTotal']
											if analisisCodop.signo == None and analisisCodop.registroAc == None:
												variablesTextBox += "Indizado de 5 bits, (IDX), " + str(infoInstrModo['IDX']['bTotal']) + " bytes\n"
											elif analisisCodop.registroAc != None:
												variablesTextBox += "Indizado de acumulador, (IDX), " + str(infoInstrModo['IDX']['bTotal']) + " bytes\n"
											else:
												variablesTextBox += "Indizado de "
												if analisisCodop.pre:
													variablesTextBox+="pre "
												else:
													variablesTextBox+="post "
												if analisisCodop.signo == '+':
													variablesTextBox+="incremento"
												else:
													variablesTextBox+="decremento"
												variablesTextBox+=", (IDX), de " + str(infoInstrModo['IDX']['bTotal']) + " bytes\n"
										elif modo == 'IDX1':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['IDX1']['bTotal']
											variablesTextBox += "Indizado de 9 bits, (IDX1), " + str(infoInstrModo['IDX1']['bTotal']) + " bytes\n"
										elif modo == 'IDX2':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['IDX2']['bTotal']
											variablesTextBox += "Indizado de 16 bits, (IDX2), " + str(infoInstrModo['IDX2']['bTotal']) + " bytes\n"
										elif modo == '[IDX2]':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['[IDX2]']['bTotal']
											variablesTextBox += "Indizado indirecto de 16 bits, (IDX1), " + str(infoInstrModo['[IDX2]']['bTotal']) + " bytes\n"
										elif modo == '[D,IDX]':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['[D,IDX]']['bTotal']
											variablesTextBox += "Indizado indirecto de acumulador, ([D,IDX]), " + str(infoInstrModo['[D,IDX]']['bTotal']) + " bytes\n"
										elif modo == 'REL':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['REL']['bTotal']
											variablesTextBox += "Relativo de "+str(4*infoInstrModo['REL']['bTotal'])+" bits, "+ str(infoInstrModo['REL']['bTotal']) + " bytes\n"
										elif modo == 'Extendido':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['Extendido']['bTotal']
											variablesTextBox+="Extendido, de "+str(infoInstrModo['Extendido']['bTotal']) + " bytes\n"
										elif modo == 'Directo':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['Directo']['bTotal']
											variablesTextBox+="Directo, de "+str(infoInstrModo['Directo']['bTotal']) + " bytes\n"
										elif modo == 'Inmediato':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['Inmediato']['bTotal']
											variablesTextBox+="Inmediato de "+str(8*infoInstrModo['Inmediato']['bCalcular'])+" bits, "+str(infoInstrModo['Inmediato']['bTotal']) + " bytes\n"
										variablesTextBox+='\n'
								if not banderaModoEncontrado:
									variablesTextBox+="No coincide con ningún modo de direccionamiento (detalles en el log de errores [linea "+str(lineCount-1)+"])"
									errorTextBox+=str(lineCount-1)+": No coincide con ningún modo de direccionameiento (modos válidos para el codop ["+currentLine.codop.text+"]: "
									b_=False
									for modo in self.tabop[currentLine.codop.text.upper()]['modos']:
										if b_:
											errorTextBox+=","+modo
										else:
											b_=True
											errorTextBox+=modo
									errorTextBox+=")\n"
					for error in currentLine.getErrores():
						errorTextBox += str(lineCount - 1) + ": " + error + "\n"
			if not banderaEnd:
				errorTextBox += str(lineCount - 1) + ": No se encontró el END\n"
			fileListado.close()
			if(banderaTabsimCreada):
				tabsim.close()
			#Fin de paso 1
			#Paso 2

			sGenerado+="s0"
			#Tamaño en bytes del registro s que se esté calculando actualemente
			sSize = 0
			#Codigo generado para el registro s actual
			sCode = ""
			#Bandera para crear nuevo registro S1
			banderaNuevoS0 = False
			#Contador de localidades para los S0
			sContLoc = 0
			#Registro s0
			#Tam máximo - 2 bytes de la dirección - 1 byte del \LF - 1 byte del checksum
			if(len(rutaArchivo)<(0xff-2-1-1)):
				#Tamaño
				sGenerado+=hex(len(rutaArchivo)+2+1+1)[2:].rjust(2,"0").upper()
				#Dirección
				sCode+="0000"
				#Convertir cada caracter ascii a su representación hexadecimal
				for c in rutaArchivo:
					sCode+=hex(ord(c))[2:].rjust(2,"0").upper()
				#\n
				sCode+="0A"
			else:
				errorTextBox+="El nombre completo del archivo que se trata de ensamblar es demasiado largo, intenta cambiarlo a una ubicación más cerca de la raíz o ponerle un nombre más pequeño\n"
			sGenerado+=sCode+Util.checkSum(sCode)
			sSize=0
			sCode=""
			fileListado = Listado(nombreListado,"r")
			#Para cada línea en el archivo de listado
			for line in fileListado.lines():
				currentLine = fileListado.read(line)
				#Se evalúa la línea con el operando con el autómata
				analisisCodop = Automata(currentLine['operando'])
				codMaqGenerado+=str(currentLine['contLoc'])+" "+str(currentLine['etiqueta']).rjust(9)+" "+str(currentLine['codop']).rjust(5)+" "+str(currentLine['operando']).rjust(10)+"\t"
				if(currentLine['modo']=="Inherente"):
					sCode+=str(currentLine['codMaq'])
					codMaqGenerado+=str(currentLine['codMaq'])
				elif(currentLine['modo']=="Directo"):
					sCode+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(2,"0").upper()
					codMaqGenerado+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(2,"0").upper()
				elif(currentLine['modo']=="Extendido"):
					if analisisCodop.etiqueta!=None:
						if currentLine['operando'] in tabsim.etiquetasTabsim:
							sCode+=str(currentLine['codMaq'])+tabsim.etiquetasTabsim[currentLine['operando']].upper()
							codMaqGenerado+=str(currentLine['codMaq'])+tabsim.etiquetasTabsim[currentLine['operando']].upper()
						else:
							codMaqGenerado+=str(currentLine['codMaq'])+"----"
							errorTextBox+=currentLine['contLoc']+": ("+ currentLine['codop'] +"), la etiqueta "+ currentLine['operando'] +" no existe\n"
					else:
						sCode+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(4,"0").upper()
						codMaqGenerado+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(4,"0").upper()
				elif(currentLine['modo']=="Inmediato"):
					if(currentLine['bCalcular']=='1'):
						sCode+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(2,"0").upper()
						codMaqGenerado+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(2,"0").upper()
					elif(currentLine['bCalcular']=='2'):
						sCode+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(4,"0").upper()
						codMaqGenerado+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(4,"0").upper()
				elif(currentLine['modo']=="IDX"):
					if analisisCodop.pre==None and analisisCodop.registroAc==None and analisisCodop.etiqueta==None:
						sCode+=str(currentLine['codMaq']+Util.xb5(analisisCodop.valor,analisisCodop.registro).upper())
						codMaqGenerado+=str(currentLine['codMaq']+Util.xb5(analisisCodop.valor,analisisCodop.registro).upper())
					elif analisisCodop.pre!=None and analisisCodop.etiqueta==None:
						sCode+=str(currentLine['codMaq']+Util.xbppid(analisisCodop.valor,analisisCodop.registro,analisisCodop.signo,analisisCodop.pre).upper())
						codMaqGenerado+=str(currentLine['codMaq']+Util.xbppid(analisisCodop.valor,analisisCodop.registro,analisisCodop.signo,analisisCodop.pre).upper())
					else:
						sCode+=str(currentLine['codMaq']+Util.xbac(analisisCodop.registro,analisisCodop.registroAc).upper())
						codMaqGenerado+=str(currentLine['codMaq']+Util.xbac(analisisCodop.registro,analisisCodop.registroAc).upper())
				elif(currentLine['modo']=="IDX1"):
					sCode+=str(currentLine['codMaq']+Util.idx1(analisisCodop.valor,analisisCodop.registro).upper())
					codMaqGenerado+=str(currentLine['codMaq']+Util.idx1(analisisCodop.valor,analisisCodop.registro).upper())
				elif(currentLine['modo']=="IDX2"):
					sCode+=str(currentLine['codMaq']+Util.idx2(analisisCodop.valor,analisisCodop.registro).upper())
					codMaqGenerado+=str(currentLine['codMaq']+Util.idx2(analisisCodop.valor,analisisCodop.registro).upper())
				elif(currentLine['modo']=="[IDX2]"):
					sCode+=str(currentLine['codMaq']+Util.idx2cplx(analisisCodop.valor,analisisCodop.registro).upper())
					codMaqGenerado+=str(currentLine['codMaq']+Util.idx2cplx(analisisCodop.valor,analisisCodop.registro).upper())
				elif(currentLine['modo']=="[D,IDX]"):
					sCode+=str(currentLine['codMaq']+Util.xbd(analisisCodop.registro).upper())
					codMaqGenerado+=str(currentLine['codMaq']+Util.xbd(analisisCodop.registro).upper())
				elif(currentLine['modo']=="REL"):
					sCode+=currentLine['codMaq']
					codMaqGenerado+=currentLine['codMaq']
					if currentLine['operando'] in tabsim.etiquetasTabsim:
						if currentLine['bCalcular']=='2': #16 bits
							_relVal = int(tabsim.etiquetasTabsim[currentLine['operando']],16)-(int(currentLine['contLoc'],16)+4)
							if _relVal >= -32768 and _relVal < 0:
								sCode+=hex(int(Util.comp2(-_relVal,16),2))[2:].rjust(4,"0").upper()
								codMaqGenerado+=hex(int(Util.comp2(-_relVal,16),2))[2:].rjust(4,"0").upper()
							elif _relVal >= 0 and _relVal <= 32767:
								sCode+= hex(_relVal)[2:].rjust(4,"0").upper()
								codMaqGenerado+= hex(_relVal)[2:].rjust(4,"0").upper()
							else:
								sCode+="----"
								errorTextBox+=currentLine['contLoc']+": ("+ currentLine['codop'] +"), fuera de rango (" +str(_relVal)+ "), el permitido para relativos de 16 bits es -32768 a 32767\n"
						elif currentLine['bCalcular']=='1': #8 bits
							_relVal = int(tabsim.etiquetasTabsim[currentLine['operando']],16)-(int(currentLine['contLoc'],16)+2)
							if _relVal >= -128 and _relVal < 0:
								sCode+=hex(int(Util.comp2(-_relVal,8),2))[2:].rjust(2,"0").upper()
								codMaqGenerado+=hex(int(Util.comp2(-_relVal,8),2))[2:].rjust(2,"0").upper()
							elif _relVal >= 0 and _relVal <= 127:
								sCode+= hex(_relVal)[2:].rjust(2,"0").upper()
								codMaqGenerado+= hex(_relVal)[2:].rjust(2,"0").upper()
							else:
								codMaqGenerado+="--"
								errorTextBox+=currentLine['contLoc']+": ("+ currentLine['codop'] +"), fuera de rango (" +str(_relVal)+ "), el permitido para relativos de 16 bits es -128 a 127\n"
					else:
						if currentLine['bCalcular']=='2':
							codMaqGenerado+="----"
						else:
							codMaqGenerado+="--"
						errorTextBox+=currentLine['contLoc']+": ("+ currentLine['codop'] +"), la etiqueta "+ currentLine['operando'] +" no existe\n"
				elif(currentLine['modo']=="DVA"):
					if str(currentLine['codop'].upper()) == "ORG":
						sContLoc=currentLine['contLoc']
					elif str(currentLine['codop']).upper() == "DB" or str(currentLine['codop']).upper() == "DC.B" or str(currentLine['codop']).upper() == "FCB":
						sCode+=hex(analisisCodop.valor)[2:].rjust(2,"0").upper()
						codMaqGenerado+=hex(analisisCodop.valor)[2:].rjust(2,"0").upper()
					elif str(currentLine['codop']).upper() == "DW" or str(currentLine['codop']).upper() == "DC.W" or str(currentLine['codop']).upper() == "FDB":
						sCode+=hex(analisisCodop.valor)[2:].rjust(4,"0").upper()
						codMaqGenerado+=hex(analisisCodop.valor)[2:].rjust(4,"0").upper()
					elif str(currentLine['codop']).upper() == "FCC":
						for c in currentLine['operando'][1:-1]:
							sCode+=hex(ord(c))[2:].rjust(2,"0").upper()
							codMaqGenerado+=hex(ord(c))[2:].rjust(2,"0").upper()
					elif str(currentLine['codop']).upper() == "DS" or str(currentLine['codop']).upper() == "DS.B" or str(currentLine['codop']).upper() == "DS.W" or str(currentLine['codop']).upper() == "RMB" or str(currentLine['codop']).upper() == "RMW":
						sSize=(len(sCode)/2)
						banderaNuevoS0 = True
						if sSize != 0:
							sGenerado+="\ns1"+hex(sSize+3)[2:].upper().rjust(2,"0")+sContLoc+sCode+Util.checkSum(hex(sSize+3)[2:].upper().rjust(2,"0")+sContLoc+sCode)
							sSize = 0
							sCode = ""
				else:
					codMaqGenerado+="No encontrado"
				if banderaNuevoS0:
					if len(sCode)>0:
						banderaNuevoS0 = False
						sContLoc = currentLine['contLoc']
				sSize=(len(sCode)/2)
				if sSize>=16:
					sSize%=16
					sGenerado+="\ns113"+sContLoc+sCode[:16*2]+Util.checkSum("13"+sContLoc+sCode[:16*2])
					sContLoc=hex(int(sContLoc,16)+16)[2:].upper().rjust(4,"0")
					if sSize!=0:
						sCode=sCode[-sSize*2:]
					else:
						sCode=""
				codMaqGenerado+="\n"
			if sSize>0:
				sGenerado+="\ns1"+hex(sSize+3)[2:].upper().rjust(2,"0")+sContLoc+sCode+Util.checkSum(hex(sSize+3)[2:].upper().rjust(2,"0")+sContLoc+sCode)
			sGenerado+="\nS9030000FC"
			#print(rutaArchivo)
			#print(sGenerado)
			s19 = open(rutaArchivo[:rutaArchivo.rfind(".")]+".s19","w")
			s19.write(sGenerado)
			s19.close()
			errorTextBox += "Longitud del código (en bytes): "+str(contLoc - direccionInicial)+"\n"
			errorTextBox += "Se generó con éxito el archivo .s19 en la misma ubicación que el archivo a ensamblar\n"
			errorTextBox += sGenerado+"\n"
			return archivoCorto, fileTextBox, variablesTextBox, errorTextBox, codMaqGenerado
		else:
			return None
示例#2
0
	def cargarArchivo(self, rutaArchivo):
		"""
			Carga y evalúa un archivo que contenga código en ensamblador (HC12)
		"""
		#Bandera utilizada para saber si el archivo contiene el codop END
		banderaEnd = False
		#Bandera utilizada para saber si la tabla de símbolos ya fue creada
		banderaTabsimCreada = False
		#Bandera utilizada para saber si ya se usó la directiva ORG por lo menos
		#una vez
		banderaOrg = False
		#Las variables "direccionInicial" y "contLoc" estarán en base decimal 
		#pero a la hora de escribirlo en el archivo se hará de manera Hexadecimal
		#de 4 bytes
		#Variable utilizada para guardar el valor inicial del archivo de listado
		direccionInicial = 0
		#Variable utilizada para llevar la cuenta de en qué localidad se encuentra
		#la instrucción actual en el archivo de listado
		contLoc = 0
		if(Util.existeArchivo(rutaArchivo)):
			#Guardará la información de la instrucción que esté evaluando
			infoInstr = None
			#Guardará la información de la instrucción actual, en el modo actual
			infoInstrModo = None
			#Lista de directivas CONSTANTES y de RESERVA DE ESPACIO DE MEMORIA
			directivas = ["DW","DB","DC.W","DC.B","FCB","FDB","FCC","DS","DS.B","DS.W","RMB","RMW"]
			archivoCorto = rutaArchivo.split("/")
			archivoCorto = archivoCorto[len(archivoCorto)-1]
			nombreListado = str.join(".",archivoCorto.split(".")[0:-1]) + "tmp.txt"
			fileListado = Listado(nombreListado,"w")
			nombreTabsim = str.join(".",archivoCorto.split(".")[0:-1]) + "tabsim.txt"
			#nombreTabsim = "tabsim.txt"
			_file = open(rutaArchivo, "r")
			fileText = _file.read()
			_file.close()
			lineCount = 1
			fileTextBox = ""
			codMaqGenerado = ""
			variablesTextBox = ""
			errorTextBox = ""
			#Iterar sobre todas las lineas del archivo
			for line in fileText.split('\n'):
				#agregamos el número de línea en cada línea
				fileTextBox += str(lineCount) + "\t" + str( line ) + "\n"
				lineCount += 1

				#Mandamos la línea actual a la clase Linea
				currentLine = Linea(str(line))
				if (currentLine.comentario) :
					variablesTextBox += "Comentario\n\n"
				else:
					if contLoc > 65535:
						errorTextBox += str(lineCount - 2) + ": Desbordamiento del contador de localidades [valor máximo: 65535] [valor actual: "+str(contLoc)+"] (Se reiniciará a 0)\n"
						contLoc=0
					"""
					INICIO DIRECTIVAS
					"""
					#Validar EQU
					if str(currentLine.codop).upper() == "EQU":
						if(currentLine.etiqueta != None and currentLine.operando != None):
							#Sacar el valor del operando
							analisisCodop = Automata(currentLine.operando.text)
							if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
								if("Directo" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
									errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva EQU es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									continue
								elif("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva EQU tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
									continue
								#Ya se cuenta con el valor, ahora se trata de insertar en la tabsim
								elif(not banderaTabsimCreada):
									tabsim = Tabsim(nombreTabsim)
									banderaTabsimCreada = True
								elif(not tabsim.write(currentLine.etiqueta, analisisCodop.valor)):
									errorTextBox += str(lineCount - 1) + ": La etiqueta "+str(currentLine.etiqueta)+" ya fue usada\n"
								else:
									#Se escribe en el archivo de listado
									fileListado.write(analisisCodop.valor,currentLine.etiqueta,"EQU",currentLine.operando,None,"DVA",None,None,None,None)
						else:
							errorTextBox += str(lineCount - 1) + ": Para la directiva EQU tanto la etiqueta como el operando tienen que ser diferentes de NULL\n"
						continue
					
					#Validar ORG
					if str(currentLine.codop).upper() == "ORG":
						if(currentLine.operando == None):
							errorTextBox += str(lineCount - 1) + ": La directiva ORG debe de tener operando\n"
						else:
							if(banderaOrg):
								errorTextBox += str(lineCount - 1) + ": La directiva ORG debe existir una sola vez\n"
								continue
							analisisCodop = Automata(currentLine.operando.text)
							if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
								if("Directo" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
									errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva ORG es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									continue
								if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva ORG tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
									continue
								#Si se llegó a éste punto quiere decir que la directiva ORG no había sido usada con anterioridad y
								#su operando es un número válido
								banderaOrg = True
								direccionInicial = analisisCodop.valor					
								contLoc = analisisCodop.valor
								fileListado.write(contLoc,currentLine.etiqueta,"ORG",currentLine.operando,None,"DVA",None,None,None,None)
							else:
								errorTextBox += str(lineCount - 1) + ": El operando de la directiva ORG tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"

					#Escribir etiqueta en TABSIM, si es que existe
					if(currentLine.etiqueta != None):
						if(not banderaTabsimCreada):
							tabsim = Tabsim(nombreTabsim)
							banderaTabsimCreada = True
						if(not tabsim.write(currentLine.etiqueta, contLoc)):
							errorTextBox += str(lineCount - 1) + ": La etiqueta "+str(currentLine.etiqueta)+" ya fue usada\n"
							continue
					
					#Validar END
					if str(currentLine.codop).upper() == "END":
						if(currentLine.operando != None):
							errorTextBox += str(lineCount - 1) + ": La directiva END no puede tener operando\n"
							continue
						#if(banderaEnd):
							#errorTextBox += str(lineCount - 1) + ": La instrucción END puede existir una sola vez\n"
						if not banderaOrg:
							errorTextBox += str(lineCount - 1) + ": La directiva END no puede estar antes de ORG\n"
							continue
						banderaEnd = True
						fileListado.write(contLoc,currentLine.etiqueta,"END",currentLine.operando,None,"DVA",None,None,None,None)
						continue

					if str(currentLine.codop).upper() in directivas:
						if not banderaOrg:
							errorTextBox += str(lineCount - 1) + ": La directiva "+str(currentLine.codop)+" no puede estar antes de ORG\n"
						if currentLine.operando != None:
							analisisCodop = Automata(currentLine.operando.text)
							#DB, DC.B, FCB
							if str(currentLine.codop).upper() == "DB" or str(currentLine.codop).upper() == "DC.B" or str(currentLine.codop).upper() == "FCB":
								if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
									if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
										continue
									if(analisisCodop.valor > 255):
										errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva "+str(currentLine.codop).upper()+" es de 0 a 255, el valor actual es "+str(analisisCodop.valor)+"\n"
									else:
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc+=1
								else:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
								continue
							#DW, DC.W, FDB
							if str(currentLine.codop).upper() == "DW" or str(currentLine.codop).upper() == "DC.W" or str(currentLine.codop).upper() == "FDB":
								if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
									if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
										continue
									if(analisisCodop.valor > 65535):
										errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva "+str(currentLine.codop).upper()+" es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									else:
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc+=2
								else:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
								continue
							#FCC
							if str(currentLine.codop).upper() == "FCC":
								try:
									str(currentLine.operando).decode('ascii')
								except:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser una cadena de caracteres ASCII\n"
									continue
								else:
									if str(currentLine.operando)[0]=="\"" and str(currentLine.operando)[-1]=="\"" and (len(str(currentLine.operando))>1):
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc += len(str(currentLine.operando))-2
									else:
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser una cadena de caracteres ASCII que comience y termine con \" (no puede terminar en espacios)\n"
									continue
							#DS, DS.B, RMB 
							if str(currentLine.codop).upper() == "DS" or str(currentLine.codop).upper() == "DS.B" or str(currentLine.codop).upper() == "RMB":
								if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
									if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
										continue
									if(analisisCodop.valor > 65535):
										errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva "+str(currentLine.codop).upper()+" es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									else:
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc+=analisisCodop.valor
								else:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
								continue
							#DS.W, RMW
							if str(currentLine.codop).upper() == "DS.W" or str(currentLine.codop).upper() == "RMW":
								if("Directo" in analisisCodop.modos or "Extendido" in analisisCodop.modos):
									if("REL" in analisisCodop.modos and "Extendido" in analisisCodop.modos):
										errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
										continue
									if(analisisCodop.valor > 65535):
										errorTextBox += str(lineCount - 1) + ": El rango de números válidos para la directiva "+str(currentLine.codop).upper()+" es de 0 a 65535, el valor actual es "+str(analisisCodop.valor)+"\n"
									else:
										fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"DVA",None,None,None,None)
										contLoc+=analisisCodop.valor*2
								else:
									errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser un número en cualquier representación válida (binario, octal, decimal o hexadecimal)\n"
								continue
						else:
							errorTextBox += str(lineCount - 1) + ": El operando de la directiva "+str(currentLine.codop).upper()+" tiene que ser diferente de NULL\n"
						continue
					"""
					FIN DIRECTIVAS
					"""

					atributos = currentLine.atributos()
					variablesTextBox += atributos[0] + "\n"
					variablesTextBox += atributos[1] + "\n"
					#Si la línea contiene un código de operación
					if(currentLine.codop != None):
						#Si el código de operación no se encuentra en la 
						#Tabla de operaciones
						if not currentLine.codop.text.upper() in self.tabop:
							currentLine.errores.append(currentLine.codop.text 
													   + " no se encuentra en"
													   + " la TABOP")
							variablesTextBox+=atributos[2]+"\n\n"
						else:
							infoInstr = self.tabop[currentLine.codop.text.upper()]
							if not banderaOrg:
								errorTextBox += str(lineCount - 1) + ": La directiva "+str(currentLine.codop)+" no puede estar antes de ORG\n"
							#Bandera utilizada para saber si el código de
							#operación de la línea admite tener o no operando
							permiteOperando = self.tabop[currentLine.codop.text.upper()]['operando']
							if permiteOperando and currentLine.operando == None:
								currentLine.errores.append("El CODOP "
														   +currentLine.codop.text
														   +" debe tener Operando")
							if not permiteOperando and currentLine.operando != None:
								currentLine.errores.append("El CODOP "
														   +currentLine.codop.text
														   +" NO debe tener Operando")
							if not permiteOperando and currentLine.operando == None:
								infoInstrModo = infoInstr['modos']['Inherente']
								fileListado.write(contLoc,currentLine.etiqueta,str(currentLine.codop).upper(),currentLine.operando,None,"Inherente",infoInstrModo['codMaq'],infoInstrModo['bCalculados'],infoInstrModo['bCalcular'],infoInstrModo['bTotal'])
								contLoc += infoInstrModo['bTotal']
								variablesTextBox += "  Operando: Inherente " + str(infoInstrModo['bTotal']) + " bytes\n\n"
								continue
							#variablesTextBox += "  Operando: " + str(permiteOperando) + "\n"
							analisisCodop = Automata(currentLine.operando.text)
							variablesTextBox += atributos[2] + "\n"
							if len(analisisCodop.errores) != 0:
								variablesTextBox+="Error (detalles en el log de errores [linea "+str(lineCount-1)+"])\n\n"
								for error in analisisCodop.errores:
									errorTextBox += str(lineCount - 1) + ": " + error + "\n"
								continue
							else:
								banderaModoEncontrado = False
								for modo in analisisCodop.modos:
									infoInstr = self.tabop[currentLine.codop.text.upper()]
									if modo in infoInstr['modos'] and not banderaModoEncontrado:
										banderaModoEncontrado = True
										infoInstrModo = infoInstr['modos']
										if modo == 'IDX':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['IDX']['bTotal']
											if analisisCodop.signo == None and analisisCodop.registroAc == None:
												variablesTextBox += "Indizado de 5 bits, (IDX), " + str(infoInstrModo['IDX']['bTotal']) + " bytes\n"
											elif analisisCodop.registroAc != None:
												variablesTextBox += "Indizado de acumulador, (IDX), " + str(infoInstrModo['IDX']['bTotal']) + " bytes\n"
											else:
												variablesTextBox += "Indizado de "
												if analisisCodop.pre:
													variablesTextBox+="pre "
												else:
													variablesTextBox+="post "
												if analisisCodop.signo == '+':
													variablesTextBox+="incremento"
												else:
													variablesTextBox+="decremento"
												variablesTextBox+=", (IDX), de " + str(infoInstrModo['IDX']['bTotal']) + " bytes\n"
										elif modo == 'IDX1':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['IDX1']['bTotal']
											variablesTextBox += "Indizado de 9 bits, (IDX1), " + str(infoInstrModo['IDX1']['bTotal']) + " bytes\n"
										elif modo == 'IDX2':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['IDX2']['bTotal']
											variablesTextBox += "Indizado de 16 bits, (IDX2), " + str(infoInstrModo['IDX2']['bTotal']) + " bytes\n"
										elif modo == '[IDX2]':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['[IDX2]']['bTotal']
											variablesTextBox += "Indizado indirecto de 16 bits, (IDX1), " + str(infoInstrModo['[IDX2]']['bTotal']) + " bytes\n"
										elif modo == '[D,IDX]':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['[D,IDX]']['bTotal']
											variablesTextBox += "Indizado indirecto de acumulador, ([D,IDX]), " + str(infoInstrModo['[D,IDX]']['bTotal']) + " bytes\n"
										elif modo == 'REL':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['REL']['bTotal']
											variablesTextBox += "Relativo de "+str(4*infoInstrModo['REL']['bTotal'])+" bits, "+ str(infoInstrModo['REL']['bTotal']) + " bytes\n"
										elif modo == 'Extendido':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['Extendido']['bTotal']
											variablesTextBox+="Extendido, de "+str(infoInstrModo['Extendido']['bTotal']) + " bytes\n"
										elif modo == 'Directo':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['Directo']['bTotal']
											variablesTextBox+="Directo, de "+str(infoInstrModo['Directo']['bTotal']) + " bytes\n"
										elif modo == 'Inmediato':
											fileListado.write(contLoc,currentLine.etiqueta,currentLine.codop,currentLine.operando,analisisCodop.valor,modo,infoInstrModo[modo]['codMaq'],infoInstrModo[modo]['bCalculados'],infoInstrModo[modo]['bCalcular'],infoInstrModo[modo]['bTotal'])
											contLoc += infoInstrModo['Inmediato']['bTotal']
											variablesTextBox+="Inmediato de "+str(8*infoInstrModo['Inmediato']['bCalcular'])+" bits, "+str(infoInstrModo['Inmediato']['bTotal']) + " bytes\n"
										variablesTextBox+='\n'
								if not banderaModoEncontrado:
									variablesTextBox+="No coincide con ningún modo de direccionamiento (detalles en el log de errores [linea "+str(lineCount-1)+"])"
									errorTextBox+=str(lineCount-1)+": No coincide con ningún modo de direccionameiento (modos válidos para el codop ["+currentLine.codop.text+"]: "
									b_=False
									for modo in self.tabop[currentLine.codop.text.upper()]['modos']:
										if b_:
											errorTextBox+=","+modo
										else:
											b_=True
											errorTextBox+=modo
									errorTextBox+=")\n"
					for error in currentLine.getErrores():
						errorTextBox += str(lineCount - 1) + ": " + error + "\n"
			if not banderaEnd:
				errorTextBox += str(lineCount - 1) + ": No se encontró el END\n"
			fileListado.close()
			if(banderaTabsimCreada):
				tabsim.close()

			fileListado = Listado(nombreListado,"r")
			for line in fileListado.lines():
				currentLine = fileListado.read(line)
				analisisCodop = Automata(currentLine['operando'])
				codMaqGenerado+=str(currentLine['contLoc'])+" "+str(currentLine['etiqueta']).rjust(9)+" "+str(currentLine['codop']).rjust(5)+" "+str(currentLine['operando']).rjust(9)+"\t"
				if(currentLine['modo']=="Inherente"):
					codMaqGenerado+=str(currentLine['codMaq'])
				elif(currentLine['modo']=="Directo"):
					codMaqGenerado+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(2,"0").upper()
				elif(currentLine['modo']=="Extendido"):
					if analisisCodop.etiqueta!=None:
						#Implementar la búsqueda en la tabla de símbolos :)
						codMaqGenerado+=""
					else:
						codMaqGenerado+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(4,"0").upper()
				elif(currentLine['modo']=="Inmediato"):
					if(currentLine['bCalcular']=='1'):
						codMaqGenerado+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(2,"0").upper()
					elif(currentLine['bCalcular']=='2'):
						codMaqGenerado+=str(currentLine['codMaq'])+currentLine['valorHex'].rjust(4,"0").upper()
				elif(currentLine['modo']=="IDX"):
					if analisisCodop.pre==None and analisisCodop.registroAc==None and analisisCodop.etiqueta==None:
						codMaqGenerado+=str(currentLine['codMaq']+Util.xb5(analisisCodop.valor,analisisCodop.registro).upper())
					elif analisisCodop.pre!=None and analisisCodop.etiqueta==None:
						codMaqGenerado+=str(currentLine['codMaq']+Util.xbppid(analisisCodop.valor,analisisCodop.registro,analisisCodop.signo,analisisCodop.pre).upper())
					else:
						codMaqGenerado+=str(currentLine['codMaq']+Util.xbac(analisisCodop.registro,analisisCodop.registroAc).upper())
				elif(currentLine['modo']=="IDX1"):
					codMaqGenerado+=str(currentLine['codMaq']+Util.idx1(analisisCodop.valor,analisisCodop.registro).upper())
				elif(currentLine['modo']=="IDX2"):
					codMaqGenerado+=str(currentLine['codMaq']+Util.idx2(analisisCodop.valor,analisisCodop.registro).upper())
				elif(currentLine['modo']=="[IDX2]"):
					codMaqGenerado+=str(currentLine['codMaq']+Util.idx2cplx(analisisCodop.valor,analisisCodop.registro).upper())
				elif(currentLine['modo']=="[D,IDX]"):
					codMaqGenerado+=str(currentLine['codMaq']+Util.xbd(analisisCodop.registro).upper())
				else:
					codMaqGenerado+="No encontrado"
				codMaqGenerado+="\n"
			errorTextBox += "Longitud del código (en bytes): "+str(contLoc - direccionInicial)+"\n"
			return archivoCorto, fileTextBox, variablesTextBox, errorTextBox, codMaqGenerado
		else:
			return None

#TODO
#	-Búsqueda en la tabla de símbolos
#	-Relativos