// Copyright 2014 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.

#include "common/common_types.h"
#include "common/logging/log.h"

#include "core/mem_map.h"

////////////////////////////////////////////////////////////////////////////////////////////////////

namespace Memory {

u8* g_exefs_code;  ///< ExeFS:/.code is loaded here
u8* g_system_mem;  ///< System memory
u8* g_heap;        ///< Application heap (main memory)
u8* g_heap_linear; ///< Linear heap
u8* g_vram;        ///< Video memory (VRAM) pointer
u8* g_shared_mem;  ///< Shared memory
u8* g_dsp_mem;     ///< DSP memory
u8* g_kernel_mem;  ///< Kernel memory

namespace {

struct MemoryArea {
    u8** ptr;
    size_t size;
};

// We don't declare the IO regions in here since its handled by other means.
static MemoryArea memory_areas[] = {
    {&g_exefs_code,  EXEFS_CODE_SIZE   },
    {&g_vram,        VRAM_SIZE         },
    {&g_heap,        HEAP_SIZE         },
    {&g_shared_mem,  SHARED_MEMORY_SIZE},
    {&g_system_mem,  SYSTEM_MEMORY_SIZE},
    {&g_dsp_mem,     DSP_MEMORY_SIZE   },
    {&g_kernel_mem,  KERNEL_MEMORY_SIZE},
    {&g_heap_linear, HEAP_LINEAR_SIZE  },
};

}

void Init() {
    for (MemoryArea& area : memory_areas) {
        *area.ptr = new u8[area.size];
    }
    MemBlock_Init();

    LOG_DEBUG(HW_Memory, "initialized OK, RAM at %p", g_heap);
}

void Shutdown() {
    MemBlock_Shutdown();
    for (MemoryArea& area : memory_areas) {
        delete[] *area.ptr;
        *area.ptr = nullptr;
    }

    LOG_DEBUG(HW_Memory, "shutdown OK");
}

} // namespace
