Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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
        }
Пример #3
0
        public void generaXB(CODOP codop)
        {
            String xb1="", xb2="",s1="",s2="";
            tam = operando.Length;
            int i;
            for (i = 0; i < tam && operando[i]!=',';i++ )
            {
                s1 += operando[i];
            }
            for (i+=1; i < tam; i++)
            {
                s2 += operando[i];
            }
            xb1 = "%";
            xb2 = "%";
            Boolean band = false;
            baseNumerica b1 = new baseNumerica("0");
            switch(codop.getModoDireccionamiento())
            {
                case "IDX":
                    baseNumerica b2 = new baseNumerica("0") ,b3 = new baseNumerica("0");
                    if(s2[0]=='+' || s2[0] == '-' || s2[s2.Length-1] == '+' || s2[s2.Length-1] == '-')
                    {
                        xb += "";
                        String tmpReg = "";
                        for (int j = 0; j<s2.Length;j++ )
                        {
                            if(s2[j] != '+' && s2[j] != '-')
                            {
                                tmpReg += s2[j];
                            }
                        }
                        switch(tmpReg)
                        {
                            case "X":
                                xb1 += "001";
                                break;
                            case "Y":
                                xb1 += "011";
                                break;
                            case "SP":
                                xb1 += "101";
                                break;
                            case "PC":
                                xb1 += "111";
                                break;
                        }
                        Boolean flagSigno = false;
                        if(s2[0]=='+')
                        {
                            xb1 += "0";
                        }
                        else if(s2[0]=='-')
                        {
                            xb1 += "0";
                            flagSigno = true;
                        }
                        else if(s2[s2.Length-1] == '+')
                        {
                            xb1 += "1";
                        }
                        else if(s2[s2.Length-1]=='-')
                        {
                            xb1 += "1";
                            flagSigno = true;
                        }

                        if (flagSigno)
                        {
                            switch(s1)
                            {
                                case "1":
                                    xb2 += "1111";
                                    break;
                                case "2":
                                    xb2 += "1110";
                                    break;
                                case "3":
                                    xb2 += "1101";
                                    break;
                                case "4":
                                    xb2 += "1100";
                                    break;
                                case "5":
                                    xb2 += "1011";
                                    break;
                                case "6":
                                    xb2 += "1010";
                                    break;
                                case "7":
                                    xb2 += "1001";
                                    break;
                                case "8":
                                    xb2 += "1000";
                                    break;
                            }//Termina switch
                        }//Termina parte cuando es negativo
                        else
                        {
                            switch (s1)
                            {
                                case "1":
                                    xb2 += "0000";
                                    break;
                                case "2":
                                    xb2 += "0001";
                                    break;
                                case "3":
                                    xb2 += "0010";
                                    break;
                                case "4":
                                    xb2 += "0011";
                                    break;
                                case "5":
                                    xb2 += "0100";
                                    break;
                                case "6":
                                    xb2 += "0101";
                                    break;
                                case "7":
                                    xb2 += "0110";
                                    break;
                                case "8":
                                    xb2 += "0111";
                                    break;
                            }
                        }//Termina cuando es positivo
                        b2 = new baseNumerica(xb1);
                        b3 = new baseNumerica(xb2);
                    }//Termina Indizado pre/post
                    else if(s1[0]=='A' || s1[0]=='B' || s1[0]=='D')
                    {
                        xb1 += "111";
                        switch(s2)
                        {
                            case "X":
                                xb1 += "0";
                                xb2 += "01";
                                break;
                            case "Y":
                                xb1 += "0";
                                xb2 += "11";
                                break;
                            case "SP":
                                xb1 += "1";
                                xb2 += "01";
                                break;
                            case "PC":
                                xb1 += "1";
                                xb2 += "11";
                                break;
                        }
                        switch(s1)
                        {
                            case "A":
                                xb2 += "00";
                                break;
                            case "B":
                                xb2 += "01";
                                break;
                            case "D":
                                xb2 += "10";
                                break;
                        }
                        b2 = new baseNumerica(xb1);
                        b3 = new baseNumerica(xb2);
                    }
                    else//Indizado 5 Bits
                    {
                    switch(s2)
                    {
                        case "X":
                            xb1 += "00";
                        break;
                        case "Y":
                            xb1 += "01";
                        break;
                        case "SP":
                            xb1 += "10";
                        break;
                        case "PC":
                            xb1 += "11";
                        break;
                    }
                    xb1 = xb1 + "0";

                    band = false;
                    b1 = new baseNumerica("0");
                    if(s1=="")
                    {
                        s1 = "0";
                    }

                    if(s1[0]=='-')
                    {
                        char[] caracteres = {'-'};
                        s1 = s1.TrimStart(caracteres);
                        b1 = new baseNumerica(s1,1);
                        band = true;
                    }
                    else
                    {
                        b1 = new baseNumerica(s1);
                    }

                    String tmp="";
                    if(band)
                    {
                        String tmp2 = b1.getNumberBinary();
                        int tamTMP = tmp2.Length;
                        //for (int j = tamTMP -  1; j >= tamTMP - 4; j--)
                        for (int j = tamTMP - 4; j < tamTMP; j++)
                        {
                            tmp += tmp2[j];
                        }
                        xb1 += tmp2[tamTMP - 5];
                        for (int j = 0; j < tmp.Length; j++)
                        {
                            xb2 += tmp[j];
                        }
                    }
                    else
                    {
                        tmp = b1.getNumberBinary().PadLeft(5, '0');
                        xb1 += tmp[0];
                        for (int j = 1; j < tmp.Length; j++)
                        {
                            xb2 += tmp[j];
                        }
                    }

                    b2 = new baseNumerica(xb1);
                    b3 = new baseNumerica(xb2);
                    }//Termina Indizado 5 bits

                    xb = b2.getNumberHexadecimal() + b3.getNumberHexadecimal();
                    break;//Termina IDX
                case "IDX1":
                    band = false;
                    if (s1[0] == '-')
                    {
                        char[] caracteres = { '-' };
                        s1 = s1.TrimStart(caracteres);
                        b1 = new baseNumerica(s1, 1);
                        band = true;
                    }
                    else
                    {
                        b1 = new baseNumerica(s1);
                    }
                    xb1 += "111";
                    switch(s2)
                    {
                        case "X":
                            xb1 += "0";
                            xb2 += "000";
                            break;
                        case "Y":
                            xb1 += "0";
                            xb2 += "100";
                            break;
                        case "SP":
                            xb1 += "1";
                            xb2 += "000";
                            break;
                        case "PC":
                            xb1 += "1";
                            xb2 += "100";
                            break;
                    }
                    String xb3 = "";
                    if (band)
                    {
                        xb2 += "1";
                        int sizeTMP = b1.getNumberHexadecimal().Length;
                        for (int j = sizeTMP - 2 ; j < sizeTMP;j++ )
                        {
                            xb3 += b1.getNumberHexadecimal()[j];
                        }
                    }
                    else
                    {
                        xb2 += "0";
                        xb3 = b1.getNumberHexadecimal().PadLeft(2, '0');
                    }
                    b2 = new baseNumerica(xb1);
                    b3 = new baseNumerica(xb2);
                    xb = b2.getNumberHexadecimal() + b3.getNumberHexadecimal() + xb3;
                    break;
                case "IDX2":
                    band = false;
                    if (s1[0] == '-')
                    {
                        char[] caracteres = { '-' };
                        s1 = s1.TrimStart(caracteres);
                        b1 = new baseNumerica(s1, 1);
                        band = true;
                    }
                    else
                    {
                        b1 = new baseNumerica(s1);
                    }
                    xb1 += "111";
                    switch(s2)
                    {
                        case "X":
                            xb1 += "0";
                            xb2 += "001";
                            break;
                        case "Y":
                            xb1 += "0";
                            xb2 += "101";
                            break;
                        case "SP":
                            xb1 += "1";
                            xb2 += "001";
                            break;
                        case "PC":
                            xb1 += "1";
                            xb2 += "101";
                            break;
                    }
                    xb3 = "";
                    if (band)
                    {
                        xb2 += "1";
                        int sizeTMP = b1.getNumberHexadecimal().Length;
                        for (int j = sizeTMP - 4 ; j < sizeTMP;j++ )
                        {
                            xb3 += b1.getNumberHexadecimal()[j];
                        }
                    }
                    else
                    {
                        xb2 += "0";
                        xb3 = b1.getNumberHexadecimal().PadLeft(4, '0');
                    }
                    b2 = new baseNumerica(xb1);
                    b3 = new baseNumerica(xb2);
                    xb = b2.getNumberHexadecimal() + b3.getNumberHexadecimal() + xb3;
                    break;
            }
        }
Пример #4
0
 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;
     }
 }
Пример #5
0
 public void calculaLongitud()
 {
     baseNumerica b1 = new baseNumerica(System.Convert.ToString(3 + (_codMaquina.Length / 2)));
     _longitud = (b1.getNumberHexadecimal()).PadLeft(2,'0');
 }
Пример #6
0
 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;
     }
 }
Пример #7
0
 public void addCodigoMaquina(String codigo)
 {
     for (int i = 0; i<codigo.Length;i++)
     {
         int tmpCodMaq = 0;
         tmpCodMaq = System.Convert.ToInt16(codigo[i]);
         baseNumerica b1 = new baseNumerica(System.Convert.ToString(tmpCodMaq));
         _codMaquina += b1.getNumberHexadecimal();
     }
     _codMaquina += "0A";
 }
Пример #8
0
        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
            }
        }
Пример #9
0
        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();
        }
Пример #10
0
        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();
        }
Пример #11
0
        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);
            }
        }
Пример #12
0
 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;
     }
 }