whitespace fixes

This commit is contained in:
Dave Murphy 2016-12-04 17:21:44 +00:00
parent 664ae583c4
commit 3501efd7e5
35 changed files with 2886 additions and 2886 deletions

View File

@ -1,173 +1,173 @@
/** /**
* @file console.h * @file console.h
* @brief 3ds stdio support. * @brief 3ds stdio support.
* *
* Provides stdio integration for printing to the 3DS screen as well as debug print * Provides stdio integration for printing to the 3DS screen as well as debug print
* functionality provided by stderr. * functionality provided by stderr.
* *
* General usage is to initialize the console by: * General usage is to initialize the console by:
* @code * @code
* consoleDemoInit() * consoleDemoInit()
* @endcode * @endcode
* or to customize the console usage by: * or to customize the console usage by:
* @code * @code
* consoleInit() * consoleInit()
* @endcode * @endcode
*/ */
#pragma once #pragma once
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/gfx.h> #include <3ds/gfx.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#define CONSOLE_ESC(x) "\x1b[" #x #define CONSOLE_ESC(x) "\x1b[" #x
#define CONSOLE_RESET CONSOLE_ESC(0m) #define CONSOLE_RESET CONSOLE_ESC(0m)
#define CONSOLE_BLACK CONSOLE_ESC(30m) #define CONSOLE_BLACK CONSOLE_ESC(30m)
#define CONSOLE_RED CONSOLE_ESC(31;1m) #define CONSOLE_RED CONSOLE_ESC(31;1m)
#define CONSOLE_GREEN CONSOLE_ESC(32;1m) #define CONSOLE_GREEN CONSOLE_ESC(32;1m)
#define CONSOLE_YELLOW CONSOLE_ESC(33;1m) #define CONSOLE_YELLOW CONSOLE_ESC(33;1m)
#define CONSOLE_BLUE CONSOLE_ESC(34;1m) #define CONSOLE_BLUE CONSOLE_ESC(34;1m)
#define CONSOLE_MAGENTA CONSOLE_ESC(35;1m) #define CONSOLE_MAGENTA CONSOLE_ESC(35;1m)
#define CONSOLE_CYAN CONSOLE_ESC(36;1m) #define CONSOLE_CYAN CONSOLE_ESC(36;1m)
#define CONSOLE_WHITE CONSOLE_ESC(37;1m) #define CONSOLE_WHITE CONSOLE_ESC(37;1m)
/// A callback for printing a character. /// A callback for printing a character.
typedef bool(*ConsolePrint)(void* con, int c); typedef bool(*ConsolePrint)(void* con, int c);
/// A font struct for the console. /// A font struct for the console.
typedef struct ConsoleFont typedef struct ConsoleFont
{ {
u8* gfx; ///< A pointer to the font graphics u8* gfx; ///< A pointer to the font graphics
u16 asciiOffset; ///< Offset to the first valid character in the font table u16 asciiOffset; ///< Offset to the first valid character in the font table
u16 numChars; ///< Number of characters in the font graphics u16 numChars; ///< Number of characters in the font graphics
}ConsoleFont; }ConsoleFont;
/** /**
* @brief Console structure used to store the state of a console render context. * @brief Console structure used to store the state of a console render context.
* *
* Default values from consoleGetDefault(); * Default values from consoleGetDefault();
* @code * @code
* PrintConsole defaultConsole = * PrintConsole defaultConsole =
* { * {
* //Font: * //Font:
* { * {
* (u8*)default_font_bin, //font gfx * (u8*)default_font_bin, //font gfx
* 0, //first ascii character in the set * 0, //first ascii character in the set
* 128, //number of characters in the font set * 128, //number of characters in the font set
* }, * },
* 0,0, //cursorX cursorY * 0,0, //cursorX cursorY
* 0,0, //prevcursorX prevcursorY * 0,0, //prevcursorX prevcursorY
* 40, //console width * 40, //console width
* 30, //console height * 30, //console height
* 0, //window x * 0, //window x
* 0, //window y * 0, //window y
* 32, //window width * 32, //window width
* 24, //window height * 24, //window height
* 3, //tab size * 3, //tab size
* 0, //font character offset * 0, //font character offset
* 0, //print callback * 0, //print callback
* false //console initialized * false //console initialized
* }; * };
* @endcode * @endcode
*/ */
typedef struct PrintConsole typedef struct PrintConsole
{ {
ConsoleFont font; ///< Font of the console ConsoleFont font; ///< Font of the console
u16 *frameBuffer; ///< Framebuffer address u16 *frameBuffer; ///< Framebuffer address
int cursorX; ///< Current X location of the cursor (as a tile offset by default) int cursorX; ///< Current X location of the cursor (as a tile offset by default)
int cursorY; ///< Current Y location of the cursor (as a tile offset by default) int cursorY; ///< Current Y location of the cursor (as a tile offset by default)
int prevCursorX; ///< Internal state int prevCursorX; ///< Internal state
int prevCursorY; ///< Internal state int prevCursorY; ///< Internal state
int consoleWidth; ///< Width of the console hardware layer in characters int consoleWidth; ///< Width of the console hardware layer in characters
int consoleHeight; ///< Height of the console hardware layer in characters int consoleHeight; ///< Height of the console hardware layer in characters
int windowX; ///< Window X location in characters (not implemented) int windowX; ///< Window X location in characters (not implemented)
int windowY; ///< Window Y location in characters (not implemented) int windowY; ///< Window Y location in characters (not implemented)
int windowWidth; ///< Window width in characters (not implemented) int windowWidth; ///< Window width in characters (not implemented)
int windowHeight; ///< Window height in characters (not implemented) int windowHeight; ///< Window height in characters (not implemented)
int tabSize; ///< Size of a tab int tabSize; ///< Size of a tab
int fg; ///< Foreground color int fg; ///< Foreground color
int bg; ///< Background color int bg; ///< Background color
int flags; ///< Reverse/bright flags int flags; ///< Reverse/bright flags
ConsolePrint PrintChar; ///< Callback for printing a character. Should return true if it has handled rendering the graphics (else the print engine will attempt to render via tiles). ConsolePrint PrintChar; ///< Callback for printing a character. Should return true if it has handled rendering the graphics (else the print engine will attempt to render via tiles).
bool consoleInitialised; ///< True if the console is initialized bool consoleInitialised; ///< True if the console is initialized
}PrintConsole; }PrintConsole;
#define CONSOLE_COLOR_BOLD (1<<0) ///< Bold text #define CONSOLE_COLOR_BOLD (1<<0) ///< Bold text
#define CONSOLE_COLOR_FAINT (1<<1) ///< Faint text #define CONSOLE_COLOR_FAINT (1<<1) ///< Faint text
#define CONSOLE_ITALIC (1<<2) ///< Italic text #define CONSOLE_ITALIC (1<<2) ///< Italic text
#define CONSOLE_UNDERLINE (1<<3) ///< Underlined text #define CONSOLE_UNDERLINE (1<<3) ///< Underlined text
#define CONSOLE_BLINK_SLOW (1<<4) ///< Slow blinking text #define CONSOLE_BLINK_SLOW (1<<4) ///< Slow blinking text
#define CONSOLE_BLINK_FAST (1<<5) ///< Fast blinking text #define CONSOLE_BLINK_FAST (1<<5) ///< Fast blinking text
#define CONSOLE_COLOR_REVERSE (1<<6) ///< Reversed color text #define CONSOLE_COLOR_REVERSE (1<<6) ///< Reversed color text
#define CONSOLE_CONCEAL (1<<7) ///< Concealed text #define CONSOLE_CONCEAL (1<<7) ///< Concealed text
#define CONSOLE_CROSSED_OUT (1<<8) ///< Crossed out text #define CONSOLE_CROSSED_OUT (1<<8) ///< Crossed out text
/// Console debug devices supported by libnds. /// Console debug devices supported by libnds.
typedef enum { typedef enum {
debugDevice_NULL, ///< Swallows prints to stderr debugDevice_NULL, ///< Swallows prints to stderr
debugDevice_3DMOO, ///< Directs stderr debug statements to 3dmoo debugDevice_3DMOO, ///< Directs stderr debug statements to 3dmoo
debugDevice_CONSOLE, ///< Directs stderr debug statements to 3DS console window debugDevice_CONSOLE, ///< Directs stderr debug statements to 3DS console window
} debugDevice; } debugDevice;
/** /**
* @brief Loads the font into the console. * @brief Loads the font into the console.
* @param console Pointer to the console to update, if NULL it will update the current console. * @param console Pointer to the console to update, if NULL it will update the current console.
* @param font The font to load. * @param font The font to load.
*/ */
void consoleSetFont(PrintConsole* console, ConsoleFont* font); void consoleSetFont(PrintConsole* console, ConsoleFont* font);
/** /**
* @brief Sets the print window. * @brief Sets the print window.
* @param console Console to set, if NULL it will set the current console window. * @param console Console to set, if NULL it will set the current console window.
* @param x X location of the window. * @param x X location of the window.
* @param y Y location of the window. * @param y Y location of the window.
* @param width Width of the window. * @param width Width of the window.
* @param height Height of the window. * @param height Height of the window.
*/ */
void consoleSetWindow(PrintConsole* console, int x, int y, int width, int height); void consoleSetWindow(PrintConsole* console, int x, int y, int width, int height);
/** /**
* @brief Gets a pointer to the console with the default values. * @brief Gets a pointer to the console with the default values.
* This should only be used when using a single console or without changing the console that is returned, otherwise use consoleInit(). * This should only be used when using a single console or without changing the console that is returned, otherwise use consoleInit().
* @return A pointer to the console with the default values. * @return A pointer to the console with the default values.
*/ */
PrintConsole* consoleGetDefault(void); PrintConsole* consoleGetDefault(void);
/** /**
* @brief Make the specified console the render target. * @brief Make the specified console the render target.
* @param console A pointer to the console struct (must have been initialized with consoleInit(PrintConsole* console)). * @param console A pointer to the console struct (must have been initialized with consoleInit(PrintConsole* console)).
* @return A pointer to the previous console. * @return A pointer to the previous console.
*/ */
PrintConsole *consoleSelect(PrintConsole* console); PrintConsole *consoleSelect(PrintConsole* console);
/** /**
* @brief Initialise the console. * @brief Initialise the console.
* @param screen The screen to use for the console. * @param screen The screen to use for the console.
* @param console A pointer to the console data to initialize (if it's NULL, the default console will be used). * @param console A pointer to the console data to initialize (if it's NULL, the default console will be used).
* @return A pointer to the current console. * @return A pointer to the current console.
*/ */
PrintConsole* consoleInit(gfxScreen_t screen, PrintConsole* console); PrintConsole* consoleInit(gfxScreen_t screen, PrintConsole* console);
/** /**
* @brief Initializes debug console output on stderr to the specified device. * @brief Initializes debug console output on stderr to the specified device.
* @param device The debug device (or devices) to output debug print statements to. * @param device The debug device (or devices) to output debug print statements to.
*/ */
void consoleDebugInit(debugDevice device); void consoleDebugInit(debugDevice device);
/// Clears the screan by using iprintf("\x1b[2J"); /// Clears the screan by using iprintf("\x1b[2J");
void consoleClear(void); void consoleClear(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -202,7 +202,7 @@ typedef enum
GPU_WRITE_BLUE = 0x04, ///< Write blue. GPU_WRITE_BLUE = 0x04, ///< Write blue.
GPU_WRITE_ALPHA = 0x08, ///< Write alpha. GPU_WRITE_ALPHA = 0x08, ///< Write alpha.
GPU_WRITE_DEPTH = 0x10, ///< Write depth. GPU_WRITE_DEPTH = 0x10, ///< Write depth.
GPU_WRITE_COLOR = 0x0F, ///< Write all color components. GPU_WRITE_COLOR = 0x0F, ///< Write all color components.
GPU_WRITE_ALL = 0x1F, ///< Write all components. GPU_WRITE_ALL = 0x1F, ///< Write all components.
} GPU_WRITEMASK; } GPU_WRITEMASK;

File diff suppressed because it is too large Load Diff

View File

