예제 #1
0
파일: ESD.cs 프로젝트: Meowmaritus/MeowDSIO
            public EzCommand GetEzCommand(int offset)
            {
                if (DictEzCommand.ContainsKey(offset))
                {
                    return(DictEzCommand[offset]);
                }

                var esf = new EzCommand();

                DictEzCommand.Add(offset, esf);

                bin.StepIn(offset);
                {
                    esf.Unk0 = bin.ReadInt32();
                    esf.ID   = bin.ReadInt32();
                    int argOffset = bin.ReadInt32();
                    int argCount  = bin.ReadInt32();

                    if (argOffset != -1)
                    {
                        for (int i = 0; i < argCount; i++)
                        {
                            esf.Args.Add(GetEzCommandArg(FILE_OFFSET + argOffset + EzCommandArg.SIZE * i));
                        }
                    }
                }
                bin.StepOut();

                return(esf);
            }
예제 #2
0
파일: ESD.cs 프로젝트: Meowmaritus/MeowDSIO
            public string Evaluate()
            {
                Stack <object> stack = new Stack <object>();

                object[] reg = new object[8];

                for (int i = 0; i < Bytes.Length; i++)
                {
                    var b = Bytes[i];
                    if (b >= 0x3F && b <= 0x7F)
                    {
                        stack.Push(b - 64);
                    }
                    else if (b == 0xA5)
                    {
                        var  sb       = new StringBuilder();
                        char nextChar = '?';
                        do
                        {
                            nextChar = BitConverter.ToChar(Bytes, i + 1);
                            if (nextChar != (char)0)
                            {
                                sb.Append(nextChar);
                            }
                            i += 2;
                        }while (nextChar != (char)0);
                        stack.Push(sb.ToString());
                    }
                    else if (b == 0x80)
                    {
                        stack.Push(BitConverter.ToSingle(Bytes, i + 1));
                        i += 4;
                    }
                    else if (b == 0x81)
                    {
                        stack.Push(BitConverter.ToDouble(Bytes, i + 1));
                        i += 8;
                    }
                    else if (b == 0x82)
                    {
                        stack.Push(BitConverter.ToInt32(Bytes, i + 1));
                        i += 4;
                    }
                    else if (b == 0x84)
                    {
                        var id = Convert.ToInt32(stack.Pop());
                        stack.Push(EzCommand.GetString(id));
                    }
                    else if (b == 0x85)
                    {
                        var arg1 = stack.Pop();
                        var id   = Convert.ToInt32(stack.Pop());
                        stack.Push(EzCommand.GetString(id, arg1));
                    }
                    else if (b == 0x86)
                    {
                        var arg2 = stack.Pop();
                        var arg1 = stack.Pop();
                        var id   = Convert.ToInt32(stack.Pop());
                        stack.Push(EzCommand.GetString(id, arg1, arg2));
                    }
                    else if (b >= 0x91 && b <= 0x96)
                    {
                        var item2 = stack.Pop();
                        var item1 = stack.Pop();
                        stack.Push($"({item1}) {GetComp(b)} ({item2})");
                    }
                    else if (b == 0x98)
                    {
                        var item2 = stack.Pop();
                        var item1 = stack.Pop();
                        stack.Push($"({item1}) && ({item2})");
                    }
                    else if (b == 0x99)
                    {
                        var item2 = stack.Pop();
                        var item1 = stack.Pop();
                        stack.Push($"({item1}) || ({item2})");
                    }
                    else if (b == 0xA6)
                    {
                        stack.Push($"[CONT.]");
                    }
                    else if (b >= 0xA7 && b <= 0xAE)
                    {
                        byte regIndex = (byte)(b - 0xA7);
                        var  item     = stack.Peek();
                        stack.Push($"{item} => REG[{regIndex}]");
                        reg[regIndex] = item;
                    }
                    else if (b >= 0xAF && b <= 0xB6)
                    {
                        byte regIndex = (byte)(b - 0xAF);
                        stack.Push($"REG[{regIndex}] => {reg[regIndex]}");
                    }
                    else if (b == 0xB7)
                    {
                        stack.Push($"[STOP IF FALSE]");
                    }
                    else if (b == 0xA1)
                    {
                        //stack.Push("\n");
                    }
                    else if (b >= 0x8C && b <= 0x8F)
                    {
                        var item2 = stack.Pop();
                        var item1 = stack.Pop();
                        stack.Push($"({item1}) <op 0x{b:X2}> ({item2})");
                    }
                    else
                    {
                        stack.Push($"<?0x{b:X2}?>");
                    }
                }
                return(string.Join(", ", stack));
            }