protected override void incrementaInstruccionDirectiva(string[] codigo) { if (this.instruccionesFormato4.Keys.Contains(codigo[1])) { this.cp += 4; } else if (this.instruccionesFormato3.Keys.Contains(codigo[1]) || codigo[1].Equals("WORD")) { this.cp += 3; } else if (this.instruccionesFormato2.Keys.Contains(codigo[1])) { this.cp += 2; } else if (this.instruccionesFormato1.Keys.Contains(codigo[1])) { this.cp++; } else if (this.directiva.Contains(codigo[1])) { codigo[2] = codigo[2].ToUpper(); switch (codigo[1]) { case "BYTE": if (codigo[2].Contains("X")) { cp += (long)Math.Ceiling((decimal)(codigo[2].Length - 3) / 2); } else if (codigo[2].Contains("C")) { cp += codigo[2].Length - 3; } break; case "RESW": codigo[2] = codigo[2].ToUpper(); if (codigo[2].Contains("H")) { cp += 3 * MetodosAuxiliares.hexadecimalADecimal(codigo[2].Replace("H", "")); } else { cp += 3 * long.Parse(codigo[2]); } break; case "RESB": codigo[2] = codigo[2].ToUpper(); if (codigo[2].Contains("H")) { cp += MetodosAuxiliares.hexadecimalADecimal(codigo[2].Replace("H", "")); } else { cp += long.Parse(codigo[2]); } break; } } }
private bool relativoContador(ref string operando, string cpSig) { bool band; long desp; long dir; band = false; if (tabSim.TryGetValue(operando, out dir)) { desp = dir - MetodosAuxiliares.hexadecimalADecimal(cpSig); if (desp >= (-2048) & desp <= 2047) { operando = MetodosAuxiliares.decimalAHexadecimal(desp); if (desp < 0) { operando = MetodosAuxiliares.ajustaOperando(operando, 3, "F"); } else { operando = MetodosAuxiliares.ajustaOperando(operando, 3, "0"); } band = true; } } return band; }
private string TIX(string m) { string mensaje; string[] operando; long decM; mensaje = "Efecto: X ← (X) + 1; (X) : (m..m+2) \n" + "Incrementa el valor de X en 1 y lo compara con una \n" + "palabra en memoria y establece el código de \n" + "condición para indicar el resultado(<, = o >) \n"; operando = this.obtenOperando(m); mensaje = "\t X ← " + MetodosAuxiliares.decimalAHexadecimal(this.x) + " + 1; " + MetodosAuxiliares.decimalAHexadecimal(this.x) + " : " + operando[0] + operando[1] + operando[2] + "\n"; decM = MetodosAuxiliares.hexadecimalADecimal(operando[0] + operando[1] + operando[2]); this.x++; if (this.x == decM) { this.cc = "="; } else if (this.x > decM) { this.cc = ">"; } else if (this.x < decM) { this.cc = "<"; } mensaje += "\t\t Resultado: X ← " + MetodosAuxiliares.decimalAHexadecimal(this.x) + "; CC ← " + this.cc; return(mensaje); }
public static long calculaTamañoMemoria(string v) { string tamaño; tamaño = v.Substring(13, 6); return((MetodosAuxiliares.hexadecimalADecimal(tamaño) / 16) + 1); }
public string BuscaDireccion3(string m) { long cp = MetodosAuxiliares.hexadecimalADecimal(m); string Valor = ""; int i = (int)ObtenFila(m); int j = (int)MetodosAuxiliares.hexadecimalADecimal(m.Last().ToString()); Valor = this.mapa[i, j]; j++; if (j > 16) { i++; j = 0; } Valor += this.mapa[i, j]; j++; if (j > 16) { i++; j = 0; } j++; Valor += this.mapa[i, j]; return(Valor); }
private string[] obtenOperando(string direccion) { long i; long j; string[] m; m = new string[3]; i = this.memoria.ObtenFila(direccion); j = MetodosAuxiliares.hexadecimalADecimal(direccion.Last().ToString()); m[0] = this.memoria.Mapa[i, j]; j++; if (j > 16) { i++; j = 0; } m[1] = this.memoria.Mapa[i, j]; j++; if (j > 16) { i++; j = 0; } m[2] = this.memoria.Mapa[i, j]; return(m); }
public long ObtenFila(string direccion) { char[] aux; aux = direccion.ToCharArray(); aux[aux.Length - 1] = '0'; return((MetodosAuxiliares.hexadecimalADecimal(new string(aux)) - MetodosAuxiliares.hexadecimalADecimal(this.inicio)) / 16); }
private string JEQ(string m) { if (cc.Equals("=")) { this.cp = MetodosAuxiliares.hexadecimalADecimal(m); } return("CP <- m si CC esta en ="); }
public static long calculaTamaño(string first, string last) { long inicio; long final; inicio = MetodosAuxiliares.hexadecimalADecimal(first.Split('\t').First()); final = MetodosAuxiliares.hexadecimalADecimal(last.Split('\t').First()); return(final - inicio); }
private string JSUB(string m) { string mensaje; mensaje = "L ← (CP); CP ← m\n"; mensaje = "\t\t L ← " + MetodosAuxiliares.decimalAHexadecimal(this.cp) + "; CP ← " + m; this.l = this.cp; cp = MetodosAuxiliares.hexadecimalADecimal(m); return(mensaje); }
internal string BuscaFinal(string m) { long cp = MetodosAuxiliares.hexadecimalADecimal(m); string Valor = ""; int i = (int)ObtenFila(m); int j = (int)MetodosAuxiliares.hexadecimalADecimal(m.Last().ToString()); Valor = this.mapa[i, j]; return(Valor); }
private string LDL(string m) { string sentencia = ""; long valorL; sentencia = memoria.BuscaDireccion3(m); valorL = MetodosAuxiliares.hexadecimalADecimal(sentencia); this.l = valorL; return("L <- (m...m+2)"); }
private string LDX(string m) { string mensaje; string[] operando; operando = this.obtenOperando(m); mensaje = "Efecto X ← (m, m+1, m+2)\n"; mensaje = "\t\t X ← " + operando[0] + operando[1] + operando[2]; this.x = MetodosAuxiliares.hexadecimalADecimal(operando[0] + operando[1] + operando[2]); return(mensaje); }
private void cargaRegistroT(string registro) { int bytesVaciados; long filaInicio; long columnaInicio; long bytes; string direccioInicio; string contenido; bytesVaciados = 0; direccioInicio = registro.Substring(1, 6); bytes = MetodosAuxiliares.hexadecimalADecimal(registro.Substring(7, 2)); contenido = registro.Substring(9); if (!direccioInicio.Last().Equals('0')) { char[] aux; aux = direccioInicio.ToCharArray(); aux[aux.Length - 1] = '0'; filaInicio = MetodosAuxiliares.CalculaFilaMemoria(new string(aux), inicio, filas); columnaInicio = MetodosAuxiliares.hexadecimalADecimal(direccioInicio.Last().ToString()); } else { filaInicio = MetodosAuxiliares.CalculaFilaMemoria(direccioInicio, inicio, filas); columnaInicio = 0; } for (int i = 0; i < 16; i++) { if (bytesVaciados == bytes | columnaInicio + i == 16) { break; } this.mapa[filaInicio, ((int)(columnaInicio)) + i] = contenido[(i * 2)].ToString() + contenido[(i * 2) + 1].ToString(); bytesVaciados++; } while (bytesVaciados != bytes) { filaInicio++; int desplazamiento; desplazamiento = bytesVaciados; for (int i = 0; i < 16; i++) { string bite; bite = contenido[(desplazamiento * 2) + (i * 2)].ToString(); bite += contenido[(desplazamiento * 2) + (i * 2) + 1].ToString(); this.mapa[filaInicio, i] = bite; bytesVaciados++; if (bytesVaciados == bytes) { break; } } } }
private string DIV(string m) { long valorTemp; string sentencia = ""; sentencia = this.memoria.BuscaDireccion3(m); valorTemp = MetodosAuxiliares.hexadecimalADecimal(sentencia); this.a = this.a / valorTemp; return("(A) <- (A)/(m..m+2)"); }
private string SUB(string m) { string mensaje; string[] operando; operando = this.obtenOperando(m); mensaje = "Efecto: A ← (A) – (m, m+1, m+2)\n"; mensaje = "\t A ← " + MetodosAuxiliares.decimalAHexadecimal(this.a) + "+" + operando[0] + operando[1] + operando[2]; this.a = this.a - MetodosAuxiliares.hexadecimalADecimal(operando[0] + operando[1] + operando[2]); mensaje = "\t\t A ← " + MetodosAuxiliares.decimalAHexadecimal(this.a); return(mensaje); }
public string ObtenCodOp(ref long cp) { int i; int j; string codOp; string cpHex; cpHex = MetodosAuxiliares.decimalAHexadecimal(cp); i = (int)this.ObtenFila(cpHex); j = (int)MetodosAuxiliares.hexadecimalADecimal(cpHex.Last().ToString()); codOp = this.mapa[i, j]; cp++; return(codOp); }
private string LDCH(string m) { string cadena = ""; string aux = ""; string hexadecimal = ""; string valorA = MetodosAuxiliares.decimalAHexadecimal(this.a); aux = valorA.Substring(0, 4); hexadecimal = MetodosAuxiliares.hexadecimalABinario(m); cadena = memoria.BuscaFinal(m); aux += cadena; this.a = MetodosAuxiliares.hexadecimalADecimal(aux); return("A[el byte de mas a la derecha ] <- (m)"); }
public void almacenaDatos(string[] operando, int v, string m) { int i; int j; long decM; for (int k = 0; k < v; k++) { i = (int)this.ObtenFila(m); j = (int)MetodosAuxiliares.hexadecimalADecimal(m.Last().ToString()); this.mapa[i, j] = operando[k]; decM = MetodosAuxiliares.hexadecimalADecimal(m) + 1; m = MetodosAuxiliares.decimalAHexadecimal(decM); } }
public static long CalculaFilaMemoria(string direccioInicio, string inicio, long filas) { long indice; indice = -1; for (long i = 0; i < filas; i++) { if (MetodosAuxiliares.hexadecimalADecimal(direccioInicio) == (MetodosAuxiliares.hexadecimalADecimal(inicio) + (i * 16))) { indice = i; break; } } return(indice); }
private string JGT(string m) { string mensaje; mensaje = "Efecto: CP ← m si CC está en <\n"; if (cc.Equals(">")) { this.cp = MetodosAuxiliares.hexadecimalADecimal(m); mensaje += "\t\t CP ← " + this.cp; } else { mensaje += "\t\t No cumple con las condiciones, el CP no fue alterado"; } return(mensaje); }
public long vaciaRegistrosT() { long cp; cp = 0; foreach (string registro in this.registros) { switch (registro.First()) { case 'E': cp = MetodosAuxiliares.hexadecimalADecimal(registro.Substring(1)); break; case 'T': this.cargaRegistroT(registro); break; } } return(cp); }
private void llenaDataGrid() { this.limpiaDatagrid(); string[] fila; fila = new string[17]; for (int i = 0; i < sicEstandar.Memoria.Filas; i++) { fila[0] = MetodosAuxiliares.decimalAHexadecimal(MetodosAuxiliares.hexadecimalADecimal(sicEstandar.Memoria.Inicio) + (i * 16)); for (int j = 0; j < sicEstandar.Memoria.Columnas; j++) { fila[j + 1] = sicEstandar.Memoria.Mapa[i, j]; } this.dataGridViewMapaDeMemoria.Rows.Add(fila); } this.dataGridViewRegistros.Rows.Add("CP", CP, MetodosAuxiliares.ajustaDireccion(MetodosAuxiliares.decimalAHexadecimal(this.sicEstandar.CP))); this.dataGridViewRegistros.Rows.Add("A", A, MetodosAuxiliares.ajustaDireccion(MetodosAuxiliares.decimalAHexadecimal(this.sicEstandar.A))); this.dataGridViewRegistros.Rows.Add("X", X, MetodosAuxiliares.ajustaDireccion(MetodosAuxiliares.decimalAHexadecimal(this.sicEstandar.X))); this.dataGridViewRegistros.Rows.Add("L", L, MetodosAuxiliares.ajustaDireccion(MetodosAuxiliares.decimalAHexadecimal(this.sicEstandar.L))); this.dataGridViewRegistros.Rows.Add("CC", this.sicEstandar.CC, ""); this.label1.Text = "Tamaño del programa:" + this.sicEstandar.Memoria.Tamaño; }
public string ObtenM(ref long cp) { int i; int j; string m; string cpHex; cpHex = MetodosAuxiliares.decimalAHexadecimal(cp); i = (int)this.ObtenFila(cpHex); j = (int)MetodosAuxiliares.hexadecimalADecimal(cpHex.Last().ToString()); m = this.mapa[i, j]; j++; if (j > 16) { i++; j = 0; } m += this.mapa[i, j]; cp += 2; return(m); }
private string COMP(string m) { long valorTemp; string sentencia = ""; sentencia = this.memoria.BuscaDireccion3(m); valorTemp = MetodosAuxiliares.hexadecimalADecimal(sentencia); if (this.a < valorTemp) { this.cc = "<"; } else if (this.a > valorTemp) { this.cc = ">"; } else if (this.a == valorTemp) { this.cc = "="; } return("(A) : (m..m+2)"); }
public static long FinalPrograma(string inicio, string tamaño) { return(MetodosAuxiliares.hexadecimalADecimal(inicio) + MetodosAuxiliares.hexadecimalADecimal(tamaño)); }
private string J(string m)///// { this.cp = MetodosAuxiliares.hexadecimalADecimal(m); return("CP<-m"); }
protected override void generaRegistrosT() { int i; int j; string registroT; string aux; string bytes; aux = ""; i = 1; while (!this.archivo[i].Contains("END")) { registroT = "T" + MetodosAuxiliares.ajustaDireccion(this.intermedio[i].Split('\t').First()); for (j = i; j < this.codigoObj.Length - 1; j++) { if (!this.codigoObj[j].Contains("Error")) { if (this.codigoObj[j].Contains("*")) { string cpHex; cpHex = MetodosAuxiliares.decimalAHexadecimal(MetodosAuxiliares.hexadecimalADecimal(this.intermedio[j].Split('\t').First()) +1); this.relocalizables.Add(MetodosAuxiliares.ajustaOperando(cpHex,6,"0")); this.codigoObj[j] = this.codigoObj[j].Replace("*", ""); } if (((aux.Length + this.codigoObj[j].Length) / 2) > 30) { break; } else if (this.codigoObj[j].Equals("---") & !this.archivo[j].Contains("BASE")) { break; } else if(!this.archivo[j].Contains("BASE")) { aux += this.codigoObj[j]; } } } bytes = MetodosAuxiliares.decimalAHexadecimal(aux.Length / 2); if (bytes.Length < 2) { bytes = "0" + bytes; } registroT += bytes; registroT += aux; aux = ""; if (registroT.Length > 9) { this.archivoObj.Add(registroT); } for (int k = j; k < this.codigoObj.Length; k++) { if (!codigoObj[k].Equals("---") | this.intermedio[k].Contains("END")) { i = k; break; } } } }
public string ejecutaPaso() { string mensaje; mensaje = ""; try { if (ejecutable) { string codOp; string m; codOp = this.memoria.ObtenCodOp(ref this.cp); m = this.memoria.ObtenM(ref this.cp); m = this.indexaM(m); if (this.cp < MetodosAuxiliares.FinalPrograma(this.memoria.Inicio, this.memoria.Tamaño)) { if (MetodosAuxiliares.hexadecimalADecimal(m) <= MetodosAuxiliares.FinalPrograma(this.memoria.Inicio, this.memoria.Tamaño)) { switch (codOp) { case "18": //ADD mensaje = this.ADD(m); break; case "40": //AND mensaje = this.AND(m); break; case "28": //COMP mensaje = this.COMP(m); break; case "24": //DIV mensaje = this.DIV(m); break; case "3C": //J mensaje = this.J(m); break; case "30": //JEQ mensaje = this.JEQ(m); break; case "34": //JGT mensaje = this.JGT(m); break; case "38": //JLT mensaje = this.JLT(m); break; case "48": //JSUB mensaje = this.JSUB(m); break; case "00": //LDA mensaje = this.LDA(m); break; case "50": //LDCH mensaje = this.LDCH(m); break; case "08": //LDL mensaje = this.LDL(m); break; case "04": //LDX mensaje = this.LDX(m); break; case "20": //MUL mensaje = this.MUL(m); break; case "44": //OR mensaje = this.OR(m); break; case "D8": //RD mensaje = this.RD(m); break; case "4C": //RSUB mensaje = this.RSUB(); break; case "0C": //STA mensaje = this.STA(m); break; case "54": //STCH mensaje = this.STCH(m); break; case "14": //STL mensaje = this.STL(m); break; case "E8": //STSW mensaje = this.STSW(m); break; case "10": //STX mensaje = this.STX(m); break; case "1C": //SUB mensaje = this.SUB(m); break; case "E0": //TD //mensaje = this.TD(m); break; case "2C": //TIX mensaje = this.TIX(m); break; case "DC": //WD //mensaje = this.WD(m); break; } } else { throw new EndProgramException("Error se intento acceder a una localidad de memoria inexistente"); } } else { throw new EndProgramException("Se acabaron las intrucciones a ejecutar, por lo tanto el programa finalizo"); } } } catch (EndProgramException e) { this.ejecutable = false; MessageBox.Show(e.Message, "El programa ah finalizado", MessageBoxButtons.OK, MessageBoxIcon.Information); } return(mensaje); }
public override void paso1(DataGridView dataGridViewIntermedio) { string[] codigo; MyErrorListener errorListener; this.lineasError = new List <bool>(); this.errores = new List <string>(); this.intermedio = new List <string>(); this.tabSim = new Dictionary <string, long>(); for (int i = 0; i < this.archivo.Count; i++) { lexer = new SICExtendidaLexer(new AntlrInputStream(this.Archivo[i])); tokens = new CommonTokenStream(lexer); parser = new SICExtendidaParser(tokens); errorListener = new MyErrorListener(i + 1); parser.AddErrorListener(errorListener); parser.prog(); codigo = this.Archivo[i].Split('\t'); this.lineasError.Add(errorListener.ExisteError); if (!errorListener.ExisteError) { try { if (!codigo[1].Equals("START") & !codigo[1].Equals("END") & !codigo[1].Equals("BASE")) { this.ensamblaIntermedio(dataGridViewIntermedio, codigo, i, "No"); if (!string.IsNullOrEmpty(codigo[0])) { this.TabSim.Add(codigo[0], this.cp); } this.incrementaInstruccionDirectiva(codigo); } else if (codigo[1].Equals("START")) { codigo[2] = codigo[2].ToUpper(); if (codigo[2].Contains("H")) { this.cp = MetodosAuxiliares.hexadecimalADecimal(codigo[2].Replace("H", "")); this.ensamblaIntermedio(dataGridViewIntermedio, codigo, i, "No"); } else { this.cp = long.Parse(codigo[2]); this.ensamblaIntermedio(dataGridViewIntermedio, codigo, i, "no"); } } else if (codigo[1].Equals("END") | codigo[1].Equals("BASE")) { //this.intermedio.Add(this.cp.ToString() + "\t" + this.archivo[i]); this.ensamblaIntermedio(dataGridViewIntermedio, codigo, i, "no"); } } catch (ArgumentException) { this.errores.Add("Linea" + (i + 1).ToString() + ": Error Simbolo repetido"); dataGridViewIntermedio.Rows.Remove(dataGridViewIntermedio.Rows[dataGridViewIntermedio.Rows.Count - 1]); this.intermedio.Remove(this.intermedio.Last()); this.ensamblaIntermedio(dataGridViewIntermedio, codigo, i, "Simbolo"); this.incrementaInstruccionDirectiva(codigo); } } else { if (!string.IsNullOrEmpty(this.Archivo[i])) { if (this.instruccionesFormato1.Keys.Contains(codigo[1]) || this.instruccionesFormato2.Keys.Contains(codigo[1]) || this.instruccionesFormato3.Keys.Contains(codigo[1]) || this.Directivas.Contains(codigo[1])) { this.errores.Add("Linea" + (i + 1).ToString() + ": Error de sintaxis la etiqueta no puede ser la palabra reservada \"" + codigo[0] + "\""); this.ensamblaIntermedio(dataGridViewIntermedio, codigo, i, "Syntax"); } else { this.errores.Add("Linea" + (i + 1).ToString() + ": Error de sintaxis el operando: \"" + codigo[2] + "\" Esta mal escrito"); this.ensamblaIntermedio(dataGridViewIntermedio, codigo, i, "Syntax"); } } else { this.errores.Add("Linea" + (i + 1).ToString() + ": Error de sintaxis no debe haber lineas vacias"); codigo = new string[] { "\t", "\t", "\t" }; this.ensamblaIntermedio(dataGridViewIntermedio, codigo, i, "Vacia"); } } } this.paso1Logrado = true; }