@ -1,120 +1,120 @@
/** /**
* @file shaderProgram.h * @file shaderProgram.h
* @brief Functions for working with shaders. * @brief Functions for working with shaders.
*/ */
#pragma once #pragma once
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/gpu/shbin.h> #include <3ds/gpu/shbin.h>
/// 24-bit float uniforms. /// 24-bit float uniforms.
typedef struct typedef struct
{ {
u32 id; ///< Uniform ID. u32 id; ///< Uniform ID.
u32 data[3]; ///< Uniform data. u32 data[3]; ///< Uniform data.
}float24Uniform_s; }float24Uniform_s;
/// Describes an instance of either a vertex or geometry shader. /// Describes an instance of either a vertex or geometry shader.
typedef struct typedef struct
{ {
DVLE_s* dvle; ///< Shader DVLE. DVLE_s* dvle; ///< Shader DVLE.
u16 boolUniforms; ///< Boolean uniforms. u16 boolUniforms; ///< Boolean uniforms.
u16 boolUniformMask; ///< Used boolean uniform mask. u16 boolUniformMask; ///< Used boolean uniform mask.
u32 intUniforms[4]; ///< Integer uniforms. u32 intUniforms[4]; ///< Integer uniforms.
float24Uniform_s* float24Uniforms; ///< 24-bit float uniforms. float24Uniform_s* float24Uniforms; ///< 24-bit float uniforms.
u8 intUniformMask; ///< Used integer uniform mask. u8 intUniformMask; ///< Used integer uniform mask.
u8 numFloat24Uniforms; ///< Float uniform count. u8 numFloat24Uniforms; ///< Float uniform count.
}shaderInstance_s; }shaderInstance_s;
/// Describes an instance of a full shader program. /// Describes an instance of a full shader program.
typedef struct typedef struct
{ {
shaderInstance_s* vertexShader; ///< Vertex shader. shaderInstance_s* vertexShader; ///< Vertex shader.
shaderInstance_s* geometryShader; ///< Geometry shader. shaderInstance_s* geometryShader; ///< Geometry shader.
u32 geoShaderInputPermutation[2]; ///< Geometry shader input permutation. u32 geoShaderInputPermutation[2]; ///< Geometry shader input permutation.
u8 geoShaderInputStride; ///< Geometry shader input stride. u8 geoShaderInputStride; ///< Geometry shader input stride.
}shaderProgram_s; }shaderProgram_s;
/** /**
* @brief Initializes a shader instance. * @brief Initializes a shader instance.
* @param si Shader instance to initialize. * @param si Shader instance to initialize.
* @param dvle DVLE to initialize the shader instance with. * @param dvle DVLE to initialize the shader instance with.
*/ */
Result shaderInstanceInit(shaderInstance_s* si, DVLE_s* dvle); Result shaderInstanceInit(shaderInstance_s* si, DVLE_s* dvle);
/** /**
* @brief Frees a shader instance. * @brief Frees a shader instance.
* @param si Shader instance to free. * @param si Shader instance to free.
*/ */
Result shaderInstanceFree(shaderInstance_s* si); Result shaderInstanceFree(shaderInstance_s* si);
/** /**
* @brief Sets a bool uniform of a shader. * @brief Sets a bool uniform of a shader.
* @param si Shader instance to use. * @param si Shader instance to use.
* @param id ID of the bool uniform. * @param id ID of the bool uniform.
* @param value Value to set. * @param value Value to set.
*/ */
Result shaderInstanceSetBool(shaderInstance_s* si, int id, bool value); Result shaderInstanceSetBool(shaderInstance_s* si, int id, bool value);
/** /**
* @brief Gets a bool uniform of a shader. * @brief Gets a bool uniform of a shader.
* @param si Shader instance to use. * @param si Shader instance to use.
* @param id ID of the bool uniform. * @param id ID of the bool uniform.
* @param value Pointer to output the value to. * @param value Pointer to output the value to.
*/ */
Result shaderInstanceGetBool(shaderInstance_s* si, int id, bool* value); Result shaderInstanceGetBool(shaderInstance_s* si, int id, bool* value);
/** /**
* @brief Gets the location of a shader's uniform. * @brief Gets the location of a shader's uniform.
* @param si Shader instance to use. * @param si Shader instance to use.
* @param name Name of the uniform. * @param name Name of the uniform.
*/ */
s8 shaderInstanceGetUniformLocation(shaderInstance_s* si, const char* name); s8 shaderInstanceGetUniformLocation(shaderInstance_s* si, const char* name);
/** /**
* @brief Initializes a shader program. * @brief Initializes a shader program.
* @param sp Shader program to initialize. * @param sp Shader program to initialize.
*/ */
Result shaderProgramInit(shaderProgram_s* sp); Result shaderProgramInit(shaderProgram_s* sp);
/** /**
* @brief Frees a shader program. * @brief Frees a shader program.
* @param sp Shader program to free. * @param sp Shader program to free.
*/ */
Result shaderProgramFree(shaderProgram_s* sp); Result shaderProgramFree(shaderProgram_s* sp);
/** /**
* @brief Sets the vertex shader of a shader program. * @brief Sets the vertex shader of a shader program.
* @param sp Shader program to use. * @param sp Shader program to use.
* @param dvle Vertex shader to set. * @param dvle Vertex shader to set.
*/ */
Result shaderProgramSetVsh(shaderProgram_s* sp, DVLE_s* dvle); Result shaderProgramSetVsh(shaderProgram_s* sp, DVLE_s* dvle);
/** /**
* @brief Sets the geometry shader of a shader program. * @brief Sets the geometry shader of a shader program.
* @param sp Shader program to use. * @param sp Shader program to use.
* @param dvle Geometry shader to set. * @param dvle Geometry shader to set.
* @param stride Input stride of the shader (pass 0 to match the number of outputs of the vertex shader). * @param stride Input stride of the shader (pass 0 to match the number of outputs of the vertex shader).
*/ */
Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle, u8 stride); Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle, u8 stride);
/** /**
* @brief Configures the permutation of the input attributes of the geometry shader of a shader program. * @brief Configures the permutation of the input attributes of the geometry shader of a shader program.
* @param sp Shader program to use. * @param sp Shader program to use.
* @param permutation Attribute permutation to use. * @param permutation Attribute permutation to use.
*/ */
Result shaderProgramSetGshInputPermutation(shaderProgram_s* sp, u64 permutation); Result shaderProgramSetGshInputPermutation(shaderProgram_s* sp, u64 permutation);
/** /**
* @brief Configures the shader units to use the specified shader program. * @brief Configures the shader units to use the specified shader program.
* @param sp Shader program to use. * @param sp Shader program to use.
* @param sendVshCode When true, the vertex shader's code and operand descriptors are uploaded. * @param sendVshCode When true, the vertex shader's code and operand descriptors are uploaded.
* @param sendGshCode When true, the geometry shader's code and operand descriptors are uploaded. * @param sendGshCode When true, the geometry shader's code and operand descriptors are uploaded.
*/ */
Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGshCode); Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGshCode);
/** /**
* @brief Same as shaderProgramConfigure, but always loading code/operand descriptors and uploading DVLE constants afterwards. * @brief Same as shaderProgramConfigure, but always loading code/operand descriptors and uploading DVLE constants afterwards.
* @param sp Shader program to use. * @param sp Shader program to use.
*/ */
Result shaderProgramUse(shaderProgram_s* sp); Result shaderProgramUse(shaderProgram_s* sp);

View File

@ -1,38 +1,38 @@
/** /**
* @file hb.h * @file hb.h
* @brief HB (Homebrew) service. * @brief HB (Homebrew) service.
*/ */
#pragma once #pragma once
// WARNING ! THIS FILE PROVIDES AN INTERFACE TO A NON-OFFICIAL SERVICE PROVIDED BY NINJHAX // WARNING ! THIS FILE PROVIDES AN INTERFACE TO A NON-OFFICIAL SERVICE PROVIDED BY NINJHAX
// BY USING COMMANDS FROM THIS SERVICE YOU WILL LIKELY MAKE YOUR APPLICATION INCOMPATIBLE WITH OTHER HOMEBREW LAUNCHING METHODS // BY USING COMMANDS FROM THIS SERVICE YOU WILL LIKELY MAKE YOUR APPLICATION INCOMPATIBLE WITH OTHER HOMEBREW LAUNCHING METHODS
// A GOOD WAY TO COPE WITH THIS IS TO CHECK THE OUTPUT OF hbInit FOR ERRORS // A GOOD WAY TO COPE WITH THIS IS TO CHECK THE OUTPUT OF hbInit FOR ERRORS
#include <3ds/types.h> #include <3ds/types.h>
/// Initializes HB. /// Initializes HB.
Result hbInit(void); Result hbInit(void);
/// Exits HB. /// Exits HB.
void hbExit(void); void hbExit(void);
/// Flushes/invalidates the entire data/instruction cache. /// Flushes/invalidates the entire data/instruction cache.
Result HB_FlushInvalidateCache(void); Result HB_FlushInvalidateCache(void);
/** /**
* @brief Fetches the address for Ninjhax 1.x bootloader addresses. * @brief Fetches the address for Ninjhax 1.x bootloader addresses.
* @param load3dsx void (*callBootloader)(Handle hb, Handle file); * @param load3dsx void (*callBootloader)(Handle hb, Handle file);
* @param setArgv void (*setArgs)(u32* src, u32 length); * @param setArgv void (*setArgs)(u32* src, u32 length);
*/ */
Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv); Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv);
/** /**
* @brief Changes the permissions of a given number of pages at address addr to mode. * @brief Changes the permissions of a given number of pages at address addr to mode.
* Should it fail, the appropriate kernel error code will be returned and *reprotectedPages (if not NULL) * Should it fail, the appropriate kernel error code will be returned and *reprotectedPages (if not NULL)
* will be set to the number of sequential pages which were successfully reprotected + 1 * will be set to the number of sequential pages which were successfully reprotected + 1
* @param addr Address to reprotect. * @param addr Address to reprotect.
* @param pages Number of pages to reprotect. * @param pages Number of pages to reprotect.
* @param mode Mode to reprotect to. * @param mode Mode to reprotect to.
* @param reprotectedPages Number of successfully reprotected pages, on failure. * @param reprotectedPages Number of successfully reprotected pages, on failure.
*/ */
Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages); Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages);

View File

@ -29,7 +29,7 @@ typedef enum
OUTPUT_RGB_32 = 0x0, ///< 32-bit RGBA8888. The alpha component is the 8-bit value set by @ref Y2RU_SetAlpha OUTPUT_RGB_32 = 0x0, ///< 32-bit RGBA8888. The alpha component is the 8-bit value set by @ref Y2RU_SetAlpha
OUTPUT_RGB_24 = 0x1, ///< 24-bit RGB888. OUTPUT_RGB_24 = 0x1, ///< 24-bit RGB888.
OUTPUT_RGB_16_555 = 0x2, ///< 16-bit RGBA5551. The alpha bit is the 7th bit of the alpha value set by @ref Y2RU_SetAlpha OUTPUT_RGB_16_555 = 0x2, ///< 16-bit RGBA5551. The alpha bit is the 7th bit of the alpha value set by @ref Y2RU_SetAlpha
OUTPUT_RGB_16_565 = 0x3, ///< 16-bit RGB565. OUTPUT_RGB_16_565 = 0x3, ///< 16-bit RGB565.
} Y2RU_OutputFormat; } Y2RU_OutputFormat;
/// Rotation to be applied to the output. /// Rotation to be applied to the output.

File diff suppressed because it is too large Load Diff

View File

