public void generaCodigoMaquina(baseNumerica contlocFile,CODOP codop,String contLocLabel) { baseNumerica contEtiqueta = new baseNumerica(contLocLabel); baseNumerica contLocNext = new baseNumerica(System.Convert.ToString(contlocFile.getNumberDecimal() + codop.getBytesTotales())); baseNumerica contLocNew = new baseNumerica("0"); fueraRango = false; int valor = contEtiqueta.getNumberDecimal() - contLocNext.getNumberDecimal(); if (valor < 0) { char[] caracteres = { '-' }; String tmp = System.Convert.ToString(valor); tmp = tmp.TrimStart(caracteres); contLocNew = new baseNumerica(tmp,1); tmp = contLocNew.getNumberHexadecimal(); xb = ""; for (int i = (tmp.Length) - (2*codop.getBytesPorCalcular()); i<tmp.Length;i++ ) { xb += tmp[i]; } } else { contLocNew = new baseNumerica(System.Convert.ToString(contEtiqueta.getNumberDecimal() - contLocNext.getNumberDecimal())); xb = contLocNew.getNumberHexadecimal(); xb = xb.PadLeft(2 * codop.getBytesPorCalcular(), '0'); } if(codop.getBytesPorCalcular() == 1) { if (!(contLocNew.getNumberDecimal() >= -128 && contLocNew.getNumberDecimal() <= 127)) { fueraRango = true; } } else { if (!(contLocNew.getNumberDecimal() >= -32768 && contLocNew.getNumberDecimal() <= 32767)) { fueraRango = true; } } }
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 calculaCRC() { baseNumerica b1 = new baseNumerica("0000"); b1 = new baseNumerica("$"+_longitud); for (int i = 0; i<4;i+=2 ) { String tmp = System.Convert.ToString(_direccion[i]) + System.Convert.ToString(_direccion[i+1]); baseNumerica tmpNum = new baseNumerica("$"+tmp); b1 = new baseNumerica(System.Convert.ToString(b1.getNumberDecimal()+tmpNum.getNumberDecimal())); } for (int i = 0; i < _codMaquina.Length; i += 2) { String tmp = System.Convert.ToString(_codMaquina[i]) + System.Convert.ToString(_codMaquina[i + 1]); baseNumerica b2 = new baseNumerica("$"+tmp); b1 = new baseNumerica(System.Convert.ToString(b1.getNumberDecimal() + b2.getNumberDecimal())); } baseNumerica max = new baseNumerica("$FFFF"); b1 = new baseNumerica(System.Convert.ToString(max.getNumberDecimal()-b1.getNumberDecimal())); for (int i = b1.getNumberHexadecimal().Length - 1; i > b1.getNumberHexadecimal().Length - 3; i--) { _crc = b1.getNumberHexadecimal()[i] + _crc; } }
public void calculaCRC() { baseNumerica b1 = new baseNumerica("0000"); baseNumerica b3 = new baseNumerica(_longitud); b1 = new baseNumerica(System.Convert.ToString(b1.getNumberDecimal()+b3.getNumberDecimal())); for (int i = 0; i<_codMaquina.Length; i+=2) { String tmp = System.Convert.ToString(_codMaquina[i])+System.Convert.ToString(_codMaquina[i+1]); baseNumerica b2 = new baseNumerica(tmp); b1 = new baseNumerica(System.Convert.ToString(b1.getNumberDecimal()+b2.getNumberDecimal())); } b3 = new baseNumerica("$FFFF"); b1 = new baseNumerica(System.Convert.ToString(b3.getNumberDecimal()-b1.getNumberDecimal())); for (int i = b1.getNumberHexadecimal().Length - 1; i>1; i--) { _crc = b1.getNumberHexadecimal()[i] + _crc; } }
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 partesS1() { //int elementoActual = 0; S1 s1 = new S1(); baseNumerica temporalAct = new baseNumerica("0"); baseNumerica direccionActual = new baseNumerica("$" + ((baseNumerica)arrayDirS1[0]).getNumberHexadecimal()); s1.direccion = direccionActual.getNumberHexadecimal(); Boolean flagPase = false; for (int elementoActual = 0; elementoActual < arrayCodMaqinaS1.Count; elementoActual++) { temporalAct = new baseNumerica("$" + ((baseNumerica)arrayDirS1[elementoActual]).getNumberHexadecimal()); if (temporalAct.getNumberHexadecimal() != direccionActual.getNumberHexadecimal())//Recorro todos los elementos de los arreglos que cree { if (flagPase) { if (s1.direccion == "") s1.direccion = temporalAct.getNumberHexadecimal(); baseNumerica longitudA = new baseNumerica(System.Convert.ToString(s1.codMaquina.Length / 2)); direccionActual = new baseNumerica(System.Convert.ToString(direccionActual.getNumberDecimal() - longitudA.getNumberDecimal())); flagPase = false; } else { if (s1.direccion == "") { s1.direccion = temporalAct.getNumberHexadecimal(); //// baseNumerica tmpComp = new baseNumerica(System.Convert.ToString(direccionActual.getNumberDecimal() - (s1.codMaquina.Length / 2))); //// if (elementoActual - (s1.codMaquina.Length / 2) >= 0 && ((baseNumerica)arrayDirS1[elementoActual - (s1.codMaquina.Length / 2)]).getNumberHexadecimal() == tmpComp.getNumberHexadecimal()) //// { //// s1.direccion = tmpComp.getNumberHexadecimal(); //// } //// else //// { //// s1.direccion = direccionActual.getNumberHexadecimal(); //// } ////} } } s1.calculaLongitud(); s1.calculaCRC(); s1.saveFile(fsS19); s1 = new S1(); if (s1.direccion != "") { //s1.direccion = ((baseNumerica)arrayDirS1[elementoActual]).getNumberHexadecimal(); s1.direccion = temporalAct.getNumberHexadecimal(); } direccionActual = new baseNumerica("$" + s1.direccion); } for (int i = 0; i < ((String)arrayCodMaqinaS1[elementoActual]).Length; i += 2) { if ((s1.codMaquina.Length / 2) < 16) { String tmp = System.Convert.ToString(((String)arrayCodMaqinaS1[elementoActual])[i]) + System.Convert.ToString(((String)arrayCodMaqinaS1[elementoActual])[i + 1]); s1.addCodigoMaquina(tmp); direccionActual = new baseNumerica(System.Convert.ToString(direccionActual.getNumberDecimal() + 1)); } else { flagPase = true; i -= 2; s1.calculaLongitud(); s1.calculaCRC(); s1.saveFile(fsS19); s1 = new S1(); s1.direccion = direccionActual.getNumberHexadecimal(); } }//Fin del bucle for para recorrer el elemento actual }//Fin del bucle for que recorre todos los elementos if(s1.codMaquina!="")//Agrego el ultimo bloque { s1.calculaLongitud(); s1.calculaCRC(); s1.saveFile(fsS19); } }
private void abreArchivo() { OpenFileDialog ofD = new OpenFileDialog(); ofD.Filter = "Ensamblador|*.asm|Documento de texto|*.txt|Todos los archivos|*.*"; if (ofD.ShowDialog() == DialogResult.OK) { StreamReader objReader = new StreamReader(ofD.FileName, System.Text.Encoding.Default, true); //Leo el archivo Boolean flagPoint = false; for(int i=ofD.FileName.Length-1;ofD.FileName[i] != '\\' && i>0;i--) { if (flagPoint) { fdOriginal = ofD.FileName[i] + fdOriginal; }else if(ofD.FileName[i]=='.') { flagPoint = true; } } nameFile = ofD.FileName; String sLine = ""; String todo = ""; ArrayList arrText = new ArrayList(); while (sLine != null) { sLine = objReader.ReadLine(); if (sLine != null) arrText.Add(sLine); } objReader.Close(); fsTMP = System.IO.File.Create(fdOriginal+".tmp", 1024); fsTabsim = System.IO.File.Create(fdOriginal+".tabsim",1024); fsS19 = System.IO.File.Create(fdOriginal+".s19"); foreach (string sOutput in arrText) { todo += sOutput; separaCadena(sOutput);//Llamada Para separar y analizar cadena. Kernel del programa todo += char.ConvertFromUtf32(13) + char.ConvertFromUtf32(10); lineasArchivo++; } txtCodigo.Text = todo; fsTMP.Close(); fsTabsim.Close(); label2.Text = "Total de lineas: " + lineasArchivo; if (!banderaEnd) { txtMensajes.Text += "Linea: " + lineasArchivo; txtMensajes.Text += char.ConvertFromUtf32(13) + char.ConvertFromUtf32(10); txtMensajes.Text += "No se encontro END"; txtMensajes.Text += char.ConvertFromUtf32(13) + char.ConvertFromUtf32(10); } //Archivo S0 del s019 S0 s0 = new S0(); s0.addCodigoMaquina(nameFile); s0.calculaLongitud(); s0.calculaCRC(); s0.saveFile(fsS19); //<Segundo Paso> StreamReader objReader1 = new StreamReader(fdOriginal + ".tmp", System.Text.Encoding.Default, true); String sLine1 = ""; ArrayList arrText1 = new ArrayList(); while (sLine1 != null) { sLine1 = objReader1.ReadLine(); if (sLine1 != null) arrText1.Add(sLine1); } objReader1.Close(); txtMensajes.Text += "###Paso 2###"; printEnter(); foreach (string sOutput in arrText1) { try { segundoPaso(sOutput); } catch (Exception ex) { txtMensajes.Text += "Error al analizar la linea"; printEnter(); } } //</Segundo Paso> if(arrayCodMaqinaS1.Count > 0) { partesS1();//Funcion que crea todos los fragmentos S1 } //Archivo s9 S9 s9 = new S9(); s9.saveFile(fsS19); fsS19.Close(); txtMensajes.Text += "El tamaño del archivo es:"; printEnter(); baseNumerica tmp = new baseNumerica(System.Convert.ToString(contLoc.getNumberDecimal() - dirInicial.getNumberDecimal())); txtMensajes.Text += System.Convert.ToString(tmp.getNumberDecimal()); lineasArchivo = 0; } }