private Rance10Object ReadObject(Rance10 rance10, uint addr, int idx)
        {
            if (addr == 0)
            {
                return(null);
            }

            var buf = new byte[64];
            var m   = rance10.ReadMemory(new IntPtr(addr), buf, 8);

            if (!m.Success)
            {
                System.Diagnostics.Debug.Print($"Failed to read memory: {addr:X8}");
                return(null);
            }

            var type = BitConverter.ToInt32(m.Data, 4);

            switch (type)
            {
            case 0: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject0.Size); break;

            case 1: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject1_Value.Size); break;

            case 2: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject2_String.Size); break;

            case 3: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject3_Array.Size); break;

            case 4: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject4_Class.Size); break;

            case 5: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject5.Size); break;

            default: throw new Exception($"Invalid type no: {type} @{addr:X8}");
            }

            if (!m.Success)
            {
                System.Diagnostics.Debug.Print($"Failed to read memory: {addr:X8}");
                return(null);
            }

            var obj = Rance10Object.New(null, (uint)m.Address.ToInt64(), m.Data);

            obj.Seq = idx;

            return(obj);
        }