@ -1,382 +1,382 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/result.h> #include <3ds/result.h>
#include <3ds/gpu/registers.h> #include <3ds/gpu/registers.h>
#include <3ds/gpu/shaderProgram.h> #include <3ds/gpu/shaderProgram.h>
static void GPU_SetShaderOutmap(const u32 outmapData[8]); static void GPU_SetShaderOutmap(const u32 outmapData[8]);
static void GPU_SendShaderCode(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length); static void GPU_SendShaderCode(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length);
static void GPU_SendOperandDescriptors(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length); static void GPU_SendOperandDescriptors(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length);
Result shaderInstanceInit(shaderInstance_s* si, DVLE_s* dvle) Result shaderInstanceInit(shaderInstance_s* si, DVLE_s* dvle)
{ {
if(!si || !dvle)return -1; if(!si || !dvle)return -1;
si->dvle = dvle; si->dvle = dvle;
si->boolUniforms = 0; si->boolUniforms = 0;
si->boolUniformMask = 0; si->boolUniformMask = 0;
si->intUniforms[0] = 0x00000000; si->intUniforms[0] = 0x00000000;
si->intUniforms[1] = 0x00000000; si->intUniforms[1] = 0x00000000;
si->intUniforms[2] = 0x00000000; si->intUniforms[2] = 0x00000000;
si->intUniforms[3] = 0x00000000; si->intUniforms[3] = 0x00000000;
si->float24Uniforms = NULL; si->float24Uniforms = NULL;
si->intUniformMask = 0; si->intUniformMask = 0;
int i; int i;
DVLE_constEntry_s* cnst = dvle->constTableData; DVLE_constEntry_s* cnst = dvle->constTableData;
if(cnst) if(cnst)
{ {
int float24cnt=0; int float24cnt=0;
for(i=0; i<dvle->constTableSize; i++) for(i=0; i<dvle->constTableSize; i++)
{ {
switch(cnst[i].type) switch(cnst[i].type)
{ {
case DVLE_CONST_BOOL: case DVLE_CONST_BOOL:
shaderInstanceSetBool(si, cnst[i].id, cnst[i].data[0]&1); shaderInstanceSetBool(si, cnst[i].id, cnst[i].data[0]&1);
break; break;
case DVLE_CONST_u8: case DVLE_CONST_u8:
if(cnst[i].id<4) if(cnst[i].id<4)
{ {
si->intUniforms[cnst[i].id] = cnst[i].data[0]; si->intUniforms[cnst[i].id] = cnst[i].data[0];
si->intUniformMask |= (1<<cnst[i].id); si->intUniformMask |= (1<<cnst[i].id);
} }
break; break;
case DVLE_CONST_FLOAT24: case DVLE_CONST_FLOAT24:
float24cnt++; float24cnt++;
break; break;
} }
} }
if(float24cnt) if(float24cnt)
{ {
si->float24Uniforms = malloc(sizeof(float24Uniform_s)*float24cnt); si->float24Uniforms = malloc(sizeof(float24Uniform_s)*float24cnt);
if(si->float24Uniforms) if(si->float24Uniforms)
{ {
float24cnt = 0; float24cnt = 0;
u32 rev[3]; u32 rev[3];
u8* rev8=(u8*)rev; u8* rev8=(u8*)rev;
for(i=0; i<dvle->constTableSize; i++) for(i=0; i<dvle->constTableSize; i++)
{ {
if(cnst[i].type==DVLE_CONST_FLOAT24) if(cnst[i].type==DVLE_CONST_FLOAT24)
{ {
memcpy(&rev8[0], &cnst[i].data[0], 3); memcpy(&rev8[0], &cnst[i].data[0], 3);
memcpy(&rev8[3], &cnst[i].data[1], 3); memcpy(&rev8[3], &cnst[i].data[1], 3);
memcpy(&rev8[6], &cnst[i].data[2], 3); memcpy(&rev8[6], &cnst[i].data[2], 3);
memcpy(&rev8[9], &cnst[i].data[3], 3); memcpy(&rev8[9], &cnst[i].data[3], 3);
si->float24Uniforms[float24cnt].id = cnst[i].id&0xFF; si->float24Uniforms[float24cnt].id = cnst[i].id&0xFF;
si->float24Uniforms[float24cnt].data[0] = rev[2]; si->float24Uniforms[float24cnt].data[0] = rev[2];
si->float24Uniforms[float24cnt].data[1] = rev[1]; si->float24Uniforms[float24cnt].data[1] = rev[1];
si->float24Uniforms[float24cnt].data[2] = rev[0]; si->float24Uniforms[float24cnt].data[2] = rev[0];
float24cnt++; float24cnt++;
} }
} }
} }
si->numFloat24Uniforms = float24cnt; si->numFloat24Uniforms = float24cnt;
} }
} }
return 0; return 0;
} }
Result shaderInstanceFree(shaderInstance_s* si) Result shaderInstanceFree(shaderInstance_s* si)
{ {
if(!si)return -1; if(!si)return -1;
if(si->float24Uniforms)free(si->float24Uniforms); if(si->float24Uniforms)free(si->float24Uniforms);
free(si); free(si);
return 0; return 0;
} }
Result shaderInstanceSetBool(shaderInstance_s* si, int id, bool value) Result shaderInstanceSetBool(shaderInstance_s* si, int id, bool value)
{ {
if(!si)return -1; if(!si)return -1;
if(id<0 || id>15)return -2; if(id<0 || id>15)return -2;
si->boolUniforms &= ~(1<<id); si->boolUniforms &= ~(1<<id);
si->boolUniforms |= (value)<<id; si->boolUniforms |= (value)<<id;
si->boolUniformMask |= (1<<id); si->boolUniformMask |= (1<<id);
return 0; return 0;
} }
Result shaderInstanceGetBool(shaderInstance_s* si, int id, bool* value) Result shaderInstanceGetBool(shaderInstance_s* si, int id, bool* value)
{ {
if(!si)return -1; if(!si)return -1;
if(id<0 || id>15)return -2; if(id<0 || id>15)return -2;
if(!value)return -3; if(!value)return -3;
*value = ((si->boolUniforms>>id)&1); *value = ((si->boolUniforms>>id)&1);
return 0; return 0;
} }
s8 shaderInstanceGetUniformLocation(shaderInstance_s* si, const char* name) s8 shaderInstanceGetUniformLocation(shaderInstance_s* si, const char* name)
{ {
if(!si)return -1; if(!si)return -1;
return DVLE_GetUniformRegister(si->dvle, name); return DVLE_GetUniformRegister(si->dvle, name);
} }
Result shaderProgramInit(shaderProgram_s* sp) Result shaderProgramInit(shaderProgram_s* sp)
{ {
if(!sp)return -1; if(!sp)return -1;
sp->vertexShader = NULL; sp->vertexShader = NULL;
sp->geometryShader = NULL; sp->geometryShader = NULL;
return 0; return 0;
} }
Result shaderProgramFree(shaderProgram_s* sp) Result shaderProgramFree(shaderProgram_s* sp)
{ {
if(!sp)return -1; if(!sp)return -1;
shaderInstanceFree(sp->vertexShader); shaderInstanceFree(sp->vertexShader);
shaderInstanceFree(sp->geometryShader); shaderInstanceFree(sp->geometryShader);
return 0; return 0;
} }
Result shaderProgramSetVsh(shaderProgram_s* sp, DVLE_s* dvle) Result shaderProgramSetVsh(shaderProgram_s* sp, DVLE_s* dvle)
{ {
if(!sp || !dvle)return -1; if(!sp || !dvle)return -1;
if(dvle->type != VERTEX_SHDR)return -2; if(dvle->type != VERTEX_SHDR)return -2;
if(sp->vertexShader)shaderInstanceFree(sp->vertexShader); if(sp->vertexShader)shaderInstanceFree(sp->vertexShader);
sp->vertexShader = (shaderInstance_s*)malloc(sizeof(shaderInstance_s)); sp->vertexShader = (shaderInstance_s*)malloc(sizeof(shaderInstance_s));
if(!sp->vertexShader)return -3; if(!sp->vertexShader)return -3;
return shaderInstanceInit(sp->vertexShader, dvle); return shaderInstanceInit(sp->vertexShader, dvle);
} }
Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle, u8 stride) Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle, u8 stride)
{ {
if(!sp || !dvle)return -1; if(!sp || !dvle)return -1;
if(dvle->type != GEOMETRY_SHDR)return -2; if(dvle->type != GEOMETRY_SHDR)return -2;
if(sp->geometryShader)shaderInstanceFree(sp->geometryShader); if(sp->geometryShader)shaderInstanceFree(sp->geometryShader);
sp->geometryShader = (shaderInstance_s*)malloc(sizeof(shaderInstance_s)); sp->geometryShader = (shaderInstance_s*)malloc(sizeof(shaderInstance_s));
if(!sp->geometryShader)return -3; if(!sp->geometryShader)return -3;
sp->geoShaderInputPermutation[0] = 0x76543210; sp->geoShaderInputPermutation[0] = 0x76543210;
sp->geoShaderInputPermutation[1] = 0xFEDCBA98; sp->geoShaderInputPermutation[1] = 0xFEDCBA98;
sp->geoShaderInputStride = stride; sp->geoShaderInputStride = stride;
return shaderInstanceInit(sp->geometryShader, dvle); return shaderInstanceInit(sp->geometryShader, dvle);
} }
Result shaderProgramSetGshInputPermutation(shaderProgram_s* sp, u64 permutation) Result shaderProgramSetGshInputPermutation(shaderProgram_s* sp, u64 permutation)
{ {
if(!sp || !sp->geometryShader)return -1; if(!sp || !sp->geometryShader)return -1;
sp->geoShaderInputPermutation[0] = permutation & 0xFFFFFFFF; sp->geoShaderInputPermutation[0] = permutation & 0xFFFFFFFF;
sp->geoShaderInputPermutation[0] = permutation>>32; sp->geoShaderInputPermutation[0] = permutation>>32;
return 0; return 0;
} }
static inline void shaderProgramUploadDvle(const DVLE_s* dvle) static inline void shaderProgramUploadDvle(const DVLE_s* dvle)
{ {
const DVLP_s* dvlp = dvle->dvlp; const DVLP_s* dvlp = dvle->dvlp;
// Limit vertex shader code size to the first 512 instructions // Limit vertex shader code size to the first 512 instructions
int codeSize = dvle->type == GEOMETRY_SHDR ? dvlp->codeSize : (dvlp->codeSize < 512 ? dvlp->codeSize : 512); int codeSize = dvle->type == GEOMETRY_SHDR ? dvlp->codeSize : (dvlp->codeSize < 512 ? dvlp->codeSize : 512);
GPU_SendShaderCode(dvle->type, dvlp->codeData, 0, codeSize); GPU_SendShaderCode(dvle->type, dvlp->codeData, 0, codeSize);
GPU_SendOperandDescriptors(dvle->type, dvlp->opcdescData, 0, dvlp->opdescSize); GPU_SendOperandDescriptors(dvle->type, dvlp->opcdescData, 0, dvlp->opdescSize);
} }
static inline void shaderProgramMergeOutmaps(u32* outmapData, const u32* vshOutmap, const u32* gshOutmap) static inline void shaderProgramMergeOutmaps(u32* outmapData, const u32* vshOutmap, const u32* gshOutmap)
{ {
int i, j; int i, j;
// Find and copy attributes common to both vertex and geometry shader // Find and copy attributes common to both vertex and geometry shader
u32 vsh_common = 0, gsh_common = 0; u32 vsh_common = 0, gsh_common = 0;
for (i = 1; i < 8; i ++) for (i = 1; i < 8; i ++)
{ {
u32 mask = gshOutmap[i]; u32 mask = gshOutmap[i];
if (mask == 0x1F1F1F1F) if (mask == 0x1F1F1F1F)
break; break;
for (j = 1; j < 8; j ++) for (j = 1; j < 8; j ++)
{ {
if (vshOutmap[j] == mask) if (vshOutmap[j] == mask)
{ {
outmapData[++outmapData[0]] = mask; outmapData[++outmapData[0]] = mask;
vsh_common |= BIT(j); vsh_common |= BIT(j);
gsh_common |= BIT(i); gsh_common |= BIT(i);
break; break;
} }
} }
} }
// Find and copy attributes that are exclusive to the geometry shader // Find and copy attributes that are exclusive to the geometry shader
for (i = 1; i < 8; i ++) for (i = 1; i < 8; i ++)
{ {
u32 mask = gshOutmap[i]; u32 mask = gshOutmap[i];
if (mask == 0x1F1F1F1F) if (mask == 0x1F1F1F1F)
break; break;
if (!(gsh_common & BIT(i))) if (!(gsh_common & BIT(i)))
outmapData[++outmapData[0]] = mask; outmapData[++outmapData[0]] = mask;
} }
// Find and copy attributes that are exclusive to the vertex shader // Find and copy attributes that are exclusive to the vertex shader
for (i = 1; i < 8; i ++) for (i = 1; i < 8; i ++)
{ {
u32 mask = vshOutmap[i]; u32 mask = vshOutmap[i];
if (mask == 0x1F1F1F1F) if (mask == 0x1F1F1F1F)
break; break;
if (!(vsh_common & BIT(i))) if (!(vsh_common & BIT(i)))
outmapData[++outmapData[0]] = mask; outmapData[++outmapData[0]] = mask;
} }
} }
Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGshCode) Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGshCode)
{ {
if (!sp || !sp->vertexShader) return -1; if (!sp || !sp->vertexShader) return -1;
// Get pointers to relevant structures // Get pointers to relevant structures
const DVLE_s* vshDvle = sp->vertexShader->dvle; const DVLE_s* vshDvle = sp->vertexShader->dvle;
const DVLE_s* gshDvle = sp->geometryShader ? sp->geometryShader->dvle : NULL; const DVLE_s* gshDvle = sp->geometryShader ? sp->geometryShader->dvle : NULL;
const DVLE_s* mainDvle = gshDvle ? gshDvle : vshDvle; const DVLE_s* mainDvle = gshDvle ? gshDvle : vshDvle;
// Variables for working with the outmap // Variables for working with the outmap
u32 outmapData[8]; u32 outmapData[8];
u32 outmapMode = mainDvle->outmapMode; u32 outmapMode = mainDvle->outmapMode;
u32 outmapClock = mainDvle->outmapClock; u32 outmapClock = mainDvle->outmapClock;
// Initialize geometry engine - do this early in order to ensure all 4 units are correctly initialized // Initialize geometry engine - do this early in order to ensure all 4 units are correctly initialized
GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0x3, gshDvle ? 2 : 0); GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0x3, gshDvle ? 2 : 0);
GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG2, 0x3, 0); GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG2, 0x3, 0);
GPUCMD_AddMaskedWrite(GPUREG_VSH_COM_MODE, 0x1, gshDvle ? 1 : 0); GPUCMD_AddMaskedWrite(GPUREG_VSH_COM_MODE, 0x1, gshDvle ? 1 : 0);
// Set up vertex shader code blob (if necessary) // Set up vertex shader code blob (if necessary)
if (sendVshCode) if (sendVshCode)
shaderProgramUploadDvle(vshDvle); shaderProgramUploadDvle(vshDvle);
// Set up vertex shader entrypoint & outmap mask // Set up vertex shader entrypoint & outmap mask
GPUCMD_AddWrite(GPUREG_VSH_ENTRYPOINT, 0x7FFF0000|(vshDvle->mainOffset&0xFFFF)); GPUCMD_AddWrite(GPUREG_VSH_ENTRYPOINT, 0x7FFF0000|(vshDvle->mainOffset&0xFFFF));
GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_MASK, vshDvle->outmapMask); GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_MASK, vshDvle->outmapMask);
GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_TOTAL1, vshDvle->outmapData[0]-1); GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_TOTAL1, vshDvle->outmapData[0]-1);
GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_TOTAL2, vshDvle->outmapData[0]-1); GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_TOTAL2, vshDvle->outmapData[0]-1);
// Set up geometry shader (if present) // Set up geometry shader (if present)
if (gshDvle) if (gshDvle)
{ {
// Set up geometry shader code blob (if necessary) // Set up geometry shader code blob (if necessary)
if (sendGshCode) if (sendGshCode)
shaderProgramUploadDvle(gshDvle); shaderProgramUploadDvle(gshDvle);
// Set up geometry shader entrypoint & outmap mask // Set up geometry shader entrypoint & outmap mask
GPUCMD_AddWrite(GPUREG_GSH_ENTRYPOINT, 0x7FFF0000|(gshDvle->mainOffset&0xFFFF)); GPUCMD_AddWrite(GPUREG_GSH_ENTRYPOINT, 0x7FFF0000|(gshDvle->mainOffset&0xFFFF));
GPUCMD_AddWrite(GPUREG_GSH_OUTMAP_MASK, gshDvle->outmapMask); GPUCMD_AddWrite(GPUREG_GSH_OUTMAP_MASK, gshDvle->outmapMask);
} }
// Merge vertex shader & geometry shader outmaps if requested // Merge vertex shader & geometry shader outmaps if requested
if (gshDvle && gshDvle->mergeOutmaps) if (gshDvle && gshDvle->mergeOutmaps)
{ {
// Clear outmap // Clear outmap
memset(outmapData, 0x1F, sizeof(outmapData)); memset(outmapData, 0x1F, sizeof(outmapData));
outmapData[0] = 0; outmapData[0] = 0;
// Merge outmaps // Merge outmaps
shaderProgramMergeOutmaps(outmapData, vshDvle->outmapData, gshDvle->outmapData); shaderProgramMergeOutmaps(outmapData, vshDvle->outmapData, gshDvle->outmapData);
outmapMode |= vshDvle->outmapMode; outmapMode |= vshDvle->outmapMode;
outmapClock |= vshDvle->outmapClock; outmapClock |= vshDvle->outmapClock;
} else } else
memcpy(outmapData, mainDvle->outmapData, sizeof(outmapData)); memcpy(outmapData, mainDvle->outmapData, sizeof(outmapData));
// Upload and configure outmap // Upload and configure outmap
GPU_SetShaderOutmap(outmapData); GPU_SetShaderOutmap(outmapData);
GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, outmapMode); GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, outmapMode);
GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, outmapClock); GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, outmapClock);
// Configure geostage // Configure geostage
if (gshDvle) if (gshDvle)
{ {
// Input stride: use value if specified, otherwise use number of outputs in vertex shader // Input stride: use value if specified, otherwise use number of outputs in vertex shader
int stride = sp->geoShaderInputStride ? sp->geoShaderInputStride : vshDvle->outmapData[0]; int stride = sp->geoShaderInputStride ? sp->geoShaderInputStride : vshDvle->outmapData[0];
// Enable or disable variable-size primitive processing // Enable or disable variable-size primitive processing
GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0xA, gshDvle->gshMode == GSH_VARIABLE_PRIM ? 0x80000000 : 0); GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0xA, gshDvle->gshMode == GSH_VARIABLE_PRIM ? 0x80000000 : 0);
// Set up geoshader processing mode // Set up geoshader processing mode
u32 misc = gshDvle->gshMode; u32 misc = gshDvle->gshMode;
if (misc == GSH_FIXED_PRIM) if (misc == GSH_FIXED_PRIM)
misc |= 0x01000000 | ((u32)gshDvle->gshFixedVtxStart<<16) | ((stride-1)<<12) | ((u32)(gshDvle->gshFixedVtxNum-1)<<8); misc |= 0x01000000 | ((u32)gshDvle->gshFixedVtxStart<<16) | ((stride-1)<<12) | ((u32)(gshDvle->gshFixedVtxNum-1)<<8);
GPUCMD_AddWrite(GPUREG_GSH_MISC0, misc); GPUCMD_AddWrite(GPUREG_GSH_MISC0, misc);
// Set up variable-size primitive mode parameters // Set up variable-size primitive mode parameters
GPUCMD_AddWrite(GPUREG_GSH_MISC1, gshDvle->gshMode == GSH_VARIABLE_PRIM ? (gshDvle->gshVariableVtxNum-1) : 0); GPUCMD_AddWrite(GPUREG_GSH_MISC1, gshDvle->gshMode == GSH_VARIABLE_PRIM ? (gshDvle->gshVariableVtxNum-1) : 0);
// Set up geoshader input // Set up geoshader input
GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0x08000000 | (gshDvle->gshMode ? 0x0100 : 0) | (stride-1)); GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0x08000000 | (gshDvle->gshMode ? 0x0100 : 0) | (stride-1));
// Set up geoshader permutation // Set up geoshader permutation
GPUCMD_AddIncrementalWrites(GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW, sp->geoShaderInputPermutation, 2); GPUCMD_AddIncrementalWrites(GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW, sp->geoShaderInputPermutation, 2);
} else } else
{ {
// Defaults for when geostage is disabled // Defaults for when geostage is disabled
GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0xA, 0); GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0xA, 0);
GPUCMD_AddWrite(GPUREG_GSH_MISC0, 0); GPUCMD_AddWrite(GPUREG_GSH_MISC0, 0);
GPUCMD_AddWrite(GPUREG_GSH_MISC1, 0); GPUCMD_AddWrite(GPUREG_GSH_MISC1, 0);
GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0xA0000000); GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0xA0000000);
} }
return 0; return 0;
} }
Result shaderProgramUse(shaderProgram_s* sp) Result shaderProgramUse(shaderProgram_s* sp)
{ {
Result rc = shaderProgramConfigure(sp, true, true); Result rc = shaderProgramConfigure(sp, true, true);
if (R_FAILED(rc)) return rc; if (R_FAILED(rc)) return rc;
int i; int i;
// Set up uniforms // Set up uniforms
GPUCMD_AddWrite(GPUREG_VSH_BOOLUNIFORM, 0x7FFF0000|sp->vertexShader->boolUniforms); GPUCMD_AddWrite(GPUREG_VSH_BOOLUNIFORM, 0x7FFF0000|sp->vertexShader->boolUniforms);
GPUCMD_AddIncrementalWrites(GPUREG_VSH_INTUNIFORM_I0, sp->vertexShader->intUniforms, 4); GPUCMD_AddIncrementalWrites(GPUREG_VSH_INTUNIFORM_I0, sp->vertexShader->intUniforms, 4);
for(i=0; i<sp->vertexShader->numFloat24Uniforms; i++) GPUCMD_AddIncrementalWrites(GPUREG_VSH_FLOATUNIFORM_CONFIG, (u32*)&sp->vertexShader->float24Uniforms[i], 4); for(i=0; i<sp->vertexShader->numFloat24Uniforms; i++) GPUCMD_AddIncrementalWrites(GPUREG_VSH_FLOATUNIFORM_CONFIG, (u32*)&sp->vertexShader->float24Uniforms[i], 4);
if (sp->geometryShader) if (sp->geometryShader)
{ {
GPUCMD_AddWrite(GPUREG_GSH_BOOLUNIFORM, 0x7FFF0000|sp->geometryShader->boolUniforms); GPUCMD_AddWrite(GPUREG_GSH_BOOLUNIFORM, 0x7FFF0000|sp->geometryShader->boolUniforms);
GPUCMD_AddIncrementalWrites(GPUREG_GSH_INTUNIFORM_I0, sp->geometryShader->intUniforms, 4); GPUCMD_AddIncrementalWrites(GPUREG_GSH_INTUNIFORM_I0, sp->geometryShader->intUniforms, 4);
for(i=0; i<sp->geometryShader->numFloat24Uniforms; i++) GPUCMD_AddIncrementalWrites(GPUREG_GSH_FLOATUNIFORM_CONFIG, (u32*)&sp->geometryShader->float24Uniforms[i], 4); for(i=0; i<sp->geometryShader->numFloat24Uniforms; i++) GPUCMD_AddIncrementalWrites(GPUREG_GSH_FLOATUNIFORM_CONFIG, (u32*)&sp->geometryShader->float24Uniforms[i], 4);
} }
return 0; return 0;
} }
void GPU_SetShaderOutmap(const u32 outmapData[8]) void GPU_SetShaderOutmap(const u32 outmapData[8])
{ {
GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x1, outmapData[0]-1); GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x1, outmapData[0]-1);
GPUCMD_AddIncrementalWrites(GPUREG_SH_OUTMAP_TOTAL, outmapData, 8); GPUCMD_AddIncrementalWrites(GPUREG_SH_OUTMAP_TOTAL, outmapData, 8);
} }
void GPU_SendShaderCode(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length) void GPU_SendShaderCode(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length)
{ {
if(!data)return; if(!data)return;
int regOffset=(type==GPU_GEOMETRY_SHADER)?(-0x30):(0x0); int regOffset=(type==GPU_GEOMETRY_SHADER)?(-0x30):(0x0);
GPUCMD_AddWrite(GPUREG_VSH_CODETRANSFER_CONFIG+regOffset, offset); GPUCMD_AddWrite(GPUREG_VSH_CODETRANSFER_CONFIG+regOffset, offset);
int i; int i;
for(i=0;i<length;i+=0x80)GPUCMD_AddWrites(GPUREG_VSH_CODETRANSFER_DATA+regOffset, &data[i], ((length-i)<0x80)?(length-i):0x80); for(i=0;i<length;i+=0x80)GPUCMD_AddWrites(GPUREG_VSH_CODETRANSFER_DATA+regOffset, &data[i], ((length-i)<0x80)?(length-i):0x80);
GPUCMD_AddWrite(GPUREG_VSH_CODETRANSFER_END+regOffset, 0x00000001); GPUCMD_AddWrite(GPUREG_VSH_CODETRANSFER_END+regOffset, 0x00000001);
} }
void GPU_SendOperandDescriptors(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length) void GPU_SendOperandDescriptors(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length)
{ {
if(!data)return; if(!data)return;
int regOffset=(type==GPU_GEOMETRY_SHADER)?(-0x30):(0x0); int regOffset=(type==GPU_GEOMETRY_SHADER)?(-0x30):(0x0);
GPUCMD_AddWrite(GPUREG_VSH_OPDESCS_CONFIG+regOffset, offset); GPUCMD_AddWrite(GPUREG_VSH_OPDESCS_CONFIG+regOffset, offset);
GPUCMD_AddWrites(GPUREG_VSH_OPDESCS_DATA+regOffset, data, length); GPUCMD_AddWrites(GPUREG_VSH_OPDESCS_DATA+regOffset, data, length);
} }

