Пример #1
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;
            }
        }
Пример #2
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();
        }