public string getParameterString(string key, int pc)
        {
            string result = "";
            int    idx    = 0;
            string ra     = "";
            string rt     = "";

            switch (type)
            {
            case SPUOpcodeType.RR:
                return(mnemonic + " " + getRegisterString(ConversionUtil.binStringToInt(key.Substring(25, 7))) + ", " +
                       getRegisterString(ConversionUtil.binStringToInt(key.Substring(18, 7))) + ", " +
                       getRegisterString(ConversionUtil.binStringToInt(key.Substring(11, 7))));

            case SPUOpcodeType.RRR:
                return(mnemonic + " " + getRegisterString(ConversionUtil.binStringToInt(key.Substring(4, 7))) + ", " +
                       getRegisterString(ConversionUtil.binStringToInt(key.Substring(18, 7))) + ", " +
                       getRegisterString(ConversionUtil.binStringToInt(key.Substring(11, 7))) + ", " +
                       getRegisterString(ConversionUtil.binStringToInt(key.Substring(25, 7))));

            case SPUOpcodeType.RI7:
                rt     = getRegisterString(ConversionUtil.binStringToInt(key.Substring(25, 7)));
                result = mnemonic + " " + rt + ", ";
                ra     = getRegisterString(ConversionUtil.binStringToInt(key.Substring(18, 7)));
                idx    = ConversionUtil.binStringToInt(key.Substring(11, 7));
                if (signed)
                {
                    idx <<= 32 - 7;
                    idx >>= 32 - 7;
                }
                idx <<= shift;
                if (mnemonic[0] == 'b' && mnemonic[1] != 'r' && mnemonic[2] != 'a')
                {
                    idx += pc;
                }
                else if (mnemonic[mnemonic.Length - 1] == 'd')
                {
                    return(result + ((idx <= 0) ? "" + idx : "0x" + idx.ToString("X")) + "(" + ra + ")");
                }
                if (mnemonic == "shlqbyi" && idx == 0)
                {
                    return("lr " + rt + ", " + ra);
                }
                return(result + ra + ", " + ((idx <= 0) ? "" + idx : "0x" + idx.ToString("X")));

            case SPUOpcodeType.RI8:
                rt     = getRegisterString(ConversionUtil.binStringToInt(key.Substring(25, 7)));
                result = mnemonic + " " + rt + ", ";
                ra     = getRegisterString(ConversionUtil.binStringToInt(key.Substring(18, 7)));
                idx    = ConversionUtil.binStringToInt(key.Substring(10, 8));
                if (signed)
                {
                    idx <<= 32 - 8;
                    idx >>= 32 - 8;
                }
                idx <<= shift;
                if (mnemonic[0] == 'b' && mnemonic[1] != 'r' && mnemonic[2] != 'a')
                {
                    idx += pc;
                }
                else if (mnemonic[mnemonic.Length - 1] == 'd')
                {
                    return(result + ((idx <= 0) ? "" + idx : "0x" + idx.ToString("X")) + "(" + ra + ")");
                }
                return(result + ra + ", " + ((idx <= 0) ? "" + idx : "0x" + idx.ToString("X")));

            case SPUOpcodeType.RI10:
                rt     = getRegisterString(ConversionUtil.binStringToInt(key.Substring(25, 7)));
                result = mnemonic + " " + rt + ", ";
                ra     = getRegisterString(ConversionUtil.binStringToInt(key.Substring(18, 7)));
                idx    = ConversionUtil.binStringToInt(key.Substring(8, 10));
                if (signed)
                {
                    idx <<= 32 - 10;
                    idx >>= 32 - 10;
                }
                idx <<= shift;
                if (mnemonic[0] == 'b' && mnemonic[1] != 'r' && mnemonic[2] != 'a')
                {
                    idx += pc;
                }
                else if (mnemonic[mnemonic.Length - 1] == 'd')
                {
                    return(result + ((idx <= 0) ? "" + idx : "0x" + idx.ToString("X")) + "(" + ra + ")");
                }
                else if (mnemonic == "ori" && idx == 0)
                {
                    return("lr " + rt + ", " + ra);
                }
                return(result + ra + ", " + ((idx <= 0) ? "" + idx : "0x" + idx.ToString("X")));

            case SPUOpcodeType.RI16:
                rt     = getRegisterString(ConversionUtil.binStringToInt(key.Substring(25, 7)));
                result = mnemonic + " " + rt + ", ";
                idx    = ConversionUtil.binStringToInt(key.Substring(9, 16));
                if (signed)
                {
                    idx <<= 32 - 16;
                    idx >>= 32 - 16;
                }
                idx <<= shift;
                if (mnemonic[0] == 'b' && mnemonic[1] != 'r' && mnemonic[2] != 'a')
                {
                    idx += pc;
                }
                return(result + ((idx <= 0) ? "" + idx : "0x" + idx.ToString("X")));

            case SPUOpcodeType.RI18:
                rt     = getRegisterString(ConversionUtil.binStringToInt(key.Substring(25, 7)));
                result = mnemonic + " " + rt + ", ";
                idx    = ConversionUtil.binStringToInt(key.Substring(7, 18));
                if (signed)
                {
                    idx <<= 32 - 16;
                    idx >>= 32 - 16;
                }
                idx <<= shift;
                if (mnemonic[0] == 'b' && mnemonic[1] != 'r' && mnemonic[2] != 'a')
                {
                    idx += pc;
                }
                return(result + ((idx <= 0) ? "" + idx : "0x" + idx.ToString("X")));

            case SPUOpcodeType.Special:
                return(mnemonic);
            }
            return("");
        }