View File

@ -114,7 +114,7 @@ void DVLE_GenerateOutmap(DVLE_s* dvle)
int mask = dvle->outTableData[i].mask; int mask = dvle->outTableData[i].mask;
int regID = dvle->outTableData[i].regID; int regID = dvle->outTableData[i].regID;
u32* out = &dvle->outmapData[regID+1]; u32* out = &dvle->outmapData[regID+1];
if (!(dvle->outmapMask & BIT(regID))) if (!(dvle->outmapMask & BIT(regID)))
{ {
dvle->outmapMask |= BIT(regID); dvle->outmapMask |= BIT(regID);

View File

@ -548,7 +548,7 @@ sdmc_write_safe(struct _reent *r,
memcpy(tmp_buffer, ptr, toWrite); memcpy(tmp_buffer, ptr, toWrite);
/* write the data */ /* write the data */
rc = FSFILE_Write(file->fd, &bytes, file->offset, rc = FSFILE_Write(file->fd, &bytes, file->offset,
(u32*)tmp_buffer, (u32)toWrite, sync); (u32*)tmp_buffer, (u32)toWrite, sync);
if(R_FAILED(rc)) if(R_FAILED(rc))
{ {

View File

@ -62,7 +62,7 @@ Result AM_GetTitleCount(FS_MediaType mediatype, u32 *count)
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(count) *count = cmdbuf[2]; if(count) *count = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -78,7 +78,7 @@ Result AM_GetTitleList(u32* titlesRead, FS_MediaType mediatype, u32 titleCount,
cmdbuf[4] = (u32)titleIds; cmdbuf[4] = (u32)titleIds;
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(titlesRead) *titlesRead = cmdbuf[2]; if(titlesRead) *titlesRead = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
@ -112,7 +112,7 @@ Result AM_GetTicketCount(u32 *count)
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(count) *count = cmdbuf[2]; if(count) *count = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -128,7 +128,7 @@ Result AM_GetTicketList(u32 *ticketsRead, u32 ticketCount, u32 skip, u64 *ticket
cmdbuf[4] = (u32)ticketIds; cmdbuf[4] = (u32)ticketIds;
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(ticketsRead) *ticketsRead = cmdbuf[2]; if(ticketsRead) *ticketsRead = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
@ -146,7 +146,7 @@ Result AM_GetPendingTitleCount(u32 *count, FS_MediaType mediatype, u32 statusMas
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(count) *count = cmdbuf[2]; if(count) *count = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -163,7 +163,7 @@ Result AM_GetPendingTitleList(u32 *titlesRead, u32 titleCount, FS_MediaType medi
cmdbuf[5] = (u32)titleIds; cmdbuf[5] = (u32)titleIds;
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(titlesRead) *titlesRead = cmdbuf[2]; if(titlesRead) *titlesRead = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
@ -197,7 +197,7 @@ Result AM_GetDeviceId(u32 *deviceID)
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(deviceID) *deviceID = cmdbuf[3]; if(deviceID) *deviceID = cmdbuf[3];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -297,7 +297,7 @@ Result AM_StartCiaInstall(FS_MediaType mediatype, Handle *ciaHandle)
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(ciaHandle) *ciaHandle = cmdbuf[3]; if(ciaHandle) *ciaHandle = cmdbuf[3];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -311,7 +311,7 @@ Result AM_StartDlpChildCiaInstall(Handle *ciaHandle)
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(ciaHandle) *ciaHandle = cmdbuf[3]; if(ciaHandle) *ciaHandle = cmdbuf[3];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -458,12 +458,12 @@ Result AM_GetTitleProductCode(FS_MediaType mediatype, u64 titleId, char *product
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x5,3,0); // 0x000500C0 cmdbuf[0] = IPC_MakeHeader(0x5,3,0); // 0x000500C0
cmdbuf[1] = mediatype; cmdbuf[1] = mediatype;
cmdbuf[2] = titleId & 0xffffffff; cmdbuf[2] = titleId & 0xffffffff;
cmdbuf[3] = (u32)(titleId >> 32); cmdbuf[3] = (u32)(titleId >> 32);
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
// The product code string can use the full 16 bytes without NULL terminator // The product code string can use the full 16 bytes without NULL terminator
@ -476,12 +476,12 @@ Result AM_GetTitleExtDataId(u64 *extDataId, FS_MediaType mediatype, u64 titleId)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,3,0); // 0x000600C0 cmdbuf[0] = IPC_MakeHeader(0x6,3,0); // 0x000600C0
cmdbuf[1] = mediatype; cmdbuf[1] = mediatype;
cmdbuf[2] = titleId & 0xffffffff; cmdbuf[2] = titleId & 0xffffffff;
cmdbuf[3] = (u32)(titleId >> 32); cmdbuf[3] = (u32)(titleId >> 32);
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(extDataId) *extDataId = (u64)cmdbuf[2] | ((u64)cmdbuf[3] << 32); if(extDataId) *extDataId = (u64)cmdbuf[2] | ((u64)cmdbuf[3] << 32);
@ -493,7 +493,7 @@ Result AM_GetCiaFileInfo(FS_MediaType mediatype, AM_TitleEntry *titleEntry, Hand
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x408,1,2); // 0x04080042 cmdbuf[0] = IPC_MakeHeader(0x408,1,2); // 0x04080042
cmdbuf[1] = mediatype; cmdbuf[1] = mediatype;
cmdbuf[2] = IPC_Desc_SharedHandles(1); cmdbuf[2] = IPC_Desc_SharedHandles(1);
@ -594,7 +594,7 @@ Result AM_GetCiaMetaSection(void *meta, u32 size, Handle fileHandle)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x414,1,4); // 0x04140044 cmdbuf[0] = IPC_MakeHeader(0x414,1,4); // 0x04140044
cmdbuf[1] = size; cmdbuf[1] = size;
cmdbuf[2] = IPC_Desc_SharedHandles(1); cmdbuf[2] = IPC_Desc_SharedHandles(1);
@ -648,7 +648,7 @@ Result AM_InstallTicketBegin(Handle *ticketHandle)
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(ticketHandle) *ticketHandle = cmdbuf[3]; if(ticketHandle) *ticketHandle = cmdbuf[3];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -775,7 +775,7 @@ Result AM_InstallTmdBegin(Handle *tmdHandle)
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(tmdHandle) *tmdHandle = cmdbuf[3]; if(tmdHandle) *tmdHandle = cmdbuf[3];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -834,7 +834,7 @@ Result AM_InstallContentBegin(Handle *contentHandle, u16 index)
if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(contentHandle) *contentHandle = cmdbuf[3]; if(contentHandle) *contentHandle = cmdbuf[3];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -864,7 +864,7 @@ Result AM_InstallContentResume(Handle *contentHandle, u64* resumeOffset, u16 ind
if(contentHandle) *contentHandle = cmdbuf[5]; if(contentHandle) *contentHandle = cmdbuf[5];
if(resumeOffset) *resumeOffset = cmdbuf[2] | ((u64)cmdbuf[3] << 32); if(resumeOffset) *resumeOffset = cmdbuf[2] | ((u64)cmdbuf[3] << 32);
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }

View File

@ -153,7 +153,7 @@ static void aptInitCaptureInfo(aptCaptureBufInfo* capinfo)
// Fill in display-capture info for NS. // Fill in display-capture info for NS.
capinfo->is3D = (gspcapinfo.screencapture[0].format & 0x20) != 0; capinfo->is3D = (gspcapinfo.screencapture[0].format & 0x20) != 0;
capinfo->top.format = gspcapinfo.screencapture[0].format & 0x7; capinfo->top.format = gspcapinfo.screencapture[0].format & 0x7;
capinfo->bottom.format = gspcapinfo.screencapture[1].format & 0x7; capinfo->bottom.format = gspcapinfo.screencapture[1].format & 0x7;
@ -555,7 +555,7 @@ Result APT_GetLockHandle(u16 flags, Handle* lockHandle)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x1,1,0); // 0x10040 cmdbuf[0]=IPC_MakeHeader(0x1,1,0); // 0x10040
cmdbuf[1]=flags; cmdbuf[1]=flags;
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
if (R_SUCCEEDED(ret)) if (R_SUCCEEDED(ret))
*lockHandle = cmdbuf[5]; *lockHandle = cmdbuf[5];
@ -569,7 +569,7 @@ Result APT_Initialize(NS_APPID appId, APT_AppletAttr attr, Handle* signalEvent,
cmdbuf[0]=IPC_MakeHeader(0x2,2,0); // 0x20080 cmdbuf[0]=IPC_MakeHeader(0x2,2,0); // 0x20080
cmdbuf[1]=appId; cmdbuf[1]=appId;
cmdbuf[2]=attr; cmdbuf[2]=attr;
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
if (R_SUCCEEDED(ret)) if (R_SUCCEEDED(ret))
{ {
@ -585,7 +585,7 @@ Result APT_Finalize(NS_APPID appId)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x4,1,0); // 0x40040 cmdbuf[0]=IPC_MakeHeader(0x4,1,0); // 0x40040
cmdbuf[1]=appId; cmdbuf[1]=appId;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -593,7 +593,7 @@ Result APT_HardwareResetAsync(void)
{ {
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x4E,0,0); // 0x4E0000 cmdbuf[0]=IPC_MakeHeader(0x4E,0,0); // 0x4E0000
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -602,7 +602,7 @@ Result APT_Enable(APT_AppletAttr attr)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x3,1,0); // 0x30040 cmdbuf[0]=IPC_MakeHeader(0x3,1,0); // 0x30040
cmdbuf[1]=attr; cmdbuf[1]=attr;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -611,7 +611,7 @@ Result APT_GetAppletManInfo(APT_AppletPos inpos, APT_AppletPos* outpos, NS_APPID
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040 cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040
cmdbuf[1]=inpos; cmdbuf[1]=inpos;
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
if (R_SUCCEEDED(ret)) if (R_SUCCEEDED(ret))
{ {
@ -620,7 +620,7 @@ Result APT_GetAppletManInfo(APT_AppletPos inpos, APT_AppletPos* outpos, NS_APPID
if (menu_appid) *menu_appid =cmdbuf[4]; if (menu_appid) *menu_appid =cmdbuf[4];
if (active_appid) *active_appid=cmdbuf[5]; if (active_appid) *active_appid=cmdbuf[5];
} }
return ret; return ret;
} }
@ -662,7 +662,7 @@ Result APT_GetProgramID(u64* pProgramID)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0] = IPC_MakeHeader(0x58,0,2); // 0x580002 cmdbuf[0] = IPC_MakeHeader(0x58,0,2); // 0x580002
cmdbuf[1] = IPC_Desc_CurProcessHandle(); cmdbuf[1] = IPC_Desc_CurProcessHandle();
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
if (R_SUCCEEDED(ret)) if (R_SUCCEEDED(ret))
*pProgramID=((u64)cmdbuf[3]<<32)|cmdbuf[2]; *pProgramID=((u64)cmdbuf[3]<<32)|cmdbuf[2];
@ -675,7 +675,7 @@ Result APT_IsRegistered(NS_APPID appID, bool* out)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x9,1,0); // 0x90040 cmdbuf[0]=IPC_MakeHeader(0x9,1,0); // 0x90040
cmdbuf[1]=appID; cmdbuf[1]=appID;
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
if (R_SUCCEEDED(ret)) if (R_SUCCEEDED(ret))
*out=cmdbuf[2] & 0xFF; *out=cmdbuf[2] & 0xFF;
@ -688,7 +688,7 @@ Result APT_InquireNotification(u32 appID, APT_Signal* signalType)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0xB,1,0); // 0xB0040 cmdbuf[0]=IPC_MakeHeader(0xB,1,0); // 0xB0040
cmdbuf[1]=appID; cmdbuf[1]=appID;
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
if (R_SUCCEEDED(ret)) if (R_SUCCEEDED(ret))
{ {
@ -703,7 +703,7 @@ Result APT_PrepareToJumpToHomeMenu(void)
{ {
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x2B,0,0); // 0x2B0000 cmdbuf[0]=IPC_MakeHeader(0x2B,0,0); // 0x2B0000
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -738,7 +738,7 @@ Result APT_JumpToApplication(const void* param, size_t paramSize, Handle handle)
cmdbuf[3]=handle; cmdbuf[3]=handle;
cmdbuf[4]=IPC_Desc_StaticBuffer(cmdbuf[1],0); cmdbuf[4]=IPC_Desc_StaticBuffer(cmdbuf[1],0);
cmdbuf[5]= (u32) param; cmdbuf[5]= (u32) param;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -747,7 +747,7 @@ Result APT_NotifyToWait(NS_APPID appID)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x43,1,0); // 0x430040 cmdbuf[0]=IPC_MakeHeader(0x43,1,0); // 0x430040
cmdbuf[1]=appID; cmdbuf[1]=appID;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -767,7 +767,7 @@ Result APT_AppletUtility(int id, void* out, size_t outSize, const void* in, size
saved_threadstorage[1]=staticbufs[1]; saved_threadstorage[1]=staticbufs[1];
staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[3],0); staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[3],0);
staticbufs[1]=(u32)out; staticbufs[1]=(u32)out;
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
staticbufs[0]=saved_threadstorage[0]; staticbufs[0]=saved_threadstorage[0];
staticbufs[1]=saved_threadstorage[1]; staticbufs[1]=saved_threadstorage[1];
@ -805,7 +805,7 @@ Result APT_GlanceParameter(NS_APPID appID, void* buffer, size_t bufferSize, NS_A
saved_threadstorage[1]=staticbufs[1]; saved_threadstorage[1]=staticbufs[1];
staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[2],0); staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[2],0);
staticbufs[1]=(u32)buffer; staticbufs[1]=(u32)buffer;
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
staticbufs[0]=saved_threadstorage[0]; staticbufs[0]=saved_threadstorage[0];
staticbufs[1]=saved_threadstorage[1]; staticbufs[1]=saved_threadstorage[1];
@ -835,7 +835,7 @@ Result APT_ReceiveParameter(NS_APPID appID, void* buffer, size_t bufferSize, NS_
saved_threadstorage[1]=staticbufs[1]; saved_threadstorage[1]=staticbufs[1];
staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[2],0); staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[2],0);
staticbufs[1]=(u32)buffer; staticbufs[1]=(u32)buffer;
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
staticbufs[0]=saved_threadstorage[0]; staticbufs[0]=saved_threadstorage[0];
staticbufs[1]=saved_threadstorage[1]; staticbufs[1]=saved_threadstorage[1];
@ -865,10 +865,10 @@ Result APT_SendParameter(NS_APPID source, NS_APPID dest, APT_Command command, co
cmdbuf[5] = IPC_Desc_SharedHandles(1); cmdbuf[5] = IPC_Desc_SharedHandles(1);
cmdbuf[6] = parameter; cmdbuf[6] = parameter;
cmdbuf[7] = IPC_Desc_StaticBuffer(cmdbuf[4],0); cmdbuf[7] = IPC_Desc_StaticBuffer(cmdbuf[4],0);
cmdbuf[8] = (u32)buffer; cmdbuf[8] = (u32)buffer;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -897,7 +897,7 @@ Result APT_SendCaptureBufferInfo(const aptCaptureBufInfo* captureBuf)
cmdbuf[1] = sizeof(*captureBuf); cmdbuf[1] = sizeof(*captureBuf);
cmdbuf[2] = IPC_Desc_StaticBuffer(cmdbuf[1],0); cmdbuf[2] = IPC_Desc_StaticBuffer(cmdbuf[1],0);
cmdbuf[3] = (u32)captureBuf; cmdbuf[3] = (u32)captureBuf;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -907,7 +907,7 @@ Result APT_ReplySleepQuery(NS_APPID appID, APT_QueryReply reply)
cmdbuf[0]=IPC_MakeHeader(0x3E,2,0); // 0x3E0080 cmdbuf[0]=IPC_MakeHeader(0x3E,2,0); // 0x3E0080
cmdbuf[1]=appID; cmdbuf[1]=appID;
cmdbuf[2]=reply; cmdbuf[2]=reply;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -916,7 +916,7 @@ Result APT_ReplySleepNotificationComplete(NS_APPID appID)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x3F,1,0); // 0x3F0040 cmdbuf[0]=IPC_MakeHeader(0x3F,1,0); // 0x3F0040
cmdbuf[1]=appID; cmdbuf[1]=appID;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -925,7 +925,7 @@ Result APT_PrepareToCloseApplication(bool cancelPreload)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x22,1,0); // 0x220040 cmdbuf[0]=IPC_MakeHeader(0x22,1,0); // 0x220040
cmdbuf[1]=cancelPreload; cmdbuf[1]=cancelPreload;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -938,7 +938,7 @@ Result APT_CloseApplication(const void* param, size_t paramSize, Handle handle)
cmdbuf[3]=handle; cmdbuf[3]=handle;
cmdbuf[4]=IPC_Desc_StaticBuffer(cmdbuf[1],0); cmdbuf[4]=IPC_Desc_StaticBuffer(cmdbuf[1],0);
cmdbuf[5]= (u32) param; cmdbuf[5]= (u32) param;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -949,7 +949,7 @@ Result APT_SetAppCpuTimeLimit(u32 percent)
cmdbuf[0]=IPC_MakeHeader(0x4F,2,0); // 0x4F0080 cmdbuf[0]=IPC_MakeHeader(0x4F,2,0); // 0x4F0080
cmdbuf[1]=1; cmdbuf[1]=1;
cmdbuf[2]=percent; cmdbuf[2]=percent;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -958,7 +958,7 @@ Result APT_GetAppCpuTimeLimit(u32 *percent)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x50,1,0); // 0x500040 cmdbuf[0]=IPC_MakeHeader(0x50,1,0); // 0x500040
cmdbuf[1]=1; cmdbuf[1]=1;
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
if (R_SUCCEEDED(ret)) if (R_SUCCEEDED(ret))
*percent=cmdbuf[2]; *percent=cmdbuf[2];
@ -970,7 +970,7 @@ static Result APT_CheckNew3DS_System(bool* out)
{ {
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x102,0,0); // 0x1020000 cmdbuf[0]=IPC_MakeHeader(0x102,0,0); // 0x1020000
Result ret = aptSendCommand(cmdbuf); Result ret = aptSendCommand(cmdbuf);
if (R_SUCCEEDED(ret)) if (R_SUCCEEDED(ret))
*out = cmdbuf[2] & 0xFF; *out = cmdbuf[2] & 0xFF;
@ -1001,7 +1001,7 @@ Result APT_PrepareToDoApplicationJump(u8 flags, u64 programID, u8 mediatype)
cmdbuf[2]=(u32)programID; cmdbuf[2]=(u32)programID;
cmdbuf[3]=(u32)(programID>>32); cmdbuf[3]=(u32)(programID>>32);
cmdbuf[4]=mediatype; cmdbuf[4]=mediatype;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -1015,7 +1015,7 @@ Result APT_DoApplicationJump(const void* param, size_t paramSize, const void* hm
cmdbuf[4]=(u32)param; cmdbuf[4]=(u32)param;
cmdbuf[5]=IPC_Desc_StaticBuffer(cmdbuf[2],2); cmdbuf[5]=IPC_Desc_StaticBuffer(cmdbuf[2],2);
cmdbuf[6]=(u32)hmac; cmdbuf[6]=(u32)hmac;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -1024,7 +1024,7 @@ Result APT_PrepareToStartLibraryApplet(NS_APPID appID)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x18,1,0); // 0x180040 cmdbuf[0]=IPC_MakeHeader(0x18,1,0); // 0x180040
cmdbuf[1]=appID; cmdbuf[1]=appID;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -1038,7 +1038,7 @@ Result APT_StartLibraryApplet(NS_APPID appID, const void* param, size_t paramSiz
cmdbuf[4]=handle; cmdbuf[4]=handle;
cmdbuf[5]=IPC_Desc_StaticBuffer(cmdbuf[2],0); cmdbuf[5]=IPC_Desc_StaticBuffer(cmdbuf[2],0);
cmdbuf[6]=(u32)param; cmdbuf[6]=(u32)param;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -1047,7 +1047,7 @@ Result APT_PrepareToStartSystemApplet(NS_APPID appID)
u32 cmdbuf[16]; u32 cmdbuf[16];
cmdbuf[0]=IPC_MakeHeader(0x19,1,0); // 0x190040 cmdbuf[0]=IPC_MakeHeader(0x19,1,0); // 0x190040
cmdbuf[1]=appID; cmdbuf[1]=appID;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }
@ -1061,7 +1061,7 @@ Result APT_StartSystemApplet(NS_APPID appID, const void* param, size_t paramSize
cmdbuf[4] = handle; cmdbuf[4] = handle;
cmdbuf[5] = IPC_Desc_StaticBuffer(cmdbuf[2],0); cmdbuf[5] = IPC_Desc_StaticBuffer(cmdbuf[2],0);
cmdbuf[6] = (u32)param; cmdbuf[6] = (u32)param;
return aptSendCommand(cmdbuf); return aptSendCommand(cmdbuf);
} }

View File

@ -152,9 +152,9 @@ Result DSP_ReadPipeIfPossible(u32 channel, u32 peer, void* buffer, u16 length, u
staticbufs[0] = saved1; staticbufs[0] = saved1;
staticbufs[1] = saved2; staticbufs[1] = saved2;
if (R_FAILED(ret)) return ret; if (R_FAILED(ret)) return ret;
if (length_read) if (length_read)
*length_read = cmdbuf[2] & 0xFFFF; *length_read = cmdbuf[2] & 0xFFFF;
return cmdbuf[1]; return cmdbuf[1];

View File

@ -60,7 +60,7 @@ Result GSPLCD_GetVendors(u8 *vendors)
Result ret=0; Result ret=0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
if(vendors) *vendors = cmdbuf[2] & 0xFF; if(vendors) *vendors = cmdbuf[2] & 0xFF;
return cmdbuf[1]; return cmdbuf[1];

View File

@ -1,77 +1,77 @@
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/result.h> #include <3ds/result.h>
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/synchronization.h> #include <3ds/synchronization.h>
#include <3ds/env.h> #include <3ds/env.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>
static Handle hbHandle; static Handle hbHandle;
static int hbRefCount; static int hbRefCount;
Result hbInit(void) Result hbInit(void)
{ {
Result res=0; Result res=0;
if (AtomicPostIncrement(&hbRefCount)) return 0; if (AtomicPostIncrement(&hbRefCount)) return 0;
Handle temp = envGetHandle("hb:HB"); Handle temp = envGetHandle("hb:HB");
res = temp ? svcDuplicateHandle(&hbHandle, temp) : MAKERESULT(RL_STATUS,RS_NOTFOUND,RM_APPLICATION,RD_NOT_FOUND); res = temp ? svcDuplicateHandle(&hbHandle, temp) : MAKERESULT(RL_STATUS,RS_NOTFOUND,RM_APPLICATION,RD_NOT_FOUND);
if (R_FAILED(res)) AtomicDecrement(&hbRefCount); if (R_FAILED(res)) AtomicDecrement(&hbRefCount);
return res; return res;
} }
void hbExit(void) void hbExit(void)
{ {
if (AtomicDecrement(&hbRefCount)) return; if (AtomicDecrement(&hbRefCount)) return;
svcCloseHandle(hbHandle); svcCloseHandle(hbHandle);
} }
Result HB_FlushInvalidateCache(void) Result HB_FlushInvalidateCache(void)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1,1,2); // 0x10042 cmdbuf[0] = IPC_MakeHeader(0x1,1,2); // 0x10042
cmdbuf[1] = 0x00000000; cmdbuf[1] = 0x00000000;
cmdbuf[2] = IPC_Desc_SharedHandles(1); cmdbuf[2] = IPC_Desc_SharedHandles(1);
cmdbuf[3] = CUR_PROCESS_HANDLE; cmdbuf[3] = CUR_PROCESS_HANDLE;
if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv) Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000 cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret;
if(load3dsx)*load3dsx=(void*)cmdbuf[2]; if(load3dsx)*load3dsx=(void*)cmdbuf[2];
if(setArgv)*setArgv=(void*)cmdbuf[3]; if(setArgv)*setArgv=(void*)cmdbuf[3];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages) Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x9,3,0); // 0x900C0 cmdbuf[0] = IPC_MakeHeader(0x9,3,0); // 0x900C0
cmdbuf[1] = (u32)addr; cmdbuf[1] = (u32)addr;
cmdbuf[2] = pages; cmdbuf[2] = pages;
cmdbuf[3] = mode; cmdbuf[3] = mode;
if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret;
if(reprotectedPages) if(reprotectedPages)
{ {
if(R_SUCCEEDED(ret))*reprotectedPages=(u32)cmdbuf[2]; if(R_SUCCEEDED(ret))*reprotectedPages=(u32)cmdbuf[2];
else *reprotectedPages=0; else *reprotectedPages=0;
} }
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }

