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); }
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)); }