diff --git a/rpcs3/Emu/SysCalls/ModuleManager.cpp b/rpcs3/Emu/SysCalls/ModuleManager.cpp index 154ed10811..5e1488f318 100644 --- a/rpcs3/Emu/SysCalls/ModuleManager.cpp +++ b/rpcs3/Emu/SysCalls/ModuleManager.cpp @@ -8,6 +8,8 @@ extern Module cellAtracMulti; extern Module cellAudio; extern Module cellAvconfExt; extern Module cellCamera; +extern Module cellCelp8Enc; +extern Module cellCelpEnc; extern Module cellDmux; extern Module cellFiber; extern Module cellFont; @@ -136,7 +138,7 @@ static const g_module_list[] = { 0x0045, "sceNpTus", &sceNpTus }, { 0x0046, "cellVoice", &cellVoice }, { 0x0047, "cellAdecCelp8", nullptr }, - { 0x0048, "cellCelp8Enc", nullptr }, + { 0x0048, "cellCelp8Enc", &cellCelp8Enc }, { 0x0049, "cellLicenseArea", nullptr }, { 0x004a, "cellMusic2", nullptr }, { 0x004e, "cellScreenShotUtility", &cellScreenshot }, @@ -149,7 +151,7 @@ static const g_module_list[] = { 0x0057, "cellRudp", &cellRudp }, { 0x0059, "sceNpSns", &sceNpSns }, { 0x005a, "libgem", &cellGem }, - { 0xf00a, "cellCelpEnc", nullptr }, + { 0xf00a, "cellCelpEnc", &cellCelpEnc }, { 0xf010, "cellGifDec", &cellGifDec }, { 0xf019, "cellAdecCelp", nullptr }, { 0xf01b, "cellAdecM2bc", nullptr }, diff --git a/rpcs3/Emu/SysCalls/Modules/cellCelp8Enc.cpp b/rpcs3/Emu/SysCalls/Modules/cellCelp8Enc.cpp index e89fe43bce..676eeaa3a7 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellCelp8Enc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellCelp8Enc.cpp @@ -1,8 +1,9 @@ #include "stdafx.h" -#if 0 +#include "Emu/Memory/Memory.h" +#include "Emu/System.h" +#include "Emu/SysCalls/Modules.h" -void cellCelp8Enc_init(); -Module cellCelp8Enc(0x0048, cellCelp8Enc_init); +extern Module cellCelp8Enc; // Return Codes enum @@ -15,61 +16,61 @@ enum CELL_CELP8ENC_ERROR_CORE_ARG = 0x806140b3, }; -int cellCelp8EncQueryAttr() +s32 cellCelp8EncQueryAttr() { UNIMPLEMENTED_FUNC(cellCelp8Enc); return CELL_OK; } -int cellCelp8EncOpen() +s32 cellCelp8EncOpen() { UNIMPLEMENTED_FUNC(cellCelp8Enc); return CELL_OK; } -int cellCelp8EncOpenEx() +s32 cellCelp8EncOpenEx() { UNIMPLEMENTED_FUNC(cellCelp8Enc); return CELL_OK; } -int cellCelp8EncClose() +s32 cellCelp8EncClose() { UNIMPLEMENTED_FUNC(cellCelp8Enc); return CELL_OK; } -int cellCelp8EncStart() +s32 cellCelp8EncStart() { UNIMPLEMENTED_FUNC(cellCelp8Enc); return CELL_OK; } -int cellCelp8EncEnd() +s32 cellCelp8EncEnd() { UNIMPLEMENTED_FUNC(cellCelp8Enc); return CELL_OK; } -int cellCelp8EncEncodeFrame() +s32 cellCelp8EncEncodeFrame() { UNIMPLEMENTED_FUNC(cellCelp8Enc); return CELL_OK; } -int cellCelp8EncWaitForOutput() +s32 cellCelp8EncWaitForOutput() { UNIMPLEMENTED_FUNC(cellCelp8Enc); return CELL_OK; } -int cellCelp8EncGetAu() +s32 cellCelp8EncGetAu() { UNIMPLEMENTED_FUNC(cellCelp8Enc); return CELL_OK; } -void cellCelp8Enc_init() +Module cellCelp8Enc("cellCelp8Enc", []() { REG_FUNC(cellCelp8Enc, cellCelp8EncQueryAttr); REG_FUNC(cellCelp8Enc, cellCelp8EncOpen); @@ -80,5 +81,4 @@ void cellCelp8Enc_init() REG_FUNC(cellCelp8Enc, cellCelp8EncEncodeFrame); REG_FUNC(cellCelp8Enc, cellCelp8EncWaitForOutput); REG_FUNC(cellCelp8Enc, cellCelp8EncGetAu); -} -#endif +}); diff --git a/rpcs3/Emu/SysCalls/Modules/cellCelpEnc.cpp b/rpcs3/Emu/SysCalls/Modules/cellCelpEnc.cpp index 9ee9c60953..60041821a8 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellCelpEnc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellCelpEnc.cpp @@ -1,8 +1,9 @@ #include "stdafx.h" -#if 0 +#include "Emu/Memory/Memory.h" +#include "Emu/System.h" +#include "Emu/SysCalls/Modules.h" -void cellCelpEnc_init(); -Module cellCelpEnc(0xf00a, cellCelpEnc_init); +extern Module cellCelpEnc; // Return Codes enum @@ -15,61 +16,61 @@ enum CELL_CELPENC_ERROR_CORE_ARG = 0x80614083, }; -int cellCelpEncQueryAttr() +s32 cellCelpEncQueryAttr() { UNIMPLEMENTED_FUNC(cellCelpEnc); return CELL_OK; } -int cellCelpEncOpen() +s32 cellCelpEncOpen() { UNIMPLEMENTED_FUNC(cellCelpEnc); return CELL_OK; } -int cellCelpEncOpenEx() +s32 cellCelpEncOpenEx() { UNIMPLEMENTED_FUNC(cellCelpEnc); return CELL_OK; } -int cellCelpEncClose() +s32 cellCelpEncClose() { UNIMPLEMENTED_FUNC(cellCelpEnc); return CELL_OK; } -int cellCelpEncStart() +s32 cellCelpEncStart() { UNIMPLEMENTED_FUNC(cellCelpEnc); return CELL_OK; } -int cellCelpEncEnd() +s32 cellCelpEncEnd() { UNIMPLEMENTED_FUNC(cellCelpEnc); return CELL_OK; } -int cellCelpEncEncodeFrame() +s32 cellCelpEncEncodeFrame() { UNIMPLEMENTED_FUNC(cellCelpEnc); return CELL_OK; } -int cellCelpEncWaitForOutput() +s32 cellCelpEncWaitForOutput() { UNIMPLEMENTED_FUNC(cellCelpEnc); return CELL_OK; } -int cellCelpEncGetAu() +s32 cellCelpEncGetAu() { UNIMPLEMENTED_FUNC(cellCelpEnc); return CELL_OK; } -void cellCelpEnc_init() +Module cellCelpEnc("cellCelpEnc", []() { REG_FUNC(cellCelpEnc, cellCelpEncQueryAttr); REG_FUNC(cellCelpEnc, cellCelpEncOpen); @@ -80,5 +81,4 @@ void cellCelpEnc_init() REG_FUNC(cellCelpEnc, cellCelpEncEncodeFrame); REG_FUNC(cellCelpEnc, cellCelpEncWaitForOutput); REG_FUNC(cellCelpEnc, cellCelpEncGetAu); -} -#endif +}); diff --git a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp index 2330feaab3..7433d187fc 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp @@ -8,19 +8,23 @@ extern Module cellFont; -std::unique_ptr g_font; +struct font_instance_t +{ + std::atomic init{ false }; +} +g_font; // Functions s32 cellFontInitializeWithRevision(u64 revisionFlags, vm::ptr config) { cellFont.Warning("cellFontInitializeWithRevision(revisionFlags=0x%llx, config=*0x%x)", revisionFlags, config); - - if (g_font->m_bInitialized) + + if (g_font.init.load()) { return CELL_FONT_ERROR_ALREADY_INITIALIZED; } - - if (config->FileCache.size < 24) + + if (config->fc_size < 24) { return CELL_FONT_ERROR_INVALID_PARAMETER; } @@ -30,11 +34,11 @@ s32 cellFontInitializeWithRevision(u64 revisionFlags, vm::ptr co cellFont.Error("cellFontInitializeWithRevision: Unknown flags (0x%x)", config->flags); } - g_font->m_buffer_addr = config->FileCache.buffer_addr; - g_font->m_buffer_size = config->FileCache.size; - g_font->m_userFontEntrys_addr = config->userFontEntrys_addr; - g_font->m_userFontEntryMax = config->userFontEntryMax; - g_font->m_bInitialized = true; + if (g_font.init.exchange(true)) + { + throw EXCEPTION("Unexpected"); + } + return CELL_OK; } @@ -44,11 +48,11 @@ s32 cellFontGetRevisionFlags(vm::ptr revisionFlags) return CELL_OK; } -s32 cellFontInit(PPUThread& CPU, vm::ptr config) +s32 cellFontInit(PPUThread& ppu, vm::ptr config) { cellFont.Warning("cellFontInit(config=*0x%x)", config); - vm::stackvar> revisionFlags(CPU); + vm::stackvar> revisionFlags(ppu); revisionFlags.value() = 0; cellFontGetRevisionFlags(revisionFlags); @@ -59,12 +63,15 @@ s32 cellFontEnd() { cellFont.Warning("cellFontEnd()"); - if (!g_font->m_bInitialized) + if (!g_font.init.load()) { return CELL_FONT_ERROR_UNINITIALIZED; } - g_font->m_bInitialized = false; + if (!g_font.init.exchange(false)) + { + throw EXCEPTION("Unexpected"); + } return CELL_OK; } @@ -79,7 +86,7 @@ s32 cellFontOpenFontMemory(vm::ptr library, u32 fontAddr, u32 f { cellFont.Warning("cellFontOpenFontMemory(library=*0x%x, fontAddr=0x%x, fontSize=%d, subNum=%d, uniqueId=%d, font=*0x%x)", library, fontAddr, fontSize, subNum, uniqueId, font); - if (!g_font->m_bInitialized) + if (!g_font.init.load()) { return CELL_FONT_ERROR_UNINITIALIZED; } @@ -115,11 +122,11 @@ s32 cellFontOpenFontFile(vm::ptr library, vm::cptr fontPa return ret; } -s32 cellFontOpenFontset(PPUThread& CPU, vm::ptr library, vm::ptr fontType, vm::ptr font) +s32 cellFontOpenFontset(PPUThread& ppu, vm::ptr library, vm::ptr fontType, vm::ptr font) { cellFont.Warning("cellFontOpenFontset(library=*0x%x, fontType=*0x%x, font=*0x%x)", library, fontType, font); - if (!g_font->m_bInitialized) + if (!g_font.init.load()) { return CELL_FONT_ERROR_UNINITIALIZED; } @@ -195,7 +202,7 @@ s32 cellFontOpenFontset(PPUThread& CPU, vm::ptr library, vm::pt return CELL_FONT_ERROR_NO_SUPPORT_FONTSET; } - vm::stackvar f(CPU, (u32)file.length() + 1, 1); + vm::stackvar f(ppu, (u32)file.length() + 1, 1); memcpy(f.get_ptr(), file.c_str(), file.size() + 1); s32 ret = cellFontOpenFontFile(library, f, 0, 0, font); //TODO: Find the correct values of subNum, uniqueId font->origin = CELL_FONT_OPEN_FONTSET; @@ -227,7 +234,7 @@ s32 cellFontCreateRenderer(vm::ptr library, vm::ptrm_bInitialized) + if (!g_font.init.load()) { return CELL_FONT_ERROR_UNINITIALIZED; } @@ -241,26 +248,21 @@ void cellFontRenderSurfaceInit(vm::ptr surface, vm::ptrbuffer_addr = buffer.addr(); - surface->widthByte = bufferWidthByte; - surface->pixelSizeByte = pixelSizeByte; - surface->width = w; - surface->height = h; - - if (!buffer) - { - surface->buffer_addr = vm::alloc(bufferWidthByte * h, vm::main); // TODO: Huge memory leak - } + surface->buffer = buffer; + surface->widthByte = bufferWidthByte; + surface->pixelSizeByte = pixelSizeByte; + surface->width = w; + surface->height = h; } void cellFontRenderSurfaceSetScissor(vm::ptr surface, s32 x0, s32 y0, s32 w, s32 h) { cellFont.Warning("cellFontRenderSurfaceSetScissor(surface=*0x%x, x0=%d, y0=%d, w=%d, h=%d)", surface, x0, y0, w, h); - surface->Scissor.x0 = x0; - surface->Scissor.y0 = y0; - surface->Scissor.x1 = w; - surface->Scissor.y1 = h; + surface->sc_x0 = x0; + surface->sc_y0 = y0; + surface->sc_x1 = w; + surface->sc_y1 = h; } s32 cellFontSetScalePixel(vm::ptr font, float w, float h) @@ -374,7 +376,7 @@ s32 cellFontRenderCharGlyphImage(vm::ptr font, u32 code, vm::ptr(surface->buffer_addr); + unsigned char* buffer = vm::get_ptr(surface->buffer.addr()); for (u32 ypos = 0; ypos < (u32)height; ypos++) { if ((u32)y + ypos + yoff + baseLineY >= surface->height) @@ -457,12 +459,12 @@ s32 cellFontGetCharGlyphMetrics(vm::ptr font, u32 code, vm::ptrwidth = (x1-x0) * scale; metrics->height = (y1-y0) * scale; - metrics->Horizontal.bearingX = (float)leftSideBearing * scale; - metrics->Horizontal.bearingY = 0.f; - metrics->Horizontal.advance = (float)advanceWidth * scale; - metrics->Vertical.bearingX = 0.f; - metrics->Vertical.bearingY = 0.f; - metrics->Vertical.advance = 0.f; + metrics->h_bearingX = (float)leftSideBearing * scale; + metrics->h_bearingY = 0.f; + metrics->h_advance = (float)advanceWidth * scale; + metrics->v_bearingX = 0.f; + metrics->v_bearingY = 0.f; + metrics->v_advance = 0.f; return CELL_OK; } @@ -473,11 +475,11 @@ s32 cellFontGraphicsSetFontRGBA() return CELL_OK; } -s32 cellFontOpenFontsetOnMemory(PPUThread& CPU, vm::ptr library, vm::ptr fontType, vm::ptr font) +s32 cellFontOpenFontsetOnMemory(PPUThread& ppu, vm::ptr library, vm::ptr fontType, vm::ptr font) { cellFont.Todo("cellFontOpenFontsetOnMemory(library=*0x%x, fontType=*0x%x, font=*0x%x)", library, fontType, font); - if (!g_font->m_bInitialized) + if (!g_font.init.load()) { return CELL_FONT_ERROR_UNINITIALIZED; } @@ -632,7 +634,7 @@ s32 cellFontGetCharGlyphMetricsVertical() Module cellFont("cellFont", []() { - g_font = std::make_unique(); + g_font.init = false; REG_FUNC(cellFont, cellFontInit); REG_FUNC(cellFont, cellFontSetFontsetOpenMode); diff --git a/rpcs3/Emu/SysCalls/Modules/cellFont.h b/rpcs3/Emu/SysCalls/Modules/cellFont.h index 8cfc8430e8..0b1d3274a0 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFont.h +++ b/rpcs3/Emu/SysCalls/Modules/cellFont.h @@ -32,21 +32,6 @@ enum CELL_FONT_ERROR_NO_SUPPORT_SURFACE = 0x80540040, }; -struct CellFontLibrary -{ - u32 libraryType, libraryVersion; - //u32 SystemClosed[]; -}; - -struct CellFontMemoryInterface -{ - u32 Object_addr; //void* - //CellFontMallocCallback Malloc; - //CellFontFreeCallback Free; - //CellFontReallocCallback Realloc; - //CellFontCallocCallback Calloc; -}; - // Font Set Types enum { @@ -115,24 +100,6 @@ enum CELL_FONT_MAP_UNICODE = 1, }; -struct CellFontConfig -{ - struct - { - be_t buffer_addr; - be_t size; - } FileCache; - - be_t userFontEntryMax; - be_t userFontEntrys_addr; - be_t flags; -}; - -struct CellFontRenderer -{ - void *systemReserved[64]; -}; - //Custom enum to determine the origin of a CellFont object enum { @@ -142,20 +109,46 @@ enum CELL_FONT_OPEN_MEMORY, }; -struct stbtt_fontinfo; -struct CellFont +using CellFontMallocCallback = vm::ptr(vm::ptr arg, u32 size); +using CellFontFreeCallback = void(vm::ptr arg, vm::ptr ptr); +using CellFontReallocCallback = vm::ptr(vm::ptr arg, vm::ptr p, u32 reallocSize); +using CellFontCallocCallback = vm::ptr(vm::ptr arg, u32 num, u32 size); + +struct CellFontMemoryInterface { - //void* SystemReserved[64]; - be_t scale_x; - be_t scale_y; - be_t slant; - be_t renderer_addr; + vm::bptr arg; + vm::bptr malloc; + vm::bptr free; + vm::bptr realloc; + vm::bptr calloc; +}; - be_t fontdata_addr; - be_t origin; - stbtt_fontinfo* stbfont; - // hack: don't place anything after pointer +struct CellFontEntry +{ + be_t lock; + be_t uniqueId; + vm::bcptr fontLib; + vm::bptr fontH; +}; + +struct CellFontConfig +{ + // FileCache + vm::bptr fc_buffer; + be_t fc_size; + + be_t userFontEntryMax; + vm::bptr userFontEntrys; + + be_t flags; +}; + +struct CellFontLibrary +{ + be_t libraryType; + be_t libraryVersion; + // ... }; struct CellFontType @@ -164,119 +157,89 @@ struct CellFontType be_t map; }; -struct CellFontInitGraphicsConfigGcm -{ - be_t configType; - - struct - { - be_t address; - be_t size; - } GraphicsMemory; - - struct - { - be_t address; - be_t size; - } MappedMainMemory; - - struct - { - be_t slotNumber; - be_t slotCount; - } VertexShader; -}; - -struct CellFontGraphics -{ - u32 graphicsType; - u32 SystemClosed_addr; -}; - struct CellFontHorizontalLayout { - be_t baseLineY; - be_t lineHeight; - be_t effectHeight; + be_t baseLineY; + be_t lineHeight; + be_t effectHeight; }; struct CellFontVerticalLayout { - be_t baseLineX; - be_t lineWidth; - be_t effectWidth; + be_t baseLineX; + be_t lineWidth; + be_t effectWidth; }; struct CellFontGlyphMetrics { - be_t width; - be_t height; + be_t width; + be_t height; - struct - { - be_t bearingX; - be_t bearingY; - be_t advance; - } Horizontal; + be_t h_bearingX; + be_t h_bearingY; + be_t h_advance; - struct - { - be_t bearingX; - be_t bearingY; - be_t advance; - } Vertical; -}; - -struct CellFontImageTransInfo -{ - be_t Image_addr; - be_t imageWidthByte; - be_t imageWidth; - be_t imageHeight; - be_t Surface_addr; - be_t surfWidthByte; -}; - -struct CellFontRendererConfig -{ - struct BufferingPolicy - { - be_t buffer; - be_t initSize; - be_t maxSize; - be_t expandSize; - be_t resetSize; - }; + be_t v_bearingX; + be_t v_bearingY; + be_t v_advance; }; struct CellFontRenderSurface { - be_t buffer_addr; - be_t widthByte; - be_t pixelSizeByte; - be_t width, height; + vm::bptr buffer; + be_t widthByte; + be_t pixelSizeByte; + be_t width; + be_t height; - struct - { - be_t x0, y0; - be_t x1, y1; - } Scissor; + // Scissor + be_t sc_x0; + be_t sc_y0; + be_t sc_x1; + be_t sc_y1; }; -// Internal Datatypes -struct CellFontInternal //Module cellFont +struct CellFontImageTransInfo { - u32 m_buffer_addr, m_buffer_size; - u32 m_userFontEntrys_addr, m_userFontEntryMax; + vm::bptr image; + be_t imageWidthByte; + be_t imageWidth; + be_t imageHeight; + vm::bptr surface; + be_t surfWidthByte; +}; - bool m_bInitialized; - bool m_bFontGcmInitialized; +struct CellFont +{ + be_t scale_x; + be_t scale_y; + be_t slant; + be_t renderer_addr; - CellFontInternal() - : m_buffer_addr(0) - , m_buffer_size(0) - , m_bInitialized(false) - , m_bFontGcmInitialized(false) - { - } -}; \ No newline at end of file + be_t fontdata_addr; + be_t origin; + struct stbtt_fontinfo* stbfont; + // hack: don't place anything after pointer +}; + +struct CellFontRendererConfig +{ + // Buffering Policy + vm::bptr buffer; + be_t initSize; + be_t maxSize; + be_t expandSize; + be_t resetSize; +}; + +struct CellFontRenderer +{ + void *systemReserved[64]; +}; + +struct CellFontGraphics +{ + be_t graphicsType; + // ... +}; diff --git a/rpcs3/Emu/SysCalls/Modules/cellFontFT.cpp b/rpcs3/Emu/SysCalls/Modules/cellFontFT.cpp index 376eb611d6..e5b5048999 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFontFT.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellFontFT.cpp @@ -2,20 +2,14 @@ #include "Emu/Memory/Memory.h" #include "Emu/SysCalls/Modules.h" -#include "cellFont.h" #include "cellFontFT.h" extern Module cellFontFT; -CCellFontFTInternal* s_fontFtInternalInstance = nullptr; - s32 cellFontInitLibraryFreeTypeWithRevision(u64 revisionFlags, vm::ptr config, vm::pptr lib) { cellFontFT.Warning("cellFontInitLibraryFreeTypeWithRevision(revisionFlags=0x%llx, config=*0x%x, lib=**0x%x)", revisionFlags, config, lib); - //if (s_fontInternalInstance->m_bInitialized) - //return CELL_FONT_ERROR_UNINITIALIZED; - lib->set(vm::alloc(sizeof(CellFontLibrary), vm::main)); return CELL_OK; @@ -35,13 +29,6 @@ s32 cellFontFTGetInitializedRevisionFlags() Module cellFontFT("cellFontFT", []() { - s_fontFtInternalInstance = new CCellFontFTInternal(); - - cellFontFT.on_stop = []() - { - delete s_fontFtInternalInstance; - }; - REG_FUNC(cellFontFT, cellFontInitLibraryFreeTypeWithRevision); REG_FUNC(cellFontFT, cellFontFTGetRevisionFlags); REG_FUNC(cellFontFT, cellFontFTGetInitializedRevisionFlags); diff --git a/rpcs3/Emu/SysCalls/Modules/cellFontFT.h b/rpcs3/Emu/SysCalls/Modules/cellFontFT.h index 541f5f287d..37f8204062 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFontFT.h +++ b/rpcs3/Emu/SysCalls/Modules/cellFontFT.h @@ -1,30 +1,13 @@ #pragma once +#include "cellFont.h" + namespace vm { using namespace ps3; } struct CellFontLibraryConfigFT { - u32 library_addr; //void* + vm::bptr library; CellFontMemoryInterface MemoryIF; }; -struct CellFontRendererConfigFT -{ - struct { - u32 buffer_addr; //void* - u32 initSize; - u32 maxSize; - u32 expandSize; - u32 resetSize; - } BufferingPolicy; -}; - -struct CCellFontFTInternal -{ - bool m_bInitialized; - - CCellFontFTInternal() - : m_bInitialized(false) - { - } -}; \ No newline at end of file +using CellFontRendererConfigFT = CellFontRendererConfig; diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 4002a65304..137ac9dd46 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -416,12 +416,6 @@ Emu\SysCalls\currently_unused - - Emu\SysCalls\currently_unused - - - Emu\SysCalls\currently_unused - Emu\SysCalls\currently_unused @@ -887,6 +881,12 @@ Emu\SysCalls\Modules + + Emu\SysCalls\Modules + + + Emu\SysCalls\Modules +