View File

@ -135,7 +135,7 @@ Result httpcCancelConnection(httpcContext *context)
cmdbuf[0]=IPC_MakeHeader(0x4,1,0); // 0x40040 cmdbuf[0]=IPC_MakeHeader(0x4,1,0); // 0x40040
cmdbuf[1]=context->httphandle; cmdbuf[1]=context->httphandle;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(__httpc_servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(__httpc_servhandle)))return ret;
@ -181,7 +181,7 @@ static Result HTTPC_Initialize(Handle handle, u32 sharedmem_size, Handle sharedm
cmdbuf[2]=IPC_Desc_CurProcessHandle(); cmdbuf[2]=IPC_Desc_CurProcessHandle();
cmdbuf[4]=IPC_Desc_SharedHandles(1); cmdbuf[4]=IPC_Desc_SharedHandles(1);
cmdbuf[5]=sharedmem_handle;// POST buffer memory block handle cmdbuf[5]=sharedmem_handle;// POST buffer memory block handle
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
@ -210,10 +210,10 @@ static Result HTTPC_CreateContext(Handle handle, HTTPC_RequestMethod method, con
cmdbuf[2]=method; cmdbuf[2]=method;
cmdbuf[3]=IPC_Desc_Buffer(l,IPC_BUFFER_R); cmdbuf[3]=IPC_Desc_Buffer(l,IPC_BUFFER_R);
cmdbuf[4]=(u32)url; cmdbuf[4]=(u32)url;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
if(contextHandle)*contextHandle=cmdbuf[2]; if(contextHandle)*contextHandle=cmdbuf[2];
return cmdbuf[1]; return cmdbuf[1];
@ -226,7 +226,7 @@ static Result HTTPC_InitializeConnectionSession(Handle handle, Handle contextHan
cmdbuf[0]=IPC_MakeHeader(0x8,1,2); // 0x80042 cmdbuf[0]=IPC_MakeHeader(0x8,1,2); // 0x80042
cmdbuf[1]=contextHandle; cmdbuf[1]=contextHandle;
cmdbuf[2]=IPC_Desc_CurProcessHandle(); cmdbuf[2]=IPC_Desc_CurProcessHandle();
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
@ -239,7 +239,7 @@ static Result HTTPC_SetProxyDefault(Handle handle, Handle contextHandle)
cmdbuf[0]=IPC_MakeHeader(0xE,1,0); // 0xE0040 cmdbuf[0]=IPC_MakeHeader(0xE,1,0); // 0xE0040
cmdbuf[1]=contextHandle; cmdbuf[1]=contextHandle;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
@ -252,7 +252,7 @@ static Result HTTPC_CloseContext(Handle handle, Handle contextHandle)
cmdbuf[0]=IPC_MakeHeader(0x3,1,0); // 0x30040 cmdbuf[0]=IPC_MakeHeader(0x3,1,0); // 0x30040
cmdbuf[1]=contextHandle; cmdbuf[1]=contextHandle;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
@ -274,7 +274,7 @@ Result httpcAddRequestHeaderField(httpcContext *context, const char* name, const
cmdbuf[5]=(u32)name; cmdbuf[5]=(u32)name;
cmdbuf[6]=IPC_Desc_Buffer(value_len,IPC_BUFFER_R); cmdbuf[6]=IPC_Desc_Buffer(value_len,IPC_BUFFER_R);
cmdbuf[7]=(u32)value; cmdbuf[7]=(u32)value;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
@ -296,7 +296,7 @@ Result httpcAddPostDataAscii(httpcContext *context, const char* name, const char
cmdbuf[5]=(u32)name; cmdbuf[5]=(u32)name;
cmdbuf[6]=IPC_Desc_Buffer(value_len,IPC_BUFFER_R); cmdbuf[6]=IPC_Desc_Buffer(value_len,IPC_BUFFER_R);
cmdbuf[7]=(u32)value; cmdbuf[7]=(u32)value;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
@ -327,7 +327,7 @@ Result httpcBeginRequest(httpcContext *context)
cmdbuf[0]=IPC_MakeHeader(0x9,1,0); // 0x90040 cmdbuf[0]=IPC_MakeHeader(0x9,1,0); // 0x90040
cmdbuf[1]=context->httphandle; cmdbuf[1]=context->httphandle;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
@ -343,7 +343,7 @@ Result httpcReceiveData(httpcContext *context, u8* buffer, u32 size)
cmdbuf[2]=size; cmdbuf[2]=size;
cmdbuf[3]=IPC_Desc_Buffer(size,IPC_BUFFER_W); cmdbuf[3]=IPC_Desc_Buffer(size,IPC_BUFFER_W);
cmdbuf[4]=(u32)buffer; cmdbuf[4]=(u32)buffer;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
@ -361,7 +361,7 @@ Result httpcReceiveDataTimeout(httpcContext *context, u8* buffer, u32 size, u64
cmdbuf[4]=(timeout >> 32) & 0xffffffff; cmdbuf[4]=(timeout >> 32) & 0xffffffff;
cmdbuf[5]=IPC_Desc_Buffer(size,IPC_BUFFER_W); cmdbuf[5]=IPC_Desc_Buffer(size,IPC_BUFFER_W);
cmdbuf[6]=(u32)buffer; cmdbuf[6]=(u32)buffer;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
@ -374,7 +374,7 @@ Result httpcGetRequestState(httpcContext *context, HTTPC_RequestStatus* out)
cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040 cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040
cmdbuf[1]=context->httphandle; cmdbuf[1]=context->httphandle;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
@ -389,7 +389,7 @@ Result httpcGetDownloadSizeState(httpcContext *context, u32* downloadedsize, u32
cmdbuf[0]=IPC_MakeHeader(0x6,1,0); // 0x60040 cmdbuf[0]=IPC_MakeHeader(0x6,1,0); // 0x60040
cmdbuf[1]=context->httphandle; cmdbuf[1]=context->httphandle;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
@ -425,7 +425,7 @@ Result httpcGetResponseStatusCode(httpcContext *context, u32* out)
cmdbuf[0]=IPC_MakeHeader(0x22,1,0); // 0x220040 cmdbuf[0]=IPC_MakeHeader(0x22,1,0); // 0x220040
cmdbuf[1]=context->httphandle; cmdbuf[1]=context->httphandle;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
@ -443,7 +443,7 @@ Result httpcGetResponseStatusCodeTimeout(httpcContext *context, u32* out, u64 ti
cmdbuf[1]=context->httphandle; cmdbuf[1]=context->httphandle;
cmdbuf[2]=timeout & 0xffffffff; cmdbuf[2]=timeout & 0xffffffff;
cmdbuf[3]=(timeout >> 32) & 0xffffffff; cmdbuf[3]=(timeout >> 32) & 0xffffffff;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;

View File

@ -109,7 +109,7 @@ u32 irrstCheckSectionUpdateTime(vu32 *sharedmem_section, u32 id)
void irrstScanInput(void) void irrstScanInput(void)
{ {
if(irrstRefCount==0)return; if(irrstRefCount==0)return;
u32 Id=0; u32 Id=0;
kHeld = 0; kHeld = 0;
memset(&csPos, 0, sizeof(circlePosition)); memset(&csPos, 0, sizeof(circlePosition));

View File

@ -252,7 +252,7 @@ Result mvdstdInit(MVDSTD_Mode mode, MVDSTD_InputFormat input_type, MVDSTD_Output
if(mvdstd_mode==MVDMODE_VIDEOPROCESSING) if(mvdstd_mode==MVDMODE_VIDEOPROCESSING)
{ {
ret = MVDSTD_cmd5(tmpinitstruct.cmd5_inval0, tmpinitstruct.cmd5_inval1, tmpinitstruct.cmd5_inval2, tmpinitstruct.cmd5_inval3); ret = MVDSTD_cmd5(tmpinitstruct.cmd5_inval0, tmpinitstruct.cmd5_inval1, tmpinitstruct.cmd5_inval2, tmpinitstruct.cmd5_inval3);
if(ret!=MVD_STATUS_OK) goto cleanup3; if(ret!=MVD_STATUS_OK) goto cleanup3;
} }
ret = MVDSTD_cmd18(); ret = MVDSTD_cmd18();
@ -261,7 +261,7 @@ Result mvdstdInit(MVDSTD_Mode mode, MVDSTD_InputFormat input_type, MVDSTD_Output
if(mvdstd_mode==MVDMODE_VIDEOPROCESSING) if(mvdstd_mode==MVDMODE_VIDEOPROCESSING)
{ {
ret = MVDSTD_cmd1b(tmpinitstruct.cmd1b_inval); ret = MVDSTD_cmd1b(tmpinitstruct.cmd1b_inval);
if(ret!=MVD_STATUS_OK) goto cleanup3; if(ret!=MVD_STATUS_OK) goto cleanup3;
} }
return 0; return 0;

View File

@ -71,9 +71,9 @@ Result NEWS_GetTotalNotifications(u32* num)
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x5,0,0); cmdbuf[0] = IPC_MakeHeader(0x5,0,0);
if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
*num = cmdbuf[2]; *num = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -88,7 +88,7 @@ Result NEWS_SetNotificationHeader(u32 news_id, const NotificationHeader* header)
cmdbuf[2] = sizeof(NotificationHeader); cmdbuf[2] = sizeof(NotificationHeader);
cmdbuf[3] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_R); cmdbuf[3] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_R);
cmdbuf[4] = (u32)header; cmdbuf[4] = (u32)header;
if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -103,7 +103,7 @@ Result NEWS_GetNotificationHeader(u32 news_id, NotificationHeader* header)
cmdbuf[2] = sizeof(NotificationHeader); cmdbuf[2] = sizeof(NotificationHeader);
cmdbuf[3] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_W); cmdbuf[3] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_W);
cmdbuf[4] = (u32)header; cmdbuf[4] = (u32)header;
if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -118,7 +118,7 @@ Result NEWS_SetNotificationMessage(u32 news_id, const u16* message, u32 size)
cmdbuf[2] = size; cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_Buffer((size_t)0x1780,IPC_BUFFER_R); cmdbuf[3] = IPC_Desc_Buffer((size_t)0x1780,IPC_BUFFER_R);
cmdbuf[4] = (u32)message; cmdbuf[4] = (u32)message;
if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -133,7 +133,7 @@ Result NEWS_GetNotificationMessage(u32 news_id, u16* message, u32* size)
cmdbuf[2] = 0x1780; // Default size used by Notifications Applet cmdbuf[2] = 0x1780; // Default size used by Notifications Applet
cmdbuf[3] = IPC_Desc_Buffer((size_t)0x1780,IPC_BUFFER_W); cmdbuf[3] = IPC_Desc_Buffer((size_t)0x1780,IPC_BUFFER_W);
cmdbuf[4] = (u32)message; cmdbuf[4] = (u32)message;
if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
if(size) *size = cmdbuf[2]; if(size) *size = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
@ -149,7 +149,7 @@ Result NEWS_SetNotificationImage(u32 news_id, const void* buffer, u32 size)
cmdbuf[2] = size; cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_Buffer((size_t)0x10000,IPC_BUFFER_R); cmdbuf[3] = IPC_Desc_Buffer((size_t)0x10000,IPC_BUFFER_R);
cmdbuf[4] = (u32)buffer; cmdbuf[4] = (u32)buffer;
if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -164,7 +164,7 @@ Result NEWS_GetNotificationImage(u32 news_id, void* buffer, u32* size)
cmdbuf[2] = 0x10000; // Default size used by Notifications Applet cmdbuf[2] = 0x10000; // Default size used by Notifications Applet
cmdbuf[3] = IPC_Desc_Buffer((size_t)0x10000,IPC_BUFFER_W); cmdbuf[3] = IPC_Desc_Buffer((size_t)0x10000,IPC_BUFFER_W);
cmdbuf[4] = (u32)buffer; cmdbuf[4] = (u32)buffer;
if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
if(size) *size = cmdbuf[2]; if(size) *size = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];

View File

@ -1,438 +1,438 @@
#include <string.h> #include <string.h>
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/result.h> #include <3ds/result.h>
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/synchronization.h> #include <3ds/synchronization.h>
#include <3ds/services/nfc.h> #include <3ds/services/nfc.h>
#include <3ds/services/apt.h> #include <3ds/services/apt.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>
static Handle nfcHandle; static Handle nfcHandle;
static int nfcRefCount; static int nfcRefCount;
static NFC_OpType nfc_optype = NFC_OpType_NFCTag; static NFC_OpType nfc_optype = NFC_OpType_NFCTag;
static Result NFC_Initialize(NFC_OpType type); static Result NFC_Initialize(NFC_OpType type);
static Result NFC_Shutdown(NFC_OpType type); static Result NFC_Shutdown(NFC_OpType type);
static Result NFC_StartCommunication(void); static Result NFC_StartCommunication(void);
static Result NFC_StopCommunication(void); static Result NFC_StopCommunication(void);
static Result NFC_CommunicationGetStatus(u8 *out); static Result NFC_CommunicationGetStatus(u8 *out);
static Result NFC_CommunicationGetResult(Result *out); static Result NFC_CommunicationGetResult(Result *out);
static Result NFC_StartTagScanning(u16 unknown); static Result NFC_StartTagScanning(u16 unknown);
static Result NFC_StopTagScanning(void); static Result NFC_StopTagScanning(void);
static Result NFC_InitializeWriteAppData(u32 amiibo_appid, NFC_AppDataInitStruct *initstruct, const void *buf, size_t size); static Result NFC_InitializeWriteAppData(u32 amiibo_appid, NFC_AppDataInitStruct *initstruct, const void *buf, size_t size);
static Result NFC_GetAppDataInitStruct(NFC_AppDataInitStruct *out); static Result NFC_GetAppDataInitStruct(NFC_AppDataInitStruct *out);
Result nfcInit(NFC_OpType type) Result nfcInit(NFC_OpType type)
{ {
Result ret=0; Result ret=0;
if (AtomicPostIncrement(&nfcRefCount)) return 0; if (AtomicPostIncrement(&nfcRefCount)) return 0;
ret = srvGetServiceHandle(&nfcHandle, "nfc:m"); ret = srvGetServiceHandle(&nfcHandle, "nfc:m");
if (R_FAILED(ret))ret = srvGetServiceHandle(&nfcHandle, "nfc:u"); if (R_FAILED(ret))ret = srvGetServiceHandle(&nfcHandle, "nfc:u");
if (R_SUCCEEDED(ret)) if (R_SUCCEEDED(ret))
{ {
nfc_optype = type; nfc_optype = type;
ret = NFC_Initialize(type); ret = NFC_Initialize(type);
if (R_FAILED(ret)) svcCloseHandle(nfcHandle); if (R_FAILED(ret)) svcCloseHandle(nfcHandle);
} }
if (R_FAILED(ret)) AtomicDecrement(&nfcRefCount); if (R_FAILED(ret)) AtomicDecrement(&nfcRefCount);
return ret; return ret;
} }
void nfcExit(void) void nfcExit(void)
{ {
if (AtomicDecrement(&nfcRefCount)) return; if (AtomicDecrement(&nfcRefCount)) return;
NFC_Shutdown(nfc_optype); NFC_Shutdown(nfc_optype);
svcCloseHandle(nfcHandle); svcCloseHandle(nfcHandle);
} }
Handle nfcGetSessionHandle(void) Handle nfcGetSessionHandle(void)
{ {
return nfcHandle; return nfcHandle;
} }
Result nfcStartScanning(u16 inval) Result nfcStartScanning(u16 inval)
{ {
Result ret, ret2; Result ret, ret2;
bool new3ds_flag = false; bool new3ds_flag = false;
u8 status; u8 status;
APT_CheckNew3DS(&new3ds_flag); APT_CheckNew3DS(&new3ds_flag);
if(!new3ds_flag) if(!new3ds_flag)
{ {
ret = NFC_StartCommunication(); ret = NFC_StartCommunication();
if(R_FAILED(ret))return ret; if(R_FAILED(ret))return ret;
while(1) while(1)
{ {
status = 0; status = 0;
ret = NFC_CommunicationGetStatus(&status); ret = NFC_CommunicationGetStatus(&status);
if(R_FAILED(ret))break; if(R_FAILED(ret))break;
if(status==1)//"Attempting to initialize Old3DS NFC adapter communication." if(status==1)//"Attempting to initialize Old3DS NFC adapter communication."
{ {
svcSleepThread(1000000*100); svcSleepThread(1000000*100);
continue; continue;
} }
else if(status==2)//"Old3DS NFC adapter communication initialization successfully finished." else if(status==2)//"Old3DS NFC adapter communication initialization successfully finished."
{ {
break; break;
} }
//An error occured with Old3DS NFC-adapter communication initialization. //An error occured with Old3DS NFC-adapter communication initialization.
ret = NFC_CommunicationGetResult(&ret2); ret = NFC_CommunicationGetResult(&ret2);
if(R_FAILED(ret))break; if(R_FAILED(ret))break;
return ret2; return ret2;
} }
if(R_FAILED(ret))return ret; if(R_FAILED(ret))return ret;
} }
return NFC_StartTagScanning(inval); return NFC_StartTagScanning(inval);
} }
void nfcStopScanning(void) void nfcStopScanning(void)
{ {
bool new3ds_flag = false; bool new3ds_flag = false;
APT_CheckNew3DS(&new3ds_flag); APT_CheckNew3DS(&new3ds_flag);
NFC_StopTagScanning(); NFC_StopTagScanning();
if(!new3ds_flag) if(!new3ds_flag)
{ {
NFC_StopCommunication(); NFC_StopCommunication();
} }
} }
static Result NFC_Initialize(NFC_OpType type) static Result NFC_Initialize(NFC_OpType type)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x1,1,0); // 0x10040 cmdbuf[0]=IPC_MakeHeader(0x1,1,0); // 0x10040
cmdbuf[1]=type & 0xff; cmdbuf[1]=type & 0xff;
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
static Result NFC_Shutdown(NFC_OpType type) static Result NFC_Shutdown(NFC_OpType type)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x2,1,0); // 0x20040 cmdbuf[0]=IPC_MakeHeader(0x2,1,0); // 0x20040
cmdbuf[1]=type & 0xff; cmdbuf[1]=type & 0xff;
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
static Result NFC_StartCommunication(void) static Result NFC_StartCommunication(void)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x3,0,0); // 0x30000 cmdbuf[0]=IPC_MakeHeader(0x3,0,0); // 0x30000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
static Result NFC_StopCommunication(void) static Result NFC_StopCommunication(void)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x4,0,0); // 0x40000 cmdbuf[0]=IPC_MakeHeader(0x4,0,0); // 0x40000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
static Result NFC_StartTagScanning(u16 unknown) static Result NFC_StartTagScanning(u16 unknown)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040 cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040
cmdbuf[1]=unknown; cmdbuf[1]=unknown;
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
static Result NFC_StopTagScanning(void) static Result NFC_StopTagScanning(void)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x6,0,0); // 0x60000 cmdbuf[0]=IPC_MakeHeader(0x6,0,0); // 0x60000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
Result nfcLoadAmiiboData(void) Result nfcLoadAmiiboData(void)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x7,0,0); // 0x70000 cmdbuf[0]=IPC_MakeHeader(0x7,0,0); // 0x70000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
Result nfcResetTagScanState(void) Result nfcResetTagScanState(void)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x8,0,0); // 0x80000 cmdbuf[0]=IPC_MakeHeader(0x8,0,0); // 0x80000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
Result nfcUpdateStoredAmiiboData(void) Result nfcUpdateStoredAmiiboData(void)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x9,0,2); // 0x90002 cmdbuf[0]=IPC_MakeHeader(0x9,0,2); // 0x90002
cmdbuf[1]=IPC_Desc_CurProcessHandle(); cmdbuf[1]=IPC_Desc_CurProcessHandle();
if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
Result nfcGetTagState(NFC_TagState *state) Result nfcGetTagState(NFC_TagState *state)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0xD,0,0); // 0xD0000 cmdbuf[0]=IPC_MakeHeader(0xD,0,0); // 0xD0000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
if(R_SUCCEEDED(ret) && state)*state = cmdbuf[2] & 0xff; if(R_SUCCEEDED(ret) && state)*state = cmdbuf[2] & 0xff;
return ret; return ret;
} }
static Result NFC_CommunicationGetStatus(u8 *out) static Result NFC_CommunicationGetStatus(u8 *out)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0xF,0,0); // 0xF0000 cmdbuf[0]=IPC_MakeHeader(0xF,0,0); // 0xF0000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
if(R_SUCCEEDED(ret) && out)*out = cmdbuf[2]; if(R_SUCCEEDED(ret) && out)*out = cmdbuf[2];
return ret; return ret;
} }
Result nfcGetTagInfo(NFC_TagInfo *out) Result nfcGetTagInfo(NFC_TagInfo *out)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x11,0,0); // 0x110000 cmdbuf[0]=IPC_MakeHeader(0x11,0,0); // 0x110000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_TagInfo)); if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_TagInfo));
return ret; return ret;
} }
static Result NFC_CommunicationGetResult(Result *out) static Result NFC_CommunicationGetResult(Result *out)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x12,0,0); // 0x120000 cmdbuf[0]=IPC_MakeHeader(0x12,0,0); // 0x120000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
if(R_SUCCEEDED(ret) && out)*out = cmdbuf[2]; if(R_SUCCEEDED(ret) && out)*out = cmdbuf[2];
return ret; return ret;
} }
Result nfcOpenAppData(u32 amiibo_appid) Result nfcOpenAppData(u32 amiibo_appid)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x13,1,0); // 0x130040 cmdbuf[0]=IPC_MakeHeader(0x13,1,0); // 0x130040
cmdbuf[1]=amiibo_appid; cmdbuf[1]=amiibo_appid;
if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
Result nfcInitializeWriteAppData(u32 amiibo_appid, const void *buf, size_t size) Result nfcInitializeWriteAppData(u32 amiibo_appid, const void *buf, size_t size)
{ {
Result ret=0; Result ret=0;
NFC_AppDataInitStruct initstruct; NFC_AppDataInitStruct initstruct;
ret = NFC_GetAppDataInitStruct(&initstruct); ret = NFC_GetAppDataInitStruct(&initstruct);
if(R_FAILED(ret))return ret; if(R_FAILED(ret))return ret;
return NFC_InitializeWriteAppData(amiibo_appid, &initstruct, buf, size); return NFC_InitializeWriteAppData(amiibo_appid, &initstruct, buf, size);
} }
static Result NFC_InitializeWriteAppData(u32 amiibo_appid, NFC_AppDataInitStruct *initstruct, const void *buf, size_t size) static Result NFC_InitializeWriteAppData(u32 amiibo_appid, NFC_AppDataInitStruct *initstruct, const void *buf, size_t size)
{ {
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x14,14,4); // 0x140384 cmdbuf[0]=IPC_MakeHeader(0x14,14,4); // 0x140384
cmdbuf[1]=amiibo_appid; cmdbuf[1]=amiibo_appid;
cmdbuf[2]=size; cmdbuf[2]=size;
memcpy(&cmdbuf[3], initstruct->data_xc, sizeof(initstruct->data_xc)); memcpy(&cmdbuf[3], initstruct->data_xc, sizeof(initstruct->data_xc));
cmdbuf[15]=IPC_Desc_CurProcessHandle(); cmdbuf[15]=IPC_Desc_CurProcessHandle();
cmdbuf[17]=IPC_Desc_StaticBuffer(size, 0); cmdbuf[17]=IPC_Desc_StaticBuffer(size, 0);
cmdbuf[18]=(u32)buf; cmdbuf[18]=(u32)buf;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result nfcReadAppData(void *buf, size_t size) Result nfcReadAppData(void *buf, size_t size)
{ {
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
u32 saved_threadstorage[2]; u32 saved_threadstorage[2];
cmdbuf[0]=IPC_MakeHeader(0x15,1,0); // 0x150040 cmdbuf[0]=IPC_MakeHeader(0x15,1,0); // 0x150040
cmdbuf[1]=size; cmdbuf[1]=size;
u32 * staticbufs = getThreadStaticBuffers(); u32 * staticbufs = getThreadStaticBuffers();
saved_threadstorage[0] = staticbufs[0]; saved_threadstorage[0] = staticbufs[0];
saved_threadstorage[1] = staticbufs[1]; saved_threadstorage[1] = staticbufs[1];
staticbufs[0] = IPC_Desc_StaticBuffer(size,0); staticbufs[0] = IPC_Desc_StaticBuffer(size,0);
staticbufs[1] = (u32)buf; staticbufs[1] = (u32)buf;
Result ret=0; Result ret=0;
ret=svcSendSyncRequest(nfcHandle); ret=svcSendSyncRequest(nfcHandle);
staticbufs[0] = saved_threadstorage[0]; staticbufs[0] = saved_threadstorage[0];
staticbufs[1] = saved_threadstorage[1]; staticbufs[1] = saved_threadstorage[1];
if(R_FAILED(ret))return ret; if(R_FAILED(ret))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
return ret; return ret;
} }
Result nfcWriteAppData(const void *buf, size_t size, NFC_TagInfo *taginfo) Result nfcWriteAppData(const void *buf, size_t size, NFC_TagInfo *taginfo)
{ {
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
NFC_AppDataWriteStruct writestruct; NFC_AppDataWriteStruct writestruct;
cmdbuf[0]=IPC_MakeHeader(0x16,9,2); // 0x160242 cmdbuf[0]=IPC_MakeHeader(0x16,9,2); // 0x160242
cmdbuf[1]=size; cmdbuf[1]=size;
cmdbuf[10]=IPC_Desc_StaticBuffer(size, 0); cmdbuf[10]=IPC_Desc_StaticBuffer(size, 0);
cmdbuf[11]=(u32)buf; cmdbuf[11]=(u32)buf;
if(taginfo==NULL)return -1; if(taginfo==NULL)return -1;
if(taginfo->id_offset_size>10)return -2; if(taginfo->id_offset_size>10)return -2;
memset(&writestruct, 0, sizeof(NFC_AppDataWriteStruct)); memset(&writestruct, 0, sizeof(NFC_AppDataWriteStruct));
writestruct.id_size = taginfo->id_offset_size; writestruct.id_size = taginfo->id_offset_size;
memcpy(writestruct.id, taginfo->id, sizeof(writestruct.id)); memcpy(writestruct.id, taginfo->id, sizeof(writestruct.id));
memcpy(&cmdbuf[2], &writestruct, sizeof(NFC_AppDataWriteStruct)); memcpy(&cmdbuf[2], &writestruct, sizeof(NFC_AppDataWriteStruct));
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result nfcGetAmiiboSettings(NFC_AmiiboSettings *out) Result nfcGetAmiiboSettings(NFC_AmiiboSettings *out)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x17,0,0); // 0x170000 cmdbuf[0]=IPC_MakeHeader(0x17,0,0); // 0x170000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AmiiboSettings)); if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AmiiboSettings));
return ret; return ret;
} }
Result nfcGetAmiiboConfig(NFC_AmiiboConfig *out) Result nfcGetAmiiboConfig(NFC_AmiiboConfig *out)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x18,0,0); // 0x180000 cmdbuf[0]=IPC_MakeHeader(0x18,0,0); // 0x180000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AmiiboConfig)); if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AmiiboConfig));
return ret; return ret;
} }
static Result NFC_GetAppDataInitStruct(NFC_AppDataInitStruct *out) static Result NFC_GetAppDataInitStruct(NFC_AppDataInitStruct *out)
{ {
Result ret=0; Result ret=0;
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x19,0,0); // 0x190000 cmdbuf[0]=IPC_MakeHeader(0x19,0,0); // 0x190000
if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret;
ret = cmdbuf[1]; ret = cmdbuf[1];
if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AppDataInitStruct)); if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AppDataInitStruct));
return ret; return ret;
} }

