using ChocolArm64.Memory;

namespace Ryujinx.Core.OsHle
{
    public class Homebrew
    {
        //http://switchbrew.org/index.php?title=Homebrew_ABI
        public Homebrew(AMemory Memory, long Position, long MainThreadHandle)
        {
            //(NbrKeys * LoaderConfigEntrySize) + 2 buffers for Key2
            long Size = (4 * 0x18) + 0x1000;
            Memory.Manager.MapPhys(Position, Size, (int)MemoryType.Normal, AMemoryPerm.RW);

            //MainThreadHandle
            WriteConfigEntry(Memory, ref Position, 1, 0, MainThreadHandle);
            //NextLoadPath
            WriteConfigEntry(Memory, ref Position, 2, 0, Position + Size, Position + Size + 0x200);
            //AppletType
            WriteConfigEntry(Memory, ref Position, 7);
            //EndOfList
            WriteConfigEntry(Memory, ref Position, 0);
        }

        private void WriteConfigEntry(AMemory Memory, ref long Position, int Key, int Flags = 0, long Value0 = 0L, long Value1 = 0L)
        {
            Memory.WriteInt32(Position + 0x00, Key);
            Memory.WriteInt32(Position + 0x04, Flags);
            Memory.WriteInt64(Position + 0x08, Value0);
            Memory.WriteInt64(Position + 0x10, Value1);

            Position += 0x18;
        }
    }
}