예제 #1
0
 public void Patch()
 {
     foreach (int patch in Patches)
     {
         long address = Address;
         int  @int    = VMB.GetInt(patch);
         int  value   = VMBuffer.EncodeInstructionBranch(VMBuffer.GetInstruction(@int), patch);
         VMB.SetInt(patch, value);
     }
     Patches.Clear();
 }
예제 #2
0
        public int DisasmOne(VMBuffer _vmb, int _offs, TextWriter _sw)
        {
            int num  = _offs;
            int @int = _vmb.GetInt(_offs);

            _offs += 4;
            int instruction = VMBuffer.GetInstruction(@int);
            int arg         = VMBuffer.GetArg(@int);
            int num2        = _offs;

            if ((instruction & 0x40) != 0)
            {
                _offs += ParamSize(arg);
            }
            int i = 11;

            _sw.Write("{0:x8} : ", num);
            int num3 = num;

            while (num3 < _offs)
            {
                _sw.Write("{0:x2}", _vmb.Buffer.GetBuffer()[num3]);
                num3++;
                i += 2;
            }
            for (; i < 36; i++)
            {
                _sw.Write(" ");
            }
            string text = Instruction2String(instruction);

            _sw.Write(text);
            i += text.Length;
            if ((instruction & 0xA0) == 128)
            {
                _sw.Write(Arg2String(arg));
                i += 2;
            }
            else if ((instruction & 0xA0) == 0)
            {
                _sw.Write(Arg2String(arg & 0xF));
                _sw.Write(Arg2String(arg >> 4));
                i += 4;
            }
            for (; i < 46; i++)
            {
                _sw.Write(" ");
            }
            if ((instruction & 0x40) != 0)
            {
                long position = _vmb.Buffer.Position;
                _vmb.Buffer.Position = num2;
                switch (arg & 0xF)
                {
                case 3:
                    _sw.Write("{0}", _vmb.Buffer.ReadLong());
                    break;

                case 0:
                    _sw.Write("{0}", _vmb.Buffer.ReadDouble());
                    break;

                case 2:
                    _sw.Write("{0}", _vmb.Buffer.ReadInteger());
                    break;

                case 5:
                    _sw.Write("{0}", _vmb.Buffer.ReadInteger() & 0x1FFFFFFF);
                    break;

                case 6:
                    _sw.Write("{0}", Strings[_vmb.Buffer.ReadInteger()]);
                    break;

                case 1:
                    _sw.Write("{0}", _vmb.Buffer.ReadSingle());
                    break;

                case 4:
                    _sw.Write("{0}", _vmb.Buffer.ReadInteger() != 0);
                    break;

                case 15:
                    _sw.Write("{0}", @int << 16 >> 16);
                    break;
                }
                _vmb.Buffer.Position = position;
            }
            else if ((instruction & 0x20) != 0)
            {
                int num4 = num + VMBuffer.GetBranch(@int);
                _sw.WriteLine("0x{0:x8}", num4);
            }
            _sw.WriteLine("");
            return(_offs);
        }