View File

@ -33,9 +33,9 @@ Result NS_LaunchFIRM(u64 titleid)
cmdbuf[0] = IPC_MakeHeader(0x1,3,0); // 0x100C0 cmdbuf[0] = IPC_MakeHeader(0x1,3,0); // 0x100C0
cmdbuf[1] = titleid & 0xffffffff; cmdbuf[1] = titleid & 0xffffffff;
cmdbuf[2] = (titleid >> 32) & 0xffffffff; cmdbuf[2] = (titleid >> 32) & 0xffffffff;
if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -48,11 +48,11 @@ Result NS_LaunchTitle(u64 titleid, u32 launch_flags, u32 *procid)
cmdbuf[1] = titleid & 0xffffffff; cmdbuf[1] = titleid & 0xffffffff;
cmdbuf[2] = (titleid >> 32) & 0xffffffff; cmdbuf[2] = (titleid >> 32) & 0xffffffff;
cmdbuf[3] = launch_flags; cmdbuf[3] = launch_flags;
if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
if(procid != NULL) *procid = cmdbuf[2]; if(procid != NULL) *procid = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -65,9 +65,9 @@ Result NS_LaunchApplicationFIRM(u64 titleid, u32 flags)
cmdbuf[1] = titleid & 0xffffffff; cmdbuf[1] = titleid & 0xffffffff;
cmdbuf[2] = (titleid >> 32) & 0xffffffff; cmdbuf[2] = (titleid >> 32) & 0xffffffff;
cmdbuf[3] = flags; cmdbuf[3] = flags;
if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -83,7 +83,7 @@ Result NS_RebootToTitle(u8 mediatype, u64 titleid)
cmdbuf[4] = mediatype; cmdbuf[4] = mediatype;
cmdbuf[5] = 0x0; // reserved cmdbuf[5] = 0x0; // reserved
cmdbuf[6] = 0x0; cmdbuf[6] = 0x0;
if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];