예제 #2
0
        public void parseParameter(string key)
        {
            switch (type)
            {
            case SPUOpcodeType.RR:
                rt = ConversionUtil.binStringToInt(key.Substring(25, 7));
                ra = ConversionUtil.binStringToInt(key.Substring(18, 7));
                rb = ConversionUtil.binStringToInt(key.Substring(11, 7));
                break;

            case SPUOpcodeType.RRR:
                rt = ConversionUtil.binStringToInt(key.Substring(4, 7));
                ra = ConversionUtil.binStringToInt(key.Substring(18, 7));
                rb = ConversionUtil.binStringToInt(key.Substring(11, 7));
                rc = ConversionUtil.binStringToInt(key.Substring(25, 7));
                break;

            case SPUOpcodeType.RI7:
                rt  = ConversionUtil.binStringToInt(key.Substring(25, 7));
                ra  = ConversionUtil.binStringToInt(key.Substring(18, 7));
                idx = ConversionUtil.binStringToInt(key.Substring(11, 7));
                if (node.data.signed)
                {
                    idx <<= 32 - 7;
                    idx >>= 32 - 7;
                }
                idx <<= node.data.shift;
                break;

            case SPUOpcodeType.RI8:
                rt  = ConversionUtil.binStringToInt(key.Substring(25, 7));
                ra  = ConversionUtil.binStringToInt(key.Substring(18, 7));
                idx = ConversionUtil.binStringToInt(key.Substring(10, 8));
                if (node.data.signed)
                {
                    idx <<= 32 - 8;
                    idx >>= 32 - 8;
                }
                idx <<= node.data.shift;
                break;

            case SPUOpcodeType.RI10:
                rt  = ConversionUtil.binStringToInt(key.Substring(25, 7));
                ra  = ConversionUtil.binStringToInt(key.Substring(18, 7));
                idx = ConversionUtil.binStringToInt(key.Substring(8, 10));
                if (node.data.signed)
                {
                    idx <<= 32 - 10;
                    idx >>= 32 - 10;
                }
                idx <<= node.data.shift;
                break;

            case SPUOpcodeType.RI16:
                rt  = ConversionUtil.binStringToInt(key.Substring(25, 7));
                idx = ConversionUtil.binStringToInt(key.Substring(9, 16));
                if (node.data.signed)
                {
                    idx <<= 32 - 16;
                    idx >>= 32 - 16;
                }
                idx <<= node.data.shift;
                break;

            case SPUOpcodeType.RI18:
                rt  = ConversionUtil.binStringToInt(key.Substring(25, 7));
                idx = ConversionUtil.binStringToInt(key.Substring(7, 18));
                if (node.data.signed)
                {
                    idx <<= 32 - 16;
                    idx >>= 32 - 16;
                }
                idx <<= node.data.shift;
                break;

            case SPUOpcodeType.Special:
                break;
            }
        }