public DIRECTIVA(String directive,OPERANDO operando,LABEL label) { baseNumerica base1 = new baseNumerica(operando.getOperando()); //base1.convert2Dec(); codigoMaquina = ""; valida = true; size = 0; valueHex = ""; if (!base1.getValido() && directive != "FCC" && directive != "END") { imprimirMensaje = "[Error]El operando contiene valores que no son validos en su base"; valida = false; } if (operando.getOperando() == "NULL" && directive != "END") { imprimirMensaje = "[Error]La Directiva necesita operando"; valida = false; } switch (directive) { case "ORG": existe = true; if (!(base1.getNumberDecimal() >= 0 && base1.getNumberDecimal() <= 65535)) { imprimirMensaje = "[Error]Valor invalido para " + directive + " los valores van de 0-65535"; valida = false; } break; case "END": existe = true; if(operando.getOperando()!="NULL") { imprimirMensaje = "[Error]END no debe llevar operando"; valida = false; } break; case "DB": case "DC.B": case "FCB": existe = true; if (base1.getNumberDecimal() >= 0 && base1.getNumberDecimal() <= 255) { size = 1; try { codigoMaquina = base1.getNumberHexadecimal().PadLeft(2, '0'); } catch(Exception ex) { imprimirMensaje = "[Error] Valores invalidos para la base"; valida = false; } } else { imprimirMensaje = "[Error]Valor invalido para " + directive + " los valores van de 0-255"; valida = false; } break; case "DW": case "DC.W": case "FDB": existe = true; if (base1.getNumberDecimal() >= 0 && base1.getNumberDecimal() <= 65535) { size = 2; try { codigoMaquina = base1.getNumberHexadecimal().PadLeft(4, '0'); } catch(Exception ex) { imprimirMensaje = "[Error] Valores invalidos para la base"; valida = false; } } else { imprimirMensaje = "[Error]Valor invalido para " + directive + " los valores van de 0-65535"; valida = false; } break; case "FCC": existe = true; if ((@operando.getOperando()[0] == '"' && @operando.getOperando()[operando.getOperando().Length - 1] == '"') && operando.getOperando().Length >= 2) { size = operando.getOperando().Length - 2; baseNumerica b2 = new baseNumerica("0"); for (int i = 1; i<operando.getOriginal().Length-1;i++ ) { int tmpIntFCC = 0; tmpIntFCC = System.Convert.ToInt16(operando.getOriginal()[i]); b2 = new baseNumerica(System.Convert.ToString(tmpIntFCC)); codigoMaquina += b2.getNumberHexadecimal(); } } else { imprimirMensaje = "[Error]El operando no tiene ambas comillas"; valida = false; } break; case "DS": case "DS.B": case "RMB": existe = true; if (base1.getNumberDecimal() >= 0 && base1.getNumberDecimal() <= 65535) { size = 1 * base1.getNumberDecimal(); } else { imprimirMensaje = "[Error]Valor invalido para " + directive + " los valores van de 0-65535"; valida = false; } break; case "DS.W": case "RMW": existe = true; if (base1.getNumberDecimal() >= 0 && base1.getNumberDecimal() <= 65535) { size = 2 * base1.getNumberDecimal(); } else { imprimirMensaje = "[Error]Valor invalido para " + directive + " los valores van de 0-65535"; valida = false; } break; case "EQU": existe = true; if(label.getLabel() == "NULL") { imprimirMensaje = "[Error]EQU debe tener etiqueta"; valida = false; } else if (!(base1.getNumberDecimal() >= 0 && base1.getNumberDecimal() <= 65535)) { imprimirMensaje += "[Error]Valor invalido para " + directive + " los valores van de 0-65535"; valida = false; } else { baseNumerica b1 = new baseNumerica(operando.getOperando()); valueHex = b1.getNumberHexadecimal(); } break; default: existe = valida = false; break; }//End switch }
public void validaRel(String operando) { LABEL etiqueta = new LABEL(operando); etiqueta.validaEtiqueta(); if (etiqueta.getValida()) { mensajeResultado = "Relativo"; modoDireccionamiento = "REL"; encontrado = true; return; } else { mensajeResultado = "Etiqueta no valida para Relativo"; encontrado = false; return; //Relativo no valido } }
private void separaCadena(String cadena) { if (cadena[0] == ';') { txtMensajes.Text += "Comentario"; printEnter(); return; } //############################################################################################## //Separo la cadena con un automata String[] separados = new String[3];//[0]Etiqueta [1]CODOP [2]OPERANDO bool[] validos = new bool[3]; int[,] estados = new int[5,2]{ {0,1}, {2,1}, {2,3}, {4,3}, {4,4}}; int state=0,input=0,sizeString=cadena.Length,sizeTotal=0,i=0; while(i<sizeString) { switch(cadena[i]) { case ' ': case '\t': input = 1; break; default: input = 0; break; } state = estados[state,input]; switch(state){ case 0: separados[sizeTotal] += cadena[i++]; break; case 1:case 3: i++; if (i < sizeString && cadena[i] != ' ' && cadena[i] != '\t') { sizeTotal++; } break; case 2: separados[sizeTotal] += cadena[i++]; break; case 4: separados[sizeTotal] += cadena[i++]; break; } } for (int j = 0; j < 3; j++) { if (separados[j] == null) separados[j] = "NULL"; } //############################################################################################## //Creo los objetos de las respectivas clases. label = new LABEL(separados[0]); label.validaEtiqueta(); codop = new CODOP(separados[1]); codop.validaCODOP(); operando = new OPERANDO(separados[2]); operando.validaOperando(); //Valido las combinaciones if (codop.getCodop() == "NULL") { txtMensajes.Text += "Linea: " + (lineasArchivo + 1); printEnter(); txtMensajes.Text += mensajesError[0];//Dice cuales son las combinaciones validas... printEnter(); printEnter(); return; } //Validaciones para la etiqueta if (label.getValida()) { txtMensajes.Text += "ETIQUETA = " + label.getLabel();//Etiqueta printEnter(); //Guardo en el tabsim la etiqueta if (label.getLabel() != "NULL" && codop.getCodop() != "EQU") { Boolean flagEncontrada = false; foreach(String labelTMP in listaEtiquetas) { if(label.getLabel() == labelTMP) { flagEncontrada = true; } } if (!flagEncontrada) { lfile.setLabel(label.getLabel()); lfile.setValue(contLoc.getNumberHexadecimal().PadLeft(4, '0'));//Modifica1 Contoloc lfile.save(fsTabsim, 2); listaEtiquetas.Add(label.getLabel()); dirEtiquetas.Add(contLoc.getNumberHexadecimal()); } else { txtMensajes.Text += mensajesError[7]; } } //Prepara para el archivo TMP lfile.setLabel1(label.getLabel()); } else { txtMensajes.Text += "Linea: " + (lineasArchivo + 1); printEnter(); txtMensajes.Text += mensajesError[1];//Etiqueta no valida printEnter(); } //Validaciones para el CODOP if (codop.getValido()) { txtMensajes.Text += "CODOP = " + codop.getCodop();//Codop printEnter(); binarySearch(0,200,codop.getCodop()); if (codop.getExiste()) { codop.revizaModoDireccionamiento(arrayCODOP,arrayTMPCODOP[codop.getIniciaCODOP()].start,arrayTMPCODOP[codop.getIniciaCODOP()].end,operando); //Preparo para guardar en el archivo TMP lfile.setCODOP(codop.getCodop()); } else { directive = new DIRECTIVA(codop.getCodop(),operando,label); if (directive.getExiste()) { if(directive.getValida()) { //Preparo para guardar en el archivo TMP if(codop.getCodop() == "ORG") { baseNumerica b1 = new baseNumerica(System.Convert.ToString(operando.getOperando())); contLoc = b1; dirInicial = b1; //contLoc.setNumberHexadecimal(b1.getNumberHexadecimal()); } else if(codop.getCodop() == "EQU") { baseNumerica b1 = new baseNumerica(System.Convert.ToString(operando.getOperando())); Boolean flagExist = false; foreach(String stmp in listaEtiquetas) { if(stmp == label.getLabel()) { flagExist = true; } } if (flagExist) { txtMensajes.Text += mensajesError[7]; printEnter(); } else { lfile.setLabel(label.getLabel()); //lfile.setValue(directive.getValueHexadecimal()); lfile.setValue(b1.getNumberHexadecimal().PadLeft(4, '0'));//Modifca2 Contloc lfile.save(fsTabsim, 2); listaEtiquetas.Add(label.getLabel()); dirEtiquetas.Add(b1.getNumberHexadecimal().PadLeft(4,'0')); lfile.setValue1(b1.getNumberHexadecimal().PadLeft(4, '0')); } } lfile.setCODOP(codop.getCodop()); } else { txtMensajes.Text += directive.getImprimirMensaje(); printEnter(); } } else { txtMensajes.Text += mensajesError[5];//El CODOP ingresado no existe printEnter(); } } } else { txtMensajes.Text += "Linea: " + (lineasArchivo + 1); printEnter(); txtMensajes.Text += mensajesError[2];//Codop no valido printEnter(); } //Validaciones para el OPERANDO txtMensajes.Text += "OPERANDO = " + operando.getOperando();//Operando printEnter(); //Preparo para guardar operando lfile.setOperando(operando.getOriginal()); txtMensajes.Text += codop.getMensajeResultado() + " "; if (codop.getBytesTotales() > 0) { txtMensajes.Text += Convert.ToString(codop.getBytesTotales()) + " bytes"; } printEnter(); //Verifico si el codop necesita un operando if (operando.getOperando() == "NULL" && codop.getNecesitaOperando() && codop.getExiste()) { txtMensajes.Text += mensajesError[3];//El codop necesita operando printEnter(); } else if(operando.getOperando() != "NULL" && !codop.getNecesitaOperando() && codop.getExiste()) { txtMensajes.Text += mensajesError[4];//El codop no necesita operando printEnter(); } printEnter(); //Verifico si hay un END de cierre if (codop.getCodop() == "END") { banderaEnd = true; } baseNumerica OV = new baseNumerica(System.Convert.ToString(0)); //Recalculo el ContLOc if (codop.getExiste()) { OV = new baseNumerica(System.Convert.ToString(codop.getBytesTotales())); } else if(directive.getValida()) { OV = new baseNumerica(System.Convert.ToString(directive.getSize())); } //int temporal = contLoc.getNumberDecimal() + OV.getNumberDecimal(); //baseNumerica TMP = new baseNumerica(System.Convert.ToString(temporal)); //contLoc = TMP; if (codop.getCodop() != "EQU") { lfile.setValue1(contLoc.getNumberHexadecimal().PadLeft(4, '0'));//Modifica3 Contloc } //Guardo el TMP lfile.save(fsTMP,1); int temporal = contLoc.getNumberDecimal() + OV.getNumberDecimal(); baseNumerica TMP = new baseNumerica(System.Convert.ToString(temporal)); contLoc = TMP; //Llamo al destructor codop = null; GC.Collect(); }
public void validaDir(String operando) { //Validar para cuando es extendido por etiqueta switch (operando[0]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '@': case '%': case '$': case '-': case '+': break; case '#': encontrado = false; return; break; case '[': encontrado = false; return; break; default: LABEL etiqueta = new LABEL(operando); etiqueta.validaEtiqueta(); if (etiqueta.getValida()) { mensajeResultado = "Extendido"; modoDireccionamiento = "EXT"; encontrado = true; return; } else { mensajeResultado = "Etiqueta no valida para extendido"; encontrado = false; return; //Etiqueta no valida Error } break; } if (operando.Length == 1 && !isDigit(operando[0])) { mensajeResultado = "Error en directo: Sintaxis (%|@|$ o ninguna base) y despues valores correspondientes a la base"; encontrado = false; return; } baseNumerica b1 = new baseNumerica(operando); //b1.convert2Dec(); if(!b1.getValido()) { String menbase = ""; String menVal = ""; switch(operando[0]) { case '%': menbase = "Binario"; menVal = "1 - 0"; break; case '@': menbase = "Octal"; menVal = "0 - 7"; break; case '$': menbase = "Hexadecimal"; menVal = "0-9 o las letras de la A - F"; break; default: menbase = "Decimal"; menVal = "0 - 9"; break; } mensajeResultado = "Valores invalidos para la base." + menbase + " solo acepta los digitos del " + menVal; encontrado = false; return; } if (b1.getNumberDecimal() >= 0 && b1.getNumberDecimal() <= 255) { mensajeResultado = "Directo"; modoDireccionamiento = "DIR"; encontrado = true; return; } else if (b1.getNumberDecimal() >= 256 && b1.getNumberDecimal() <= 65535) { mensajeResultado = "Extendido"; modoDireccionamiento = "EXT"; encontrado = true; return; } else { mensajeResultado = "Fuera de rango en Extendido"; encontrado = false; return; //Fuera de rango } }
private void segundoPaso(String cadena) { String codigoMaquina = ""; int tam = cadena.Length; String[] arrayLine = new String[4]; int i = 0,j=0; while (i<tam) { if (cadena[i] != '\t') { arrayLine[j] += cadena[i++]; } else { j++; i++; } } //Cargo las 4 partes de la linea baseNumerica contLocFile = new baseNumerica("$"+arrayLine[0]); LABEL labelFile = new LABEL(arrayLine[1]); codop = new CODOP(arrayLine[2]); OPERANDO operandoFile = new OPERANDO(arrayLine[3]); labelFile.validaEtiqueta(); codop.validaCODOP(); operandoFile.validaOperando(); if(codop.getCodop()=="END") { return; } if (codop.getValido()) { binarySearch(0, 200, codop.getCodop()); codop.revizaModoDireccionamiento(arrayCODOP, arrayTMPCODOP[codop.getIniciaCODOP()].start, arrayTMPCODOP[codop.getIniciaCODOP()].end, operandoFile); } else { txtMensajes.Text += mensajesError[2];//El CODOP no es valido printEnter(); return; } if(!codop.getExiste()) { DIRECTIVA d1 = new DIRECTIVA(codop.getCodop(),operandoFile,labelFile); if (d1.getExiste() && d1.getValida()) { txtMensajes.Text += d1.getCodigoMaquina();//11111111111111111111111Imprimo codigo Maquina de la directiva codigoMaquina = d1.getCodigoMaquina(); if(codigoMaquina != "") { arrayCodMaqinaS1.Add(codigoMaquina); arrayDirS1.Add(contLocFile); } } else { txtMensajes.Text += mensajesError[6];//No se encontro } printEnter(); return; } //Verifico que tipo de direccionamiento tiene y hago creo el codigo maquina en base a eso String xb = ""; switch(codop.getModoDireccionamiento()) { case "INH": txtMensajes.Text += codop.getCodigoMaquina();//22222222222222222222Imprimo codigo Maquina de codop codigoMaquina = codop.getCodigoMaquina(); break; case "DIR": case "EXT": baseNumerica b1 = new baseNumerica("0"); if(operandoFile.getOperando()[0] >= 'A' && operandoFile.getOperando()[0] <= 'Z') { int ilabel = 0,indiceLabel = 0; Boolean labelFound = false; foreach(String lTMP in listaEtiquetas) { if(lTMP == operandoFile.getOriginal()) { indiceLabel = ilabel; labelFound = true; } ilabel++; } if(labelFound) { ilabel = 0; String labelExtendido = ""; foreach(String lTMP in dirEtiquetas) { if(ilabel == indiceLabel) { labelExtendido = lTMP; } ilabel++; }//Finaliza bucle foreach labelExtendido = "$" + labelExtendido; b1 = new baseNumerica(labelExtendido);//333333333333Imprimo codigo maquina de codop txtMensajes.Text += codop.getCodigoMaquina() + System.Convert.ToString(b1.getNumberHexadecimal()).PadLeft(2 * codop.getBytesPorCalcular(), '0'); codigoMaquina = codop.getCodigoMaquina() + System.Convert.ToString(b1.getNumberHexadecimal()).PadLeft(2 * codop.getBytesPorCalcular(), '0'); } else { txtMensajes.Text += mensajesError[8]; //Etiqueta no encontrada } }//Termina cuando es extendido con Etiqueta else { b1 = new baseNumerica(arrayLine[3]);//444444444444444444444444Imprimo codigo maquina de codop txtMensajes.Text += codop.getCodigoMaquina() + System.Convert.ToString(b1.getNumberHexadecimal()).PadLeft(2*codop.getBytesPorCalcular(),'0'); codigoMaquina = codop.getCodigoMaquina() + System.Convert.ToString(b1.getNumberHexadecimal()).PadLeft(2 * codop.getBytesPorCalcular(), '0'); } break; case "IMM": char[] car = {'#'}; arrayLine[3] = arrayLine[3].TrimStart(car); baseNumerica b2 = new baseNumerica(arrayLine[3]);//55555555555555555555Imprimo codigo maquina de codop txtMensajes.Text += codop.getCodigoMaquina() + System.Convert.ToString(b2.getNumberHexadecimal()).PadLeft(2 * codop.getBytesPorCalcular(), '0'); codigoMaquina = codop.getCodigoMaquina() + System.Convert.ToString(b2.getNumberHexadecimal()).PadLeft(2 * codop.getBytesPorCalcular(), '0'); break; case "[IDX2]": int sizeTMP = arrayLine[3].Length - 1; String registro = "", operandoTMP = ""; Boolean band1 = false; for (i=1; i < sizeTMP ;i++ ) { if (arrayLine[3][i]==',') { band1 = true; } else if(!band1) { operandoTMP += arrayLine[3][i]; } else { registro += arrayLine[3][i]; } }//Fin del for switch(registro) { case "X": xb = "E3"; break; case "Y": xb = "EB"; break; case "SP": xb = "F3"; break; case "PC": xb = "FB"; break; } baseNumerica bI16 = new baseNumerica(operandoTMP);//666666666666666Imprimo codigo maquina de codop txtMensajes.Text += codop.getCodigoMaquina() + xb + System.Convert.ToString(bI16.getNumberHexadecimal()).PadLeft(2 * (codop.getBytesPorCalcular()-1), '0'); codigoMaquina = codop.getCodigoMaquina() + xb + System.Convert.ToString(bI16.getNumberHexadecimal()).PadLeft(2 * (codop.getBytesPorCalcular() - 1), '0'); break; case "[D,IDX]": xb = ""; switch(arrayLine[3][3]) { case 'X': xb = "E7"; break; case 'Y': xb = "EF"; break; case 'S': xb = "F7"; break; case 'P': xb = "FF"; break; } txtMensajes.Text += codop.getCodigoMaquina() + xb;//77777777777777777777Imprimo codigo maquina de codop codigoMaquina = codop.getCodigoMaquina() + xb; break; case "IDX": operandoFile.generaXB(codop); txtMensajes.Text += codop.getCodigoMaquina() + operandoFile.getXb().PadLeft(2,'0');//88888888888Imprimo Codigo maquina de codop codigoMaquina = codop.getCodigoMaquina() + operandoFile.getXb().PadLeft(2, '0'); break; case "IDX1": operandoFile.generaXB(codop); txtMensajes.Text += codop.getCodigoMaquina() + operandoFile.getXb();//999999999999999999999Imprimo codigo maquina de codop codigoMaquina = codop.getCodigoMaquina() + operandoFile.getXb(); break; case "IDX2": operandoFile.generaXB(codop); txtMensajes.Text += codop.getCodigoMaquina() + operandoFile.getXb();//AAAAAAAAAAAAAAAImprimo codigo maquina de codop codigoMaquina = codop.getCodigoMaquina() + operandoFile.getXb(); break; case "REL": int indice = 0,tmp = 0; Boolean flagFound = false; foreach (String labelTMP in listaEtiquetas) { if (operandoFile.getOperando() == labelTMP) { indice = tmp; flagFound = true; } tmp++; } if(flagFound) { tmp = 0; String contLocLabel = "$"; foreach(String contlocTMP in dirEtiquetas) { if(tmp == indice) { contLocLabel += contlocTMP; } tmp++; } operandoFile.generaCodigoMaquina(contLocFile,codop,contLocLabel); if (operandoFile.getFueraRango()) { txtMensajes.Text += "FUERA DE RANGO "; if(codop.getBytesPorCalcular() == 1) { txtMensajes.Text += "los rangos permitidos son de -128 hasta 127"; } else { txtMensajes.Text += "los rangos permitidos son de -32768 hasta 32767"; } } else { txtMensajes.Text += codop.getCodigoMaquina().PadLeft(2, '0') + operandoFile.getXb();//BBBBBBBBBBBBBImprimo codigo maquina de codop codigoMaquina = codop.getCodigoMaquina().PadLeft(2, '0') + operandoFile.getXb(); } } else { txtMensajes.Text += mensajesError[8];//Etiqueta no encontrada } break; } //Agregando informacion para posteriormente construir el S1 arrayDirS1.Add(contLocFile); arrayCodMaqinaS1.Add(codigoMaquina); printEnter(); GC.Collect(); }