View File

@ -37,9 +37,9 @@ Result PM_LaunchTitle(u8 mediatype, u64 titleid, u32 launch_flags)
cmdbuf[3] = mediatype; cmdbuf[3] = mediatype;
cmdbuf[4] = 0x0; cmdbuf[4] = 0x0;
cmdbuf[5] = launch_flags; cmdbuf[5] = launch_flags;
if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -53,11 +53,11 @@ Result PM_GetTitleExheaderFlags(u8 mediatype, u64 titleid, u8* out)
cmdbuf[2] = (titleid >> 32) & 0xffffffff; cmdbuf[2] = (titleid >> 32) & 0xffffffff;
cmdbuf[3] = mediatype; cmdbuf[3] = mediatype;
cmdbuf[4] = 0x0; cmdbuf[4] = 0x0;
if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
memcpy(out, (u8*)(&cmdbuf[2]), 8); memcpy(out, (u8*)(&cmdbuf[2]), 8);
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -70,9 +70,9 @@ Result PM_SetFIRMLaunchParams(u32 size, u8* in)
cmdbuf[1] = size; cmdbuf[1] = size;
cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R); cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[3] = (u32)in; cmdbuf[3] = (u32)in;
if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -85,9 +85,9 @@ Result PM_GetFIRMLaunchParams(u32 size, u8* out)
cmdbuf[1] = size; cmdbuf[1] = size;
cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_W); cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
cmdbuf[3] = (u32)out; cmdbuf[3] = (u32)out;
if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -101,8 +101,8 @@ Result PM_LaunchFIRMSetParams(u32 firm_titleid_low, u32 size, u8* in)
cmdbuf[2] = size; cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R); cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[4] = (u32)in; cmdbuf[4] = (u32)in;
if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }

View File

@ -50,10 +50,10 @@ int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
staticbufs[1] = (u32)tmpaddr; staticbufs[1] = (u32)tmpaddr;
ret = svcSendSyncRequest(SOCU_handle); ret = svcSendSyncRequest(SOCU_handle);
staticbufs[0] = saved_threadstorage[0]; staticbufs[0] = saved_threadstorage[0];
staticbufs[1] = saved_threadstorage[1]; staticbufs[1] = saved_threadstorage[1];
if(ret != 0) { if(ret != 0) {
__release_handle(fd); __release_handle(fd);
errno = SYNC_ERROR; errno = SYNC_ERROR;

View File

@ -140,7 +140,7 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi
Result ret; Result ret;
addrinfo_3ds_t *info = NULL, *tmp; addrinfo_3ds_t *info = NULL, *tmp;
s32 count = DEFAULT_NUM_ADDRINFO, info_count; s32 count = DEFAULT_NUM_ADDRINFO, info_count;
if(node == NULL && service == NULL) if(node == NULL && service == NULL)
{ {
return EAI_NONAME; return EAI_NONAME;

View File

@ -57,7 +57,7 @@ int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_
if(R_FAILED(ret)) { if(R_FAILED(ret)) {
errno = SYNC_ERROR; errno = SYNC_ERROR;
return ret; return ret;
} }
ret = cmdbuf[1]; ret = cmdbuf[1];
if(R_FAILED(ret)) { if(R_FAILED(ret)) {

View File

@ -38,9 +38,9 @@ int SOCU_GetNetworkOpt(int level, NetworkOpt optname, void * optval, socklen_t *
{ {
errno = SYNC_ERROR; errno = SYNC_ERROR;
return ret; return ret;
} }
ret = _net_convert_error(cmdbuf[2]); ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) { if(ret < 0) {

View File

@ -29,10 +29,10 @@ int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
staticbufs[1] = (u32)tmpaddr; staticbufs[1] = (u32)tmpaddr;
ret = svcSendSyncRequest(SOCU_handle); ret = svcSendSyncRequest(SOCU_handle);
staticbufs[0] = saved_threadstorage[0]; staticbufs[0] = saved_threadstorage[0];
staticbufs[1] = saved_threadstorage[1]; staticbufs[1] = saved_threadstorage[1];
if(ret != 0) { if(ret != 0) {
errno = SYNC_ERROR; errno = SYNC_ERROR;
return ret; return ret;

View File

@ -30,10 +30,10 @@ int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optl
staticbufs[1] = (u32)optval; staticbufs[1] = (u32)optval;
ret = svcSendSyncRequest(SOCU_handle); ret = svcSendSyncRequest(SOCU_handle);
staticbufs[0] = saved_threadstorage[0]; staticbufs[0] = saved_threadstorage[0];
staticbufs[1] = saved_threadstorage[1]; staticbufs[1] = saved_threadstorage[1];
if(ret != 0) { if(ret != 0) {
errno = SYNC_ERROR; errno = SYNC_ERROR;
return ret; return ret;

View File

@ -122,7 +122,7 @@ Result socExit(void)
{ {
Result ret = 0; Result ret = 0;
int dev; int dev;
svcCloseHandle(socMemhandle); svcCloseHandle(socMemhandle);
socMemhandle = 0; socMemhandle = 0;
@ -154,7 +154,7 @@ soc_close(struct _reent *r,
int fd) int fd)
{ {
Handle sockfd = *(Handle*)fd; Handle sockfd = *(Handle*)fd;
int ret = 0; int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();

View File

@ -29,7 +29,7 @@ int ioctl(int sockfd, int request, ...)
} }
flags = fcntl(sockfd, F_GETFL, 0); flags = fcntl(sockfd, F_GETFL, 0);
if(flags == -1) if(flags == -1)
return -1; return -1;
if(*value) if(*value)

View File

@ -51,10 +51,10 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout)
staticbufs[1] = (u32)tmp_fds; staticbufs[1] = (u32)tmp_fds;
ret = svcSendSyncRequest(SOCU_handle); ret = svcSendSyncRequest(SOCU_handle);
staticbufs[0] = saved_threadstorage[0]; staticbufs[0] = saved_threadstorage[0];
staticbufs[1] = saved_threadstorage[1]; staticbufs[1] = saved_threadstorage[1];
if(ret != 0) { if(ret != 0) {
free(tmp_fds); free(tmp_fds);
errno = SYNC_ERROR; errno = SYNC_ERROR;

View File

@ -33,10 +33,10 @@ ssize_t socuipc_cmd7(int sockfd, void *buf, size_t len, int flags, struct sockad
staticbufs[1] = (u32)tmpaddr; staticbufs[1] = (u32)tmpaddr;
ret = svcSendSyncRequest(SOCU_handle); ret = svcSendSyncRequest(SOCU_handle);
staticbufs[0] = saved_threadstorage[0]; staticbufs[0] = saved_threadstorage[0];
staticbufs[1] = saved_threadstorage[1]; staticbufs[1] = saved_threadstorage[1];
if(ret != 0) { if(ret != 0) {
errno = SYNC_ERROR; errno = SYNC_ERROR;
return -1; return -1;
@ -64,7 +64,7 @@ ssize_t socuipc_cmd7(int sockfd, void *buf, size_t len, int flags, struct sockad
ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen) ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
{ {
int ret = 0; int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
u32 tmp_addrlen = 0; u32 tmp_addrlen = 0;
u8 tmpaddr[0x1c]; u8 tmpaddr[0x1c];
u32 saved_threadstorage[4]; u32 saved_threadstorage[4];
@ -85,7 +85,7 @@ ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockad
saved_threadstorage[1] = cmdbuf[0x104>>2]; saved_threadstorage[1] = cmdbuf[0x104>>2];
saved_threadstorage[2] = cmdbuf[0x108>>2]; saved_threadstorage[2] = cmdbuf[0x108>>2];
saved_threadstorage[3] = cmdbuf[0x10c>>2]; saved_threadstorage[3] = cmdbuf[0x10c>>2];
cmdbuf[0x100>>2] = (((u32)len)<<14) | 2; cmdbuf[0x100>>2] = (((u32)len)<<14) | 2;
cmdbuf[0x104>>2] = (u32)buf; cmdbuf[0x104>>2] = (u32)buf;
cmdbuf[0x108>>2] = (tmp_addrlen<<14) | 2; cmdbuf[0x108>>2] = (tmp_addrlen<<14) | 2;

View File

@ -45,7 +45,7 @@ static Result sslcipc_Initialize(void)
cmdbuf[0]=IPC_MakeHeader(0x1,0,2); // 0x10002 cmdbuf[0]=IPC_MakeHeader(0x1,0,2); // 0x10002
cmdbuf[1]=IPC_Desc_CurProcessHandle(); cmdbuf[1]=IPC_Desc_CurProcessHandle();
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(__sslc_servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(__sslc_servhandle)))return ret;
@ -235,7 +235,7 @@ static Result sslcipc_InitializeConnectionSession(sslcContext *context)
cmdbuf[0]=IPC_MakeHeader(0x12,1,2); // 0x120042 cmdbuf[0]=IPC_MakeHeader(0x12,1,2); // 0x120042
cmdbuf[1]=context->sslchandle; cmdbuf[1]=context->sslchandle;
cmdbuf[2]=IPC_Desc_CurProcessHandle(); cmdbuf[2]=IPC_Desc_CurProcessHandle();
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
@ -371,7 +371,7 @@ static Result sslcipc_ContextInitSharedmem(sslcContext *context, u32 size)
cmdbuf[2]=size; cmdbuf[2]=size;
cmdbuf[3]=IPC_Desc_SharedHandles(1); cmdbuf[3]=IPC_Desc_SharedHandles(1);
cmdbuf[4]=context->sharedmem_handle; cmdbuf[4]=context->sharedmem_handle;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;

View File

@ -69,11 +69,11 @@ SVC_BEGIN svcGetThreadPriority
ldr r3, [sp], #4 ldr r3, [sp], #4
str r1, [r3] str r1, [r3]
bx lr bx lr
SVC_BEGIN svcSetThreadPriority SVC_BEGIN svcSetThreadPriority
svc 0x0C svc 0x0C
bx lr bx lr
SVC_BEGIN svcGetThreadAffinityMask SVC_BEGIN svcGetThreadAffinityMask
svc 0x0D svc 0x0D
bx lr bx lr
@ -81,14 +81,14 @@ SVC_BEGIN svcGetThreadAffinityMask
SVC_BEGIN svcSetThreadAffinityMask SVC_BEGIN svcSetThreadAffinityMask
svc 0x0E svc 0x0E
bx lr bx lr
SVC_BEGIN svcGetThreadIdealProcessor SVC_BEGIN svcGetThreadIdealProcessor
str r0, [sp, #-0x4]! str r0, [sp, #-0x4]!
svc 0x0F svc 0x0F
ldr r3, [sp], #4 ldr r3, [sp], #4
str r1, [r3] str r1, [r3]
bx lr bx lr
SVC_BEGIN svcSetThreadIdealProcessor SVC_BEGIN svcSetThreadIdealProcessor
svc 0x10 svc 0x10
bx lr bx lr
@ -281,7 +281,7 @@ SVC_BEGIN svcOpenThread
pop {r2} pop {r2}
str r1, [r2] str r1, [r2]
bx lr bx lr
SVC_BEGIN svcGetProcessId SVC_BEGIN svcGetProcessId
str r0, [sp, #-0x4]! str r0, [sp, #-0x4]!
svc 0x35 svc 0x35
@ -295,7 +295,7 @@ SVC_BEGIN svcGetProcessIdOfThread
ldr r3, [sp], #4 ldr r3, [sp], #4
str r1, [r3] str r1, [r3]
bx lr bx lr
SVC_BEGIN svcGetThreadId SVC_BEGIN svcGetThreadId
str r0, [sp, #-0x4]! str r0, [sp, #-0x4]!
svc 0x37 svc 0x37
@ -407,7 +407,7 @@ SVC_BEGIN svcTerminateDebugProcess
SVC_BEGIN svcGetProcessDebugEvent SVC_BEGIN svcGetProcessDebugEvent
svc 0x63 svc 0x63
bx lr bx lr
SVC_BEGIN svcContinueDebugEvent SVC_BEGIN svcContinueDebugEvent
svc 0x64 svc 0x64
bx lr bx lr

View File

@ -25,6 +25,6 @@ rbtree_find(const rbtree_t *tree,
tmp = tmp->child[LEFT]; tmp = tmp->child[LEFT];
} }
} }
return save; return save;
} }