diff --git a/libctru/include/3ds/console.h b/libctru/include/3ds/console.h index 6a36786..e2e4a87 100644 --- a/libctru/include/3ds/console.h +++ b/libctru/include/3ds/console.h @@ -1,173 +1,173 @@ -/** - * @file console.h - * @brief 3ds stdio support. - * - * Provides stdio integration for printing to the 3DS screen as well as debug print - * functionality provided by stderr. - * - * General usage is to initialize the console by: - * @code - * consoleDemoInit() - * @endcode - * or to customize the console usage by: - * @code - * consoleInit() - * @endcode - */ -#pragma once - -#include <3ds/types.h> -#include <3ds/gfx.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define CONSOLE_ESC(x) "\x1b[" #x -#define CONSOLE_RESET CONSOLE_ESC(0m) -#define CONSOLE_BLACK CONSOLE_ESC(30m) -#define CONSOLE_RED CONSOLE_ESC(31;1m) -#define CONSOLE_GREEN CONSOLE_ESC(32;1m) -#define CONSOLE_YELLOW CONSOLE_ESC(33;1m) -#define CONSOLE_BLUE CONSOLE_ESC(34;1m) -#define CONSOLE_MAGENTA CONSOLE_ESC(35;1m) -#define CONSOLE_CYAN CONSOLE_ESC(36;1m) -#define CONSOLE_WHITE CONSOLE_ESC(37;1m) - -/// A callback for printing a character. -typedef bool(*ConsolePrint)(void* con, int c); - -/// A font struct for the console. -typedef struct ConsoleFont -{ - u8* gfx; ///< A pointer to the font graphics - u16 asciiOffset; ///< Offset to the first valid character in the font table - u16 numChars; ///< Number of characters in the font graphics -}ConsoleFont; - -/** - * @brief Console structure used to store the state of a console render context. - * - * Default values from consoleGetDefault(); - * @code - * PrintConsole defaultConsole = - * { - * //Font: - * { - * (u8*)default_font_bin, //font gfx - * 0, //first ascii character in the set - * 128, //number of characters in the font set - * }, - * 0,0, //cursorX cursorY - * 0,0, //prevcursorX prevcursorY - * 40, //console width - * 30, //console height - * 0, //window x - * 0, //window y - * 32, //window width - * 24, //window height - * 3, //tab size - * 0, //font character offset - * 0, //print callback - * false //console initialized - * }; - * @endcode - */ -typedef struct PrintConsole -{ - ConsoleFont font; ///< Font of the console - - u16 *frameBuffer; ///< Framebuffer address - - 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 prevCursorX; ///< Internal state - int prevCursorY; ///< Internal state - - int consoleWidth; ///< Width 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 windowY; ///< Window Y location in characters (not implemented) - int windowWidth; ///< Window width in characters (not implemented) - int windowHeight; ///< Window height in characters (not implemented) - - int tabSize; ///< Size of a tab - int fg; ///< Foreground color - int bg; ///< Background color - 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). - - bool consoleInitialised; ///< True if the console is initialized -}PrintConsole; - -#define CONSOLE_COLOR_BOLD (1<<0) ///< Bold text -#define CONSOLE_COLOR_FAINT (1<<1) ///< Faint text -#define CONSOLE_ITALIC (1<<2) ///< Italic text -#define CONSOLE_UNDERLINE (1<<3) ///< Underlined text -#define CONSOLE_BLINK_SLOW (1<<4) ///< Slow blinking text -#define CONSOLE_BLINK_FAST (1<<5) ///< Fast blinking text -#define CONSOLE_COLOR_REVERSE (1<<6) ///< Reversed color text -#define CONSOLE_CONCEAL (1<<7) ///< Concealed text -#define CONSOLE_CROSSED_OUT (1<<8) ///< Crossed out text - -/// Console debug devices supported by libnds. -typedef enum { - debugDevice_NULL, ///< Swallows prints to stderr - debugDevice_3DMOO, ///< Directs stderr debug statements to 3dmoo - debugDevice_CONSOLE, ///< Directs stderr debug statements to 3DS console window -} debugDevice; - -/** - * @brief Loads the font into the console. - * @param console Pointer to the console to update, if NULL it will update the current console. - * @param font The font to load. - */ -void consoleSetFont(PrintConsole* console, ConsoleFont* font); - -/** - * @brief Sets the print window. - * @param console Console to set, if NULL it will set the current console window. - * @param x X location of the window. - * @param y Y location of the window. - * @param width Width of the window. - * @param height Height of the window. - */ -void consoleSetWindow(PrintConsole* console, int x, int y, int width, int height); - -/** - * @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(). - * @return A pointer to the console with the default values. - */ -PrintConsole* consoleGetDefault(void); - -/** - * @brief Make the specified console the render target. - * @param console A pointer to the console struct (must have been initialized with consoleInit(PrintConsole* console)). - * @return A pointer to the previous console. - */ -PrintConsole *consoleSelect(PrintConsole* console); - -/** - * @brief Initialise 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). - * @return A pointer to the current console. - */ -PrintConsole* consoleInit(gfxScreen_t screen, PrintConsole* console); - -/** - * @brief Initializes debug console output on stderr to the specified device. - * @param device The debug device (or devices) to output debug print statements to. - */ -void consoleDebugInit(debugDevice device); - -/// Clears the screan by using iprintf("\x1b[2J"); -void consoleClear(void); - -#ifdef __cplusplus -} -#endif +/** + * @file console.h + * @brief 3ds stdio support. + * + * Provides stdio integration for printing to the 3DS screen as well as debug print + * functionality provided by stderr. + * + * General usage is to initialize the console by: + * @code + * consoleDemoInit() + * @endcode + * or to customize the console usage by: + * @code + * consoleInit() + * @endcode + */ +#pragma once + +#include <3ds/types.h> +#include <3ds/gfx.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define CONSOLE_ESC(x) "\x1b[" #x +#define CONSOLE_RESET CONSOLE_ESC(0m) +#define CONSOLE_BLACK CONSOLE_ESC(30m) +#define CONSOLE_RED CONSOLE_ESC(31;1m) +#define CONSOLE_GREEN CONSOLE_ESC(32;1m) +#define CONSOLE_YELLOW CONSOLE_ESC(33;1m) +#define CONSOLE_BLUE CONSOLE_ESC(34;1m) +#define CONSOLE_MAGENTA CONSOLE_ESC(35;1m) +#define CONSOLE_CYAN CONSOLE_ESC(36;1m) +#define CONSOLE_WHITE CONSOLE_ESC(37;1m) + +/// A callback for printing a character. +typedef bool(*ConsolePrint)(void* con, int c); + +/// A font struct for the console. +typedef struct ConsoleFont +{ + u8* gfx; ///< A pointer to the font graphics + u16 asciiOffset; ///< Offset to the first valid character in the font table + u16 numChars; ///< Number of characters in the font graphics +}ConsoleFont; + +/** + * @brief Console structure used to store the state of a console render context. + * + * Default values from consoleGetDefault(); + * @code + * PrintConsole defaultConsole = + * { + * //Font: + * { + * (u8*)default_font_bin, //font gfx + * 0, //first ascii character in the set + * 128, //number of characters in the font set + * }, + * 0,0, //cursorX cursorY + * 0,0, //prevcursorX prevcursorY + * 40, //console width + * 30, //console height + * 0, //window x + * 0, //window y + * 32, //window width + * 24, //window height + * 3, //tab size + * 0, //font character offset + * 0, //print callback + * false //console initialized + * }; + * @endcode + */ +typedef struct PrintConsole +{ + ConsoleFont font; ///< Font of the console + + u16 *frameBuffer; ///< Framebuffer address + + 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 prevCursorX; ///< Internal state + int prevCursorY; ///< Internal state + + int consoleWidth; ///< Width 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 windowY; ///< Window Y location in characters (not implemented) + int windowWidth; ///< Window width in characters (not implemented) + int windowHeight; ///< Window height in characters (not implemented) + + int tabSize; ///< Size of a tab + int fg; ///< Foreground color + int bg; ///< Background color + 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). + + bool consoleInitialised; ///< True if the console is initialized +}PrintConsole; + +#define CONSOLE_COLOR_BOLD (1<<0) ///< Bold text +#define CONSOLE_COLOR_FAINT (1<<1) ///< Faint text +#define CONSOLE_ITALIC (1<<2) ///< Italic text +#define CONSOLE_UNDERLINE (1<<3) ///< Underlined text +#define CONSOLE_BLINK_SLOW (1<<4) ///< Slow blinking text +#define CONSOLE_BLINK_FAST (1<<5) ///< Fast blinking text +#define CONSOLE_COLOR_REVERSE (1<<6) ///< Reversed color text +#define CONSOLE_CONCEAL (1<<7) ///< Concealed text +#define CONSOLE_CROSSED_OUT (1<<8) ///< Crossed out text + +/// Console debug devices supported by libnds. +typedef enum { + debugDevice_NULL, ///< Swallows prints to stderr + debugDevice_3DMOO, ///< Directs stderr debug statements to 3dmoo + debugDevice_CONSOLE, ///< Directs stderr debug statements to 3DS console window +} debugDevice; + +/** + * @brief Loads the font into the console. + * @param console Pointer to the console to update, if NULL it will update the current console. + * @param font The font to load. + */ +void consoleSetFont(PrintConsole* console, ConsoleFont* font); + +/** + * @brief Sets the print window. + * @param console Console to set, if NULL it will set the current console window. + * @param x X location of the window. + * @param y Y location of the window. + * @param width Width of the window. + * @param height Height of the window. + */ +void consoleSetWindow(PrintConsole* console, int x, int y, int width, int height); + +/** + * @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(). + * @return A pointer to the console with the default values. + */ +PrintConsole* consoleGetDefault(void); + +/** + * @brief Make the specified console the render target. + * @param console A pointer to the console struct (must have been initialized with consoleInit(PrintConsole* console)). + * @return A pointer to the previous console. + */ +PrintConsole *consoleSelect(PrintConsole* console); + +/** + * @brief Initialise 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). + * @return A pointer to the current console. + */ +PrintConsole* consoleInit(gfxScreen_t screen, PrintConsole* console); + +/** + * @brief Initializes debug console output on stderr to the specified device. + * @param device The debug device (or devices) to output debug print statements to. + */ +void consoleDebugInit(debugDevice device); + +/// Clears the screan by using iprintf("\x1b[2J"); +void consoleClear(void); + +#ifdef __cplusplus +} +#endif diff --git a/libctru/include/3ds/gpu/enums.h b/libctru/include/3ds/gpu/enums.h index e89e3f8..a8ab577 100644 --- a/libctru/include/3ds/gpu/enums.h +++ b/libctru/include/3ds/gpu/enums.h @@ -202,7 +202,7 @@ typedef enum GPU_WRITE_BLUE = 0x04, ///< Write blue. GPU_WRITE_ALPHA = 0x08, ///< Write alpha. GPU_WRITE_DEPTH = 0x10, ///< Write depth. - + GPU_WRITE_COLOR = 0x0F, ///< Write all color components. GPU_WRITE_ALL = 0x1F, ///< Write all components. } GPU_WRITEMASK; diff --git a/libctru/include/3ds/gpu/registers.h b/libctru/include/3ds/gpu/registers.h index 3a0fe94..4aed7f6 100644 --- a/libctru/include/3ds/gpu/registers.h +++ b/libctru/include/3ds/gpu/registers.h @@ -1,767 +1,767 @@ -/** - * @file registers.h - * @description GPU registers. - */ -#pragma once - -///@name Miscellaneous registers (0x000-0x03F) -///@{ -#define GPUREG_0000 0x0000 ///< Unknown. -#define GPUREG_0001 0x0001 ///< Unknown. -#define GPUREG_0002 0x0002 ///< Unknown. -#define GPUREG_0003 0x0003 ///< Unknown. -#define GPUREG_0004 0x0004 ///< Unknown. -#define GPUREG_0005 0x0005 ///< Unknown. -#define GPUREG_0006 0x0006 ///< Unknown. -#define GPUREG_0007 0x0007 ///< Unknown. -#define GPUREG_0008 0x0008 ///< Unknown. -#define GPUREG_0009 0x0009 ///< Unknown. -#define GPUREG_000A 0x000A ///< Unknown. -#define GPUREG_000B 0x000B ///< Unknown. -#define GPUREG_000C 0x000C ///< Unknown. -#define GPUREG_000D 0x000D ///< Unknown. -#define GPUREG_000E 0x000E ///< Unknown. -#define GPUREG_000F 0x000F ///< Unknown. -#define GPUREG_FINALIZE 0x0010 ///< Used to finalize GPU drawing. -#define GPUREG_0011 0x0011 ///< Unknown. -#define GPUREG_0012 0x0012 ///< Unknown. -#define GPUREG_0013 0x0013 ///< Unknown. -#define GPUREG_0014 0x0014 ///< Unknown. -#define GPUREG_0015 0x0015 ///< Unknown. -#define GPUREG_0016 0x0016 ///< Unknown. -#define GPUREG_0017 0x0017 ///< Unknown. -#define GPUREG_0018 0x0018 ///< Unknown. -#define GPUREG_0019 0x0019 ///< Unknown. -#define GPUREG_001A 0x001A ///< Unknown. -#define GPUREG_001B 0x001B ///< Unknown. -#define GPUREG_001C 0x001C ///< Unknown. -#define GPUREG_001D 0x001D ///< Unknown. -#define GPUREG_001E 0x001E ///< Unknown. -#define GPUREG_001F 0x001F ///< Unknown. -#define GPUREG_0020 0x0020 ///< Unknown. -#define GPUREG_0021 0x0021 ///< Unknown. -#define GPUREG_0022 0x0022 ///< Unknown. -#define GPUREG_0023 0x0023 ///< Unknown. -#define GPUREG_0024 0x0024 ///< Unknown. -#define GPUREG_0025 0x0025 ///< Unknown. -#define GPUREG_0026 0x0026 ///< Unknown. -#define GPUREG_0027 0x0027 ///< Unknown. -#define GPUREG_0028 0x0028 ///< Unknown. -#define GPUREG_0029 0x0029 ///< Unknown. -#define GPUREG_002A 0x002A ///< Unknown. -#define GPUREG_002B 0x002B ///< Unknown. -#define GPUREG_002C 0x002C ///< Unknown. -#define GPUREG_002D 0x002D ///< Unknown. -#define GPUREG_002E 0x002E ///< Unknown. -#define GPUREG_002F 0x002F ///< Unknown. -#define GPUREG_0030 0x0030 ///< Unknown. -#define GPUREG_0031 0x0031 ///< Unknown. -#define GPUREG_0032 0x0032 ///< Unknown. -#define GPUREG_0033 0x0033 ///< Unknown. -#define GPUREG_0034 0x0034 ///< Unknown. -#define GPUREG_0035 0x0035 ///< Unknown. -#define GPUREG_0036 0x0036 ///< Unknown. -#define GPUREG_0037 0x0037 ///< Unknown. -#define GPUREG_0038 0x0038 ///< Unknown. -#define GPUREG_0039 0x0039 ///< Unknown. -#define GPUREG_003A 0x003A ///< Unknown. -#define GPUREG_003B 0x003B ///< Unknown. -#define GPUREG_003C 0x003C ///< Unknown. -#define GPUREG_003D 0x003D ///< Unknown. -#define GPUREG_003E 0x003E ///< Unknown. -#define GPUREG_003F 0x003F ///< Unknown. -///@} - -///@name Rasterizer registers (0x040-0x07F) -///@{ -#define GPUREG_FACECULLING_CONFIG 0x0040 ///< Face culling configuration. -#define GPUREG_VIEWPORT_WIDTH 0x0041 ///< Viewport width. -#define GPUREG_VIEWPORT_INVW 0x0042 ///< Inverted viewport width. -#define GPUREG_VIEWPORT_HEIGHT 0x0043 ///< Viewport height. -#define GPUREG_VIEWPORT_INVH 0x0044 ///< Inverted viewport height. -#define GPUREG_0045 0x0045 ///< Unknown -#define GPUREG_0046 0x0046 ///< Unknown -#define GPUREG_FRAGOP_CLIP 0x0047 ///< Unknown -#define GPUREG_FRAGOP_CLIP_DATA0 0x0048 ///< Unknown -#define GPUREG_FRAGOP_CLIP_DATA1 0x0049 ///< Unknown -#define GPUREG_FRAGOP_CLIP_DATA2 0x004A ///< Unknown -#define GPUREG_FRAGOP_CLIP_DATA3 0x004B ///< Unknown -#define GPUREG_004C 0x004C ///< Unknown -#define GPUREG_DEPTHMAP_SCALE 0x004D ///< Depth map scale. -#define GPUREG_DEPTHMAP_OFFSET 0x004E ///< Depth map offset. -#define GPUREG_SH_OUTMAP_TOTAL 0x004F ///< Shader output map total. -#define GPUREG_SH_OUTMAP_O0 0x0050 ///< Shader output map 0. -#define GPUREG_SH_OUTMAP_O1 0x0051 ///< Shader output map 1. -#define GPUREG_SH_OUTMAP_O2 0x0052 ///< Shader output map 2. -#define GPUREG_SH_OUTMAP_O3 0x0053 ///< Shader output map 3. -#define GPUREG_SH_OUTMAP_O4 0x0054 ///< Shader output map 4. -#define GPUREG_SH_OUTMAP_O5 0x0055 ///< Shader output map 5. -#define GPUREG_SH_OUTMAP_O6 0x0056 ///< Shader output map 6. -#define GPUREG_0057 0x0057 ///< Unknown -#define GPUREG_0058 0x0058 ///< Unknown -#define GPUREG_0059 0x0059 ///< Unknown -#define GPUREG_005A 0x005A ///< Unknown -#define GPUREG_005B 0x005B ///< Unknown -#define GPUREG_005C 0x005C ///< Unknown -#define GPUREG_005D 0x005D ///< Unknown -#define GPUREG_005E 0x005E ///< Unknown -#define GPUREG_005F 0x005F ///< Unknown -#define GPUREG_0060 0x0060 ///< Unknown -#define GPUREG_EARLYDEPTH_FUNC 0x0061 ///< Unknown -#define GPUREG_EARLYDEPTH_TEST1 0x0062 ///< Unknown -#define GPUREG_EARLYDEPTH_CLEAR 0x0063 ///< Unknown -#define GPUREG_SH_OUTATTR_MODE 0x0064 ///< Shader output attributes mode. -#define GPUREG_SCISSORTEST_MODE 0x0065 ///< Scissor test mode. -#define GPUREG_SCISSORTEST_POS 0x0066 ///< Scissor test position. -#define GPUREG_SCISSORTEST_DIM 0x0067 ///< Scissor text dimensions. -#define GPUREG_VIEWPORT_XY 0x0068 ///< Viewport X and Y. -#define GPUREG_0069 0x0069 ///< Unknown -#define GPUREG_EARLYDEPTH_DATA 0x006A ///< Unknown -#define GPUREG_006B 0x006B ///< Unknown -#define GPUREG_006C 0x006C ///< Unknown -#define GPUREG_DEPTHMAP_ENABLE 0x006D ///< Depth map enable. -#define GPUREG_RENDERBUF_DIM 0x006E ///< Renderbuffer dimensions. -#define GPUREG_SH_OUTATTR_CLOCK 0x006F ///< Shader output attributes clock enable. -#define GPUREG_0070 0x0070 ///< Unknown -#define GPUREG_0071 0x0071 ///< Unknown -#define GPUREG_0072 0x0072 ///< Unknown -#define GPUREG_0073 0x0073 ///< Unknown -#define GPUREG_0074 0x0074 ///< Unknown -#define GPUREG_0075 0x0075 ///< Unknown -#define GPUREG_0076 0x0076 ///< Unknown -#define GPUREG_0077 0x0077 ///< Unknown -#define GPUREG_0078 0x0078 ///< Unknown -#define GPUREG_0079 0x0079 ///< Unknown -#define GPUREG_007A 0x007A ///< Unknown -#define GPUREG_007B 0x007B ///< Unknown -#define GPUREG_007C 0x007C ///< Unknown -#define GPUREG_007D 0x007D ///< Unknown -#define GPUREG_007E 0x007E ///< Unknown -#define GPUREG_007F 0x007F ///< Unknown -///@} - -///@name Texturing registers (0x080-0x0FF) -///@{ -#define GPUREG_TEXUNIT_CONFIG 0x0080 ///< Texture unit configuration. -#define GPUREG_TEXUNIT0_BORDER_COLOR 0x0081 ///< Texture unit 0 border color. -#define GPUREG_TEXUNIT0_DIM 0x0082 ///< Texture unit 0 dimensions. -#define GPUREG_TEXUNIT0_PARAM 0x0083 ///< Texture unit 0 parameters. -#define GPUREG_TEXUNIT0_LOD 0x0084 ///< Texture unit 0 LOD. -#define GPUREG_TEXUNIT0_ADDR1 0x0085 ///< Texture unit 0 address. -#define GPUREG_TEXUNIT0_ADDR2 0x0086 ///< Unknown. -#define GPUREG_TEXUNIT0_ADDR3 0x0087 ///< Unknown. -#define GPUREG_TEXUNIT0_ADDR4 0x0088 ///< Unknown. -#define GPUREG_TEXUNIT0_ADDR5 0x0089 ///< Unknown. -#define GPUREG_TEXUNIT0_ADDR6 0x008A ///< Unknown. -#define GPUREG_TEXUNIT0_SHADOW 0x008B ///< Unknown. -#define GPUREG_008C 0x008C ///< Unknown. -#define GPUREG_008D 0x008D ///< Unknown. -#define GPUREG_TEXUNIT0_TYPE 0x008E ///< Texture unit 0 type. -#define GPUREG_LIGHTING_ENABLE0 0x008F ///< Lighting toggle. -#define GPUREG_0090 0x0090 ///< Unknown. -#define GPUREG_TEXUNIT1_BORDER_COLOR 0x0091 ///< Texture unit 1 border color. -#define GPUREG_TEXUNIT1_DIM 0x0092 ///< Texture unit 1 dimensions. -#define GPUREG_TEXUNIT1_PARAM 0x0093 ///< Texture unit 1 parameters. -#define GPUREG_TEXUNIT1_LOD 0x0094 ///< Texture unit 1 LOD. -#define GPUREG_TEXUNIT1_ADDR 0x0095 ///< Texture unit 1 address. -#define GPUREG_TEXUNIT1_TYPE 0x0096 ///< Texture unit 1 type. -#define GPUREG_0097 0x0097 ///< Unknown. -#define GPUREG_0098 0x0098 ///< Unknown. -#define GPUREG_TEXUNIT2_BORDER_COLOR 0x0099 ///< Texture unit 2 border color. -#define GPUREG_TEXUNIT2_DIM 0x009A ///< Texture unit 2 dimensions. -#define GPUREG_TEXUNIT2_PARAM 0x009B ///< Texture unit 2 parameters. -#define GPUREG_TEXUNIT2_LOD 0x009C ///< Texture unit 2 LOD. -#define GPUREG_TEXUNIT2_ADDR 0x009D ///< Texture unit 2 address. -#define GPUREG_TEXUNIT2_TYPE 0x009E ///< Texture unit 2 type. -#define GPUREG_009F 0x009F ///< Unknown. -#define GPUREG_00A0 0x00A0 ///< Unknown. -#define GPUREG_00A1 0x00A1 ///< Unknown. -#define GPUREG_00A2 0x00A2 ///< Unknown. -#define GPUREG_00A3 0x00A3 ///< Unknown. -#define GPUREG_00A4 0x00A4 ///< Unknown. -#define GPUREG_00A5 0x00A5 ///< Unknown. -#define GPUREG_00A6 0x00A6 ///< Unknown. -#define GPUREG_00A7 0x00A7 ///< Unknown. -#define GPUREG_TEXUNIT3_PROCTEX0 0x00A8 ///< Unknown. -#define GPUREG_TEXUNIT3_PROCTEX1 0x00A9 ///< Unknown. -#define GPUREG_TEXUNIT3_PROCTEX2 0x00AA ///< Unknown. -#define GPUREG_TEXUNIT3_PROCTEX3 0x00AB ///< Unknown. -#define GPUREG_TEXUNIT3_PROCTEX4 0x00A ///< Unknown. -#define GPUREG_TEXUNIT3_PROCTEX5 0x00D ///< Unknown. -#define GPUREG_00AE 0x00AE ///< Unknown. -#define GPUREG_PROCTEX_LUT 0x00AF ///< Unknown. -#define GPUREG_PROCTEX_LUT_DATA0 0x00B0 ///< Unknown. -#define GPUREG_PROCTEX_LUT_DATA1 0x00B1 ///< Unknown. -#define GPUREG_PROCTEX_LUT_DATA2 0x00B2 ///< Unknown. -#define GPUREG_PROCTEX_LUT_DATA3 0x00B3 ///< Unknown. -#define GPUREG_PROCTEX_LUT_DATA4 0x00B4 ///< Unknown. -#define GPUREG_PROCTEX_LUT_DATA5 0x00B5 ///< Unknown. -#define GPUREG_PROCTEX_LUT_DATA6 0x00B6 ///< Unknown. -#define GPUREG_PROCTEX_LUT_DATA7 0x00B7 ///< Unknown. -#define GPUREG_00B8 0x00B8 ///< Unknown. -#define GPUREG_00B9 0x00B9 ///< Unknown. -#define GPUREG_00BA 0x00BA ///< Unknown. -#define GPUREG_00BB 0x00BB ///< Unknown. -#define GPUREG_00BC 0x00BC ///< Unknown. -#define GPUREG_00BD 0x00BD ///< Unknown. -#define GPUREG_00BE 0x00BE ///< Unknown. -#define GPUREG_00BF 0x00BF ///< Unknown. -#define GPUREG_TEXENV0_SOURCE 0x00C0 ///< Texture env 0 source. -#define GPUREG_TEXENV0_OPERAND 0x00C1 ///< Texture env 0 operand. -#define GPUREG_TEXENV0_COMBINER 0x00C2 ///< Texture env 0 combiner. -#define GPUREG_TEXENV0_COLOR 0x00C3 ///< Texture env 0 color. -#define GPUREG_TEXENV0_SCALE 0x00C4 ///< Texture env 0 scale. -#define GPUREG_00C5 0x00C5 ///< Unknown. -#define GPUREG_00C6 0x00C6 ///< Unknown. -#define GPUREG_00C7 0x00C7 ///< Unknown. -#define GPUREG_TEXENV1_SOURCE 0x00C8 ///< Texture env 1 source. -#define GPUREG_TEXENV1_OPERAND 0x00C9 ///< Texture env 1 operand. -#define GPUREG_TEXENV1_COMBINER 0x00CA ///< Texture env 1 combiner. -#define GPUREG_TEXENV1_COLOR 0x00CB ///< Texture env 1 color. -#define GPUREG_TEXENV1_SCALE 0x00CC ///< Texture env 1 scale. -#define GPUREG_00CD 0x00CD ///< Unknown. -#define GPUREG_00CE 0x00CE ///< Unknown. -#define GPUREG_00CF 0x00CF ///< Unknown. -#define GPUREG_TEXENV2_SOURCE 0x00D0 ///< Texture env 2 source. -#define GPUREG_TEXENV2_OPERAND 0x00D1 ///< Texture env 2 operand. -#define GPUREG_TEXENV2_COMBINER 0x00D2 ///< Texture env 2 combiner. -#define GPUREG_TEXENV2_COLOR 0x00D3 ///< Texture env 2 color. -#define GPUREG_TEXENV2_SCALE 0x00D4 ///< Texture env 2 scale. -#define GPUREG_00D5 0x00D5 ///< Unknown. -#define GPUREG_00D6 0x00D6 ///< Unknown. -#define GPUREG_00D7 0x00D7 ///< Unknown. -#define GPUREG_TEXENV3_SOURCE 0x00D8 ///< Texture env 3 source. -#define GPUREG_TEXENV3_OPERAND 0x00D9 ///< Texture env 3 operand. -#define GPUREG_TEXENV3_COMBINER 0x00DA ///< Texture env 3 combiner. -#define GPUREG_TEXENV3_COLOR 0x00DB ///< Texture env 3 color. -#define GPUREG_TEXENV3_SCALE 0x00DC ///< Texture env 3 scale. -#define GPUREG_00DD 0x00DD ///< Unknown. -#define GPUREG_00DE 0x00DE ///< Unknown. -#define GPUREG_00DF 0x00DF ///< Unknown. -#define GPUREG_TEXENV_UPDATE_BUFFER 0x00E0 ///< Texture env buffer update flag. -#define GPUREG_FOG_COLOR 0x00E1 ///< Unknown. -#define GPUREG_00E2 0x00E2 ///< Unknown. -#define GPUREG_00E3 0x00E3 ///< Unknown. -#define GPUREG_GAS_ATTENUATION 0x00E4 ///< Unknown. -#define GPUREG_GAS_ACCMAX 0x00E5 ///< Unknown. -#define GPUREG_FOG_LUT_INDEX 0x00E6 ///< Unknown. -#define GPUREG_00E7 0x00E7 ///< Unknown. -#define GPUREG_FOG_LUT_DATA0 0x00E8 ///< Unknown. -#define GPUREG_FOG_LUT_DATA1 0x00E9 ///< Unknown. -#define GPUREG_FOG_LUT_DATA2 0x00EA ///< Unknown. -#define GPUREG_FOG_LUT_DATA3 0x00EB ///< Unknown. -#define GPUREG_FOG_LUT_DATA4 0x00EC ///< Unknown. -#define GPUREG_FOG_LUT_DATA5 0x00ED ///< Unknown. -#define GPUREG_FOG_LUT_DATA6 0x00EE ///< Unknown. -#define GPUREG_FOG_LUT_DATA7 0x00EF ///< Unknown. -#define GPUREG_TEXENV4_SOURCE 0x00F0 ///< Texture env 4 source. -#define GPUREG_TEXENV4_OPERAND 0x00F1 ///< Texture env 4 operand. -#define GPUREG_TEXENV4_COMBINER 0x00F2 ///< Texture env 4 combiner. -#define GPUREG_TEXENV4_COLOR 0x00F3 ///< Texture env 4 color. -#define GPUREG_TEXENV4_SCALE 0x00F4 ///< Texture env 4 scale. -#define GPUREG_00F5 0x00F5 ///< Unknown. -#define GPUREG_00F6 0x00F6 ///< Unknown. -#define GPUREG_00F7 0x00F7 ///< Unknown. -#define GPUREG_TEXENV5_SOURCE 0x00F8 ///< Texture env 5 source. -#define GPUREG_TEXENV5_OPERAND 0x00F9 ///< Texture env 5 operand. -#define GPUREG_TEXENV5_COMBINER 0x00FA ///< Texture env 5 combiner. -#define GPUREG_TEXENV5_COLOR 0x00FB ///< Texture env 5 color. -#define GPUREG_TEXENV5_SCALE 0x00FC ///< Texture env 5 scale. -#define GPUREG_TEXENV_BUFFER_COLOR 0x00FD ///< Texture env buffer color. -#define GPUREG_00FE 0x00FE ///< Unknown. -#define GPUREG_00FF 0x00FF ///< Unknown. -///@} - -///@name Framebuffer registers (0x100-0x13F) -///@{ -#define GPUREG_COLOR_OPERATION 0x0100 ///< Configures fragment operation and blend mode. -#define GPUREG_BLEND_FUNC 0x0101 ///< Blend function configuration. -#define GPUREG_LOGIC_OP 0x0102 ///< Logical operator configuration. -#define GPUREG_BLEND_COLOR 0x0103 ///< Blend color. -#define GPUREG_FRAGOP_ALPHA_TEST 0x0104 ///< Alpha test configuration. -#define GPUREG_STENCIL_TEST 0x0105 ///< Stencil test configuration. -#define GPUREG_STENCIL_OP 0x0106 ///< Stencil test operation. -#define GPUREG_DEPTH_COLOR_MASK 0x0107 ///< Depth test and color mask configuration. -#define GPUREG_0108 0x0108 ///< Unknown. -#define GPUREG_0109 0x0109 ///< Unknown. -#define GPUREG_010A 0x010A ///< Unknown. -#define GPUREG_010B 0x010B ///< Unknown. -#define GPUREG_010C 0x010C ///< Unknown. -#define GPUREG_010D 0x010D ///< Unknown. -#define GPUREG_010E 0x010E ///< Unknown. -#define GPUREG_010F 0x010F ///< Unknown. -#define GPUREG_FRAMEBUFFER_INVALIDATE 0x0110 ///< Invalidates the frame buffer. -#define GPUREG_FRAMEBUFFER_FLUSH 0x0111 ///< Flushes the frame buffer. -#define GPUREG_COLORBUFFER_READ 0x0112 ///< Reads from the color buffer. -#define GPUREG_COLORBUFFER_WRITE 0x0113 ///< Writes to the color buffer. -#define GPUREG_DEPTHBUFFER_READ 0x0114 ///< Reads from the depth buffer. -#define GPUREG_DEPTHBUFFER_WRITE 0x0115 ///< Writes to the depth buffer. -#define GPUREG_DEPTHBUFFER_FORMAT 0x0116 ///< Depth buffer format. -#define GPUREG_COLORBUFFER_FORMAT 0x0117 ///< Color buffer format. -#define GPUREG_EARLYDEPTH_TEST2 0x0118 ///< Unknown. -#define GPUREG_0119 0x0119 ///< Unknown. -#define GPUREG_011A 0x011A ///< Unknown. -#define GPUREG_FRAMEBUFFER_BLOCK32 0x011B ///< Frame buffer block 32. -#define GPUREG_DEPTHBUFFER_LOC 0x011C ///< Depth buffer location. -#define GPUREG_COLORBUFFER_LOC 0x011D ///< Color buffer location. -#define GPUREG_FRAMEBUFFER_DIM 0x011E ///< Frame buffer dimensions. -#define GPUREG_011F 0x011F ///< Unknown. -#define GPUREG_GAS_LIGHT_XY 0x0120 ///< Unknown. -#define GPUREG_GAS_LIGHT_Z 0x0121 ///< Unknown. -#define GPUREG_GAS_LIGHT_Z_COLOR 0x0122 ///< Unknown. -#define GPUREG_GAS_LUT_INDEX 0x0123 ///< Unknown. -#define GPUREG_GAS_LUT_DATA 0x0124 ///< Unknown. -#define GPUREG_0125 0x0125 ///< Unknown. -#define GPUREG_GAS_DELTAZ_DEPTH 0x0126 ///< Unknown. -#define GPUREG_0127 0x0127 ///< Unknown. -#define GPUREG_0128 0x0128 ///< Unknown. -#define GPUREG_0129 0x0129 ///< Unknown. -#define GPUREG_012A 0x012A ///< Unknown. -#define GPUREG_012B 0x012B ///< Unknown. -#define GPUREG_012C 0x012C ///< Unknown. -#define GPUREG_012D 0x012D ///< Unknown. -#define GPUREG_012E 0x012E ///< Unknown. -#define GPUREG_012F 0x012F ///< Unknown. -#define GPUREG_FRAGOP_SHADOW 0x0130 ///< Unknown. -#define GPUREG_0131 0x0131 ///< Unknown. -#define GPUREG_0132 0x0132 ///< Unknown. -#define GPUREG_0133 0x0133 ///< Unknown. -#define GPUREG_0134 0x0134 ///< Unknown. -#define GPUREG_0135 0x0135 ///< Unknown. -#define GPUREG_0136 0x0136 ///< Unknown. -#define GPUREG_0137 0x0137 ///< Unknown. -#define GPUREG_0138 0x0138 ///< Unknown. -#define GPUREG_0139 0x0139 ///< Unknown. -#define GPUREG_013A 0x013A ///< Unknown. -#define GPUREG_013B 0x013B ///< Unknown. -#define GPUREG_013C 0x013C ///< Unknown. -#define GPUREG_013D 0x013D ///< Unknown. -#define GPUREG_013E 0x013E ///< Unknown. -#define GPUREG_013F 0x013F ///< Unknown. -///@} - -///@name Fragment lighting registers (0x140-0x1FF) -///@{ -#define GPUREG_LIGHT0_SPECULAR0 0x0140 ///< Light 0 specular lighting. -#define GPUREG_LIGHT0_SPECULAR1 0x0141 ///< Light 0 specular lighting. -#define GPUREG_LIGHT0_DIFFUSE 0x0142 ///< Light 0 diffuse lighting. -#define GPUREG_LIGHT0_AMBIENT 0x0143 ///< Light 0 ambient lighting. -#define GPUREG_LIGHT0_XY 0x0144 ///< Light 0 X and Y. -#define GPUREG_LIGHT0_Z 0x0145 ///< Light 0 Z. -#define GPUREG_LIGHT0_SPOTDIR_XY 0x0146 ///< Light 0 spotlight direction X and Y. -#define GPUREG_LIGHT0_SPOTDIR_Z 0x0147 ///< Light 0 spotlight direction Z. -#define GPUREG_0148 0x0148 ///< Unknown. -#define GPUREG_LIGHT0_CONFIG 0x0149 ///< Light 0 configuration. -#define GPUREG_LIGHT0_ATTENUATION_BIAS 0x014A ///< Light 0 attenuation bias. -#define GPUREG_LIGHT0_ATTENUATION_SCALE 0x014B ///< Light 0 attenuation scale. -#define GPUREG_014C 0x014C ///< Unknown. -#define GPUREG_014D 0x014D ///< Unknown. -#define GPUREG_014E 0x014E ///< Unknown. -#define GPUREG_014F 0x014F ///< Unknown. -#define GPUREG_LIGHT1_SPECULAR0 0x0150 ///< Light 1 specular lighting. -#define GPUREG_LIGHT1_SPECULAR1 0x0151 ///< Light 1 specular lighting. -#define GPUREG_LIGHT1_DIFFUSE 0x0152 ///< Light 1 diffuse lighting. -#define GPUREG_LIGHT1_AMBIENT 0x0153 ///< Light 1 ambient lighting. -#define GPUREG_LIGHT1_XY 0x0154 ///< Light 1 X and Y. -#define GPUREG_LIGHT1_Z 0x0155 ///< Light 1 Z. -#define GPUREG_LIGHT1_SPOTDIR_XY 0x0156 ///< Light 1 spotlight direction X and Y. -#define GPUREG_LIGHT1_SPOTDIR_Z 0x0157 ///< Light 1 spotlight direction Z. -#define GPUREG_0158 0x0158 ///< Unknown. -#define GPUREG_LIGHT1_CONFIG 0x0159 ///< Light 1 configuration. -#define GPUREG_LIGHT1_ATTENUATION_BIAS 0x015A ///< Light 1 attenuation bias. -#define GPUREG_LIGHT1_ATTENUATION_SCALE 0x015B ///< Light 1 attenuation scale. -#define GPUREG_015C 0x015C ///< Unknown. -#define GPUREG_015D 0x015D ///< Unknown. -#define GPUREG_015E 0x015E ///< Unknown. -#define GPUREG_015F 0x015F ///< Unknown. -#define GPUREG_LIGHT2_SPECULAR0 0x0160 ///< Light 2 specular lighting. -#define GPUREG_LIGHT2_SPECULAR1 0x0161 ///< Light 2 specular lighting. -#define GPUREG_LIGHT2_DIFFUSE 0x0162 ///< Light 2 diffuse lighting. -#define GPUREG_LIGHT2_AMBIENT 0x0163 ///< Light 2 ambient lighting. -#define GPUREG_LIGHT2_XY 0x0164 ///< Light 2 X and Y. -#define GPUREG_LIGHT2_Z 0x0165 ///< Light 2 Z. -#define GPUREG_LIGHT2_SPOTDIR_XY 0x0166 ///< Light 2 spotlight direction X and Y. -#define GPUREG_LIGHT2_SPOTDIR_Z 0x0167 ///< Light 2 spotlight direction Z. -#define GPUREG_0168 0x0168 ///< Unknown. -#define GPUREG_LIGHT2_CONFIG 0x0169 ///< Light 2 configuration. -#define GPUREG_LIGHT2_ATTENUATION_BIAS 0x016A ///< Light 2 attenuation bias. -#define GPUREG_LIGHT2_ATTENUATION_SCALE 0x016B ///< Light 2 attenuation scale. -#define GPUREG_016C 0x016C ///< Unknown. -#define GPUREG_016D 0x016D ///< Unknown. -#define GPUREG_016E 0x016E ///< Unknown. -#define GPUREG_016F 0x016F ///< Unknown. -#define GPUREG_LIGHT3_SPECULAR0 0x0170 ///< Light 3 specular lighting. -#define GPUREG_LIGHT3_SPECULAR1 0x0171 ///< Light 3 specular lighting. -#define GPUREG_LIGHT3_DIFFUSE 0x0172 ///< Light 3 diffuse lighting. -#define GPUREG_LIGHT3_AMBIENT 0x0173 ///< Light 3 ambient lighting. -#define GPUREG_LIGHT3_XY 0x0174 ///< Light 3 X and Y. -#define GPUREG_LIGHT3_Z 0x0175 ///< Light 3 Z. -#define GPUREG_LIGHT3_SPOTDIR_XY 0x0176 ///< Light 3 spotlight direction X and Y. -#define GPUREG_LIGHT3_SPOTDIR_Z 0x0177 ///< Light 3 spotlight direction Z. -#define GPUREG_0178 0x0178 ///< Unknown. -#define GPUREG_LIGHT3_CONFIG 0x0179 ///< Light 3 configuration. -#define GPUREG_LIGHT3_ATTENUATION_BIAS 0x017A ///< Light 3 attenuation bias. -#define GPUREG_LIGHT3_ATTENUATION_SCALE 0x017B ///< Light 3 attenuation scale. -#define GPUREG_017C 0x017C ///< Unknown. -#define GPUREG_017D 0x017D ///< Unknown. -#define GPUREG_017E 0x017E ///< Unknown. -#define GPUREG_017F 0x017F ///< Unknown. -#define GPUREG_LIGHT4_SPECULAR0 0x0180 ///< Light 4 specular lighting. -#define GPUREG_LIGHT4_SPECULAR1 0x0181 ///< Light 4 specular lighting. -#define GPUREG_LIGHT4_DIFFUSE 0x0182 ///< Light 4 diffuse lighting. -#define GPUREG_LIGHT4_AMBIENT 0x0183 ///< Light 4 ambient lighting. -#define GPUREG_LIGHT4_XY 0x0184 ///< Light 4 X and Y. -#define GPUREG_LIGHT4_Z 0x0185 ///< Light 4 Z. -#define GPUREG_LIGHT4_SPOTDIR_XY 0x0186 ///< Light 4 spotlight direction X and Y. -#define GPUREG_LIGHT4_SPOTDIR_Z 0x0187 ///< Light 4 spotlight direction Z. -#define GPUREG_0188 0x0188 ///< Unknown. -#define GPUREG_LIGHT4_CONFIG 0x0189 ///< Light 4 configuration. -#define GPUREG_LIGHT4_ATTENUATION_BIAS 0x018A ///< Light 4 attenuation bias. -#define GPUREG_LIGHT4_ATTENUATION_SCALE 0x018B ///< Light 4 attenuation scale. -#define GPUREG_018C 0x018C ///< Unknown. -#define GPUREG_018D 0x018D ///< Unknown. -#define GPUREG_018E 0x018E ///< Unknown. -#define GPUREG_018F 0x018F ///< Unknown. -#define GPUREG_LIGHT5_SPECULAR0 0x0190 ///< Light 5 specular lighting. -#define GPUREG_LIGHT5_SPECULAR1 0x0191 ///< Light 5 specular lighting. -#define GPUREG_LIGHT5_DIFFUSE 0x0192 ///< Light 5 diffuse lighting. -#define GPUREG_LIGHT5_AMBIENT 0x0193 ///< Light 5 ambient lighting. -#define GPUREG_LIGHT5_XY 0x0194 ///< Light 5 X and Y. -#define GPUREG_LIGHT5_Z 0x0195 ///< Light 5 Z. -#define GPUREG_LIGHT5_SPOTDIR_XY 0x0196 ///< Light 5 spotlight direction X and Y. -#define GPUREG_LIGHT5_SPOTDIR_Z 0x0197 ///< Light 5 spotlight direction Z. -#define GPUREG_0198 0x0198 ///< Unknown. -#define GPUREG_LIGHT5_CONFIG 0x0199 ///< Light 5 configuration. -#define GPUREG_LIGHT5_ATTENUATION_BIAS 0x019A ///< Light 5 attenuation bias. -#define GPUREG_LIGHT5_ATTENUATION_SCALE 0x019B ///< Light 5 attenuation scale. -#define GPUREG_019C 0x019C ///< Unknown. -#define GPUREG_019D 0x019D ///< Unknown. -#define GPUREG_019E 0x019E ///< Unknown. -#define GPUREG_019F 0x019F ///< Unknown. -#define GPUREG_LIGHT6_SPECULAR0 0x01A0 ///< Light 6 specular lighting. -#define GPUREG_LIGHT6_SPECULAR1 0x01A1 ///< Light 6 specular lighting. -#define GPUREG_LIGHT6_DIFFUSE 0x01A2 ///< Light 6 diffuse lighting. -#define GPUREG_LIGHT6_AMBIENT 0x01A3 ///< Light 6 ambient lighting. -#define GPUREG_LIGHT6_XY 0x01A4 ///< Light 6 X and Y. -#define GPUREG_LIGHT6_Z 0x01A5 ///< Light 6 Z. -#define GPUREG_LIGHT6_SPOTDIR_XY 0x01A6 ///< Light 6 spotlight direction X and Y. -#define GPUREG_LIGHT6_SPOTDIR_Z 0x01A7 ///< Light 6 spotlight direction Z. -#define GPUREG_01A8 0x01A8 ///< Unknown. -#define GPUREG_LIGHT6_CONFIG 0x01A9 ///< Light 6 configuration. -#define GPUREG_LIGHT6_ATTENUATION_BIAS 0x01AA ///< Light 6 attenuation bias. -#define GPUREG_LIGHT6_ATTENUATION_SCALE 0x01AB ///< Light 6 attenuation scale. -#define GPUREG_01AC 0x01AC ///< Unknown. -#define GPUREG_01AD 0x01AD ///< Unknown. -#define GPUREG_01AE 0x01AE ///< Unknown. -#define GPUREG_01AF 0x01AF ///< Unknown. -#define GPUREG_LIGHT7_SPECULAR0 0x01B0 ///< Light 7 specular lighting. -#define GPUREG_LIGHT7_SPECULAR1 0x01B1 ///< Light 7 specular lighting. -#define GPUREG_LIGHT7_DIFFUSE 0x01B2 ///< Light 7 diffuse lighting. -#define GPUREG_LIGHT7_AMBIENT 0x01B3 ///< Light 7 ambient lighting. -#define GPUREG_LIGHT7_XY 0x01B4 ///< Light 7 X and Y. -#define GPUREG_LIGHT7_Z 0x01B5 ///< Light 7 Z. -#define GPUREG_LIGHT7_SPOTDIR_XY 0x01B6 ///< Light 7 spotlight direction X and Y. -#define GPUREG_LIGHT7_SPOTDIR_Z 0x01B7 ///< Light 7 spotlight direction Z. -#define GPUREG_01B8 0x01B8 ///< Unknown. -#define GPUREG_LIGHT7_CONFIG 0x01B9 ///< Light 7 configuration. -#define GPUREG_LIGHT7_ATTENUATION_BIAS 0x01BA ///< Light 7 attenuation bias. -#define GPUREG_LIGHT7_ATTENUATION_SCALE 0x01BB ///< Light 7 attenuation scale. -#define GPUREG_01BC 0x01BC ///< Unknown. -#define GPUREG_01BD 0x01BD ///< Unknown. -#define GPUREG_01BE 0x01BE ///< Unknown. -#define GPUREG_01BF 0x01BF ///< Unknown. -#define GPUREG_LIGHTING_AMBIENT 0x01C0 ///< Ambient lighting. -#define GPUREG_01C1 0x01C1 ///< Unknown. -#define GPUREG_LIGHTING_NUM_LIGHTS 0x01C2 ///< Number of lights. -#define GPUREG_LIGHTING_CONFIG0 0x01C3 ///< Lighting configuration. -#define GPUREG_LIGHTING_CONFIG1 0x01C4 ///< Lighting configuration. -#define GPUREG_LIGHTING_LUT_INDEX 0x01C5 ///< LUT index. -#define GPUREG_LIGHTING_ENABLE1 0x01C6 ///< Lighting toggle. -#define GPUREG_01C7 0x01C7 ///< Unknown. -#define GPUREG_LIGHTING_LUT_DATA0 0x01C8 ///< LUT data 0. -#define GPUREG_LIGHTING_LUT_DATA1 0x01C9 ///< LUT data 1. -#define GPUREG_LIGHTING_LUT_DATA2 0x01CA ///< LUT data 2. -#define GPUREG_LIGHTING_LUT_DATA3 0x01CB ///< LUT data 3. -#define GPUREG_LIGHTING_LUT_DATA4 0x01CC ///< LUT data 4. -#define GPUREG_LIGHTING_LUT_DATA5 0x01CD ///< LUT data 5. -#define GPUREG_LIGHTING_LUT_DATA6 0x01CE ///< LUT data 6. -#define GPUREG_LIGHTING_LUT_DATA7 0x01CF ///< LUT data 7. -#define GPUREG_LIGHTING_LUTINPUT_ABS 0x01D0 ///< LUT input abs. -#define GPUREG_LIGHTING_LUTINPUT_SELECT 0x01D1 ///< LUT input selector. -#define GPUREG_LIGHTING_LUTINPUT_SCALE 0x01D2 ///< LUT input scale. -#define GPUREG_01D3 0x01D3 ///< Unknown. -#define GPUREG_01D4 0x01D4 ///< Unknown. -#define GPUREG_01D5 0x01D5 ///< Unknown. -#define GPUREG_01D6 0x01D6 ///< Unknown. -#define GPUREG_01D7 0x01D7 ///< Unknown. -#define GPUREG_01D8 0x01D8 ///< Unknown. -#define GPUREG_LIGHTING_LIGHT_PERMUTATION 0x01D9 ///< Light permutation. -#define GPUREG_01DA 0x01DA ///< Unknown. -#define GPUREG_01DB 0x01DB ///< Unknown. -#define GPUREG_01DC 0x01DC ///< Unknown. -#define GPUREG_01DD 0x01DD ///< Unknown. -#define GPUREG_01DE 0x01DE ///< Unknown. -#define GPUREG_01DF 0x01DF ///< Unknown. -#define GPUREG_01E0 0x01E0 ///< Unknown. -#define GPUREG_01E1 0x01E1 ///< Unknown. -#define GPUREG_01E2 0x01E2 ///< Unknown. -#define GPUREG_01E3 0x01E3 ///< Unknown. -#define GPUREG_01E4 0x01E4 ///< Unknown. -#define GPUREG_01E5 0x01E5 ///< Unknown. -#define GPUREG_01E6 0x01E6 ///< Unknown. -#define GPUREG_01E7 0x01E7 ///< Unknown. -#define GPUREG_01E8 0x01E8 ///< Unknown. -#define GPUREG_01E9 0x01E9 ///< Unknown. -#define GPUREG_01EA 0x01EA ///< Unknown. -#define GPUREG_01EB 0x01EB ///< Unknown. -#define GPUREG_01EC 0x01EC ///< Unknown. -#define GPUREG_01ED 0x01ED ///< Unknown. -#define GPUREG_01EE 0x01EE ///< Unknown. -#define GPUREG_01EF 0x01EF ///< Unknown. -#define GPUREG_01F0 0x01F0 ///< Unknown. -#define GPUREG_01F1 0x01F1 ///< Unknown. -#define GPUREG_01F2 0x01F2 ///< Unknown. -#define GPUREG_01F3 0x01F3 ///< Unknown. -#define GPUREG_01F4 0x01F4 ///< Unknown. -#define GPUREG_01F5 0x01F5 ///< Unknown. -#define GPUREG_01F6 0x01F6 ///< Unknown. -#define GPUREG_01F7 0x01F7 ///< Unknown. -#define GPUREG_01F8 0x01F8 ///< Unknown. -#define GPUREG_01F9 0x01F9 ///< Unknown. -#define GPUREG_01FA 0x01FA ///< Unknown. -#define GPUREG_01FB 0x01FB ///< Unknown. -#define GPUREG_01FC 0x01FC ///< Unknown. -#define GPUREG_01FD 0x01FD ///< Unknown. -#define GPUREG_01FE 0x01FE ///< Unknown. -#define GPUREG_01FF 0x01FF ///< Unknown. -///@} - -///@name Geometry pipeline registers (0x200-0x27F) -///@{ -#define GPUREG_ATTRIBBUFFERS_LOC 0x0200 ///< Attribute buffers location. -#define GPUREG_ATTRIBBUFFERS_FORMAT_LOW 0x0201 ///< Attribute buffers format low. -#define GPUREG_ATTRIBBUFFERS_FORMAT_HIGH 0x0202 ///< Attribute buffers format high. -#define GPUREG_ATTRIBBUFFER0_OFFSET 0x0203 ///< Attribute buffers 0 offset. -#define GPUREG_ATTRIBBUFFER0_CONFIG1 0x0204 ///< Attribute buffers 0 configuration. -#define GPUREG_ATTRIBBUFFER0_CONFIG2 0x0205 ///< Attribute buffers 0 configuration. -#define GPUREG_ATTRIBBUFFER1_OFFSET 0x0206 ///< Attribute buffers 1 offset. -#define GPUREG_ATTRIBBUFFER1_CONFIG1 0x0207 ///< Attribute buffers 1 configuration. -#define GPUREG_ATTRIBBUFFER1_CONFIG2 0x0208 ///< Attribute buffers 1 configuration. -#define GPUREG_ATTRIBBUFFER2_OFFSET 0x0209 ///< Attribute buffers 2 offset. -#define GPUREG_ATTRIBBUFFER2_CONFIG1 0x020A ///< Attribute buffers 2 configuration. -#define GPUREG_ATTRIBBUFFER2_CONFIG2 0x020B ///< Attribute buffers 2 configuration. -#define GPUREG_ATTRIBBUFFER3_OFFSET 0x020C ///< Attribute buffers 3 offset. -#define GPUREG_ATTRIBBUFFER3_CONFIG1 0x020D ///< Attribute buffers 3 configuration. -#define GPUREG_ATTRIBBUFFER3_CONFIG2 0x020E ///< Attribute buffers 3 configuration. -#define GPUREG_ATTRIBBUFFER4_OFFSET 0x020F ///< Attribute buffers 4 offset. -#define GPUREG_ATTRIBBUFFER4_CONFIG1 0x0210 ///< Attribute buffers 4 configuration. -#define GPUREG_ATTRIBBUFFER4_CONFIG2 0x0211 ///< Attribute buffers 4 configuration. -#define GPUREG_ATTRIBBUFFER5_OFFSET 0x0212 ///< Attribute buffers 5 offset. -#define GPUREG_ATTRIBBUFFER5_CONFIG1 0x0213 ///< Attribute buffers 5 configuration. -#define GPUREG_ATTRIBBUFFER5_CONFIG2 0x0214 ///< Attribute buffers 5 configuration. -#define GPUREG_ATTRIBBUFFER6_OFFSET 0x0215 ///< Attribute buffers 6 offset. -#define GPUREG_ATTRIBBUFFER6_CONFIG1 0x0216 ///< Attribute buffers 6 configuration. -#define GPUREG_ATTRIBBUFFER6_CONFIG2 0x0217 ///< Attribute buffers 6 configuration. -#define GPUREG_ATTRIBBUFFER7_OFFSET 0x0218 ///< Attribute buffers 7 offset. -#define GPUREG_ATTRIBBUFFER7_CONFIG1 0x0219 ///< Attribute buffers 7 configuration. -#define GPUREG_ATTRIBBUFFER7_CONFIG2 0x021A ///< Attribute buffers 7 configuration. -#define GPUREG_ATTRIBBUFFER8_OFFSET 0x021B ///< Attribute buffers 8 offset. -#define GPUREG_ATTRIBBUFFER8_CONFIG1 0x021C ///< Attribute buffers 8 configuration. -#define GPUREG_ATTRIBBUFFER8_CONFIG2 0x021D ///< Attribute buffers 8 configuration. -#define GPUREG_ATTRIBBUFFER9_OFFSET 0x021E ///< Attribute buffers 9 offset. -#define GPUREG_ATTRIBBUFFER9_CONFIG1 0x021F ///< Attribute buffers 9 configuration. -#define GPUREG_ATTRIBBUFFER9_CONFIG2 0x0220 ///< Attribute buffers 9 configuration. -#define GPUREG_ATTRIBBUFFERA_OFFSET 0x0221 ///< Attribute buffers A offset. -#define GPUREG_ATTRIBBUFFERA_CONFIG1 0x0222 ///< Attribute buffers A configuration. -#define GPUREG_ATTRIBBUFFERA_CONFIG2 0x0223 ///< Attribute buffers A configuration. -#define GPUREG_ATTRIBBUFFERB_OFFSET 0x0224 ///< Attribute buffers B offset. -#define GPUREG_ATTRIBBUFFERB_CONFIG1 0x0225 ///< Attribute buffers B configuration. -#define GPUREG_ATTRIBBUFFERB_CONFIG2 0x0226 ///< Attribute buffers B configuration. -#define GPUREG_INDEXBUFFER_CONFIG 0x0227 ///< Index buffer configuration. -#define GPUREG_NUMVERTICES 0x0228 ///< Number of vertices. -#define GPUREG_GEOSTAGE_CONFIG 0x0229 ///< Geometry stage configuration. -#define GPUREG_VERTEX_OFFSET 0x022A ///< Vertex offset. -#define GPUREG_022B 0x022B ///< Unknown. -#define GPUREG_022C 0x022C ///< Unknown. -#define GPUREG_POST_VERTEX_CACHE_NUM 0x022D ///< Unknown. -#define GPUREG_DRAWARRAYS 0x022E ///< Draw arrays trigger. -#define GPUREG_DRAWELEMENTS 0x022F ///< Draw arrays elements. -#define GPUREG_0230 0x0230 ///< Unknown. -#define GPUREG_VTX_FUNC 0x0231 ///< Unknown. -#define GPUREG_FIXEDATTRIB_INDEX 0x0232 ///< Fixed attribute index. -#define GPUREG_FIXEDATTRIB_DATA0 0x0233 ///< Fixed attribute data 0. -#define GPUREG_FIXEDATTRIB_DATA1 0x0234 ///< Fixed attribute data 1. -#define GPUREG_FIXEDATTRIB_DATA2 0x0235 ///< Fixed attribute data 2. -#define GPUREG_0236 0x0236 ///< Unknown. -#define GPUREG_0237 0x0237 ///< Unknown. -#define GPUREG_CMDBUF_SIZE0 0x0238 ///< Command buffer size 0. -#define GPUREG_CMDBUF_SIZE1 0x0239 ///< Command buffer size 1. -#define GPUREG_CMDBUF_ADDR0 0x023A ///< Command buffer address 0. -#define GPUREG_CMDBUF_ADDR1 0x023B ///< Command buffer address 1. -#define GPUREG_CMDBUF_JUMP0 0x023C ///< Command buffer jump 0. -#define GPUREG_CMDBUF_JUMP1 0x023D ///< Command buffer jump 1. -#define GPUREG_023E 0x023E ///< Unknown. -#define GPUREG_023F 0x023F ///< Unknown. -#define GPUREG_0240 0x0240 ///< Unknown. -#define GPUREG_0241 0x0241 ///< Unknown. -#define GPUREG_VSH_NUM_ATTR 0x0242 ///< Unknown. -#define GPUREG_0243 0x0243 ///< Unknown. -#define GPUREG_VSH_COM_MODE 0x0244 ///< Unknown. -#define GPUREG_START_DRAW_FUNC0 0x0245 ///< Unknown. -#define GPUREG_0246 0x0246 ///< Unknown. -#define GPUREG_0247 0x0247 ///< Unknown. -#define GPUREG_0248 0x0248 ///< Unknown. -#define GPUREG_0249 0x0249 ///< Unknown. -#define GPUREG_VSH_OUTMAP_TOTAL1 0x024A ///< Unknown. -#define GPUREG_024B 0x024B ///< Unknown. -#define GPUREG_024C 0x024C ///< Unknown. -#define GPUREG_024D 0x024D ///< Unknown. -#define GPUREG_024E 0x024E ///< Unknown. -#define GPUREG_024F 0x024F ///< Unknown. -#define GPUREG_0250 0x0250 ///< Unknown. -#define GPUREG_VSH_OUTMAP_TOTAL2 0x0251 ///< Unknown. -#define GPUREG_GSH_MISC0 0x0252 ///< Unknown. -#define GPUREG_GEOSTAGE_CONFIG2 0x0253 ///< Unknown. -#define GPUREG_GSH_MISC1 0x0254 ///< Unknown. -#define GPUREG_0255 0x0255 ///< Unknown. -#define GPUREG_0256 0x0256 ///< Unknown. -#define GPUREG_0257 0x0257 ///< Unknown. -#define GPUREG_0258 0x0258 ///< Unknown. -#define GPUREG_0259 0x0259 ///< Unknown. -#define GPUREG_025A 0x025A ///< Unknown. -#define GPUREG_025B 0x025B ///< Unknown. -#define GPUREG_025C 0x025C ///< Unknown. -#define GPUREG_025D 0x025D ///< Unknown. -#define GPUREG_PRIMITIVE_CONFIG 0x025E ///< Primitive configuration. -#define GPUREG_RESTART_PRIMITIVE 0x025F ///< Restart primitive flag. -#define GPUREG_0260 0x0260 ///< Unknown. -#define GPUREG_0261 0x0261 ///< Unknown. -#define GPUREG_0262 0x0262 ///< Unknown. -#define GPUREG_0263 0x0263 ///< Unknown. -#define GPUREG_0264 0x0264 ///< Unknown. -#define GPUREG_0265 0x0265 ///< Unknown. -#define GPUREG_0266 0x0266 ///< Unknown. -#define GPUREG_0267 0x0267 ///< Unknown. -#define GPUREG_0268 0x0268 ///< Unknown. -#define GPUREG_0269 0x0269 ///< Unknown. -#define GPUREG_026A 0x026A ///< Unknown. -#define GPUREG_026B 0x026B ///< Unknown. -#define GPUREG_026C 0x026C ///< Unknown. -#define GPUREG_026D 0x026D ///< Unknown. -#define GPUREG_026E 0x026E ///< Unknown. -#define GPUREG_026F 0x026F ///< Unknown. -#define GPUREG_0270 0x0270 ///< Unknown. -#define GPUREG_0271 0x0271 ///< Unknown. -#define GPUREG_0272 0x0272 ///< Unknown. -#define GPUREG_0273 0x0273 ///< Unknown. -#define GPUREG_0274 0x0274 ///< Unknown. -#define GPUREG_0275 0x0275 ///< Unknown. -#define GPUREG_0276 0x0276 ///< Unknown. -#define GPUREG_0277 0x0277 ///< Unknown. -#define GPUREG_0278 0x0278 ///< Unknown. -#define GPUREG_0279 0x0279 ///< Unknown. -#define GPUREG_027A 0x027A ///< Unknown. -#define GPUREG_027B 0x027B ///< Unknown. -#define GPUREG_027C 0x027C ///< Unknown. -#define GPUREG_027D 0x027D ///< Unknown. -#define GPUREG_027E 0x027E ///< Unknown. -#define GPUREG_027F 0x027F ///< Unknown. -///@} - -///@name Geometry shader registers (0x280-0x2AF) -///@{ -#define GPUREG_GSH_BOOLUNIFORM 0x0280 ///< Geometry shader bool uniforms. -#define GPUREG_GSH_INTUNIFORM_I0 0x0281 ///< Geometry shader integer uniform 0. -#define GPUREG_GSH_INTUNIFORM_I1 0x0282 ///< Geometry shader integer uniform 1. -#define GPUREG_GSH_INTUNIFORM_I2 0x0283 ///< Geometry shader integer uniform 2. -#define GPUREG_GSH_INTUNIFORM_I3 0x0284 ///< Geometry shader integer uniform 3. -#define GPUREG_0285 0x0285 ///< Unknown. -#define GPUREG_0286 0x0286 ///< Unknown. -#define GPUREG_0287 0x0287 ///< Unknown. -#define GPUREG_0288 0x0288 ///< Unknown. -#define GPUREG_GSH_INPUTBUFFER_CONFIG 0x0289 ///< Geometry shader input buffer configuration. -#define GPUREG_GSH_ENTRYPOINT 0x028A ///< Geometry shader entry point. -#define GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW 0x028B ///< Geometry shader attribute permutations low. -#define GPUREG_GSH_ATTRIBUTES_PERMUTATION_HIGH 0x028C ///< Geometry shader attribute permutations high. -#define GPUREG_GSH_OUTMAP_MASK 0x028D ///< Geometry shader output map mask. -#define GPUREG_028E 0x028E ///< Unknown. -#define GPUREG_GSH_CODETRANSFER_END 0x028F ///< Geometry shader code transfer end trigger. -#define GPUREG_GSH_FLOATUNIFORM_CONFIG 0x0290 ///< Geometry shader float uniform configuration. -#define GPUREG_GSH_FLOATUNIFORM_DATA 0x0291 ///< Geometry shader float uniform data. -#define GPUREG_0299 0x0299 ///< Unknown. -#define GPUREG_029A 0x029A ///< Unknown. -#define GPUREG_GSH_CODETRANSFER_CONFIG 0x029B ///< Geometry shader code transfer configuration. -#define GPUREG_GSH_CODETRANSFER_DATA 0x029C ///< Geometry shader code transfer data. -#define GPUREG_02A4 0x02A4 ///< Unknown. -#define GPUREG_GSH_OPDESCS_CONFIG 0x02A5 ///< Geometry shader operand description configuration. -#define GPUREG_GSH_OPDESCS_DATA 0x02A6 ///< Geometry shader operand description data. -#define GPUREG_02AE 0x02AE ///< Unknown. -#define GPUREG_02AF 0x02AF ///< Unknown. -///@} - -///@name Vertex shader registers (0x2B0-0x2DF) -///@{ -#define GPUREG_VSH_BOOLUNIFORM 0x02B0 ///< Vertex shader bool uniforms. -#define GPUREG_VSH_INTUNIFORM_I0 0x02B1 ///< Vertex shader integer uniform 0. -#define GPUREG_VSH_INTUNIFORM_I1 0x02B2 ///< Vertex shader integer uniform 1. -#define GPUREG_VSH_INTUNIFORM_I2 0x02B3 ///< Vertex shader integer uniform 2. -#define GPUREG_VSH_INTUNIFORM_I3 0x02B4 ///< Vertex shader integer uniform 3. -#define GPUREG_02B5 0x02B5 ///< Unknown. -#define GPUREG_02B6 0x02B6 ///< Unknown. -#define GPUREG_02B7 0x02B7 ///< Unknown. -#define GPUREG_02B8 0x02B8 ///< Unknown. -#define GPUREG_VSH_INPUTBUFFER_CONFIG 0x02B9 ///< Vertex shader input buffer configuration. -#define GPUREG_VSH_ENTRYPOINT 0x02BA ///< Vertex shader entry point. -#define GPUREG_VSH_ATTRIBUTES_PERMUTATION_LOW 0x02BB ///< Vertex shader attribute permutations low. -#define GPUREG_VSH_ATTRIBUTES_PERMUTATION_HIGH 0x02BC ///< Vertex shader attribute permutations high. -#define GPUREG_VSH_OUTMAP_MASK 0x02BD ///< Vertex shader output map mask. -#define GPUREG_02BE 0x02BE ///< Unknown. -#define GPUREG_VSH_CODETRANSFER_END 0x02BF ///< Vertex shader code transfer end trigger. -#define GPUREG_VSH_FLOATUNIFORM_CONFIG 0x02C0 ///< Vertex shader float uniform configuration. -#define GPUREG_VSH_FLOATUNIFORM_DATA 0x02C1 ///< Vertex shader float uniform data. -#define GPUREG_02C9 0x02C9 ///< Unknown. -#define GPUREG_02CA 0x02CA ///< Unknown. -#define GPUREG_VSH_CODETRANSFER_CONFIG 0x02CB ///< Vertex shader code transfer configuration. -#define GPUREG_VSH_CODETRANSFER_DATA 0x02CC ///< Vertex shader code transfer data. -#define GPUREG_02D4 0x02D4 ///< Unknown. -#define GPUREG_VSH_OPDESCS_CONFIG 0x02D5 ///< Vertex shader operand description configuration. -#define GPUREG_VSH_OPDESCS_DATA 0x02D6 ///< Vertex shader operand description data. -#define GPUREG_02DE 0x02DE ///< Unknown. -#define GPUREG_02DF 0x02DF ///< Unknown. -///@} - -///@name Unknown registers (0x2E0-0x2FF) -///@{ -#define GPUREG_02E0 0x02E0 ///< Unknown. -#define GPUREG_02E1 0x02E1 ///< Unknown. -#define GPUREG_02E2 0x02E2 ///< Unknown. -#define GPUREG_02E3 0x02E3 ///< Unknown. -#define GPUREG_02E4 0x02E4 ///< Unknown. -#define GPUREG_02E5 0x02E5 ///< Unknown. -#define GPUREG_02E6 0x02E6 ///< Unknown. -#define GPUREG_02E7 0x02E7 ///< Unknown. -#define GPUREG_02E8 0x02E8 ///< Unknown. -#define GPUREG_02E9 0x02E9 ///< Unknown. -#define GPUREG_02EA 0x02EA ///< Unknown. -#define GPUREG_02EB 0x02EB ///< Unknown. -#define GPUREG_02EC 0x02EC ///< Unknown. -#define GPUREG_02ED 0x02ED ///< Unknown. -#define GPUREG_02EE 0x02EE ///< Unknown. -#define GPUREG_02EF 0x02EF ///< Unknown. -#define GPUREG_02F0 0x02F0 ///< Unknown. -#define GPUREG_02F1 0x02F1 ///< Unknown. -#define GPUREG_02F2 0x02F2 ///< Unknown. -#define GPUREG_02F3 0x02F3 ///< Unknown. -#define GPUREG_02F4 0x02F4 ///< Unknown. -#define GPUREG_02F5 0x02F5 ///< Unknown. -#define GPUREG_02F6 0x02F6 ///< Unknown. -#define GPUREG_02F7 0x02F7 ///< Unknown. -#define GPUREG_02F8 0x02F8 ///< Unknown. -#define GPUREG_02F9 0x02F9 ///< Unknown. -#define GPUREG_02FA 0x02FA ///< Unknown. -#define GPUREG_02FB 0x02FB ///< Unknown. -#define GPUREG_02FC 0x02FC ///< Unknown. -#define GPUREG_02FD 0x02FD ///< Unknown. -#define GPUREG_02FE 0x02FE ///< Unknown. -#define GPUREG_02FF 0x02FF ///< Unknown. -///@} +/** + * @file registers.h + * @description GPU registers. + */ +#pragma once + +///@name Miscellaneous registers (0x000-0x03F) +///@{ +#define GPUREG_0000 0x0000 ///< Unknown. +#define GPUREG_0001 0x0001 ///< Unknown. +#define GPUREG_0002 0x0002 ///< Unknown. +#define GPUREG_0003 0x0003 ///< Unknown. +#define GPUREG_0004 0x0004 ///< Unknown. +#define GPUREG_0005 0x0005 ///< Unknown. +#define GPUREG_0006 0x0006 ///< Unknown. +#define GPUREG_0007 0x0007 ///< Unknown. +#define GPUREG_0008 0x0008 ///< Unknown. +#define GPUREG_0009 0x0009 ///< Unknown. +#define GPUREG_000A 0x000A ///< Unknown. +#define GPUREG_000B 0x000B ///< Unknown. +#define GPUREG_000C 0x000C ///< Unknown. +#define GPUREG_000D 0x000D ///< Unknown. +#define GPUREG_000E 0x000E ///< Unknown. +#define GPUREG_000F 0x000F ///< Unknown. +#define GPUREG_FINALIZE 0x0010 ///< Used to finalize GPU drawing. +#define GPUREG_0011 0x0011 ///< Unknown. +#define GPUREG_0012 0x0012 ///< Unknown. +#define GPUREG_0013 0x0013 ///< Unknown. +#define GPUREG_0014 0x0014 ///< Unknown. +#define GPUREG_0015 0x0015 ///< Unknown. +#define GPUREG_0016 0x0016 ///< Unknown. +#define GPUREG_0017 0x0017 ///< Unknown. +#define GPUREG_0018 0x0018 ///< Unknown. +#define GPUREG_0019 0x0019 ///< Unknown. +#define GPUREG_001A 0x001A ///< Unknown. +#define GPUREG_001B 0x001B ///< Unknown. +#define GPUREG_001C 0x001C ///< Unknown. +#define GPUREG_001D 0x001D ///< Unknown. +#define GPUREG_001E 0x001E ///< Unknown. +#define GPUREG_001F 0x001F ///< Unknown. +#define GPUREG_0020 0x0020 ///< Unknown. +#define GPUREG_0021 0x0021 ///< Unknown. +#define GPUREG_0022 0x0022 ///< Unknown. +#define GPUREG_0023 0x0023 ///< Unknown. +#define GPUREG_0024 0x0024 ///< Unknown. +#define GPUREG_0025 0x0025 ///< Unknown. +#define GPUREG_0026 0x0026 ///< Unknown. +#define GPUREG_0027 0x0027 ///< Unknown. +#define GPUREG_0028 0x0028 ///< Unknown. +#define GPUREG_0029 0x0029 ///< Unknown. +#define GPUREG_002A 0x002A ///< Unknown. +#define GPUREG_002B 0x002B ///< Unknown. +#define GPUREG_002C 0x002C ///< Unknown. +#define GPUREG_002D 0x002D ///< Unknown. +#define GPUREG_002E 0x002E ///< Unknown. +#define GPUREG_002F 0x002F ///< Unknown. +#define GPUREG_0030 0x0030 ///< Unknown. +#define GPUREG_0031 0x0031 ///< Unknown. +#define GPUREG_0032 0x0032 ///< Unknown. +#define GPUREG_0033 0x0033 ///< Unknown. +#define GPUREG_0034 0x0034 ///< Unknown. +#define GPUREG_0035 0x0035 ///< Unknown. +#define GPUREG_0036 0x0036 ///< Unknown. +#define GPUREG_0037 0x0037 ///< Unknown. +#define GPUREG_0038 0x0038 ///< Unknown. +#define GPUREG_0039 0x0039 ///< Unknown. +#define GPUREG_003A 0x003A ///< Unknown. +#define GPUREG_003B 0x003B ///< Unknown. +#define GPUREG_003C 0x003C ///< Unknown. +#define GPUREG_003D 0x003D ///< Unknown. +#define GPUREG_003E 0x003E ///< Unknown. +#define GPUREG_003F 0x003F ///< Unknown. +///@} + +///@name Rasterizer registers (0x040-0x07F) +///@{ +#define GPUREG_FACECULLING_CONFIG 0x0040 ///< Face culling configuration. +#define GPUREG_VIEWPORT_WIDTH 0x0041 ///< Viewport width. +#define GPUREG_VIEWPORT_INVW 0x0042 ///< Inverted viewport width. +#define GPUREG_VIEWPORT_HEIGHT 0x0043 ///< Viewport height. +#define GPUREG_VIEWPORT_INVH 0x0044 ///< Inverted viewport height. +#define GPUREG_0045 0x0045 ///< Unknown +#define GPUREG_0046 0x0046 ///< Unknown +#define GPUREG_FRAGOP_CLIP 0x0047 ///< Unknown +#define GPUREG_FRAGOP_CLIP_DATA0 0x0048 ///< Unknown +#define GPUREG_FRAGOP_CLIP_DATA1 0x0049 ///< Unknown +#define GPUREG_FRAGOP_CLIP_DATA2 0x004A ///< Unknown +#define GPUREG_FRAGOP_CLIP_DATA3 0x004B ///< Unknown +#define GPUREG_004C 0x004C ///< Unknown +#define GPUREG_DEPTHMAP_SCALE 0x004D ///< Depth map scale. +#define GPUREG_DEPTHMAP_OFFSET 0x004E ///< Depth map offset. +#define GPUREG_SH_OUTMAP_TOTAL 0x004F ///< Shader output map total. +#define GPUREG_SH_OUTMAP_O0 0x0050 ///< Shader output map 0. +#define GPUREG_SH_OUTMAP_O1 0x0051 ///< Shader output map 1. +#define GPUREG_SH_OUTMAP_O2 0x0052 ///< Shader output map 2. +#define GPUREG_SH_OUTMAP_O3 0x0053 ///< Shader output map 3. +#define GPUREG_SH_OUTMAP_O4 0x0054 ///< Shader output map 4. +#define GPUREG_SH_OUTMAP_O5 0x0055 ///< Shader output map 5. +#define GPUREG_SH_OUTMAP_O6 0x0056 ///< Shader output map 6. +#define GPUREG_0057 0x0057 ///< Unknown +#define GPUREG_0058 0x0058 ///< Unknown +#define GPUREG_0059 0x0059 ///< Unknown +#define GPUREG_005A 0x005A ///< Unknown +#define GPUREG_005B 0x005B ///< Unknown +#define GPUREG_005C 0x005C ///< Unknown +#define GPUREG_005D 0x005D ///< Unknown +#define GPUREG_005E 0x005E ///< Unknown +#define GPUREG_005F 0x005F ///< Unknown +#define GPUREG_0060 0x0060 ///< Unknown +#define GPUREG_EARLYDEPTH_FUNC 0x0061 ///< Unknown +#define GPUREG_EARLYDEPTH_TEST1 0x0062 ///< Unknown +#define GPUREG_EARLYDEPTH_CLEAR 0x0063 ///< Unknown +#define GPUREG_SH_OUTATTR_MODE 0x0064 ///< Shader output attributes mode. +#define GPUREG_SCISSORTEST_MODE 0x0065 ///< Scissor test mode. +#define GPUREG_SCISSORTEST_POS 0x0066 ///< Scissor test position. +#define GPUREG_SCISSORTEST_DIM 0x0067 ///< Scissor text dimensions. +#define GPUREG_VIEWPORT_XY 0x0068 ///< Viewport X and Y. +#define GPUREG_0069 0x0069 ///< Unknown +#define GPUREG_EARLYDEPTH_DATA 0x006A ///< Unknown +#define GPUREG_006B 0x006B ///< Unknown +#define GPUREG_006C 0x006C ///< Unknown +#define GPUREG_DEPTHMAP_ENABLE 0x006D ///< Depth map enable. +#define GPUREG_RENDERBUF_DIM 0x006E ///< Renderbuffer dimensions. +#define GPUREG_SH_OUTATTR_CLOCK 0x006F ///< Shader output attributes clock enable. +#define GPUREG_0070 0x0070 ///< Unknown +#define GPUREG_0071 0x0071 ///< Unknown +#define GPUREG_0072 0x0072 ///< Unknown +#define GPUREG_0073 0x0073 ///< Unknown +#define GPUREG_0074 0x0074 ///< Unknown +#define GPUREG_0075 0x0075 ///< Unknown +#define GPUREG_0076 0x0076 ///< Unknown +#define GPUREG_0077 0x0077 ///< Unknown +#define GPUREG_0078 0x0078 ///< Unknown +#define GPUREG_0079 0x0079 ///< Unknown +#define GPUREG_007A 0x007A ///< Unknown +#define GPUREG_007B 0x007B ///< Unknown +#define GPUREG_007C 0x007C ///< Unknown +#define GPUREG_007D 0x007D ///< Unknown +#define GPUREG_007E 0x007E ///< Unknown +#define GPUREG_007F 0x007F ///< Unknown +///@} + +///@name Texturing registers (0x080-0x0FF) +///@{ +#define GPUREG_TEXUNIT_CONFIG 0x0080 ///< Texture unit configuration. +#define GPUREG_TEXUNIT0_BORDER_COLOR 0x0081 ///< Texture unit 0 border color. +#define GPUREG_TEXUNIT0_DIM 0x0082 ///< Texture unit 0 dimensions. +#define GPUREG_TEXUNIT0_PARAM 0x0083 ///< Texture unit 0 parameters. +#define GPUREG_TEXUNIT0_LOD 0x0084 ///< Texture unit 0 LOD. +#define GPUREG_TEXUNIT0_ADDR1 0x0085 ///< Texture unit 0 address. +#define GPUREG_TEXUNIT0_ADDR2 0x0086 ///< Unknown. +#define GPUREG_TEXUNIT0_ADDR3 0x0087 ///< Unknown. +#define GPUREG_TEXUNIT0_ADDR4 0x0088 ///< Unknown. +#define GPUREG_TEXUNIT0_ADDR5 0x0089 ///< Unknown. +#define GPUREG_TEXUNIT0_ADDR6 0x008A ///< Unknown. +#define GPUREG_TEXUNIT0_SHADOW 0x008B ///< Unknown. +#define GPUREG_008C 0x008C ///< Unknown. +#define GPUREG_008D 0x008D ///< Unknown. +#define GPUREG_TEXUNIT0_TYPE 0x008E ///< Texture unit 0 type. +#define GPUREG_LIGHTING_ENABLE0 0x008F ///< Lighting toggle. +#define GPUREG_0090 0x0090 ///< Unknown. +#define GPUREG_TEXUNIT1_BORDER_COLOR 0x0091 ///< Texture unit 1 border color. +#define GPUREG_TEXUNIT1_DIM 0x0092 ///< Texture unit 1 dimensions. +#define GPUREG_TEXUNIT1_PARAM 0x0093 ///< Texture unit 1 parameters. +#define GPUREG_TEXUNIT1_LOD 0x0094 ///< Texture unit 1 LOD. +#define GPUREG_TEXUNIT1_ADDR 0x0095 ///< Texture unit 1 address. +#define GPUREG_TEXUNIT1_TYPE 0x0096 ///< Texture unit 1 type. +#define GPUREG_0097 0x0097 ///< Unknown. +#define GPUREG_0098 0x0098 ///< Unknown. +#define GPUREG_TEXUNIT2_BORDER_COLOR 0x0099 ///< Texture unit 2 border color. +#define GPUREG_TEXUNIT2_DIM 0x009A ///< Texture unit 2 dimensions. +#define GPUREG_TEXUNIT2_PARAM 0x009B ///< Texture unit 2 parameters. +#define GPUREG_TEXUNIT2_LOD 0x009C ///< Texture unit 2 LOD. +#define GPUREG_TEXUNIT2_ADDR 0x009D ///< Texture unit 2 address. +#define GPUREG_TEXUNIT2_TYPE 0x009E ///< Texture unit 2 type. +#define GPUREG_009F 0x009F ///< Unknown. +#define GPUREG_00A0 0x00A0 ///< Unknown. +#define GPUREG_00A1 0x00A1 ///< Unknown. +#define GPUREG_00A2 0x00A2 ///< Unknown. +#define GPUREG_00A3 0x00A3 ///< Unknown. +#define GPUREG_00A4 0x00A4 ///< Unknown. +#define GPUREG_00A5 0x00A5 ///< Unknown. +#define GPUREG_00A6 0x00A6 ///< Unknown. +#define GPUREG_00A7 0x00A7 ///< Unknown. +#define GPUREG_TEXUNIT3_PROCTEX0 0x00A8 ///< Unknown. +#define GPUREG_TEXUNIT3_PROCTEX1 0x00A9 ///< Unknown. +#define GPUREG_TEXUNIT3_PROCTEX2 0x00AA ///< Unknown. +#define GPUREG_TEXUNIT3_PROCTEX3 0x00AB ///< Unknown. +#define GPUREG_TEXUNIT3_PROCTEX4 0x00A ///< Unknown. +#define GPUREG_TEXUNIT3_PROCTEX5 0x00D ///< Unknown. +#define GPUREG_00AE 0x00AE ///< Unknown. +#define GPUREG_PROCTEX_LUT 0x00AF ///< Unknown. +#define GPUREG_PROCTEX_LUT_DATA0 0x00B0 ///< Unknown. +#define GPUREG_PROCTEX_LUT_DATA1 0x00B1 ///< Unknown. +#define GPUREG_PROCTEX_LUT_DATA2 0x00B2 ///< Unknown. +#define GPUREG_PROCTEX_LUT_DATA3 0x00B3 ///< Unknown. +#define GPUREG_PROCTEX_LUT_DATA4 0x00B4 ///< Unknown. +#define GPUREG_PROCTEX_LUT_DATA5 0x00B5 ///< Unknown. +#define GPUREG_PROCTEX_LUT_DATA6 0x00B6 ///< Unknown. +#define GPUREG_PROCTEX_LUT_DATA7 0x00B7 ///< Unknown. +#define GPUREG_00B8 0x00B8 ///< Unknown. +#define GPUREG_00B9 0x00B9 ///< Unknown. +#define GPUREG_00BA 0x00BA ///< Unknown. +#define GPUREG_00BB 0x00BB ///< Unknown. +#define GPUREG_00BC 0x00BC ///< Unknown. +#define GPUREG_00BD 0x00BD ///< Unknown. +#define GPUREG_00BE 0x00BE ///< Unknown. +#define GPUREG_00BF 0x00BF ///< Unknown. +#define GPUREG_TEXENV0_SOURCE 0x00C0 ///< Texture env 0 source. +#define GPUREG_TEXENV0_OPERAND 0x00C1 ///< Texture env 0 operand. +#define GPUREG_TEXENV0_COMBINER 0x00C2 ///< Texture env 0 combiner. +#define GPUREG_TEXENV0_COLOR 0x00C3 ///< Texture env 0 color. +#define GPUREG_TEXENV0_SCALE 0x00C4 ///< Texture env 0 scale. +#define GPUREG_00C5 0x00C5 ///< Unknown. +#define GPUREG_00C6 0x00C6 ///< Unknown. +#define GPUREG_00C7 0x00C7 ///< Unknown. +#define GPUREG_TEXENV1_SOURCE 0x00C8 ///< Texture env 1 source. +#define GPUREG_TEXENV1_OPERAND 0x00C9 ///< Texture env 1 operand. +#define GPUREG_TEXENV1_COMBINER 0x00CA ///< Texture env 1 combiner. +#define GPUREG_TEXENV1_COLOR 0x00CB ///< Texture env 1 color. +#define GPUREG_TEXENV1_SCALE 0x00CC ///< Texture env 1 scale. +#define GPUREG_00CD 0x00CD ///< Unknown. +#define GPUREG_00CE 0x00CE ///< Unknown. +#define GPUREG_00CF 0x00CF ///< Unknown. +#define GPUREG_TEXENV2_SOURCE 0x00D0 ///< Texture env 2 source. +#define GPUREG_TEXENV2_OPERAND 0x00D1 ///< Texture env 2 operand. +#define GPUREG_TEXENV2_COMBINER 0x00D2 ///< Texture env 2 combiner. +#define GPUREG_TEXENV2_COLOR 0x00D3 ///< Texture env 2 color. +#define GPUREG_TEXENV2_SCALE 0x00D4 ///< Texture env 2 scale. +#define GPUREG_00D5 0x00D5 ///< Unknown. +#define GPUREG_00D6 0x00D6 ///< Unknown. +#define GPUREG_00D7 0x00D7 ///< Unknown. +#define GPUREG_TEXENV3_SOURCE 0x00D8 ///< Texture env 3 source. +#define GPUREG_TEXENV3_OPERAND 0x00D9 ///< Texture env 3 operand. +#define GPUREG_TEXENV3_COMBINER 0x00DA ///< Texture env 3 combiner. +#define GPUREG_TEXENV3_COLOR 0x00DB ///< Texture env 3 color. +#define GPUREG_TEXENV3_SCALE 0x00DC ///< Texture env 3 scale. +#define GPUREG_00DD 0x00DD ///< Unknown. +#define GPUREG_00DE 0x00DE ///< Unknown. +#define GPUREG_00DF 0x00DF ///< Unknown. +#define GPUREG_TEXENV_UPDATE_BUFFER 0x00E0 ///< Texture env buffer update flag. +#define GPUREG_FOG_COLOR 0x00E1 ///< Unknown. +#define GPUREG_00E2 0x00E2 ///< Unknown. +#define GPUREG_00E3 0x00E3 ///< Unknown. +#define GPUREG_GAS_ATTENUATION 0x00E4 ///< Unknown. +#define GPUREG_GAS_ACCMAX 0x00E5 ///< Unknown. +#define GPUREG_FOG_LUT_INDEX 0x00E6 ///< Unknown. +#define GPUREG_00E7 0x00E7 ///< Unknown. +#define GPUREG_FOG_LUT_DATA0 0x00E8 ///< Unknown. +#define GPUREG_FOG_LUT_DATA1 0x00E9 ///< Unknown. +#define GPUREG_FOG_LUT_DATA2 0x00EA ///< Unknown. +#define GPUREG_FOG_LUT_DATA3 0x00EB ///< Unknown. +#define GPUREG_FOG_LUT_DATA4 0x00EC ///< Unknown. +#define GPUREG_FOG_LUT_DATA5 0x00ED ///< Unknown. +#define GPUREG_FOG_LUT_DATA6 0x00EE ///< Unknown. +#define GPUREG_FOG_LUT_DATA7 0x00EF ///< Unknown. +#define GPUREG_TEXENV4_SOURCE 0x00F0 ///< Texture env 4 source. +#define GPUREG_TEXENV4_OPERAND 0x00F1 ///< Texture env 4 operand. +#define GPUREG_TEXENV4_COMBINER 0x00F2 ///< Texture env 4 combiner. +#define GPUREG_TEXENV4_COLOR 0x00F3 ///< Texture env 4 color. +#define GPUREG_TEXENV4_SCALE 0x00F4 ///< Texture env 4 scale. +#define GPUREG_00F5 0x00F5 ///< Unknown. +#define GPUREG_00F6 0x00F6 ///< Unknown. +#define GPUREG_00F7 0x00F7 ///< Unknown. +#define GPUREG_TEXENV5_SOURCE 0x00F8 ///< Texture env 5 source. +#define GPUREG_TEXENV5_OPERAND 0x00F9 ///< Texture env 5 operand. +#define GPUREG_TEXENV5_COMBINER 0x00FA ///< Texture env 5 combiner. +#define GPUREG_TEXENV5_COLOR 0x00FB ///< Texture env 5 color. +#define GPUREG_TEXENV5_SCALE 0x00FC ///< Texture env 5 scale. +#define GPUREG_TEXENV_BUFFER_COLOR 0x00FD ///< Texture env buffer color. +#define GPUREG_00FE 0x00FE ///< Unknown. +#define GPUREG_00FF 0x00FF ///< Unknown. +///@} + +///@name Framebuffer registers (0x100-0x13F) +///@{ +#define GPUREG_COLOR_OPERATION 0x0100 ///< Configures fragment operation and blend mode. +#define GPUREG_BLEND_FUNC 0x0101 ///< Blend function configuration. +#define GPUREG_LOGIC_OP 0x0102 ///< Logical operator configuration. +#define GPUREG_BLEND_COLOR 0x0103 ///< Blend color. +#define GPUREG_FRAGOP_ALPHA_TEST 0x0104 ///< Alpha test configuration. +#define GPUREG_STENCIL_TEST 0x0105 ///< Stencil test configuration. +#define GPUREG_STENCIL_OP 0x0106 ///< Stencil test operation. +#define GPUREG_DEPTH_COLOR_MASK 0x0107 ///< Depth test and color mask configuration. +#define GPUREG_0108 0x0108 ///< Unknown. +#define GPUREG_0109 0x0109 ///< Unknown. +#define GPUREG_010A 0x010A ///< Unknown. +#define GPUREG_010B 0x010B ///< Unknown. +#define GPUREG_010C 0x010C ///< Unknown. +#define GPUREG_010D 0x010D ///< Unknown. +#define GPUREG_010E 0x010E ///< Unknown. +#define GPUREG_010F 0x010F ///< Unknown. +#define GPUREG_FRAMEBUFFER_INVALIDATE 0x0110 ///< Invalidates the frame buffer. +#define GPUREG_FRAMEBUFFER_FLUSH 0x0111 ///< Flushes the frame buffer. +#define GPUREG_COLORBUFFER_READ 0x0112 ///< Reads from the color buffer. +#define GPUREG_COLORBUFFER_WRITE 0x0113 ///< Writes to the color buffer. +#define GPUREG_DEPTHBUFFER_READ 0x0114 ///< Reads from the depth buffer. +#define GPUREG_DEPTHBUFFER_WRITE 0x0115 ///< Writes to the depth buffer. +#define GPUREG_DEPTHBUFFER_FORMAT 0x0116 ///< Depth buffer format. +#define GPUREG_COLORBUFFER_FORMAT 0x0117 ///< Color buffer format. +#define GPUREG_EARLYDEPTH_TEST2 0x0118 ///< Unknown. +#define GPUREG_0119 0x0119 ///< Unknown. +#define GPUREG_011A 0x011A ///< Unknown. +#define GPUREG_FRAMEBUFFER_BLOCK32 0x011B ///< Frame buffer block 32. +#define GPUREG_DEPTHBUFFER_LOC 0x011C ///< Depth buffer location. +#define GPUREG_COLORBUFFER_LOC 0x011D ///< Color buffer location. +#define GPUREG_FRAMEBUFFER_DIM 0x011E ///< Frame buffer dimensions. +#define GPUREG_011F 0x011F ///< Unknown. +#define GPUREG_GAS_LIGHT_XY 0x0120 ///< Unknown. +#define GPUREG_GAS_LIGHT_Z 0x0121 ///< Unknown. +#define GPUREG_GAS_LIGHT_Z_COLOR 0x0122 ///< Unknown. +#define GPUREG_GAS_LUT_INDEX 0x0123 ///< Unknown. +#define GPUREG_GAS_LUT_DATA 0x0124 ///< Unknown. +#define GPUREG_0125 0x0125 ///< Unknown. +#define GPUREG_GAS_DELTAZ_DEPTH 0x0126 ///< Unknown. +#define GPUREG_0127 0x0127 ///< Unknown. +#define GPUREG_0128 0x0128 ///< Unknown. +#define GPUREG_0129 0x0129 ///< Unknown. +#define GPUREG_012A 0x012A ///< Unknown. +#define GPUREG_012B 0x012B ///< Unknown. +#define GPUREG_012C 0x012C ///< Unknown. +#define GPUREG_012D 0x012D ///< Unknown. +#define GPUREG_012E 0x012E ///< Unknown. +#define GPUREG_012F 0x012F ///< Unknown. +#define GPUREG_FRAGOP_SHADOW 0x0130 ///< Unknown. +#define GPUREG_0131 0x0131 ///< Unknown. +#define GPUREG_0132 0x0132 ///< Unknown. +#define GPUREG_0133 0x0133 ///< Unknown. +#define GPUREG_0134 0x0134 ///< Unknown. +#define GPUREG_0135 0x0135 ///< Unknown. +#define GPUREG_0136 0x0136 ///< Unknown. +#define GPUREG_0137 0x0137 ///< Unknown. +#define GPUREG_0138 0x0138 ///< Unknown. +#define GPUREG_0139 0x0139 ///< Unknown. +#define GPUREG_013A 0x013A ///< Unknown. +#define GPUREG_013B 0x013B ///< Unknown. +#define GPUREG_013C 0x013C ///< Unknown. +#define GPUREG_013D 0x013D ///< Unknown. +#define GPUREG_013E 0x013E ///< Unknown. +#define GPUREG_013F 0x013F ///< Unknown. +///@} + +///@name Fragment lighting registers (0x140-0x1FF) +///@{ +#define GPUREG_LIGHT0_SPECULAR0 0x0140 ///< Light 0 specular lighting. +#define GPUREG_LIGHT0_SPECULAR1 0x0141 ///< Light 0 specular lighting. +#define GPUREG_LIGHT0_DIFFUSE 0x0142 ///< Light 0 diffuse lighting. +#define GPUREG_LIGHT0_AMBIENT 0x0143 ///< Light 0 ambient lighting. +#define GPUREG_LIGHT0_XY 0x0144 ///< Light 0 X and Y. +#define GPUREG_LIGHT0_Z 0x0145 ///< Light 0 Z. +#define GPUREG_LIGHT0_SPOTDIR_XY 0x0146 ///< Light 0 spotlight direction X and Y. +#define GPUREG_LIGHT0_SPOTDIR_Z 0x0147 ///< Light 0 spotlight direction Z. +#define GPUREG_0148 0x0148 ///< Unknown. +#define GPUREG_LIGHT0_CONFIG 0x0149 ///< Light 0 configuration. +#define GPUREG_LIGHT0_ATTENUATION_BIAS 0x014A ///< Light 0 attenuation bias. +#define GPUREG_LIGHT0_ATTENUATION_SCALE 0x014B ///< Light 0 attenuation scale. +#define GPUREG_014C 0x014C ///< Unknown. +#define GPUREG_014D 0x014D ///< Unknown. +#define GPUREG_014E 0x014E ///< Unknown. +#define GPUREG_014F 0x014F ///< Unknown. +#define GPUREG_LIGHT1_SPECULAR0 0x0150 ///< Light 1 specular lighting. +#define GPUREG_LIGHT1_SPECULAR1 0x0151 ///< Light 1 specular lighting. +#define GPUREG_LIGHT1_DIFFUSE 0x0152 ///< Light 1 diffuse lighting. +#define GPUREG_LIGHT1_AMBIENT 0x0153 ///< Light 1 ambient lighting. +#define GPUREG_LIGHT1_XY 0x0154 ///< Light 1 X and Y. +#define GPUREG_LIGHT1_Z 0x0155 ///< Light 1 Z. +#define GPUREG_LIGHT1_SPOTDIR_XY 0x0156 ///< Light 1 spotlight direction X and Y. +#define GPUREG_LIGHT1_SPOTDIR_Z 0x0157 ///< Light 1 spotlight direction Z. +#define GPUREG_0158 0x0158 ///< Unknown. +#define GPUREG_LIGHT1_CONFIG 0x0159 ///< Light 1 configuration. +#define GPUREG_LIGHT1_ATTENUATION_BIAS 0x015A ///< Light 1 attenuation bias. +#define GPUREG_LIGHT1_ATTENUATION_SCALE 0x015B ///< Light 1 attenuation scale. +#define GPUREG_015C 0x015C ///< Unknown. +#define GPUREG_015D 0x015D ///< Unknown. +#define GPUREG_015E 0x015E ///< Unknown. +#define GPUREG_015F 0x015F ///< Unknown. +#define GPUREG_LIGHT2_SPECULAR0 0x0160 ///< Light 2 specular lighting. +#define GPUREG_LIGHT2_SPECULAR1 0x0161 ///< Light 2 specular lighting. +#define GPUREG_LIGHT2_DIFFUSE 0x0162 ///< Light 2 diffuse lighting. +#define GPUREG_LIGHT2_AMBIENT 0x0163 ///< Light 2 ambient lighting. +#define GPUREG_LIGHT2_XY 0x0164 ///< Light 2 X and Y. +#define GPUREG_LIGHT2_Z 0x0165 ///< Light 2 Z. +#define GPUREG_LIGHT2_SPOTDIR_XY 0x0166 ///< Light 2 spotlight direction X and Y. +#define GPUREG_LIGHT2_SPOTDIR_Z 0x0167 ///< Light 2 spotlight direction Z. +#define GPUREG_0168 0x0168 ///< Unknown. +#define GPUREG_LIGHT2_CONFIG 0x0169 ///< Light 2 configuration. +#define GPUREG_LIGHT2_ATTENUATION_BIAS 0x016A ///< Light 2 attenuation bias. +#define GPUREG_LIGHT2_ATTENUATION_SCALE 0x016B ///< Light 2 attenuation scale. +#define GPUREG_016C 0x016C ///< Unknown. +#define GPUREG_016D 0x016D ///< Unknown. +#define GPUREG_016E 0x016E ///< Unknown. +#define GPUREG_016F 0x016F ///< Unknown. +#define GPUREG_LIGHT3_SPECULAR0 0x0170 ///< Light 3 specular lighting. +#define GPUREG_LIGHT3_SPECULAR1 0x0171 ///< Light 3 specular lighting. +#define GPUREG_LIGHT3_DIFFUSE 0x0172 ///< Light 3 diffuse lighting. +#define GPUREG_LIGHT3_AMBIENT 0x0173 ///< Light 3 ambient lighting. +#define GPUREG_LIGHT3_XY 0x0174 ///< Light 3 X and Y. +#define GPUREG_LIGHT3_Z 0x0175 ///< Light 3 Z. +#define GPUREG_LIGHT3_SPOTDIR_XY 0x0176 ///< Light 3 spotlight direction X and Y. +#define GPUREG_LIGHT3_SPOTDIR_Z 0x0177 ///< Light 3 spotlight direction Z. +#define GPUREG_0178 0x0178 ///< Unknown. +#define GPUREG_LIGHT3_CONFIG 0x0179 ///< Light 3 configuration. +#define GPUREG_LIGHT3_ATTENUATION_BIAS 0x017A ///< Light 3 attenuation bias. +#define GPUREG_LIGHT3_ATTENUATION_SCALE 0x017B ///< Light 3 attenuation scale. +#define GPUREG_017C 0x017C ///< Unknown. +#define GPUREG_017D 0x017D ///< Unknown. +#define GPUREG_017E 0x017E ///< Unknown. +#define GPUREG_017F 0x017F ///< Unknown. +#define GPUREG_LIGHT4_SPECULAR0 0x0180 ///< Light 4 specular lighting. +#define GPUREG_LIGHT4_SPECULAR1 0x0181 ///< Light 4 specular lighting. +#define GPUREG_LIGHT4_DIFFUSE 0x0182 ///< Light 4 diffuse lighting. +#define GPUREG_LIGHT4_AMBIENT 0x0183 ///< Light 4 ambient lighting. +#define GPUREG_LIGHT4_XY 0x0184 ///< Light 4 X and Y. +#define GPUREG_LIGHT4_Z 0x0185 ///< Light 4 Z. +#define GPUREG_LIGHT4_SPOTDIR_XY 0x0186 ///< Light 4 spotlight direction X and Y. +#define GPUREG_LIGHT4_SPOTDIR_Z 0x0187 ///< Light 4 spotlight direction Z. +#define GPUREG_0188 0x0188 ///< Unknown. +#define GPUREG_LIGHT4_CONFIG 0x0189 ///< Light 4 configuration. +#define GPUREG_LIGHT4_ATTENUATION_BIAS 0x018A ///< Light 4 attenuation bias. +#define GPUREG_LIGHT4_ATTENUATION_SCALE 0x018B ///< Light 4 attenuation scale. +#define GPUREG_018C 0x018C ///< Unknown. +#define GPUREG_018D 0x018D ///< Unknown. +#define GPUREG_018E 0x018E ///< Unknown. +#define GPUREG_018F 0x018F ///< Unknown. +#define GPUREG_LIGHT5_SPECULAR0 0x0190 ///< Light 5 specular lighting. +#define GPUREG_LIGHT5_SPECULAR1 0x0191 ///< Light 5 specular lighting. +#define GPUREG_LIGHT5_DIFFUSE 0x0192 ///< Light 5 diffuse lighting. +#define GPUREG_LIGHT5_AMBIENT 0x0193 ///< Light 5 ambient lighting. +#define GPUREG_LIGHT5_XY 0x0194 ///< Light 5 X and Y. +#define GPUREG_LIGHT5_Z 0x0195 ///< Light 5 Z. +#define GPUREG_LIGHT5_SPOTDIR_XY 0x0196 ///< Light 5 spotlight direction X and Y. +#define GPUREG_LIGHT5_SPOTDIR_Z 0x0197 ///< Light 5 spotlight direction Z. +#define GPUREG_0198 0x0198 ///< Unknown. +#define GPUREG_LIGHT5_CONFIG 0x0199 ///< Light 5 configuration. +#define GPUREG_LIGHT5_ATTENUATION_BIAS 0x019A ///< Light 5 attenuation bias. +#define GPUREG_LIGHT5_ATTENUATION_SCALE 0x019B ///< Light 5 attenuation scale. +#define GPUREG_019C 0x019C ///< Unknown. +#define GPUREG_019D 0x019D ///< Unknown. +#define GPUREG_019E 0x019E ///< Unknown. +#define GPUREG_019F 0x019F ///< Unknown. +#define GPUREG_LIGHT6_SPECULAR0 0x01A0 ///< Light 6 specular lighting. +#define GPUREG_LIGHT6_SPECULAR1 0x01A1 ///< Light 6 specular lighting. +#define GPUREG_LIGHT6_DIFFUSE 0x01A2 ///< Light 6 diffuse lighting. +#define GPUREG_LIGHT6_AMBIENT 0x01A3 ///< Light 6 ambient lighting. +#define GPUREG_LIGHT6_XY 0x01A4 ///< Light 6 X and Y. +#define GPUREG_LIGHT6_Z 0x01A5 ///< Light 6 Z. +#define GPUREG_LIGHT6_SPOTDIR_XY 0x01A6 ///< Light 6 spotlight direction X and Y. +#define GPUREG_LIGHT6_SPOTDIR_Z 0x01A7 ///< Light 6 spotlight direction Z. +#define GPUREG_01A8 0x01A8 ///< Unknown. +#define GPUREG_LIGHT6_CONFIG 0x01A9 ///< Light 6 configuration. +#define GPUREG_LIGHT6_ATTENUATION_BIAS 0x01AA ///< Light 6 attenuation bias. +#define GPUREG_LIGHT6_ATTENUATION_SCALE 0x01AB ///< Light 6 attenuation scale. +#define GPUREG_01AC 0x01AC ///< Unknown. +#define GPUREG_01AD 0x01AD ///< Unknown. +#define GPUREG_01AE 0x01AE ///< Unknown. +#define GPUREG_01AF 0x01AF ///< Unknown. +#define GPUREG_LIGHT7_SPECULAR0 0x01B0 ///< Light 7 specular lighting. +#define GPUREG_LIGHT7_SPECULAR1 0x01B1 ///< Light 7 specular lighting. +#define GPUREG_LIGHT7_DIFFUSE 0x01B2 ///< Light 7 diffuse lighting. +#define GPUREG_LIGHT7_AMBIENT 0x01B3 ///< Light 7 ambient lighting. +#define GPUREG_LIGHT7_XY 0x01B4 ///< Light 7 X and Y. +#define GPUREG_LIGHT7_Z 0x01B5 ///< Light 7 Z. +#define GPUREG_LIGHT7_SPOTDIR_XY 0x01B6 ///< Light 7 spotlight direction X and Y. +#define GPUREG_LIGHT7_SPOTDIR_Z 0x01B7 ///< Light 7 spotlight direction Z. +#define GPUREG_01B8 0x01B8 ///< Unknown. +#define GPUREG_LIGHT7_CONFIG 0x01B9 ///< Light 7 configuration. +#define GPUREG_LIGHT7_ATTENUATION_BIAS 0x01BA ///< Light 7 attenuation bias. +#define GPUREG_LIGHT7_ATTENUATION_SCALE 0x01BB ///< Light 7 attenuation scale. +#define GPUREG_01BC 0x01BC ///< Unknown. +#define GPUREG_01BD 0x01BD ///< Unknown. +#define GPUREG_01BE 0x01BE ///< Unknown. +#define GPUREG_01BF 0x01BF ///< Unknown. +#define GPUREG_LIGHTING_AMBIENT 0x01C0 ///< Ambient lighting. +#define GPUREG_01C1 0x01C1 ///< Unknown. +#define GPUREG_LIGHTING_NUM_LIGHTS 0x01C2 ///< Number of lights. +#define GPUREG_LIGHTING_CONFIG0 0x01C3 ///< Lighting configuration. +#define GPUREG_LIGHTING_CONFIG1 0x01C4 ///< Lighting configuration. +#define GPUREG_LIGHTING_LUT_INDEX 0x01C5 ///< LUT index. +#define GPUREG_LIGHTING_ENABLE1 0x01C6 ///< Lighting toggle. +#define GPUREG_01C7 0x01C7 ///< Unknown. +#define GPUREG_LIGHTING_LUT_DATA0 0x01C8 ///< LUT data 0. +#define GPUREG_LIGHTING_LUT_DATA1 0x01C9 ///< LUT data 1. +#define GPUREG_LIGHTING_LUT_DATA2 0x01CA ///< LUT data 2. +#define GPUREG_LIGHTING_LUT_DATA3 0x01CB ///< LUT data 3. +#define GPUREG_LIGHTING_LUT_DATA4 0x01CC ///< LUT data 4. +#define GPUREG_LIGHTING_LUT_DATA5 0x01CD ///< LUT data 5. +#define GPUREG_LIGHTING_LUT_DATA6 0x01CE ///< LUT data 6. +#define GPUREG_LIGHTING_LUT_DATA7 0x01CF ///< LUT data 7. +#define GPUREG_LIGHTING_LUTINPUT_ABS 0x01D0 ///< LUT input abs. +#define GPUREG_LIGHTING_LUTINPUT_SELECT 0x01D1 ///< LUT input selector. +#define GPUREG_LIGHTING_LUTINPUT_SCALE 0x01D2 ///< LUT input scale. +#define GPUREG_01D3 0x01D3 ///< Unknown. +#define GPUREG_01D4 0x01D4 ///< Unknown. +#define GPUREG_01D5 0x01D5 ///< Unknown. +#define GPUREG_01D6 0x01D6 ///< Unknown. +#define GPUREG_01D7 0x01D7 ///< Unknown. +#define GPUREG_01D8 0x01D8 ///< Unknown. +#define GPUREG_LIGHTING_LIGHT_PERMUTATION 0x01D9 ///< Light permutation. +#define GPUREG_01DA 0x01DA ///< Unknown. +#define GPUREG_01DB 0x01DB ///< Unknown. +#define GPUREG_01DC 0x01DC ///< Unknown. +#define GPUREG_01DD 0x01DD ///< Unknown. +#define GPUREG_01DE 0x01DE ///< Unknown. +#define GPUREG_01DF 0x01DF ///< Unknown. +#define GPUREG_01E0 0x01E0 ///< Unknown. +#define GPUREG_01E1 0x01E1 ///< Unknown. +#define GPUREG_01E2 0x01E2 ///< Unknown. +#define GPUREG_01E3 0x01E3 ///< Unknown. +#define GPUREG_01E4 0x01E4 ///< Unknown. +#define GPUREG_01E5 0x01E5 ///< Unknown. +#define GPUREG_01E6 0x01E6 ///< Unknown. +#define GPUREG_01E7 0x01E7 ///< Unknown. +#define GPUREG_01E8 0x01E8 ///< Unknown. +#define GPUREG_01E9 0x01E9 ///< Unknown. +#define GPUREG_01EA 0x01EA ///< Unknown. +#define GPUREG_01EB 0x01EB ///< Unknown. +#define GPUREG_01EC 0x01EC ///< Unknown. +#define GPUREG_01ED 0x01ED ///< Unknown. +#define GPUREG_01EE 0x01EE ///< Unknown. +#define GPUREG_01EF 0x01EF ///< Unknown. +#define GPUREG_01F0 0x01F0 ///< Unknown. +#define GPUREG_01F1 0x01F1 ///< Unknown. +#define GPUREG_01F2 0x01F2 ///< Unknown. +#define GPUREG_01F3 0x01F3 ///< Unknown. +#define GPUREG_01F4 0x01F4 ///< Unknown. +#define GPUREG_01F5 0x01F5 ///< Unknown. +#define GPUREG_01F6 0x01F6 ///< Unknown. +#define GPUREG_01F7 0x01F7 ///< Unknown. +#define GPUREG_01F8 0x01F8 ///< Unknown. +#define GPUREG_01F9 0x01F9 ///< Unknown. +#define GPUREG_01FA 0x01FA ///< Unknown. +#define GPUREG_01FB 0x01FB ///< Unknown. +#define GPUREG_01FC 0x01FC ///< Unknown. +#define GPUREG_01FD 0x01FD ///< Unknown. +#define GPUREG_01FE 0x01FE ///< Unknown. +#define GPUREG_01FF 0x01FF ///< Unknown. +///@} + +///@name Geometry pipeline registers (0x200-0x27F) +///@{ +#define GPUREG_ATTRIBBUFFERS_LOC 0x0200 ///< Attribute buffers location. +#define GPUREG_ATTRIBBUFFERS_FORMAT_LOW 0x0201 ///< Attribute buffers format low. +#define GPUREG_ATTRIBBUFFERS_FORMAT_HIGH 0x0202 ///< Attribute buffers format high. +#define GPUREG_ATTRIBBUFFER0_OFFSET 0x0203 ///< Attribute buffers 0 offset. +#define GPUREG_ATTRIBBUFFER0_CONFIG1 0x0204 ///< Attribute buffers 0 configuration. +#define GPUREG_ATTRIBBUFFER0_CONFIG2 0x0205 ///< Attribute buffers 0 configuration. +#define GPUREG_ATTRIBBUFFER1_OFFSET 0x0206 ///< Attribute buffers 1 offset. +#define GPUREG_ATTRIBBUFFER1_CONFIG1 0x0207 ///< Attribute buffers 1 configuration. +#define GPUREG_ATTRIBBUFFER1_CONFIG2 0x0208 ///< Attribute buffers 1 configuration. +#define GPUREG_ATTRIBBUFFER2_OFFSET 0x0209 ///< Attribute buffers 2 offset. +#define GPUREG_ATTRIBBUFFER2_CONFIG1 0x020A ///< Attribute buffers 2 configuration. +#define GPUREG_ATTRIBBUFFER2_CONFIG2 0x020B ///< Attribute buffers 2 configuration. +#define GPUREG_ATTRIBBUFFER3_OFFSET 0x020C ///< Attribute buffers 3 offset. +#define GPUREG_ATTRIBBUFFER3_CONFIG1 0x020D ///< Attribute buffers 3 configuration. +#define GPUREG_ATTRIBBUFFER3_CONFIG2 0x020E ///< Attribute buffers 3 configuration. +#define GPUREG_ATTRIBBUFFER4_OFFSET 0x020F ///< Attribute buffers 4 offset. +#define GPUREG_ATTRIBBUFFER4_CONFIG1 0x0210 ///< Attribute buffers 4 configuration. +#define GPUREG_ATTRIBBUFFER4_CONFIG2 0x0211 ///< Attribute buffers 4 configuration. +#define GPUREG_ATTRIBBUFFER5_OFFSET 0x0212 ///< Attribute buffers 5 offset. +#define GPUREG_ATTRIBBUFFER5_CONFIG1 0x0213 ///< Attribute buffers 5 configuration. +#define GPUREG_ATTRIBBUFFER5_CONFIG2 0x0214 ///< Attribute buffers 5 configuration. +#define GPUREG_ATTRIBBUFFER6_OFFSET 0x0215 ///< Attribute buffers 6 offset. +#define GPUREG_ATTRIBBUFFER6_CONFIG1 0x0216 ///< Attribute buffers 6 configuration. +#define GPUREG_ATTRIBBUFFER6_CONFIG2 0x0217 ///< Attribute buffers 6 configuration. +#define GPUREG_ATTRIBBUFFER7_OFFSET 0x0218 ///< Attribute buffers 7 offset. +#define GPUREG_ATTRIBBUFFER7_CONFIG1 0x0219 ///< Attribute buffers 7 configuration. +#define GPUREG_ATTRIBBUFFER7_CONFIG2 0x021A ///< Attribute buffers 7 configuration. +#define GPUREG_ATTRIBBUFFER8_OFFSET 0x021B ///< Attribute buffers 8 offset. +#define GPUREG_ATTRIBBUFFER8_CONFIG1 0x021C ///< Attribute buffers 8 configuration. +#define GPUREG_ATTRIBBUFFER8_CONFIG2 0x021D ///< Attribute buffers 8 configuration. +#define GPUREG_ATTRIBBUFFER9_OFFSET 0x021E ///< Attribute buffers 9 offset. +#define GPUREG_ATTRIBBUFFER9_CONFIG1 0x021F ///< Attribute buffers 9 configuration. +#define GPUREG_ATTRIBBUFFER9_CONFIG2 0x0220 ///< Attribute buffers 9 configuration. +#define GPUREG_ATTRIBBUFFERA_OFFSET 0x0221 ///< Attribute buffers A offset. +#define GPUREG_ATTRIBBUFFERA_CONFIG1 0x0222 ///< Attribute buffers A configuration. +#define GPUREG_ATTRIBBUFFERA_CONFIG2 0x0223 ///< Attribute buffers A configuration. +#define GPUREG_ATTRIBBUFFERB_OFFSET 0x0224 ///< Attribute buffers B offset. +#define GPUREG_ATTRIBBUFFERB_CONFIG1 0x0225 ///< Attribute buffers B configuration. +#define GPUREG_ATTRIBBUFFERB_CONFIG2 0x0226 ///< Attribute buffers B configuration. +#define GPUREG_INDEXBUFFER_CONFIG 0x0227 ///< Index buffer configuration. +#define GPUREG_NUMVERTICES 0x0228 ///< Number of vertices. +#define GPUREG_GEOSTAGE_CONFIG 0x0229 ///< Geometry stage configuration. +#define GPUREG_VERTEX_OFFSET 0x022A ///< Vertex offset. +#define GPUREG_022B 0x022B ///< Unknown. +#define GPUREG_022C 0x022C ///< Unknown. +#define GPUREG_POST_VERTEX_CACHE_NUM 0x022D ///< Unknown. +#define GPUREG_DRAWARRAYS 0x022E ///< Draw arrays trigger. +#define GPUREG_DRAWELEMENTS 0x022F ///< Draw arrays elements. +#define GPUREG_0230 0x0230 ///< Unknown. +#define GPUREG_VTX_FUNC 0x0231 ///< Unknown. +#define GPUREG_FIXEDATTRIB_INDEX 0x0232 ///< Fixed attribute index. +#define GPUREG_FIXEDATTRIB_DATA0 0x0233 ///< Fixed attribute data 0. +#define GPUREG_FIXEDATTRIB_DATA1 0x0234 ///< Fixed attribute data 1. +#define GPUREG_FIXEDATTRIB_DATA2 0x0235 ///< Fixed attribute data 2. +#define GPUREG_0236 0x0236 ///< Unknown. +#define GPUREG_0237 0x0237 ///< Unknown. +#define GPUREG_CMDBUF_SIZE0 0x0238 ///< Command buffer size 0. +#define GPUREG_CMDBUF_SIZE1 0x0239 ///< Command buffer size 1. +#define GPUREG_CMDBUF_ADDR0 0x023A ///< Command buffer address 0. +#define GPUREG_CMDBUF_ADDR1 0x023B ///< Command buffer address 1. +#define GPUREG_CMDBUF_JUMP0 0x023C ///< Command buffer jump 0. +#define GPUREG_CMDBUF_JUMP1 0x023D ///< Command buffer jump 1. +#define GPUREG_023E 0x023E ///< Unknown. +#define GPUREG_023F 0x023F ///< Unknown. +#define GPUREG_0240 0x0240 ///< Unknown. +#define GPUREG_0241 0x0241 ///< Unknown. +#define GPUREG_VSH_NUM_ATTR 0x0242 ///< Unknown. +#define GPUREG_0243 0x0243 ///< Unknown. +#define GPUREG_VSH_COM_MODE 0x0244 ///< Unknown. +#define GPUREG_START_DRAW_FUNC0 0x0245 ///< Unknown. +#define GPUREG_0246 0x0246 ///< Unknown. +#define GPUREG_0247 0x0247 ///< Unknown. +#define GPUREG_0248 0x0248 ///< Unknown. +#define GPUREG_0249 0x0249 ///< Unknown. +#define GPUREG_VSH_OUTMAP_TOTAL1 0x024A ///< Unknown. +#define GPUREG_024B 0x024B ///< Unknown. +#define GPUREG_024C 0x024C ///< Unknown. +#define GPUREG_024D 0x024D ///< Unknown. +#define GPUREG_024E 0x024E ///< Unknown. +#define GPUREG_024F 0x024F ///< Unknown. +#define GPUREG_0250 0x0250 ///< Unknown. +#define GPUREG_VSH_OUTMAP_TOTAL2 0x0251 ///< Unknown. +#define GPUREG_GSH_MISC0 0x0252 ///< Unknown. +#define GPUREG_GEOSTAGE_CONFIG2 0x0253 ///< Unknown. +#define GPUREG_GSH_MISC1 0x0254 ///< Unknown. +#define GPUREG_0255 0x0255 ///< Unknown. +#define GPUREG_0256 0x0256 ///< Unknown. +#define GPUREG_0257 0x0257 ///< Unknown. +#define GPUREG_0258 0x0258 ///< Unknown. +#define GPUREG_0259 0x0259 ///< Unknown. +#define GPUREG_025A 0x025A ///< Unknown. +#define GPUREG_025B 0x025B ///< Unknown. +#define GPUREG_025C 0x025C ///< Unknown. +#define GPUREG_025D 0x025D ///< Unknown. +#define GPUREG_PRIMITIVE_CONFIG 0x025E ///< Primitive configuration. +#define GPUREG_RESTART_PRIMITIVE 0x025F ///< Restart primitive flag. +#define GPUREG_0260 0x0260 ///< Unknown. +#define GPUREG_0261 0x0261 ///< Unknown. +#define GPUREG_0262 0x0262 ///< Unknown. +#define GPUREG_0263 0x0263 ///< Unknown. +#define GPUREG_0264 0x0264 ///< Unknown. +#define GPUREG_0265 0x0265 ///< Unknown. +#define GPUREG_0266 0x0266 ///< Unknown. +#define GPUREG_0267 0x0267 ///< Unknown. +#define GPUREG_0268 0x0268 ///< Unknown. +#define GPUREG_0269 0x0269 ///< Unknown. +#define GPUREG_026A 0x026A ///< Unknown. +#define GPUREG_026B 0x026B ///< Unknown. +#define GPUREG_026C 0x026C ///< Unknown. +#define GPUREG_026D 0x026D ///< Unknown. +#define GPUREG_026E 0x026E ///< Unknown. +#define GPUREG_026F 0x026F ///< Unknown. +#define GPUREG_0270 0x0270 ///< Unknown. +#define GPUREG_0271 0x0271 ///< Unknown. +#define GPUREG_0272 0x0272 ///< Unknown. +#define GPUREG_0273 0x0273 ///< Unknown. +#define GPUREG_0274 0x0274 ///< Unknown. +#define GPUREG_0275 0x0275 ///< Unknown. +#define GPUREG_0276 0x0276 ///< Unknown. +#define GPUREG_0277 0x0277 ///< Unknown. +#define GPUREG_0278 0x0278 ///< Unknown. +#define GPUREG_0279 0x0279 ///< Unknown. +#define GPUREG_027A 0x027A ///< Unknown. +#define GPUREG_027B 0x027B ///< Unknown. +#define GPUREG_027C 0x027C ///< Unknown. +#define GPUREG_027D 0x027D ///< Unknown. +#define GPUREG_027E 0x027E ///< Unknown. +#define GPUREG_027F 0x027F ///< Unknown. +///@} + +///@name Geometry shader registers (0x280-0x2AF) +///@{ +#define GPUREG_GSH_BOOLUNIFORM 0x0280 ///< Geometry shader bool uniforms. +#define GPUREG_GSH_INTUNIFORM_I0 0x0281 ///< Geometry shader integer uniform 0. +#define GPUREG_GSH_INTUNIFORM_I1 0x0282 ///< Geometry shader integer uniform 1. +#define GPUREG_GSH_INTUNIFORM_I2 0x0283 ///< Geometry shader integer uniform 2. +#define GPUREG_GSH_INTUNIFORM_I3 0x0284 ///< Geometry shader integer uniform 3. +#define GPUREG_0285 0x0285 ///< Unknown. +#define GPUREG_0286 0x0286 ///< Unknown. +#define GPUREG_0287 0x0287 ///< Unknown. +#define GPUREG_0288 0x0288 ///< Unknown. +#define GPUREG_GSH_INPUTBUFFER_CONFIG 0x0289 ///< Geometry shader input buffer configuration. +#define GPUREG_GSH_ENTRYPOINT 0x028A ///< Geometry shader entry point. +#define GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW 0x028B ///< Geometry shader attribute permutations low. +#define GPUREG_GSH_ATTRIBUTES_PERMUTATION_HIGH 0x028C ///< Geometry shader attribute permutations high. +#define GPUREG_GSH_OUTMAP_MASK 0x028D ///< Geometry shader output map mask. +#define GPUREG_028E 0x028E ///< Unknown. +#define GPUREG_GSH_CODETRANSFER_END 0x028F ///< Geometry shader code transfer end trigger. +#define GPUREG_GSH_FLOATUNIFORM_CONFIG 0x0290 ///< Geometry shader float uniform configuration. +#define GPUREG_GSH_FLOATUNIFORM_DATA 0x0291 ///< Geometry shader float uniform data. +#define GPUREG_0299 0x0299 ///< Unknown. +#define GPUREG_029A 0x029A ///< Unknown. +#define GPUREG_GSH_CODETRANSFER_CONFIG 0x029B ///< Geometry shader code transfer configuration. +#define GPUREG_GSH_CODETRANSFER_DATA 0x029C ///< Geometry shader code transfer data. +#define GPUREG_02A4 0x02A4 ///< Unknown. +#define GPUREG_GSH_OPDESCS_CONFIG 0x02A5 ///< Geometry shader operand description configuration. +#define GPUREG_GSH_OPDESCS_DATA 0x02A6 ///< Geometry shader operand description data. +#define GPUREG_02AE 0x02AE ///< Unknown. +#define GPUREG_02AF 0x02AF ///< Unknown. +///@} + +///@name Vertex shader registers (0x2B0-0x2DF) +///@{ +#define GPUREG_VSH_BOOLUNIFORM 0x02B0 ///< Vertex shader bool uniforms. +#define GPUREG_VSH_INTUNIFORM_I0 0x02B1 ///< Vertex shader integer uniform 0. +#define GPUREG_VSH_INTUNIFORM_I1 0x02B2 ///< Vertex shader integer uniform 1. +#define GPUREG_VSH_INTUNIFORM_I2 0x02B3 ///< Vertex shader integer uniform 2. +#define GPUREG_VSH_INTUNIFORM_I3 0x02B4 ///< Vertex shader integer uniform 3. +#define GPUREG_02B5 0x02B5 ///< Unknown. +#define GPUREG_02B6 0x02B6 ///< Unknown. +#define GPUREG_02B7 0x02B7 ///< Unknown. +#define GPUREG_02B8 0x02B8 ///< Unknown. +#define GPUREG_VSH_INPUTBUFFER_CONFIG 0x02B9 ///< Vertex shader input buffer configuration. +#define GPUREG_VSH_ENTRYPOINT 0x02BA ///< Vertex shader entry point. +#define GPUREG_VSH_ATTRIBUTES_PERMUTATION_LOW 0x02BB ///< Vertex shader attribute permutations low. +#define GPUREG_VSH_ATTRIBUTES_PERMUTATION_HIGH 0x02BC ///< Vertex shader attribute permutations high. +#define GPUREG_VSH_OUTMAP_MASK 0x02BD ///< Vertex shader output map mask. +#define GPUREG_02BE 0x02BE ///< Unknown. +#define GPUREG_VSH_CODETRANSFER_END 0x02BF ///< Vertex shader code transfer end trigger. +#define GPUREG_VSH_FLOATUNIFORM_CONFIG 0x02C0 ///< Vertex shader float uniform configuration. +#define GPUREG_VSH_FLOATUNIFORM_DATA 0x02C1 ///< Vertex shader float uniform data. +#define GPUREG_02C9 0x02C9 ///< Unknown. +#define GPUREG_02CA 0x02CA ///< Unknown. +#define GPUREG_VSH_CODETRANSFER_CONFIG 0x02CB ///< Vertex shader code transfer configuration. +#define GPUREG_VSH_CODETRANSFER_DATA 0x02CC ///< Vertex shader code transfer data. +#define GPUREG_02D4 0x02D4 ///< Unknown. +#define GPUREG_VSH_OPDESCS_CONFIG 0x02D5 ///< Vertex shader operand description configuration. +#define GPUREG_VSH_OPDESCS_DATA 0x02D6 ///< Vertex shader operand description data. +#define GPUREG_02DE 0x02DE ///< Unknown. +#define GPUREG_02DF 0x02DF ///< Unknown. +///@} + +///@name Unknown registers (0x2E0-0x2FF) +///@{ +#define GPUREG_02E0 0x02E0 ///< Unknown. +#define GPUREG_02E1 0x02E1 ///< Unknown. +#define GPUREG_02E2 0x02E2 ///< Unknown. +#define GPUREG_02E3 0x02E3 ///< Unknown. +#define GPUREG_02E4 0x02E4 ///< Unknown. +#define GPUREG_02E5 0x02E5 ///< Unknown. +#define GPUREG_02E6 0x02E6 ///< Unknown. +#define GPUREG_02E7 0x02E7 ///< Unknown. +#define GPUREG_02E8 0x02E8 ///< Unknown. +#define GPUREG_02E9 0x02E9 ///< Unknown. +#define GPUREG_02EA 0x02EA ///< Unknown. +#define GPUREG_02EB 0x02EB ///< Unknown. +#define GPUREG_02EC 0x02EC ///< Unknown. +#define GPUREG_02ED 0x02ED ///< Unknown. +#define GPUREG_02EE 0x02EE ///< Unknown. +#define GPUREG_02EF 0x02EF ///< Unknown. +#define GPUREG_02F0 0x02F0 ///< Unknown. +#define GPUREG_02F1 0x02F1 ///< Unknown. +#define GPUREG_02F2 0x02F2 ///< Unknown. +#define GPUREG_02F3 0x02F3 ///< Unknown. +#define GPUREG_02F4 0x02F4 ///< Unknown. +#define GPUREG_02F5 0x02F5 ///< Unknown. +#define GPUREG_02F6 0x02F6 ///< Unknown. +#define GPUREG_02F7 0x02F7 ///< Unknown. +#define GPUREG_02F8 0x02F8 ///< Unknown. +#define GPUREG_02F9 0x02F9 ///< Unknown. +#define GPUREG_02FA 0x02FA ///< Unknown. +#define GPUREG_02FB 0x02FB ///< Unknown. +#define GPUREG_02FC 0x02FC ///< Unknown. +#define GPUREG_02FD 0x02FD ///< Unknown. +#define GPUREG_02FE 0x02FE ///< Unknown. +#define GPUREG_02FF 0x02FF ///< Unknown. +///@} diff --git a/libctru/include/3ds/gpu/shaderProgram.h b/libctru/include/3ds/gpu/shaderProgram.h index e0d5302..303c49d 100644 --- a/libctru/include/3ds/gpu/shaderProgram.h +++ b/libctru/include/3ds/gpu/shaderProgram.h @@ -1,120 +1,120 @@ -/** - * @file shaderProgram.h - * @brief Functions for working with shaders. - */ -#pragma once - -#include <3ds/types.h> -#include <3ds/gpu/shbin.h> - -/// 24-bit float uniforms. -typedef struct -{ - u32 id; ///< Uniform ID. - u32 data[3]; ///< Uniform data. -}float24Uniform_s; - -/// Describes an instance of either a vertex or geometry shader. -typedef struct -{ - DVLE_s* dvle; ///< Shader DVLE. - u16 boolUniforms; ///< Boolean uniforms. - u16 boolUniformMask; ///< Used boolean uniform mask. - u32 intUniforms[4]; ///< Integer uniforms. - float24Uniform_s* float24Uniforms; ///< 24-bit float uniforms. - u8 intUniformMask; ///< Used integer uniform mask. - u8 numFloat24Uniforms; ///< Float uniform count. -}shaderInstance_s; - -/// Describes an instance of a full shader program. -typedef struct -{ - shaderInstance_s* vertexShader; ///< Vertex shader. - shaderInstance_s* geometryShader; ///< Geometry shader. - u32 geoShaderInputPermutation[2]; ///< Geometry shader input permutation. - u8 geoShaderInputStride; ///< Geometry shader input stride. -}shaderProgram_s; - -/** - * @brief Initializes a shader instance. - * @param si Shader instance to initialize. - * @param dvle DVLE to initialize the shader instance with. - */ -Result shaderInstanceInit(shaderInstance_s* si, DVLE_s* dvle); - -/** - * @brief Frees a shader instance. - * @param si Shader instance to free. - */ -Result shaderInstanceFree(shaderInstance_s* si); - -/** - * @brief Sets a bool uniform of a shader. - * @param si Shader instance to use. - * @param id ID of the bool uniform. - * @param value Value to set. - */ -Result shaderInstanceSetBool(shaderInstance_s* si, int id, bool value); - -/** - * @brief Gets a bool uniform of a shader. - * @param si Shader instance to use. - * @param id ID of the bool uniform. - * @param value Pointer to output the value to. - */ -Result shaderInstanceGetBool(shaderInstance_s* si, int id, bool* value); - -/** - * @brief Gets the location of a shader's uniform. - * @param si Shader instance to use. - * @param name Name of the uniform. - */ -s8 shaderInstanceGetUniformLocation(shaderInstance_s* si, const char* name); - -/** - * @brief Initializes a shader program. - * @param sp Shader program to initialize. - */ -Result shaderProgramInit(shaderProgram_s* sp); - -/** - * @brief Frees a shader program. - * @param sp Shader program to free. - */ -Result shaderProgramFree(shaderProgram_s* sp); - -/** - * @brief Sets the vertex shader of a shader program. - * @param sp Shader program to use. - * @param dvle Vertex shader to set. - */ -Result shaderProgramSetVsh(shaderProgram_s* sp, DVLE_s* dvle); - -/** - * @brief Sets the geometry shader of a shader program. - * @param sp Shader program to use. - * @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). - */ -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. - * @param sp Shader program to use. - * @param permutation Attribute permutation to use. - */ -Result shaderProgramSetGshInputPermutation(shaderProgram_s* sp, u64 permutation); - -/** - * @brief Configures the shader units to use the specified shader program. - * @param sp Shader program to use. - * @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. - */ -Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGshCode); - -/** - * @brief Same as shaderProgramConfigure, but always loading code/operand descriptors and uploading DVLE constants afterwards. - * @param sp Shader program to use. - */ -Result shaderProgramUse(shaderProgram_s* sp); +/** + * @file shaderProgram.h + * @brief Functions for working with shaders. + */ +#pragma once + +#include <3ds/types.h> +#include <3ds/gpu/shbin.h> + +/// 24-bit float uniforms. +typedef struct +{ + u32 id; ///< Uniform ID. + u32 data[3]; ///< Uniform data. +}float24Uniform_s; + +/// Describes an instance of either a vertex or geometry shader. +typedef struct +{ + DVLE_s* dvle; ///< Shader DVLE. + u16 boolUniforms; ///< Boolean uniforms. + u16 boolUniformMask; ///< Used boolean uniform mask. + u32 intUniforms[4]; ///< Integer uniforms. + float24Uniform_s* float24Uniforms; ///< 24-bit float uniforms. + u8 intUniformMask; ///< Used integer uniform mask. + u8 numFloat24Uniforms; ///< Float uniform count. +}shaderInstance_s; + +/// Describes an instance of a full shader program. +typedef struct +{ + shaderInstance_s* vertexShader; ///< Vertex shader. + shaderInstance_s* geometryShader; ///< Geometry shader. + u32 geoShaderInputPermutation[2]; ///< Geometry shader input permutation. + u8 geoShaderInputStride; ///< Geometry shader input stride. +}shaderProgram_s; + +/** + * @brief Initializes a shader instance. + * @param si Shader instance to initialize. + * @param dvle DVLE to initialize the shader instance with. + */ +Result shaderInstanceInit(shaderInstance_s* si, DVLE_s* dvle); + +/** + * @brief Frees a shader instance. + * @param si Shader instance to free. + */ +Result shaderInstanceFree(shaderInstance_s* si); + +/** + * @brief Sets a bool uniform of a shader. + * @param si Shader instance to use. + * @param id ID of the bool uniform. + * @param value Value to set. + */ +Result shaderInstanceSetBool(shaderInstance_s* si, int id, bool value); + +/** + * @brief Gets a bool uniform of a shader. + * @param si Shader instance to use. + * @param id ID of the bool uniform. + * @param value Pointer to output the value to. + */ +Result shaderInstanceGetBool(shaderInstance_s* si, int id, bool* value); + +/** + * @brief Gets the location of a shader's uniform. + * @param si Shader instance to use. + * @param name Name of the uniform. + */ +s8 shaderInstanceGetUniformLocation(shaderInstance_s* si, const char* name); + +/** + * @brief Initializes a shader program. + * @param sp Shader program to initialize. + */ +Result shaderProgramInit(shaderProgram_s* sp); + +/** + * @brief Frees a shader program. + * @param sp Shader program to free. + */ +Result shaderProgramFree(shaderProgram_s* sp); + +/** + * @brief Sets the vertex shader of a shader program. + * @param sp Shader program to use. + * @param dvle Vertex shader to set. + */ +Result shaderProgramSetVsh(shaderProgram_s* sp, DVLE_s* dvle); + +/** + * @brief Sets the geometry shader of a shader program. + * @param sp Shader program to use. + * @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). + */ +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. + * @param sp Shader program to use. + * @param permutation Attribute permutation to use. + */ +Result shaderProgramSetGshInputPermutation(shaderProgram_s* sp, u64 permutation); + +/** + * @brief Configures the shader units to use the specified shader program. + * @param sp Shader program to use. + * @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. + */ +Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGshCode); + +/** + * @brief Same as shaderProgramConfigure, but always loading code/operand descriptors and uploading DVLE constants afterwards. + * @param sp Shader program to use. + */ +Result shaderProgramUse(shaderProgram_s* sp); diff --git a/libctru/include/3ds/services/hb.h b/libctru/include/3ds/services/hb.h index 63740f3..6aefe96 100644 --- a/libctru/include/3ds/services/hb.h +++ b/libctru/include/3ds/services/hb.h @@ -1,38 +1,38 @@ -/** - * @file hb.h - * @brief HB (Homebrew) service. - */ -#pragma once - -// 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 -// A GOOD WAY TO COPE WITH THIS IS TO CHECK THE OUTPUT OF hbInit FOR ERRORS - -#include <3ds/types.h> - -/// Initializes HB. -Result hbInit(void); - -/// Exits HB. -void hbExit(void); - -/// Flushes/invalidates the entire data/instruction cache. -Result HB_FlushInvalidateCache(void); - -/** - * @brief Fetches the address for Ninjhax 1.x bootloader addresses. - * @param load3dsx void (*callBootloader)(Handle hb, Handle file); - * @param setArgv void (*setArgs)(u32* src, u32 length); - */ -Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv); - -/** - * @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) - * will be set to the number of sequential pages which were successfully reprotected + 1 - * @param addr Address to reprotect. - * @param pages Number of pages to reprotect. - * @param mode Mode to reprotect to. - * @param reprotectedPages Number of successfully reprotected pages, on failure. - */ -Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages); +/** + * @file hb.h + * @brief HB (Homebrew) service. + */ +#pragma once + +// 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 +// A GOOD WAY TO COPE WITH THIS IS TO CHECK THE OUTPUT OF hbInit FOR ERRORS + +#include <3ds/types.h> + +/// Initializes HB. +Result hbInit(void); + +/// Exits HB. +void hbExit(void); + +/// Flushes/invalidates the entire data/instruction cache. +Result HB_FlushInvalidateCache(void); + +/** + * @brief Fetches the address for Ninjhax 1.x bootloader addresses. + * @param load3dsx void (*callBootloader)(Handle hb, Handle file); + * @param setArgv void (*setArgs)(u32* src, u32 length); + */ +Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv); + +/** + * @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) + * will be set to the number of sequential pages which were successfully reprotected + 1 + * @param addr Address to reprotect. + * @param pages Number of pages to reprotect. + * @param mode Mode to reprotect to. + * @param reprotectedPages Number of successfully reprotected pages, on failure. + */ +Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages); diff --git a/libctru/include/3ds/services/y2r.h b/libctru/include/3ds/services/y2r.h index dc51698..635cdbf 100644 --- a/libctru/include/3ds/services/y2r.h +++ b/libctru/include/3ds/services/y2r.h @@ -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_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_565 = 0x3, ///< 16-bit RGB565. + OUTPUT_RGB_16_565 = 0x3, ///< 16-bit RGB565. } Y2RU_OutputFormat; /// Rotation to be applied to the output. diff --git a/libctru/source/console.c b/libctru/source/console.c index bb15ce9..ca940db 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -1,757 +1,757 @@ -#include -#include -#include -#include <3ds/gfx.h> -#include <3ds/console.h> -#include <3ds/svc.h> - -#include "default_font_bin.h" - -//set up the palette for color printing -static u16 colorTable[] = { - RGB8_to_565( 0, 0, 0), // black - RGB8_to_565(128, 0, 0), // red - RGB8_to_565( 0,128, 0), // green - RGB8_to_565(128,128, 0), // yellow - RGB8_to_565( 0, 0,128), // blue - RGB8_to_565(128, 0,128), // magenta - RGB8_to_565( 0,128,128), // cyan - RGB8_to_565(192,192,192), // white - - RGB8_to_565(128,128,128), // bright black - RGB8_to_565(255, 0, 0), // bright red - RGB8_to_565( 0,255, 0), // bright green - RGB8_to_565(255,255, 0), // bright yellow - RGB8_to_565( 0, 0,255), // bright blue - RGB8_to_565(255, 0,255), // bright magenta - RGB8_to_565( 0,255,255), // bright cyan - RGB8_to_565(255,255,255), // bright white - - RGB8_to_565( 0, 0, 0), // faint black - RGB8_to_565( 64, 0, 0), // faint red - RGB8_to_565( 0, 64, 0), // faint green - RGB8_to_565( 64, 64, 0), // faint yellow - RGB8_to_565( 0, 0, 64), // faint blue - RGB8_to_565( 64, 0, 64), // faint magenta - RGB8_to_565( 0, 64, 64), // faint cyan - RGB8_to_565( 96, 96, 96), // faint white -}; - -PrintConsole defaultConsole = -{ - //Font: - { - (u8*)default_font_bin, //font gfx - 0, //first ascii character in the set - 256 //number of characters in the font set - }, - (u16*)NULL, - 0,0, //cursorX cursorY - 0,0, //prevcursorX prevcursorY - 40, //console width - 30, //console height - 0, //window x - 0, //window y - 40, //window width - 30, //window height - 3, //tab size - 7, // foreground color - 0, // background color - 0, // flags - 0, //print callback - false //console initialized -}; - -PrintConsole currentCopy; - -PrintConsole* currentConsole = ¤tCopy; - -PrintConsole* consoleGetDefault(void){return &defaultConsole;} - -void consolePrintChar(int c); -void consoleDrawChar(int c); - -//--------------------------------------------------------------------------------- -static void consoleCls(char mode) { -//--------------------------------------------------------------------------------- - - int i = 0; - int colTemp,rowTemp; - - switch (mode) - { - case '[': - case '0': - { - colTemp = currentConsole->cursorX ; - rowTemp = currentConsole->cursorY ; - - while(i++ < ((currentConsole->windowHeight * currentConsole->windowWidth) - (rowTemp * currentConsole->consoleWidth + colTemp))) - consolePrintChar(' '); - - currentConsole->cursorX = colTemp; - currentConsole->cursorY = rowTemp; - break; - } - case '1': - { - colTemp = currentConsole->cursorX ; - rowTemp = currentConsole->cursorY ; - - currentConsole->cursorY = 0; - currentConsole->cursorX = 0; - - while (i++ < (rowTemp * currentConsole->windowWidth + colTemp)) - consolePrintChar(' '); - - currentConsole->cursorX = colTemp; - currentConsole->cursorY = rowTemp; - break; - } - case '2': - { - currentConsole->cursorY = 0; - currentConsole->cursorX = 0; - - while(i++ < currentConsole->windowHeight * currentConsole->windowWidth) - consolePrintChar(' '); - - currentConsole->cursorY = 0; - currentConsole->cursorX = 0; - break; - } - } - gfxFlushBuffers(); -} -//--------------------------------------------------------------------------------- -static void consoleClearLine(char mode) { -//--------------------------------------------------------------------------------- - - int i = 0; - int colTemp; - - switch (mode) - { - case '[': - case '0': - { - colTemp = currentConsole->cursorX ; - - while(i++ < (currentConsole->windowWidth - colTemp)) { - consolePrintChar(' '); - } - - currentConsole->cursorX = colTemp; - - break; - } - case '1': - { - colTemp = currentConsole->cursorX ; - - currentConsole->cursorX = 0; - - while(i++ < ((currentConsole->windowWidth - colTemp)-2)) { - consolePrintChar(' '); - } - - currentConsole->cursorX = colTemp; - - break; - } - case '2': - { - colTemp = currentConsole->cursorX ; - - currentConsole->cursorX = 0; - - while(i++ < currentConsole->windowWidth) { - consolePrintChar(' '); - } - - currentConsole->cursorX = colTemp; - - break; - } - } - gfxFlushBuffers(); -} - - -//--------------------------------------------------------------------------------- -ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { -//--------------------------------------------------------------------------------- - - char chr; - - int i, count = 0; - char *tmp = (char*)ptr; - - if(!tmp || len<=0) return -1; - - i = 0; - - while(i= '0' && chr <= '9') || chr == ';') - continue; - - switch (chr) { - //--------------------------------------- - // Cursor directional movement - //--------------------------------------- - case 'A': - consumed = 0; - assigned = sscanf(escapeseq,"[%dA%n", ¶meter, &consumed); - if (assigned==0) parameter = 1; - if (consumed) - currentConsole->cursorY = (currentConsole->cursorY - parameter) < 0 ? 0 : currentConsole->cursorY - parameter; - escaping = false; - break; - case 'B': - consumed = 0; - assigned = sscanf(escapeseq,"[%dB%n", ¶meter, &consumed); - if (assigned==0) parameter = 1; - if (consumed) - currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter; - escaping = false; - break; - case 'C': - consumed = 0; - assigned = sscanf(escapeseq,"[%dC%n", ¶meter, &consumed); - if (assigned==0) parameter = 1; - if (consumed) - currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter; - escaping = false; - break; - case 'D': - consumed = 0; - assigned = sscanf(escapeseq,"[%dD%n", ¶meter, &consumed); - if (assigned==0) parameter = 1; - if (consumed) - currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter; - escaping = false; - break; - //--------------------------------------- - // Cursor position movement - //--------------------------------------- - case 'H': - case 'f': - { - int x, y; - char c; - if(sscanf(escapeseq,"[%d;%d%c", &y, &x, &c) == 3 && (c == 'f' || c == 'H')) { - currentConsole->cursorX = x; - currentConsole->cursorY = y; - escaping = false; - break; - } - - x = y = 1; - if(sscanf(escapeseq,"[%d;%c", &y, &c) == 2 && (c == 'f' || c == 'H')) { - currentConsole->cursorX = x; - currentConsole->cursorY = y; - escaping = false; - break; - } - - x = y = 1; - if(sscanf(escapeseq,"[;%d%c", &x, &c) == 2 && (c == 'f' || c == 'H')) { - currentConsole->cursorX = x; - currentConsole->cursorY = y; - escaping = false; - break; - } - - x = y = 1; - if(sscanf(escapeseq,"[;%c", &c) == 1 && (c == 'f' || c == 'H')) { - currentConsole->cursorX = x; - currentConsole->cursorY = y; - escaping = false; - break; - } - - // invalid format - escaping = false; - break; - } - //--------------------------------------- - // Screen clear - //--------------------------------------- - case 'J': - if(escapelen <= 3) - consoleCls(escapeseq[escapelen-2]); - escaping = false; - break; - //--------------------------------------- - // Line clear - //--------------------------------------- - case 'K': - if(escapelen <= 3) - consoleClearLine(escapeseq[escapelen-2]); - escaping = false; - break; - //--------------------------------------- - // Save cursor position - //--------------------------------------- - case 's': - if(escapelen == 2) { - currentConsole->prevCursorX = currentConsole->cursorX ; - currentConsole->prevCursorY = currentConsole->cursorY ; - } - escaping = false; - break; - //--------------------------------------- - // Load cursor position - //--------------------------------------- - case 'u': - if(escapelen == 2) { - currentConsole->cursorX = currentConsole->prevCursorX ; - currentConsole->cursorY = currentConsole->prevCursorY ; - } - escaping = false; - break; - //--------------------------------------- - // Color scan codes - //--------------------------------------- - case 'm': - escapeseq++; - escapelen--; - - do { - parameter = 0; - if (escapelen == 1) { - consumed = 1; - } else if (memchr(escapeseq,';',escapelen)) { - sscanf(escapeseq,"%d;%n", ¶meter, &consumed); - } else { - sscanf(escapeseq,"%dm%n", ¶meter, &consumed); - } - - escapeseq += consumed; - escapelen -= consumed; - - switch(parameter) { - case 0: // reset - currentConsole->flags = 0; - currentConsole->bg = 0; - currentConsole->fg = 7; - break; - - case 1: // bold - currentConsole->flags &= ~CONSOLE_COLOR_FAINT; - currentConsole->flags |= CONSOLE_COLOR_BOLD; - break; - - case 2: // faint - currentConsole->flags &= ~CONSOLE_COLOR_BOLD; - currentConsole->flags |= CONSOLE_COLOR_FAINT; - break; - - case 3: // italic - currentConsole->flags |= CONSOLE_ITALIC; - break; - - case 4: // underline - currentConsole->flags |= CONSOLE_UNDERLINE; - break; - - case 5: // blink slow - currentConsole->flags &= ~CONSOLE_BLINK_FAST; - currentConsole->flags |= CONSOLE_BLINK_SLOW; - break; - - case 6: // blink fast - currentConsole->flags &= ~CONSOLE_BLINK_SLOW; - currentConsole->flags |= CONSOLE_BLINK_FAST; - break; - - case 7: // reverse video - currentConsole->flags |= CONSOLE_COLOR_REVERSE; - break; - - case 8: // conceal - currentConsole->flags |= CONSOLE_CONCEAL; - break; - - case 9: // crossed-out - currentConsole->flags |= CONSOLE_CROSSED_OUT; - break; - - case 21: // bold off - currentConsole->flags &= ~CONSOLE_COLOR_BOLD; - break; - - case 22: // normal color - currentConsole->flags &= ~CONSOLE_COLOR_BOLD; - currentConsole->flags &= ~CONSOLE_COLOR_FAINT; - break; - - case 23: // italic off - currentConsole->flags &= ~CONSOLE_ITALIC; - break; - - case 24: // underline off - currentConsole->flags &= ~CONSOLE_UNDERLINE; - break; - - case 25: // blink off - currentConsole->flags &= ~CONSOLE_BLINK_SLOW; - currentConsole->flags &= ~CONSOLE_BLINK_FAST; - break; - - case 27: // reverse off - currentConsole->flags &= ~CONSOLE_COLOR_REVERSE; - break; - - case 29: // crossed-out off - currentConsole->flags &= ~CONSOLE_CROSSED_OUT; - break; - - case 30 ... 37: // writing color - currentConsole->fg = parameter - 30; - break; - - case 39: // reset foreground color - currentConsole->fg = 7; - break; - - case 40 ... 47: // screen color - currentConsole->bg = parameter - 40; - break; - - case 49: // reset background color - currentConsole->fg = 0; - break; - } - } while (escapelen > 0); - - escaping = false; - break; - - default: - // some sort of unsupported escape; just gloss over it - escaping = false; - break; - } - } while (escaping); - continue; - } - - consolePrintChar(chr); - } - - return count; -} - -static const devoptab_t dotab_stdout = { - "con", - 0, - NULL, - NULL, - con_write, - NULL, - NULL, - NULL -}; - -//--------------------------------------------------------------------------------- -ssize_t debug_write(struct _reent *r, int fd, const char *ptr, size_t len) { -//--------------------------------------------------------------------------------- - svcOutputDebugString(ptr,len); - return len; -} - -static const devoptab_t dotab_3dmoo = { - "3dmoo", - 0, - NULL, - NULL, - debug_write, - NULL, - NULL, - NULL -}; - - -static const devoptab_t dotab_null = { - "null", - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -}; - -//--------------------------------------------------------------------------------- -PrintConsole* consoleInit(gfxScreen_t screen, PrintConsole* console) { -//--------------------------------------------------------------------------------- - - static bool firstConsoleInit = true; - - if(firstConsoleInit) { - devoptab_list[STD_OUT] = &dotab_stdout; - devoptab_list[STD_ERR] = &dotab_stdout; - - setvbuf(stdout, NULL , _IONBF, 0); - setvbuf(stderr, NULL , _IONBF, 0); - - firstConsoleInit = false; - } - - if(console) { - currentConsole = console; - } else { - console = currentConsole; - } - - *currentConsole = defaultConsole; - - console->consoleInitialised = 1; - - gfxSetScreenFormat(screen,GSP_RGB565_OES); - gfxSetDoubleBuffering(screen,false); - gfxSwapBuffersGpu(); - gspWaitForVBlank(); - - console->frameBuffer = (u16*)gfxGetFramebuffer(screen, GFX_LEFT, NULL, NULL); - - if(screen==GFX_TOP) { - console->consoleWidth = 50; - console->windowWidth = 50; - } - - - consoleCls('2'); - - return currentConsole; - -} - -//--------------------------------------------------------------------------------- -void consoleDebugInit(debugDevice device){ -//--------------------------------------------------------------------------------- - - int buffertype = _IONBF; - - switch(device) { - - case debugDevice_3DMOO: - devoptab_list[STD_ERR] = &dotab_3dmoo; - buffertype = _IOLBF; - break; - case debugDevice_CONSOLE: - devoptab_list[STD_ERR] = &dotab_stdout; - break; - case debugDevice_NULL: - devoptab_list[STD_ERR] = &dotab_null; - break; - } - setvbuf(stderr, NULL , buffertype, 0); - -} - -//--------------------------------------------------------------------------------- -PrintConsole *consoleSelect(PrintConsole* console){ -//--------------------------------------------------------------------------------- - PrintConsole *tmp = currentConsole; - currentConsole = console; - return tmp; -} - -//--------------------------------------------------------------------------------- -void consoleSetFont(PrintConsole* console, ConsoleFont* font){ -//--------------------------------------------------------------------------------- - - if(!console) console = currentConsole; - - console->font = *font; - -} - -//--------------------------------------------------------------------------------- -static void newRow() { -//--------------------------------------------------------------------------------- - - - currentConsole->cursorY ++; - - - if(currentConsole->cursorY >= currentConsole->windowHeight) { - currentConsole->cursorY --; - u16 *dst = ¤tConsole->frameBuffer[(currentConsole->windowX * 8 * 240) + (239 - (currentConsole->windowY * 8))]; - u16 *src = dst - 8; - - int i,j; - - for (i=0; iwindowWidth*8; i++) { - u32 *from = (u32*)((int)src & ~3); - u32 *to = (u32*)((int)dst & ~3); - for (j=0;j<(((currentConsole->windowHeight-1)*8)/2);j++) *(to--) = *(from--); - dst += 240; - src += 240; - } - - consoleClearLine('2'); - } -} -//--------------------------------------------------------------------------------- -void consoleDrawChar(int c) { -//--------------------------------------------------------------------------------- - c -= currentConsole->font.asciiOffset; - if ( c < 0 || c > currentConsole->font.numChars ) return; - - u8 *fontdata = currentConsole->font.gfx + (8 * c); - - int writingColor = currentConsole->fg; - int screenColor = currentConsole->bg; - - if (currentConsole->flags & CONSOLE_COLOR_BOLD) { - writingColor += 8; - } else if (currentConsole->flags & CONSOLE_COLOR_FAINT) { - writingColor += 16; - } - - if (currentConsole->flags & CONSOLE_COLOR_REVERSE) { - int tmp = writingColor; - writingColor = screenColor; - screenColor = tmp; - } - - u16 bg = colorTable[screenColor]; - u16 fg = colorTable[writingColor]; - - u8 b1 = *(fontdata++); - u8 b2 = *(fontdata++); - u8 b3 = *(fontdata++); - u8 b4 = *(fontdata++); - u8 b5 = *(fontdata++); - u8 b6 = *(fontdata++); - u8 b7 = *(fontdata++); - u8 b8 = *(fontdata++); - - if (currentConsole->flags & CONSOLE_UNDERLINE) b8 = 0xff; - - if (currentConsole->flags & CONSOLE_CROSSED_OUT) b4 = 0xff; - - u8 mask = 0x80; - - - int i; - - int x = (currentConsole->cursorX + currentConsole->windowX) * 8; - int y = ((currentConsole->cursorY + currentConsole->windowY) *8 ); - - u16 *screen = ¤tConsole->frameBuffer[(x * 240) + (239 - (y + 7))]; - - for (i=0;i<8;i++) { - if (b8 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } - if (b7 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } - if (b6 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } - if (b5 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } - if (b4 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } - if (b3 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } - if (b2 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } - if (b1 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } - mask >>= 1; - screen += 240 - 8; - } - -} - -//--------------------------------------------------------------------------------- -void consolePrintChar(int c) { -//--------------------------------------------------------------------------------- - if (c==0) return; - - if(currentConsole->PrintChar) - if(currentConsole->PrintChar(currentConsole, c)) - return; - - if(currentConsole->cursorX >= currentConsole->windowWidth) { - currentConsole->cursorX = 0; - - newRow(); - } - - switch(c) { - /* - The only special characters we will handle are tab (\t), carriage return (\r), line feed (\n) - and backspace (\b). - Carriage return & line feed will function the same: go to next line and put cursor at the beginning. - For everything else, use VT sequences. - - Reason: VT sequences are more specific to the task of cursor placement. - The special escape sequences \b \f & \v are archaic and non-portable. - */ - case 8: - currentConsole->cursorX--; - - if(currentConsole->cursorX < 0) { - if(currentConsole->cursorY > 0) { - currentConsole->cursorX = currentConsole->windowX - 1; - currentConsole->cursorY--; - } else { - currentConsole->cursorX = 0; - } - } - - consoleDrawChar(' '); - break; - - case 9: - currentConsole->cursorX += currentConsole->tabSize - ((currentConsole->cursorX)%(currentConsole->tabSize)); - break; - case 10: - newRow(); - case 13: - currentConsole->cursorX = 0; - gfxFlushBuffers(); - break; - default: - consoleDrawChar(c); - ++currentConsole->cursorX ; - break; - } -} - -//--------------------------------------------------------------------------------- -void consoleClear(void) { -//--------------------------------------------------------------------------------- - iprintf("\x1b[2J"); -} - -//--------------------------------------------------------------------------------- -void consoleSetWindow(PrintConsole* console, int x, int y, int width, int height){ -//--------------------------------------------------------------------------------- - - if(!console) console = currentConsole; - - console->windowWidth = width; - console->windowHeight = height; - console->windowX = x; - console->windowY = y; - - console->cursorX = 0; - console->cursorY = 0; - -} - - +#include +#include +#include +#include <3ds/gfx.h> +#include <3ds/console.h> +#include <3ds/svc.h> + +#include "default_font_bin.h" + +//set up the palette for color printing +static u16 colorTable[] = { + RGB8_to_565( 0, 0, 0), // black + RGB8_to_565(128, 0, 0), // red + RGB8_to_565( 0,128, 0), // green + RGB8_to_565(128,128, 0), // yellow + RGB8_to_565( 0, 0,128), // blue + RGB8_to_565(128, 0,128), // magenta + RGB8_to_565( 0,128,128), // cyan + RGB8_to_565(192,192,192), // white + + RGB8_to_565(128,128,128), // bright black + RGB8_to_565(255, 0, 0), // bright red + RGB8_to_565( 0,255, 0), // bright green + RGB8_to_565(255,255, 0), // bright yellow + RGB8_to_565( 0, 0,255), // bright blue + RGB8_to_565(255, 0,255), // bright magenta + RGB8_to_565( 0,255,255), // bright cyan + RGB8_to_565(255,255,255), // bright white + + RGB8_to_565( 0, 0, 0), // faint black + RGB8_to_565( 64, 0, 0), // faint red + RGB8_to_565( 0, 64, 0), // faint green + RGB8_to_565( 64, 64, 0), // faint yellow + RGB8_to_565( 0, 0, 64), // faint blue + RGB8_to_565( 64, 0, 64), // faint magenta + RGB8_to_565( 0, 64, 64), // faint cyan + RGB8_to_565( 96, 96, 96), // faint white +}; + +PrintConsole defaultConsole = +{ + //Font: + { + (u8*)default_font_bin, //font gfx + 0, //first ascii character in the set + 256 //number of characters in the font set + }, + (u16*)NULL, + 0,0, //cursorX cursorY + 0,0, //prevcursorX prevcursorY + 40, //console width + 30, //console height + 0, //window x + 0, //window y + 40, //window width + 30, //window height + 3, //tab size + 7, // foreground color + 0, // background color + 0, // flags + 0, //print callback + false //console initialized +}; + +PrintConsole currentCopy; + +PrintConsole* currentConsole = ¤tCopy; + +PrintConsole* consoleGetDefault(void){return &defaultConsole;} + +void consolePrintChar(int c); +void consoleDrawChar(int c); + +//--------------------------------------------------------------------------------- +static void consoleCls(char mode) { +//--------------------------------------------------------------------------------- + + int i = 0; + int colTemp,rowTemp; + + switch (mode) + { + case '[': + case '0': + { + colTemp = currentConsole->cursorX ; + rowTemp = currentConsole->cursorY ; + + while(i++ < ((currentConsole->windowHeight * currentConsole->windowWidth) - (rowTemp * currentConsole->consoleWidth + colTemp))) + consolePrintChar(' '); + + currentConsole->cursorX = colTemp; + currentConsole->cursorY = rowTemp; + break; + } + case '1': + { + colTemp = currentConsole->cursorX ; + rowTemp = currentConsole->cursorY ; + + currentConsole->cursorY = 0; + currentConsole->cursorX = 0; + + while (i++ < (rowTemp * currentConsole->windowWidth + colTemp)) + consolePrintChar(' '); + + currentConsole->cursorX = colTemp; + currentConsole->cursorY = rowTemp; + break; + } + case '2': + { + currentConsole->cursorY = 0; + currentConsole->cursorX = 0; + + while(i++ < currentConsole->windowHeight * currentConsole->windowWidth) + consolePrintChar(' '); + + currentConsole->cursorY = 0; + currentConsole->cursorX = 0; + break; + } + } + gfxFlushBuffers(); +} +//--------------------------------------------------------------------------------- +static void consoleClearLine(char mode) { +//--------------------------------------------------------------------------------- + + int i = 0; + int colTemp; + + switch (mode) + { + case '[': + case '0': + { + colTemp = currentConsole->cursorX ; + + while(i++ < (currentConsole->windowWidth - colTemp)) { + consolePrintChar(' '); + } + + currentConsole->cursorX = colTemp; + + break; + } + case '1': + { + colTemp = currentConsole->cursorX ; + + currentConsole->cursorX = 0; + + while(i++ < ((currentConsole->windowWidth - colTemp)-2)) { + consolePrintChar(' '); + } + + currentConsole->cursorX = colTemp; + + break; + } + case '2': + { + colTemp = currentConsole->cursorX ; + + currentConsole->cursorX = 0; + + while(i++ < currentConsole->windowWidth) { + consolePrintChar(' '); + } + + currentConsole->cursorX = colTemp; + + break; + } + } + gfxFlushBuffers(); +} + + +//--------------------------------------------------------------------------------- +ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { +//--------------------------------------------------------------------------------- + + char chr; + + int i, count = 0; + char *tmp = (char*)ptr; + + if(!tmp || len<=0) return -1; + + i = 0; + + while(i= '0' && chr <= '9') || chr == ';') + continue; + + switch (chr) { + //--------------------------------------- + // Cursor directional movement + //--------------------------------------- + case 'A': + consumed = 0; + assigned = sscanf(escapeseq,"[%dA%n", ¶meter, &consumed); + if (assigned==0) parameter = 1; + if (consumed) + currentConsole->cursorY = (currentConsole->cursorY - parameter) < 0 ? 0 : currentConsole->cursorY - parameter; + escaping = false; + break; + case 'B': + consumed = 0; + assigned = sscanf(escapeseq,"[%dB%n", ¶meter, &consumed); + if (assigned==0) parameter = 1; + if (consumed) + currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter; + escaping = false; + break; + case 'C': + consumed = 0; + assigned = sscanf(escapeseq,"[%dC%n", ¶meter, &consumed); + if (assigned==0) parameter = 1; + if (consumed) + currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter; + escaping = false; + break; + case 'D': + consumed = 0; + assigned = sscanf(escapeseq,"[%dD%n", ¶meter, &consumed); + if (assigned==0) parameter = 1; + if (consumed) + currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter; + escaping = false; + break; + //--------------------------------------- + // Cursor position movement + //--------------------------------------- + case 'H': + case 'f': + { + int x, y; + char c; + if(sscanf(escapeseq,"[%d;%d%c", &y, &x, &c) == 3 && (c == 'f' || c == 'H')) { + currentConsole->cursorX = x; + currentConsole->cursorY = y; + escaping = false; + break; + } + + x = y = 1; + if(sscanf(escapeseq,"[%d;%c", &y, &c) == 2 && (c == 'f' || c == 'H')) { + currentConsole->cursorX = x; + currentConsole->cursorY = y; + escaping = false; + break; + } + + x = y = 1; + if(sscanf(escapeseq,"[;%d%c", &x, &c) == 2 && (c == 'f' || c == 'H')) { + currentConsole->cursorX = x; + currentConsole->cursorY = y; + escaping = false; + break; + } + + x = y = 1; + if(sscanf(escapeseq,"[;%c", &c) == 1 && (c == 'f' || c == 'H')) { + currentConsole->cursorX = x; + currentConsole->cursorY = y; + escaping = false; + break; + } + + // invalid format + escaping = false; + break; + } + //--------------------------------------- + // Screen clear + //--------------------------------------- + case 'J': + if(escapelen <= 3) + consoleCls(escapeseq[escapelen-2]); + escaping = false; + break; + //--------------------------------------- + // Line clear + //--------------------------------------- + case 'K': + if(escapelen <= 3) + consoleClearLine(escapeseq[escapelen-2]); + escaping = false; + break; + //--------------------------------------- + // Save cursor position + //--------------------------------------- + case 's': + if(escapelen == 2) { + currentConsole->prevCursorX = currentConsole->cursorX ; + currentConsole->prevCursorY = currentConsole->cursorY ; + } + escaping = false; + break; + //--------------------------------------- + // Load cursor position + //--------------------------------------- + case 'u': + if(escapelen == 2) { + currentConsole->cursorX = currentConsole->prevCursorX ; + currentConsole->cursorY = currentConsole->prevCursorY ; + } + escaping = false; + break; + //--------------------------------------- + // Color scan codes + //--------------------------------------- + case 'm': + escapeseq++; + escapelen--; + + do { + parameter = 0; + if (escapelen == 1) { + consumed = 1; + } else if (memchr(escapeseq,';',escapelen)) { + sscanf(escapeseq,"%d;%n", ¶meter, &consumed); + } else { + sscanf(escapeseq,"%dm%n", ¶meter, &consumed); + } + + escapeseq += consumed; + escapelen -= consumed; + + switch(parameter) { + case 0: // reset + currentConsole->flags = 0; + currentConsole->bg = 0; + currentConsole->fg = 7; + break; + + case 1: // bold + currentConsole->flags &= ~CONSOLE_COLOR_FAINT; + currentConsole->flags |= CONSOLE_COLOR_BOLD; + break; + + case 2: // faint + currentConsole->flags &= ~CONSOLE_COLOR_BOLD; + currentConsole->flags |= CONSOLE_COLOR_FAINT; + break; + + case 3: // italic + currentConsole->flags |= CONSOLE_ITALIC; + break; + + case 4: // underline + currentConsole->flags |= CONSOLE_UNDERLINE; + break; + + case 5: // blink slow + currentConsole->flags &= ~CONSOLE_BLINK_FAST; + currentConsole->flags |= CONSOLE_BLINK_SLOW; + break; + + case 6: // blink fast + currentConsole->flags &= ~CONSOLE_BLINK_SLOW; + currentConsole->flags |= CONSOLE_BLINK_FAST; + break; + + case 7: // reverse video + currentConsole->flags |= CONSOLE_COLOR_REVERSE; + break; + + case 8: // conceal + currentConsole->flags |= CONSOLE_CONCEAL; + break; + + case 9: // crossed-out + currentConsole->flags |= CONSOLE_CROSSED_OUT; + break; + + case 21: // bold off + currentConsole->flags &= ~CONSOLE_COLOR_BOLD; + break; + + case 22: // normal color + currentConsole->flags &= ~CONSOLE_COLOR_BOLD; + currentConsole->flags &= ~CONSOLE_COLOR_FAINT; + break; + + case 23: // italic off + currentConsole->flags &= ~CONSOLE_ITALIC; + break; + + case 24: // underline off + currentConsole->flags &= ~CONSOLE_UNDERLINE; + break; + + case 25: // blink off + currentConsole->flags &= ~CONSOLE_BLINK_SLOW; + currentConsole->flags &= ~CONSOLE_BLINK_FAST; + break; + + case 27: // reverse off + currentConsole->flags &= ~CONSOLE_COLOR_REVERSE; + break; + + case 29: // crossed-out off + currentConsole->flags &= ~CONSOLE_CROSSED_OUT; + break; + + case 30 ... 37: // writing color + currentConsole->fg = parameter - 30; + break; + + case 39: // reset foreground color + currentConsole->fg = 7; + break; + + case 40 ... 47: // screen color + currentConsole->bg = parameter - 40; + break; + + case 49: // reset background color + currentConsole->fg = 0; + break; + } + } while (escapelen > 0); + + escaping = false; + break; + + default: + // some sort of unsupported escape; just gloss over it + escaping = false; + break; + } + } while (escaping); + continue; + } + + consolePrintChar(chr); + } + + return count; +} + +static const devoptab_t dotab_stdout = { + "con", + 0, + NULL, + NULL, + con_write, + NULL, + NULL, + NULL +}; + +//--------------------------------------------------------------------------------- +ssize_t debug_write(struct _reent *r, int fd, const char *ptr, size_t len) { +//--------------------------------------------------------------------------------- + svcOutputDebugString(ptr,len); + return len; +} + +static const devoptab_t dotab_3dmoo = { + "3dmoo", + 0, + NULL, + NULL, + debug_write, + NULL, + NULL, + NULL +}; + + +static const devoptab_t dotab_null = { + "null", + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +//--------------------------------------------------------------------------------- +PrintConsole* consoleInit(gfxScreen_t screen, PrintConsole* console) { +//--------------------------------------------------------------------------------- + + static bool firstConsoleInit = true; + + if(firstConsoleInit) { + devoptab_list[STD_OUT] = &dotab_stdout; + devoptab_list[STD_ERR] = &dotab_stdout; + + setvbuf(stdout, NULL , _IONBF, 0); + setvbuf(stderr, NULL , _IONBF, 0); + + firstConsoleInit = false; + } + + if(console) { + currentConsole = console; + } else { + console = currentConsole; + } + + *currentConsole = defaultConsole; + + console->consoleInitialised = 1; + + gfxSetScreenFormat(screen,GSP_RGB565_OES); + gfxSetDoubleBuffering(screen,false); + gfxSwapBuffersGpu(); + gspWaitForVBlank(); + + console->frameBuffer = (u16*)gfxGetFramebuffer(screen, GFX_LEFT, NULL, NULL); + + if(screen==GFX_TOP) { + console->consoleWidth = 50; + console->windowWidth = 50; + } + + + consoleCls('2'); + + return currentConsole; + +} + +//--------------------------------------------------------------------------------- +void consoleDebugInit(debugDevice device){ +//--------------------------------------------------------------------------------- + + int buffertype = _IONBF; + + switch(device) { + + case debugDevice_3DMOO: + devoptab_list[STD_ERR] = &dotab_3dmoo; + buffertype = _IOLBF; + break; + case debugDevice_CONSOLE: + devoptab_list[STD_ERR] = &dotab_stdout; + break; + case debugDevice_NULL: + devoptab_list[STD_ERR] = &dotab_null; + break; + } + setvbuf(stderr, NULL , buffertype, 0); + +} + +//--------------------------------------------------------------------------------- +PrintConsole *consoleSelect(PrintConsole* console){ +//--------------------------------------------------------------------------------- + PrintConsole *tmp = currentConsole; + currentConsole = console; + return tmp; +} + +//--------------------------------------------------------------------------------- +void consoleSetFont(PrintConsole* console, ConsoleFont* font){ +//--------------------------------------------------------------------------------- + + if(!console) console = currentConsole; + + console->font = *font; + +} + +//--------------------------------------------------------------------------------- +static void newRow() { +//--------------------------------------------------------------------------------- + + + currentConsole->cursorY ++; + + + if(currentConsole->cursorY >= currentConsole->windowHeight) { + currentConsole->cursorY --; + u16 *dst = ¤tConsole->frameBuffer[(currentConsole->windowX * 8 * 240) + (239 - (currentConsole->windowY * 8))]; + u16 *src = dst - 8; + + int i,j; + + for (i=0; iwindowWidth*8; i++) { + u32 *from = (u32*)((int)src & ~3); + u32 *to = (u32*)((int)dst & ~3); + for (j=0;j<(((currentConsole->windowHeight-1)*8)/2);j++) *(to--) = *(from--); + dst += 240; + src += 240; + } + + consoleClearLine('2'); + } +} +//--------------------------------------------------------------------------------- +void consoleDrawChar(int c) { +//--------------------------------------------------------------------------------- + c -= currentConsole->font.asciiOffset; + if ( c < 0 || c > currentConsole->font.numChars ) return; + + u8 *fontdata = currentConsole->font.gfx + (8 * c); + + int writingColor = currentConsole->fg; + int screenColor = currentConsole->bg; + + if (currentConsole->flags & CONSOLE_COLOR_BOLD) { + writingColor += 8; + } else if (currentConsole->flags & CONSOLE_COLOR_FAINT) { + writingColor += 16; + } + + if (currentConsole->flags & CONSOLE_COLOR_REVERSE) { + int tmp = writingColor; + writingColor = screenColor; + screenColor = tmp; + } + + u16 bg = colorTable[screenColor]; + u16 fg = colorTable[writingColor]; + + u8 b1 = *(fontdata++); + u8 b2 = *(fontdata++); + u8 b3 = *(fontdata++); + u8 b4 = *(fontdata++); + u8 b5 = *(fontdata++); + u8 b6 = *(fontdata++); + u8 b7 = *(fontdata++); + u8 b8 = *(fontdata++); + + if (currentConsole->flags & CONSOLE_UNDERLINE) b8 = 0xff; + + if (currentConsole->flags & CONSOLE_CROSSED_OUT) b4 = 0xff; + + u8 mask = 0x80; + + + int i; + + int x = (currentConsole->cursorX + currentConsole->windowX) * 8; + int y = ((currentConsole->cursorY + currentConsole->windowY) *8 ); + + u16 *screen = ¤tConsole->frameBuffer[(x * 240) + (239 - (y + 7))]; + + for (i=0;i<8;i++) { + if (b8 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b7 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b6 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b5 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b4 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b3 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b2 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b1 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + mask >>= 1; + screen += 240 - 8; + } + +} + +//--------------------------------------------------------------------------------- +void consolePrintChar(int c) { +//--------------------------------------------------------------------------------- + if (c==0) return; + + if(currentConsole->PrintChar) + if(currentConsole->PrintChar(currentConsole, c)) + return; + + if(currentConsole->cursorX >= currentConsole->windowWidth) { + currentConsole->cursorX = 0; + + newRow(); + } + + switch(c) { + /* + The only special characters we will handle are tab (\t), carriage return (\r), line feed (\n) + and backspace (\b). + Carriage return & line feed will function the same: go to next line and put cursor at the beginning. + For everything else, use VT sequences. + + Reason: VT sequences are more specific to the task of cursor placement. + The special escape sequences \b \f & \v are archaic and non-portable. + */ + case 8: + currentConsole->cursorX--; + + if(currentConsole->cursorX < 0) { + if(currentConsole->cursorY > 0) { + currentConsole->cursorX = currentConsole->windowX - 1; + currentConsole->cursorY--; + } else { + currentConsole->cursorX = 0; + } + } + + consoleDrawChar(' '); + break; + + case 9: + currentConsole->cursorX += currentConsole->tabSize - ((currentConsole->cursorX)%(currentConsole->tabSize)); + break; + case 10: + newRow(); + case 13: + currentConsole->cursorX = 0; + gfxFlushBuffers(); + break; + default: + consoleDrawChar(c); + ++currentConsole->cursorX ; + break; + } +} + +//--------------------------------------------------------------------------------- +void consoleClear(void) { +//--------------------------------------------------------------------------------- + iprintf("\x1b[2J"); +} + +//--------------------------------------------------------------------------------- +void consoleSetWindow(PrintConsole* console, int x, int y, int width, int height){ +//--------------------------------------------------------------------------------- + + if(!console) console = currentConsole; + + console->windowWidth = width; + console->windowHeight = height; + console->windowX = x; + console->windowY = y; + + console->cursorX = 0; + console->cursorY = 0; + +} + + diff --git a/libctru/source/gpu/shaderProgram.c b/libctru/source/gpu/shaderProgram.c index edfcf98..0e5a74a 100644 --- a/libctru/source/gpu/shaderProgram.c +++ b/libctru/source/gpu/shaderProgram.c @@ -1,382 +1,382 @@ -#include -#include -#include <3ds/types.h> -#include <3ds/result.h> -#include <3ds/gpu/registers.h> -#include <3ds/gpu/shaderProgram.h> - -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_SendOperandDescriptors(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length); - -Result shaderInstanceInit(shaderInstance_s* si, DVLE_s* dvle) -{ - if(!si || !dvle)return -1; - - si->dvle = dvle; - - si->boolUniforms = 0; - si->boolUniformMask = 0; - si->intUniforms[0] = 0x00000000; - si->intUniforms[1] = 0x00000000; - si->intUniforms[2] = 0x00000000; - si->intUniforms[3] = 0x00000000; - si->float24Uniforms = NULL; - si->intUniformMask = 0; - - int i; - DVLE_constEntry_s* cnst = dvle->constTableData; - if(cnst) - { - int float24cnt=0; - for(i=0; iconstTableSize; i++) - { - switch(cnst[i].type) - { - case DVLE_CONST_BOOL: - shaderInstanceSetBool(si, cnst[i].id, cnst[i].data[0]&1); - break; - case DVLE_CONST_u8: - if(cnst[i].id<4) - { - si->intUniforms[cnst[i].id] = cnst[i].data[0]; - si->intUniformMask |= (1<float24Uniforms = malloc(sizeof(float24Uniform_s)*float24cnt); - if(si->float24Uniforms) - { - float24cnt = 0; - u32 rev[3]; - u8* rev8=(u8*)rev; - for(i=0; iconstTableSize; i++) - { - if(cnst[i].type==DVLE_CONST_FLOAT24) - { - memcpy(&rev8[0], &cnst[i].data[0], 3); - memcpy(&rev8[3], &cnst[i].data[1], 3); - memcpy(&rev8[6], &cnst[i].data[2], 3); - memcpy(&rev8[9], &cnst[i].data[3], 3); - - si->float24Uniforms[float24cnt].id = cnst[i].id&0xFF; - si->float24Uniforms[float24cnt].data[0] = rev[2]; - si->float24Uniforms[float24cnt].data[1] = rev[1]; - si->float24Uniforms[float24cnt].data[2] = rev[0]; - - float24cnt++; - } - } - } - si->numFloat24Uniforms = float24cnt; - } - } - - return 0; -} - -Result shaderInstanceFree(shaderInstance_s* si) -{ - if(!si)return -1; - - if(si->float24Uniforms)free(si->float24Uniforms); - free(si); - - return 0; -} - -Result shaderInstanceSetBool(shaderInstance_s* si, int id, bool value) -{ - if(!si)return -1; - if(id<0 || id>15)return -2; - - si->boolUniforms &= ~(1<boolUniforms |= (value)<boolUniformMask |= (1<15)return -2; - if(!value)return -3; - - *value = ((si->boolUniforms>>id)&1); - - return 0; -} - -s8 shaderInstanceGetUniformLocation(shaderInstance_s* si, const char* name) -{ - if(!si)return -1; - - return DVLE_GetUniformRegister(si->dvle, name); -} - -Result shaderProgramInit(shaderProgram_s* sp) -{ - if(!sp)return -1; - - sp->vertexShader = NULL; - sp->geometryShader = NULL; - - return 0; -} - -Result shaderProgramFree(shaderProgram_s* sp) -{ - if(!sp)return -1; - - shaderInstanceFree(sp->vertexShader); - shaderInstanceFree(sp->geometryShader); - - return 0; -} - -Result shaderProgramSetVsh(shaderProgram_s* sp, DVLE_s* dvle) -{ - if(!sp || !dvle)return -1; - if(dvle->type != VERTEX_SHDR)return -2; - - if(sp->vertexShader)shaderInstanceFree(sp->vertexShader); - - sp->vertexShader = (shaderInstance_s*)malloc(sizeof(shaderInstance_s)); - if(!sp->vertexShader)return -3; - - return shaderInstanceInit(sp->vertexShader, dvle); -} - -Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle, u8 stride) -{ - if(!sp || !dvle)return -1; - if(dvle->type != GEOMETRY_SHDR)return -2; - - if(sp->geometryShader)shaderInstanceFree(sp->geometryShader); - - sp->geometryShader = (shaderInstance_s*)malloc(sizeof(shaderInstance_s)); - if(!sp->geometryShader)return -3; - - sp->geoShaderInputPermutation[0] = 0x76543210; - sp->geoShaderInputPermutation[1] = 0xFEDCBA98; - sp->geoShaderInputStride = stride; - - return shaderInstanceInit(sp->geometryShader, dvle); -} - -Result shaderProgramSetGshInputPermutation(shaderProgram_s* sp, u64 permutation) -{ - if(!sp || !sp->geometryShader)return -1; - - sp->geoShaderInputPermutation[0] = permutation & 0xFFFFFFFF; - sp->geoShaderInputPermutation[0] = permutation>>32; - return 0; -} - -static inline void shaderProgramUploadDvle(const DVLE_s* dvle) -{ - const DVLP_s* dvlp = dvle->dvlp; - // Limit vertex shader code size to the first 512 instructions - int codeSize = dvle->type == GEOMETRY_SHDR ? dvlp->codeSize : (dvlp->codeSize < 512 ? dvlp->codeSize : 512); - GPU_SendShaderCode(dvle->type, dvlp->codeData, 0, codeSize); - GPU_SendOperandDescriptors(dvle->type, dvlp->opcdescData, 0, dvlp->opdescSize); -} - -static inline void shaderProgramMergeOutmaps(u32* outmapData, const u32* vshOutmap, const u32* gshOutmap) -{ - int i, j; - - // Find and copy attributes common to both vertex and geometry shader - u32 vsh_common = 0, gsh_common = 0; - for (i = 1; i < 8; i ++) - { - u32 mask = gshOutmap[i]; - if (mask == 0x1F1F1F1F) - break; - for (j = 1; j < 8; j ++) - { - if (vshOutmap[j] == mask) - { - outmapData[++outmapData[0]] = mask; - vsh_common |= BIT(j); - gsh_common |= BIT(i); - break; - } - } - } - - // Find and copy attributes that are exclusive to the geometry shader - for (i = 1; i < 8; i ++) - { - u32 mask = gshOutmap[i]; - if (mask == 0x1F1F1F1F) - break; - if (!(gsh_common & BIT(i))) - outmapData[++outmapData[0]] = mask; - } - - // Find and copy attributes that are exclusive to the vertex shader - for (i = 1; i < 8; i ++) - { - u32 mask = vshOutmap[i]; - if (mask == 0x1F1F1F1F) - break; - if (!(vsh_common & BIT(i))) - outmapData[++outmapData[0]] = mask; - } -} - -Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGshCode) -{ - if (!sp || !sp->vertexShader) return -1; - - // Get pointers to relevant structures - const DVLE_s* vshDvle = sp->vertexShader->dvle; - const DVLE_s* gshDvle = sp->geometryShader ? sp->geometryShader->dvle : NULL; - const DVLE_s* mainDvle = gshDvle ? gshDvle : vshDvle; - - // Variables for working with the outmap - u32 outmapData[8]; - u32 outmapMode = mainDvle->outmapMode; - u32 outmapClock = mainDvle->outmapClock; - - // 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_CONFIG2, 0x3, 0); - GPUCMD_AddMaskedWrite(GPUREG_VSH_COM_MODE, 0x1, gshDvle ? 1 : 0); - - // Set up vertex shader code blob (if necessary) - if (sendVshCode) - shaderProgramUploadDvle(vshDvle); - - // Set up vertex shader entrypoint & outmap mask - GPUCMD_AddWrite(GPUREG_VSH_ENTRYPOINT, 0x7FFF0000|(vshDvle->mainOffset&0xFFFF)); - GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_MASK, vshDvle->outmapMask); - GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_TOTAL1, vshDvle->outmapData[0]-1); - GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_TOTAL2, vshDvle->outmapData[0]-1); - - // Set up geometry shader (if present) - if (gshDvle) - { - // Set up geometry shader code blob (if necessary) - if (sendGshCode) - shaderProgramUploadDvle(gshDvle); - - // Set up geometry shader entrypoint & outmap mask - GPUCMD_AddWrite(GPUREG_GSH_ENTRYPOINT, 0x7FFF0000|(gshDvle->mainOffset&0xFFFF)); - GPUCMD_AddWrite(GPUREG_GSH_OUTMAP_MASK, gshDvle->outmapMask); - } - - // Merge vertex shader & geometry shader outmaps if requested - if (gshDvle && gshDvle->mergeOutmaps) - { - // Clear outmap - memset(outmapData, 0x1F, sizeof(outmapData)); - outmapData[0] = 0; - - // Merge outmaps - shaderProgramMergeOutmaps(outmapData, vshDvle->outmapData, gshDvle->outmapData); - outmapMode |= vshDvle->outmapMode; - outmapClock |= vshDvle->outmapClock; - } else - memcpy(outmapData, mainDvle->outmapData, sizeof(outmapData)); - - // Upload and configure outmap - GPU_SetShaderOutmap(outmapData); - GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, outmapMode); - GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, outmapClock); - - // Configure geostage - if (gshDvle) - { - // Input stride: use value if specified, otherwise use number of outputs in vertex shader - int stride = sp->geoShaderInputStride ? sp->geoShaderInputStride : vshDvle->outmapData[0]; - - // Enable or disable variable-size primitive processing - GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0xA, gshDvle->gshMode == GSH_VARIABLE_PRIM ? 0x80000000 : 0); - - // Set up geoshader processing mode - u32 misc = gshDvle->gshMode; - if (misc == GSH_FIXED_PRIM) - misc |= 0x01000000 | ((u32)gshDvle->gshFixedVtxStart<<16) | ((stride-1)<<12) | ((u32)(gshDvle->gshFixedVtxNum-1)<<8); - GPUCMD_AddWrite(GPUREG_GSH_MISC0, misc); - - // Set up variable-size primitive mode parameters - GPUCMD_AddWrite(GPUREG_GSH_MISC1, gshDvle->gshMode == GSH_VARIABLE_PRIM ? (gshDvle->gshVariableVtxNum-1) : 0); - - // Set up geoshader input - GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0x08000000 | (gshDvle->gshMode ? 0x0100 : 0) | (stride-1)); - - // Set up geoshader permutation - GPUCMD_AddIncrementalWrites(GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW, sp->geoShaderInputPermutation, 2); - } else - { - // Defaults for when geostage is disabled - GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0xA, 0); - GPUCMD_AddWrite(GPUREG_GSH_MISC0, 0); - GPUCMD_AddWrite(GPUREG_GSH_MISC1, 0); - GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0xA0000000); - } - - return 0; -} - -Result shaderProgramUse(shaderProgram_s* sp) -{ - Result rc = shaderProgramConfigure(sp, true, true); - if (R_FAILED(rc)) return rc; - - int i; - - // Set up uniforms - GPUCMD_AddWrite(GPUREG_VSH_BOOLUNIFORM, 0x7FFF0000|sp->vertexShader->boolUniforms); - GPUCMD_AddIncrementalWrites(GPUREG_VSH_INTUNIFORM_I0, sp->vertexShader->intUniforms, 4); - for(i=0; ivertexShader->numFloat24Uniforms; i++) GPUCMD_AddIncrementalWrites(GPUREG_VSH_FLOATUNIFORM_CONFIG, (u32*)&sp->vertexShader->float24Uniforms[i], 4); - if (sp->geometryShader) - { - GPUCMD_AddWrite(GPUREG_GSH_BOOLUNIFORM, 0x7FFF0000|sp->geometryShader->boolUniforms); - GPUCMD_AddIncrementalWrites(GPUREG_GSH_INTUNIFORM_I0, sp->geometryShader->intUniforms, 4); - for(i=0; igeometryShader->numFloat24Uniforms; i++) GPUCMD_AddIncrementalWrites(GPUREG_GSH_FLOATUNIFORM_CONFIG, (u32*)&sp->geometryShader->float24Uniforms[i], 4); - } - - return 0; -} - -void GPU_SetShaderOutmap(const u32 outmapData[8]) -{ - GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x1, outmapData[0]-1); - GPUCMD_AddIncrementalWrites(GPUREG_SH_OUTMAP_TOTAL, outmapData, 8); -} - -void GPU_SendShaderCode(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length) -{ - if(!data)return; - - int regOffset=(type==GPU_GEOMETRY_SHADER)?(-0x30):(0x0); - - GPUCMD_AddWrite(GPUREG_VSH_CODETRANSFER_CONFIG+regOffset, offset); - - int i; - for(i=0;i +#include +#include <3ds/types.h> +#include <3ds/result.h> +#include <3ds/gpu/registers.h> +#include <3ds/gpu/shaderProgram.h> + +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_SendOperandDescriptors(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length); + +Result shaderInstanceInit(shaderInstance_s* si, DVLE_s* dvle) +{ + if(!si || !dvle)return -1; + + si->dvle = dvle; + + si->boolUniforms = 0; + si->boolUniformMask = 0; + si->intUniforms[0] = 0x00000000; + si->intUniforms[1] = 0x00000000; + si->intUniforms[2] = 0x00000000; + si->intUniforms[3] = 0x00000000; + si->float24Uniforms = NULL; + si->intUniformMask = 0; + + int i; + DVLE_constEntry_s* cnst = dvle->constTableData; + if(cnst) + { + int float24cnt=0; + for(i=0; iconstTableSize; i++) + { + switch(cnst[i].type) + { + case DVLE_CONST_BOOL: + shaderInstanceSetBool(si, cnst[i].id, cnst[i].data[0]&1); + break; + case DVLE_CONST_u8: + if(cnst[i].id<4) + { + si->intUniforms[cnst[i].id] = cnst[i].data[0]; + si->intUniformMask |= (1<float24Uniforms = malloc(sizeof(float24Uniform_s)*float24cnt); + if(si->float24Uniforms) + { + float24cnt = 0; + u32 rev[3]; + u8* rev8=(u8*)rev; + for(i=0; iconstTableSize; i++) + { + if(cnst[i].type==DVLE_CONST_FLOAT24) + { + memcpy(&rev8[0], &cnst[i].data[0], 3); + memcpy(&rev8[3], &cnst[i].data[1], 3); + memcpy(&rev8[6], &cnst[i].data[2], 3); + memcpy(&rev8[9], &cnst[i].data[3], 3); + + si->float24Uniforms[float24cnt].id = cnst[i].id&0xFF; + si->float24Uniforms[float24cnt].data[0] = rev[2]; + si->float24Uniforms[float24cnt].data[1] = rev[1]; + si->float24Uniforms[float24cnt].data[2] = rev[0]; + + float24cnt++; + } + } + } + si->numFloat24Uniforms = float24cnt; + } + } + + return 0; +} + +Result shaderInstanceFree(shaderInstance_s* si) +{ + if(!si)return -1; + + if(si->float24Uniforms)free(si->float24Uniforms); + free(si); + + return 0; +} + +Result shaderInstanceSetBool(shaderInstance_s* si, int id, bool value) +{ + if(!si)return -1; + if(id<0 || id>15)return -2; + + si->boolUniforms &= ~(1<boolUniforms |= (value)<boolUniformMask |= (1<15)return -2; + if(!value)return -3; + + *value = ((si->boolUniforms>>id)&1); + + return 0; +} + +s8 shaderInstanceGetUniformLocation(shaderInstance_s* si, const char* name) +{ + if(!si)return -1; + + return DVLE_GetUniformRegister(si->dvle, name); +} + +Result shaderProgramInit(shaderProgram_s* sp) +{ + if(!sp)return -1; + + sp->vertexShader = NULL; + sp->geometryShader = NULL; + + return 0; +} + +Result shaderProgramFree(shaderProgram_s* sp) +{ + if(!sp)return -1; + + shaderInstanceFree(sp->vertexShader); + shaderInstanceFree(sp->geometryShader); + + return 0; +} + +Result shaderProgramSetVsh(shaderProgram_s* sp, DVLE_s* dvle) +{ + if(!sp || !dvle)return -1; + if(dvle->type != VERTEX_SHDR)return -2; + + if(sp->vertexShader)shaderInstanceFree(sp->vertexShader); + + sp->vertexShader = (shaderInstance_s*)malloc(sizeof(shaderInstance_s)); + if(!sp->vertexShader)return -3; + + return shaderInstanceInit(sp->vertexShader, dvle); +} + +Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle, u8 stride) +{ + if(!sp || !dvle)return -1; + if(dvle->type != GEOMETRY_SHDR)return -2; + + if(sp->geometryShader)shaderInstanceFree(sp->geometryShader); + + sp->geometryShader = (shaderInstance_s*)malloc(sizeof(shaderInstance_s)); + if(!sp->geometryShader)return -3; + + sp->geoShaderInputPermutation[0] = 0x76543210; + sp->geoShaderInputPermutation[1] = 0xFEDCBA98; + sp->geoShaderInputStride = stride; + + return shaderInstanceInit(sp->geometryShader, dvle); +} + +Result shaderProgramSetGshInputPermutation(shaderProgram_s* sp, u64 permutation) +{ + if(!sp || !sp->geometryShader)return -1; + + sp->geoShaderInputPermutation[0] = permutation & 0xFFFFFFFF; + sp->geoShaderInputPermutation[0] = permutation>>32; + return 0; +} + +static inline void shaderProgramUploadDvle(const DVLE_s* dvle) +{ + const DVLP_s* dvlp = dvle->dvlp; + // Limit vertex shader code size to the first 512 instructions + int codeSize = dvle->type == GEOMETRY_SHDR ? dvlp->codeSize : (dvlp->codeSize < 512 ? dvlp->codeSize : 512); + GPU_SendShaderCode(dvle->type, dvlp->codeData, 0, codeSize); + GPU_SendOperandDescriptors(dvle->type, dvlp->opcdescData, 0, dvlp->opdescSize); +} + +static inline void shaderProgramMergeOutmaps(u32* outmapData, const u32* vshOutmap, const u32* gshOutmap) +{ + int i, j; + + // Find and copy attributes common to both vertex and geometry shader + u32 vsh_common = 0, gsh_common = 0; + for (i = 1; i < 8; i ++) + { + u32 mask = gshOutmap[i]; + if (mask == 0x1F1F1F1F) + break; + for (j = 1; j < 8; j ++) + { + if (vshOutmap[j] == mask) + { + outmapData[++outmapData[0]] = mask; + vsh_common |= BIT(j); + gsh_common |= BIT(i); + break; + } + } + } + + // Find and copy attributes that are exclusive to the geometry shader + for (i = 1; i < 8; i ++) + { + u32 mask = gshOutmap[i]; + if (mask == 0x1F1F1F1F) + break; + if (!(gsh_common & BIT(i))) + outmapData[++outmapData[0]] = mask; + } + + // Find and copy attributes that are exclusive to the vertex shader + for (i = 1; i < 8; i ++) + { + u32 mask = vshOutmap[i]; + if (mask == 0x1F1F1F1F) + break; + if (!(vsh_common & BIT(i))) + outmapData[++outmapData[0]] = mask; + } +} + +Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGshCode) +{ + if (!sp || !sp->vertexShader) return -1; + + // Get pointers to relevant structures + const DVLE_s* vshDvle = sp->vertexShader->dvle; + const DVLE_s* gshDvle = sp->geometryShader ? sp->geometryShader->dvle : NULL; + const DVLE_s* mainDvle = gshDvle ? gshDvle : vshDvle; + + // Variables for working with the outmap + u32 outmapData[8]; + u32 outmapMode = mainDvle->outmapMode; + u32 outmapClock = mainDvle->outmapClock; + + // 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_CONFIG2, 0x3, 0); + GPUCMD_AddMaskedWrite(GPUREG_VSH_COM_MODE, 0x1, gshDvle ? 1 : 0); + + // Set up vertex shader code blob (if necessary) + if (sendVshCode) + shaderProgramUploadDvle(vshDvle); + + // Set up vertex shader entrypoint & outmap mask + GPUCMD_AddWrite(GPUREG_VSH_ENTRYPOINT, 0x7FFF0000|(vshDvle->mainOffset&0xFFFF)); + GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_MASK, vshDvle->outmapMask); + GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_TOTAL1, vshDvle->outmapData[0]-1); + GPUCMD_AddWrite(GPUREG_VSH_OUTMAP_TOTAL2, vshDvle->outmapData[0]-1); + + // Set up geometry shader (if present) + if (gshDvle) + { + // Set up geometry shader code blob (if necessary) + if (sendGshCode) + shaderProgramUploadDvle(gshDvle); + + // Set up geometry shader entrypoint & outmap mask + GPUCMD_AddWrite(GPUREG_GSH_ENTRYPOINT, 0x7FFF0000|(gshDvle->mainOffset&0xFFFF)); + GPUCMD_AddWrite(GPUREG_GSH_OUTMAP_MASK, gshDvle->outmapMask); + } + + // Merge vertex shader & geometry shader outmaps if requested + if (gshDvle && gshDvle->mergeOutmaps) + { + // Clear outmap + memset(outmapData, 0x1F, sizeof(outmapData)); + outmapData[0] = 0; + + // Merge outmaps + shaderProgramMergeOutmaps(outmapData, vshDvle->outmapData, gshDvle->outmapData); + outmapMode |= vshDvle->outmapMode; + outmapClock |= vshDvle->outmapClock; + } else + memcpy(outmapData, mainDvle->outmapData, sizeof(outmapData)); + + // Upload and configure outmap + GPU_SetShaderOutmap(outmapData); + GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, outmapMode); + GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, outmapClock); + + // Configure geostage + if (gshDvle) + { + // Input stride: use value if specified, otherwise use number of outputs in vertex shader + int stride = sp->geoShaderInputStride ? sp->geoShaderInputStride : vshDvle->outmapData[0]; + + // Enable or disable variable-size primitive processing + GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0xA, gshDvle->gshMode == GSH_VARIABLE_PRIM ? 0x80000000 : 0); + + // Set up geoshader processing mode + u32 misc = gshDvle->gshMode; + if (misc == GSH_FIXED_PRIM) + misc |= 0x01000000 | ((u32)gshDvle->gshFixedVtxStart<<16) | ((stride-1)<<12) | ((u32)(gshDvle->gshFixedVtxNum-1)<<8); + GPUCMD_AddWrite(GPUREG_GSH_MISC0, misc); + + // Set up variable-size primitive mode parameters + GPUCMD_AddWrite(GPUREG_GSH_MISC1, gshDvle->gshMode == GSH_VARIABLE_PRIM ? (gshDvle->gshVariableVtxNum-1) : 0); + + // Set up geoshader input + GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0x08000000 | (gshDvle->gshMode ? 0x0100 : 0) | (stride-1)); + + // Set up geoshader permutation + GPUCMD_AddIncrementalWrites(GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW, sp->geoShaderInputPermutation, 2); + } else + { + // Defaults for when geostage is disabled + GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0xA, 0); + GPUCMD_AddWrite(GPUREG_GSH_MISC0, 0); + GPUCMD_AddWrite(GPUREG_GSH_MISC1, 0); + GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0xA0000000); + } + + return 0; +} + +Result shaderProgramUse(shaderProgram_s* sp) +{ + Result rc = shaderProgramConfigure(sp, true, true); + if (R_FAILED(rc)) return rc; + + int i; + + // Set up uniforms + GPUCMD_AddWrite(GPUREG_VSH_BOOLUNIFORM, 0x7FFF0000|sp->vertexShader->boolUniforms); + GPUCMD_AddIncrementalWrites(GPUREG_VSH_INTUNIFORM_I0, sp->vertexShader->intUniforms, 4); + for(i=0; ivertexShader->numFloat24Uniforms; i++) GPUCMD_AddIncrementalWrites(GPUREG_VSH_FLOATUNIFORM_CONFIG, (u32*)&sp->vertexShader->float24Uniforms[i], 4); + if (sp->geometryShader) + { + GPUCMD_AddWrite(GPUREG_GSH_BOOLUNIFORM, 0x7FFF0000|sp->geometryShader->boolUniforms); + GPUCMD_AddIncrementalWrites(GPUREG_GSH_INTUNIFORM_I0, sp->geometryShader->intUniforms, 4); + for(i=0; igeometryShader->numFloat24Uniforms; i++) GPUCMD_AddIncrementalWrites(GPUREG_GSH_FLOATUNIFORM_CONFIG, (u32*)&sp->geometryShader->float24Uniforms[i], 4); + } + + return 0; +} + +void GPU_SetShaderOutmap(const u32 outmapData[8]) +{ + GPUCMD_AddMaskedWrite(GPUREG_PRIMITIVE_CONFIG, 0x1, outmapData[0]-1); + GPUCMD_AddIncrementalWrites(GPUREG_SH_OUTMAP_TOTAL, outmapData, 8); +} + +void GPU_SendShaderCode(GPU_SHADER_TYPE type, u32* data, u16 offset, u16 length) +{ + if(!data)return; + + int regOffset=(type==GPU_GEOMETRY_SHADER)?(-0x30):(0x0); + + GPUCMD_AddWrite(GPUREG_VSH_CODETRANSFER_CONFIG+regOffset, offset); + + int i; + for(i=0;ioutTableData[i].mask; int regID = dvle->outTableData[i].regID; u32* out = &dvle->outmapData[regID+1]; - + if (!(dvle->outmapMask & BIT(regID))) { dvle->outmapMask |= BIT(regID); diff --git a/libctru/source/sdmc_dev.c b/libctru/source/sdmc_dev.c index fbc6df8..b3bd008 100644 --- a/libctru/source/sdmc_dev.c +++ b/libctru/source/sdmc_dev.c @@ -548,7 +548,7 @@ sdmc_write_safe(struct _reent *r, memcpy(tmp_buffer, ptr, toWrite); /* 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); if(R_FAILED(rc)) { diff --git a/libctru/source/services/am.c b/libctru/source/services/am.c index 96d5e41..f310ab4 100644 --- a/libctru/source/services/am.c +++ b/libctru/source/services/am.c @@ -62,7 +62,7 @@ Result AM_GetTitleCount(FS_MediaType mediatype, u32 *count) if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(count) *count = cmdbuf[2]; - + return (Result)cmdbuf[1]; } @@ -78,7 +78,7 @@ Result AM_GetTitleList(u32* titlesRead, FS_MediaType mediatype, u32 titleCount, cmdbuf[4] = (u32)titleIds; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; - + if(titlesRead) *titlesRead = cmdbuf[2]; return (Result)cmdbuf[1]; @@ -112,7 +112,7 @@ Result AM_GetTicketCount(u32 *count) if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(count) *count = cmdbuf[2]; - + return (Result)cmdbuf[1]; } @@ -128,7 +128,7 @@ Result AM_GetTicketList(u32 *ticketsRead, u32 ticketCount, u32 skip, u64 *ticket cmdbuf[4] = (u32)ticketIds; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; - + if(ticketsRead) *ticketsRead = cmdbuf[2]; 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(count) *count = cmdbuf[2]; - + return (Result)cmdbuf[1]; } @@ -163,7 +163,7 @@ Result AM_GetPendingTitleList(u32 *titlesRead, u32 titleCount, FS_MediaType medi cmdbuf[5] = (u32)titleIds; if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; - + if(titlesRead) *titlesRead = cmdbuf[2]; return (Result)cmdbuf[1]; @@ -197,7 +197,7 @@ Result AM_GetDeviceId(u32 *deviceID) if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(deviceID) *deviceID = cmdbuf[3]; - + 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(ciaHandle) *ciaHandle = cmdbuf[3]; - + return (Result)cmdbuf[1]; } @@ -311,7 +311,7 @@ Result AM_StartDlpChildCiaInstall(Handle *ciaHandle) if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(ciaHandle) *ciaHandle = cmdbuf[3]; - + return (Result)cmdbuf[1]; } @@ -458,12 +458,12 @@ Result AM_GetTitleProductCode(FS_MediaType mediatype, u64 titleId, char *product { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); - + cmdbuf[0] = IPC_MakeHeader(0x5,3,0); // 0x000500C0 cmdbuf[1] = mediatype; cmdbuf[2] = titleId & 0xffffffff; cmdbuf[3] = (u32)(titleId >> 32); - + if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; // 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; u32 *cmdbuf = getThreadCommandBuffer(); - + cmdbuf[0] = IPC_MakeHeader(0x6,3,0); // 0x000600C0 cmdbuf[1] = mediatype; cmdbuf[2] = titleId & 0xffffffff; cmdbuf[3] = (u32)(titleId >> 32); - + if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; 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; u32 *cmdbuf = getThreadCommandBuffer(); - + cmdbuf[0] = IPC_MakeHeader(0x408,1,2); // 0x04080042 cmdbuf[1] = mediatype; cmdbuf[2] = IPC_Desc_SharedHandles(1); @@ -594,7 +594,7 @@ Result AM_GetCiaMetaSection(void *meta, u32 size, Handle fileHandle) { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); - + cmdbuf[0] = IPC_MakeHeader(0x414,1,4); // 0x04140044 cmdbuf[1] = size; cmdbuf[2] = IPC_Desc_SharedHandles(1); @@ -648,7 +648,7 @@ Result AM_InstallTicketBegin(Handle *ticketHandle) if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(ticketHandle) *ticketHandle = cmdbuf[3]; - + return (Result)cmdbuf[1]; } @@ -775,7 +775,7 @@ Result AM_InstallTmdBegin(Handle *tmdHandle) if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(tmdHandle) *tmdHandle = cmdbuf[3]; - + return (Result)cmdbuf[1]; } @@ -834,7 +834,7 @@ Result AM_InstallContentBegin(Handle *contentHandle, u16 index) if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; if(contentHandle) *contentHandle = cmdbuf[3]; - + return (Result)cmdbuf[1]; } @@ -864,7 +864,7 @@ Result AM_InstallContentResume(Handle *contentHandle, u64* resumeOffset, u16 ind if(contentHandle) *contentHandle = cmdbuf[5]; if(resumeOffset) *resumeOffset = cmdbuf[2] | ((u64)cmdbuf[3] << 32); - + return (Result)cmdbuf[1]; } diff --git a/libctru/source/services/apt.c b/libctru/source/services/apt.c index ccd7957..b7b9163 100644 --- a/libctru/source/services/apt.c +++ b/libctru/source/services/apt.c @@ -153,7 +153,7 @@ static void aptInitCaptureInfo(aptCaptureBufInfo* capinfo) // Fill in display-capture info for NS. capinfo->is3D = (gspcapinfo.screencapture[0].format & 0x20) != 0; - + capinfo->top.format = gspcapinfo.screencapture[0].format & 0x7; capinfo->bottom.format = gspcapinfo.screencapture[1].format & 0x7; @@ -555,7 +555,7 @@ Result APT_GetLockHandle(u16 flags, Handle* lockHandle) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x1,1,0); // 0x10040 cmdbuf[1]=flags; - + Result ret = aptSendCommand(cmdbuf); if (R_SUCCEEDED(ret)) *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[1]=appId; cmdbuf[2]=attr; - + Result ret = aptSendCommand(cmdbuf); if (R_SUCCEEDED(ret)) { @@ -585,7 +585,7 @@ Result APT_Finalize(NS_APPID appId) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x4,1,0); // 0x40040 cmdbuf[1]=appId; - + return aptSendCommand(cmdbuf); } @@ -593,7 +593,7 @@ Result APT_HardwareResetAsync(void) { u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x4E,0,0); // 0x4E0000 - + return aptSendCommand(cmdbuf); } @@ -602,7 +602,7 @@ Result APT_Enable(APT_AppletAttr attr) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x3,1,0); // 0x30040 cmdbuf[1]=attr; - + return aptSendCommand(cmdbuf); } @@ -611,7 +611,7 @@ Result APT_GetAppletManInfo(APT_AppletPos inpos, APT_AppletPos* outpos, NS_APPID u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040 cmdbuf[1]=inpos; - + Result ret = aptSendCommand(cmdbuf); 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 (active_appid) *active_appid=cmdbuf[5]; } - + return ret; } @@ -662,7 +662,7 @@ Result APT_GetProgramID(u64* pProgramID) u32 cmdbuf[16]; cmdbuf[0] = IPC_MakeHeader(0x58,0,2); // 0x580002 cmdbuf[1] = IPC_Desc_CurProcessHandle(); - + Result ret = aptSendCommand(cmdbuf); if (R_SUCCEEDED(ret)) *pProgramID=((u64)cmdbuf[3]<<32)|cmdbuf[2]; @@ -675,7 +675,7 @@ Result APT_IsRegistered(NS_APPID appID, bool* out) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x9,1,0); // 0x90040 cmdbuf[1]=appID; - + Result ret = aptSendCommand(cmdbuf); if (R_SUCCEEDED(ret)) *out=cmdbuf[2] & 0xFF; @@ -688,7 +688,7 @@ Result APT_InquireNotification(u32 appID, APT_Signal* signalType) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0xB,1,0); // 0xB0040 cmdbuf[1]=appID; - + Result ret = aptSendCommand(cmdbuf); if (R_SUCCEEDED(ret)) { @@ -703,7 +703,7 @@ Result APT_PrepareToJumpToHomeMenu(void) { u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x2B,0,0); // 0x2B0000 - + return aptSendCommand(cmdbuf); } @@ -738,7 +738,7 @@ Result APT_JumpToApplication(const void* param, size_t paramSize, Handle handle) cmdbuf[3]=handle; cmdbuf[4]=IPC_Desc_StaticBuffer(cmdbuf[1],0); cmdbuf[5]= (u32) param; - + return aptSendCommand(cmdbuf); } @@ -747,7 +747,7 @@ Result APT_NotifyToWait(NS_APPID appID) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x43,1,0); // 0x430040 cmdbuf[1]=appID; - + 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]; staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[3],0); staticbufs[1]=(u32)out; - + Result ret = aptSendCommand(cmdbuf); staticbufs[0]=saved_threadstorage[0]; 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]; staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[2],0); staticbufs[1]=(u32)buffer; - + Result ret = aptSendCommand(cmdbuf); staticbufs[0]=saved_threadstorage[0]; 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]; staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[2],0); staticbufs[1]=(u32)buffer; - + Result ret = aptSendCommand(cmdbuf); staticbufs[0]=saved_threadstorage[0]; 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[6] = parameter; - + cmdbuf[7] = IPC_Desc_StaticBuffer(cmdbuf[4],0); cmdbuf[8] = (u32)buffer; - + return aptSendCommand(cmdbuf); } @@ -897,7 +897,7 @@ Result APT_SendCaptureBufferInfo(const aptCaptureBufInfo* captureBuf) cmdbuf[1] = sizeof(*captureBuf); cmdbuf[2] = IPC_Desc_StaticBuffer(cmdbuf[1],0); cmdbuf[3] = (u32)captureBuf; - + 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[1]=appID; cmdbuf[2]=reply; - + return aptSendCommand(cmdbuf); } @@ -916,7 +916,7 @@ Result APT_ReplySleepNotificationComplete(NS_APPID appID) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x3F,1,0); // 0x3F0040 cmdbuf[1]=appID; - + return aptSendCommand(cmdbuf); } @@ -925,7 +925,7 @@ Result APT_PrepareToCloseApplication(bool cancelPreload) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x22,1,0); // 0x220040 cmdbuf[1]=cancelPreload; - + return aptSendCommand(cmdbuf); } @@ -938,7 +938,7 @@ Result APT_CloseApplication(const void* param, size_t paramSize, Handle handle) cmdbuf[3]=handle; cmdbuf[4]=IPC_Desc_StaticBuffer(cmdbuf[1],0); cmdbuf[5]= (u32) param; - + return aptSendCommand(cmdbuf); } @@ -949,7 +949,7 @@ Result APT_SetAppCpuTimeLimit(u32 percent) cmdbuf[0]=IPC_MakeHeader(0x4F,2,0); // 0x4F0080 cmdbuf[1]=1; cmdbuf[2]=percent; - + return aptSendCommand(cmdbuf); } @@ -958,7 +958,7 @@ Result APT_GetAppCpuTimeLimit(u32 *percent) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x50,1,0); // 0x500040 cmdbuf[1]=1; - + Result ret = aptSendCommand(cmdbuf); if (R_SUCCEEDED(ret)) *percent=cmdbuf[2]; @@ -970,7 +970,7 @@ static Result APT_CheckNew3DS_System(bool* out) { u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x102,0,0); // 0x1020000 - + Result ret = aptSendCommand(cmdbuf); if (R_SUCCEEDED(ret)) *out = cmdbuf[2] & 0xFF; @@ -1001,7 +1001,7 @@ Result APT_PrepareToDoApplicationJump(u8 flags, u64 programID, u8 mediatype) cmdbuf[2]=(u32)programID; cmdbuf[3]=(u32)(programID>>32); cmdbuf[4]=mediatype; - + return aptSendCommand(cmdbuf); } @@ -1015,7 +1015,7 @@ Result APT_DoApplicationJump(const void* param, size_t paramSize, const void* hm cmdbuf[4]=(u32)param; cmdbuf[5]=IPC_Desc_StaticBuffer(cmdbuf[2],2); cmdbuf[6]=(u32)hmac; - + return aptSendCommand(cmdbuf); } @@ -1024,7 +1024,7 @@ Result APT_PrepareToStartLibraryApplet(NS_APPID appID) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x18,1,0); // 0x180040 cmdbuf[1]=appID; - + return aptSendCommand(cmdbuf); } @@ -1038,7 +1038,7 @@ Result APT_StartLibraryApplet(NS_APPID appID, const void* param, size_t paramSiz cmdbuf[4]=handle; cmdbuf[5]=IPC_Desc_StaticBuffer(cmdbuf[2],0); cmdbuf[6]=(u32)param; - + return aptSendCommand(cmdbuf); } @@ -1047,7 +1047,7 @@ Result APT_PrepareToStartSystemApplet(NS_APPID appID) u32 cmdbuf[16]; cmdbuf[0]=IPC_MakeHeader(0x19,1,0); // 0x190040 cmdbuf[1]=appID; - + return aptSendCommand(cmdbuf); } @@ -1061,7 +1061,7 @@ Result APT_StartSystemApplet(NS_APPID appID, const void* param, size_t paramSize cmdbuf[4] = handle; cmdbuf[5] = IPC_Desc_StaticBuffer(cmdbuf[2],0); cmdbuf[6] = (u32)param; - + return aptSendCommand(cmdbuf); } diff --git a/libctru/source/services/dsp.c b/libctru/source/services/dsp.c index 0a8aba6..3594f32 100644 --- a/libctru/source/services/dsp.c +++ b/libctru/source/services/dsp.c @@ -152,9 +152,9 @@ Result DSP_ReadPipeIfPossible(u32 channel, u32 peer, void* buffer, u16 length, u staticbufs[0] = saved1; staticbufs[1] = saved2; - + if (R_FAILED(ret)) return ret; - + if (length_read) *length_read = cmdbuf[2] & 0xFFFF; return cmdbuf[1]; diff --git a/libctru/source/services/gsplcd.c b/libctru/source/services/gsplcd.c index 0c27cb8..d293efe 100644 --- a/libctru/source/services/gsplcd.c +++ b/libctru/source/services/gsplcd.c @@ -60,7 +60,7 @@ Result GSPLCD_GetVendors(u8 *vendors) Result ret=0; if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret; - + if(vendors) *vendors = cmdbuf[2] & 0xFF; return cmdbuf[1]; diff --git a/libctru/source/services/hb.c b/libctru/source/services/hb.c index bbfbc15..5344ddd 100644 --- a/libctru/source/services/hb.c +++ b/libctru/source/services/hb.c @@ -1,77 +1,77 @@ -#include <3ds/types.h> -#include <3ds/result.h> -#include <3ds/svc.h> -#include <3ds/srv.h> -#include <3ds/synchronization.h> -#include <3ds/env.h> -#include <3ds/ipc.h> - -static Handle hbHandle; -static int hbRefCount; - -Result hbInit(void) -{ - Result res=0; - if (AtomicPostIncrement(&hbRefCount)) return 0; - Handle temp = envGetHandle("hb:HB"); - res = temp ? svcDuplicateHandle(&hbHandle, temp) : MAKERESULT(RL_STATUS,RS_NOTFOUND,RM_APPLICATION,RD_NOT_FOUND); - if (R_FAILED(res)) AtomicDecrement(&hbRefCount); - return res; -} - -void hbExit(void) -{ - if (AtomicDecrement(&hbRefCount)) return; - svcCloseHandle(hbHandle); -} - -Result HB_FlushInvalidateCache(void) -{ - Result ret = 0; - u32 *cmdbuf = getThreadCommandBuffer(); - - cmdbuf[0] = IPC_MakeHeader(0x1,1,2); // 0x10042 - cmdbuf[1] = 0x00000000; - cmdbuf[2] = IPC_Desc_SharedHandles(1); - cmdbuf[3] = CUR_PROCESS_HANDLE; - - if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret; - - return (Result)cmdbuf[1]; -} - -Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv) -{ - Result ret = 0; - u32 *cmdbuf = getThreadCommandBuffer(); - - cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000 - - if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret; - - if(load3dsx)*load3dsx=(void*)cmdbuf[2]; - if(setArgv)*setArgv=(void*)cmdbuf[3]; - - return (Result)cmdbuf[1]; -} - -Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages) -{ - Result ret = 0; - u32 *cmdbuf = getThreadCommandBuffer(); - - cmdbuf[0] = IPC_MakeHeader(0x9,3,0); // 0x900C0 - cmdbuf[1] = (u32)addr; - cmdbuf[2] = pages; - cmdbuf[3] = mode; - - if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret; - - if(reprotectedPages) - { - if(R_SUCCEEDED(ret))*reprotectedPages=(u32)cmdbuf[2]; - else *reprotectedPages=0; - } - - return (Result)cmdbuf[1]; -} +#include <3ds/types.h> +#include <3ds/result.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/synchronization.h> +#include <3ds/env.h> +#include <3ds/ipc.h> + +static Handle hbHandle; +static int hbRefCount; + +Result hbInit(void) +{ + Result res=0; + if (AtomicPostIncrement(&hbRefCount)) return 0; + Handle temp = envGetHandle("hb:HB"); + res = temp ? svcDuplicateHandle(&hbHandle, temp) : MAKERESULT(RL_STATUS,RS_NOTFOUND,RM_APPLICATION,RD_NOT_FOUND); + if (R_FAILED(res)) AtomicDecrement(&hbRefCount); + return res; +} + +void hbExit(void) +{ + if (AtomicDecrement(&hbRefCount)) return; + svcCloseHandle(hbHandle); +} + +Result HB_FlushInvalidateCache(void) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x1,1,2); // 0x10042 + cmdbuf[1] = 0x00000000; + cmdbuf[2] = IPC_Desc_SharedHandles(1); + cmdbuf[3] = CUR_PROCESS_HANDLE; + + if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret; + + return (Result)cmdbuf[1]; +} + +Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000 + + if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret; + + if(load3dsx)*load3dsx=(void*)cmdbuf[2]; + if(setArgv)*setArgv=(void*)cmdbuf[3]; + + return (Result)cmdbuf[1]; +} + +Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x9,3,0); // 0x900C0 + cmdbuf[1] = (u32)addr; + cmdbuf[2] = pages; + cmdbuf[3] = mode; + + if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret; + + if(reprotectedPages) + { + if(R_SUCCEEDED(ret))*reprotectedPages=(u32)cmdbuf[2]; + else *reprotectedPages=0; + } + + return (Result)cmdbuf[1]; +} diff --git a/libctru/source/services/httpc.c b/libctru/source/services/httpc.c index aa954c3..4b77dfa 100644 --- a/libctru/source/services/httpc.c +++ b/libctru/source/services/httpc.c @@ -135,7 +135,7 @@ Result httpcCancelConnection(httpcContext *context) cmdbuf[0]=IPC_MakeHeader(0x4,1,0); // 0x40040 cmdbuf[1]=context->httphandle; - + Result ret=0; 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[4]=IPC_Desc_SharedHandles(1); cmdbuf[5]=sharedmem_handle;// POST buffer memory block handle - + Result ret=0; 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[3]=IPC_Desc_Buffer(l,IPC_BUFFER_R); cmdbuf[4]=(u32)url; - + Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret; - + if(contextHandle)*contextHandle=cmdbuf[2]; return cmdbuf[1]; @@ -226,7 +226,7 @@ static Result HTTPC_InitializeConnectionSession(Handle handle, Handle contextHan cmdbuf[0]=IPC_MakeHeader(0x8,1,2); // 0x80042 cmdbuf[1]=contextHandle; cmdbuf[2]=IPC_Desc_CurProcessHandle(); - + Result ret=0; 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[1]=contextHandle; - + Result ret=0; 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[1]=contextHandle; - + Result ret=0; 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[6]=IPC_Desc_Buffer(value_len,IPC_BUFFER_R); cmdbuf[7]=(u32)value; - + Result ret=0; 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[6]=IPC_Desc_Buffer(value_len,IPC_BUFFER_R); cmdbuf[7]=(u32)value; - + Result ret=0; 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[1]=context->httphandle; - + Result ret=0; 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[3]=IPC_Desc_Buffer(size,IPC_BUFFER_W); cmdbuf[4]=(u32)buffer; - + Result ret=0; 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[5]=IPC_Desc_Buffer(size,IPC_BUFFER_W); cmdbuf[6]=(u32)buffer; - + Result ret=0; 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[1]=context->httphandle; - + Result ret=0; 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[1]=context->httphandle; - + Result ret=0; 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[1]=context->httphandle; - + Result ret=0; 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[2]=timeout & 0xffffffff; cmdbuf[3]=(timeout >> 32) & 0xffffffff; - + Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; diff --git a/libctru/source/services/irrst.c b/libctru/source/services/irrst.c index 2f93fc1..9e09797 100644 --- a/libctru/source/services/irrst.c +++ b/libctru/source/services/irrst.c @@ -109,7 +109,7 @@ u32 irrstCheckSectionUpdateTime(vu32 *sharedmem_section, u32 id) void irrstScanInput(void) { if(irrstRefCount==0)return; - + u32 Id=0; kHeld = 0; memset(&csPos, 0, sizeof(circlePosition)); diff --git a/libctru/source/services/mvd.c b/libctru/source/services/mvd.c index 675a8bd..da16c47 100644 --- a/libctru/source/services/mvd.c +++ b/libctru/source/services/mvd.c @@ -252,7 +252,7 @@ Result mvdstdInit(MVDSTD_Mode mode, MVDSTD_InputFormat input_type, MVDSTD_Output if(mvdstd_mode==MVDMODE_VIDEOPROCESSING) { 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(); @@ -261,7 +261,7 @@ Result mvdstdInit(MVDSTD_Mode mode, MVDSTD_InputFormat input_type, MVDSTD_Output if(mvdstd_mode==MVDMODE_VIDEOPROCESSING) { ret = MVDSTD_cmd1b(tmpinitstruct.cmd1b_inval); - if(ret!=MVD_STATUS_OK) goto cleanup3; + if(ret!=MVD_STATUS_OK) goto cleanup3; } return 0; diff --git a/libctru/source/services/news.c b/libctru/source/services/news.c index cf7663d..35fc26a 100644 --- a/libctru/source/services/news.c +++ b/libctru/source/services/news.c @@ -71,9 +71,9 @@ Result NEWS_GetTotalNotifications(u32* num) u32 *cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x5,0,0); - + if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; - + *num = cmdbuf[2]; return (Result)cmdbuf[1]; } @@ -88,7 +88,7 @@ Result NEWS_SetNotificationHeader(u32 news_id, const NotificationHeader* header) cmdbuf[2] = sizeof(NotificationHeader); cmdbuf[3] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_R); cmdbuf[4] = (u32)header; - + if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; return (Result)cmdbuf[1]; } @@ -103,7 +103,7 @@ Result NEWS_GetNotificationHeader(u32 news_id, NotificationHeader* header) cmdbuf[2] = sizeof(NotificationHeader); cmdbuf[3] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_W); cmdbuf[4] = (u32)header; - + if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; return (Result)cmdbuf[1]; } @@ -118,7 +118,7 @@ Result NEWS_SetNotificationMessage(u32 news_id, const u16* message, u32 size) cmdbuf[2] = size; cmdbuf[3] = IPC_Desc_Buffer((size_t)0x1780,IPC_BUFFER_R); cmdbuf[4] = (u32)message; - + if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; 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[3] = IPC_Desc_Buffer((size_t)0x1780,IPC_BUFFER_W); cmdbuf[4] = (u32)message; - + if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; if(size) *size = cmdbuf[2]; return (Result)cmdbuf[1]; @@ -149,7 +149,7 @@ Result NEWS_SetNotificationImage(u32 news_id, const void* buffer, u32 size) cmdbuf[2] = size; cmdbuf[3] = IPC_Desc_Buffer((size_t)0x10000,IPC_BUFFER_R); cmdbuf[4] = (u32)buffer; - + if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; 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[3] = IPC_Desc_Buffer((size_t)0x10000,IPC_BUFFER_W); cmdbuf[4] = (u32)buffer; - + if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret; if(size) *size = cmdbuf[2]; return (Result)cmdbuf[1]; diff --git a/libctru/source/services/nfc.c b/libctru/source/services/nfc.c index 044d449..d11608a 100644 --- a/libctru/source/services/nfc.c +++ b/libctru/source/services/nfc.c @@ -1,438 +1,438 @@ -#include -#include <3ds/types.h> -#include <3ds/result.h> -#include <3ds/svc.h> -#include <3ds/srv.h> -#include <3ds/synchronization.h> -#include <3ds/services/nfc.h> -#include <3ds/services/apt.h> -#include <3ds/ipc.h> - -static Handle nfcHandle; -static int nfcRefCount; -static NFC_OpType nfc_optype = NFC_OpType_NFCTag; - -static Result NFC_Initialize(NFC_OpType type); -static Result NFC_Shutdown(NFC_OpType type); - -static Result NFC_StartCommunication(void); -static Result NFC_StopCommunication(void); -static Result NFC_CommunicationGetStatus(u8 *out); -static Result NFC_CommunicationGetResult(Result *out); - -static Result NFC_StartTagScanning(u16 unknown); -static Result NFC_StopTagScanning(void); - -static Result NFC_InitializeWriteAppData(u32 amiibo_appid, NFC_AppDataInitStruct *initstruct, const void *buf, size_t size); -static Result NFC_GetAppDataInitStruct(NFC_AppDataInitStruct *out); - -Result nfcInit(NFC_OpType type) -{ - Result ret=0; - - if (AtomicPostIncrement(&nfcRefCount)) return 0; - - ret = srvGetServiceHandle(&nfcHandle, "nfc:m"); - if (R_FAILED(ret))ret = srvGetServiceHandle(&nfcHandle, "nfc:u"); - if (R_SUCCEEDED(ret)) - { - nfc_optype = type; - ret = NFC_Initialize(type); - if (R_FAILED(ret)) svcCloseHandle(nfcHandle); - } - if (R_FAILED(ret)) AtomicDecrement(&nfcRefCount); - - return ret; -} - -void nfcExit(void) -{ - if (AtomicDecrement(&nfcRefCount)) return; - NFC_Shutdown(nfc_optype); - svcCloseHandle(nfcHandle); -} - -Handle nfcGetSessionHandle(void) -{ - return nfcHandle; -} - -Result nfcStartScanning(u16 inval) -{ - Result ret, ret2; - bool new3ds_flag = false; - u8 status; - - APT_CheckNew3DS(&new3ds_flag); - - if(!new3ds_flag) - { - ret = NFC_StartCommunication(); - if(R_FAILED(ret))return ret; - - while(1) - { - status = 0; - ret = NFC_CommunicationGetStatus(&status); - if(R_FAILED(ret))break; - - if(status==1)//"Attempting to initialize Old3DS NFC adapter communication." - { - svcSleepThread(1000000*100); - continue; - } - else if(status==2)//"Old3DS NFC adapter communication initialization successfully finished." - { - break; - } - - //An error occured with Old3DS NFC-adapter communication initialization. - - ret = NFC_CommunicationGetResult(&ret2); - if(R_FAILED(ret))break; - - return ret2; - } - - if(R_FAILED(ret))return ret; - } - - return NFC_StartTagScanning(inval); -} - -void nfcStopScanning(void) -{ - bool new3ds_flag = false; - - APT_CheckNew3DS(&new3ds_flag); - - NFC_StopTagScanning(); - - if(!new3ds_flag) - { - NFC_StopCommunication(); - } -} - -static Result NFC_Initialize(NFC_OpType type) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x1,1,0); // 0x10040 - cmdbuf[1]=type & 0xff; - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -static Result NFC_Shutdown(NFC_OpType type) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x2,1,0); // 0x20040 - cmdbuf[1]=type & 0xff; - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -static Result NFC_StartCommunication(void) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x3,0,0); // 0x30000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -static Result NFC_StopCommunication(void) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x4,0,0); // 0x40000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -static Result NFC_StartTagScanning(u16 unknown) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040 - cmdbuf[1]=unknown; - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -static Result NFC_StopTagScanning(void) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x6,0,0); // 0x60000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -Result nfcLoadAmiiboData(void) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x7,0,0); // 0x70000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -Result nfcResetTagScanState(void) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x8,0,0); // 0x80000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -Result nfcUpdateStoredAmiiboData(void) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x9,0,2); // 0x90002 - cmdbuf[1]=IPC_Desc_CurProcessHandle(); - - if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -Result nfcGetTagState(NFC_TagState *state) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0xD,0,0); // 0xD0000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - if(R_SUCCEEDED(ret) && state)*state = cmdbuf[2] & 0xff; - - return ret; -} - -static Result NFC_CommunicationGetStatus(u8 *out) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0xF,0,0); // 0xF0000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - if(R_SUCCEEDED(ret) && out)*out = cmdbuf[2]; - - return ret; -} - -Result nfcGetTagInfo(NFC_TagInfo *out) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x11,0,0); // 0x110000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_TagInfo)); - - return ret; -} - -static Result NFC_CommunicationGetResult(Result *out) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x12,0,0); // 0x120000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - if(R_SUCCEEDED(ret) && out)*out = cmdbuf[2]; - - return ret; -} - -Result nfcOpenAppData(u32 amiibo_appid) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x13,1,0); // 0x130040 - cmdbuf[1]=amiibo_appid; - - if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - return ret; -} - -Result nfcInitializeWriteAppData(u32 amiibo_appid, const void *buf, size_t size) -{ - Result ret=0; - NFC_AppDataInitStruct initstruct; - - ret = NFC_GetAppDataInitStruct(&initstruct); - if(R_FAILED(ret))return ret; - - return NFC_InitializeWriteAppData(amiibo_appid, &initstruct, buf, size); -} - -static Result NFC_InitializeWriteAppData(u32 amiibo_appid, NFC_AppDataInitStruct *initstruct, const void *buf, size_t size) -{ - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x14,14,4); // 0x140384 - cmdbuf[1]=amiibo_appid; - cmdbuf[2]=size; - memcpy(&cmdbuf[3], initstruct->data_xc, sizeof(initstruct->data_xc)); - cmdbuf[15]=IPC_Desc_CurProcessHandle(); - cmdbuf[17]=IPC_Desc_StaticBuffer(size, 0); - cmdbuf[18]=(u32)buf; - - Result ret=0; - if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; - - return cmdbuf[1]; -} - -Result nfcReadAppData(void *buf, size_t size) -{ - u32* cmdbuf=getThreadCommandBuffer(); - u32 saved_threadstorage[2]; - - cmdbuf[0]=IPC_MakeHeader(0x15,1,0); // 0x150040 - cmdbuf[1]=size; - - u32 * staticbufs = getThreadStaticBuffers(); - saved_threadstorage[0] = staticbufs[0]; - saved_threadstorage[1] = staticbufs[1]; - - staticbufs[0] = IPC_Desc_StaticBuffer(size,0); - staticbufs[1] = (u32)buf; - - Result ret=0; - ret=svcSendSyncRequest(nfcHandle); - - staticbufs[0] = saved_threadstorage[0]; - staticbufs[1] = saved_threadstorage[1]; - - if(R_FAILED(ret))return ret; - - ret = cmdbuf[1]; - - return ret; -} - -Result nfcWriteAppData(const void *buf, size_t size, NFC_TagInfo *taginfo) -{ - u32* cmdbuf=getThreadCommandBuffer(); - NFC_AppDataWriteStruct writestruct; - - cmdbuf[0]=IPC_MakeHeader(0x16,9,2); // 0x160242 - cmdbuf[1]=size; - cmdbuf[10]=IPC_Desc_StaticBuffer(size, 0); - cmdbuf[11]=(u32)buf; - - if(taginfo==NULL)return -1; - if(taginfo->id_offset_size>10)return -2; - - memset(&writestruct, 0, sizeof(NFC_AppDataWriteStruct)); - writestruct.id_size = taginfo->id_offset_size; - memcpy(writestruct.id, taginfo->id, sizeof(writestruct.id)); - - memcpy(&cmdbuf[2], &writestruct, sizeof(NFC_AppDataWriteStruct)); - - Result ret=0; - if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; - - return cmdbuf[1]; -} - -Result nfcGetAmiiboSettings(NFC_AmiiboSettings *out) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x17,0,0); // 0x170000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AmiiboSettings)); - - return ret; -} - -Result nfcGetAmiiboConfig(NFC_AmiiboConfig *out) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x18,0,0); // 0x180000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AmiiboConfig)); - - return ret; -} - -static Result NFC_GetAppDataInitStruct(NFC_AppDataInitStruct *out) -{ - Result ret=0; - u32* cmdbuf=getThreadCommandBuffer(); - - cmdbuf[0]=IPC_MakeHeader(0x19,0,0); // 0x190000 - - if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; - ret = cmdbuf[1]; - - if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AppDataInitStruct)); - - return ret; -} - +#include +#include <3ds/types.h> +#include <3ds/result.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/synchronization.h> +#include <3ds/services/nfc.h> +#include <3ds/services/apt.h> +#include <3ds/ipc.h> + +static Handle nfcHandle; +static int nfcRefCount; +static NFC_OpType nfc_optype = NFC_OpType_NFCTag; + +static Result NFC_Initialize(NFC_OpType type); +static Result NFC_Shutdown(NFC_OpType type); + +static Result NFC_StartCommunication(void); +static Result NFC_StopCommunication(void); +static Result NFC_CommunicationGetStatus(u8 *out); +static Result NFC_CommunicationGetResult(Result *out); + +static Result NFC_StartTagScanning(u16 unknown); +static Result NFC_StopTagScanning(void); + +static Result NFC_InitializeWriteAppData(u32 amiibo_appid, NFC_AppDataInitStruct *initstruct, const void *buf, size_t size); +static Result NFC_GetAppDataInitStruct(NFC_AppDataInitStruct *out); + +Result nfcInit(NFC_OpType type) +{ + Result ret=0; + + if (AtomicPostIncrement(&nfcRefCount)) return 0; + + ret = srvGetServiceHandle(&nfcHandle, "nfc:m"); + if (R_FAILED(ret))ret = srvGetServiceHandle(&nfcHandle, "nfc:u"); + if (R_SUCCEEDED(ret)) + { + nfc_optype = type; + ret = NFC_Initialize(type); + if (R_FAILED(ret)) svcCloseHandle(nfcHandle); + } + if (R_FAILED(ret)) AtomicDecrement(&nfcRefCount); + + return ret; +} + +void nfcExit(void) +{ + if (AtomicDecrement(&nfcRefCount)) return; + NFC_Shutdown(nfc_optype); + svcCloseHandle(nfcHandle); +} + +Handle nfcGetSessionHandle(void) +{ + return nfcHandle; +} + +Result nfcStartScanning(u16 inval) +{ + Result ret, ret2; + bool new3ds_flag = false; + u8 status; + + APT_CheckNew3DS(&new3ds_flag); + + if(!new3ds_flag) + { + ret = NFC_StartCommunication(); + if(R_FAILED(ret))return ret; + + while(1) + { + status = 0; + ret = NFC_CommunicationGetStatus(&status); + if(R_FAILED(ret))break; + + if(status==1)//"Attempting to initialize Old3DS NFC adapter communication." + { + svcSleepThread(1000000*100); + continue; + } + else if(status==2)//"Old3DS NFC adapter communication initialization successfully finished." + { + break; + } + + //An error occured with Old3DS NFC-adapter communication initialization. + + ret = NFC_CommunicationGetResult(&ret2); + if(R_FAILED(ret))break; + + return ret2; + } + + if(R_FAILED(ret))return ret; + } + + return NFC_StartTagScanning(inval); +} + +void nfcStopScanning(void) +{ + bool new3ds_flag = false; + + APT_CheckNew3DS(&new3ds_flag); + + NFC_StopTagScanning(); + + if(!new3ds_flag) + { + NFC_StopCommunication(); + } +} + +static Result NFC_Initialize(NFC_OpType type) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x1,1,0); // 0x10040 + cmdbuf[1]=type & 0xff; + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +static Result NFC_Shutdown(NFC_OpType type) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x2,1,0); // 0x20040 + cmdbuf[1]=type & 0xff; + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +static Result NFC_StartCommunication(void) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x3,0,0); // 0x30000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +static Result NFC_StopCommunication(void) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x4,0,0); // 0x40000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +static Result NFC_StartTagScanning(u16 unknown) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040 + cmdbuf[1]=unknown; + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +static Result NFC_StopTagScanning(void) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x6,0,0); // 0x60000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +Result nfcLoadAmiiboData(void) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x7,0,0); // 0x70000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +Result nfcResetTagScanState(void) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x8,0,0); // 0x80000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +Result nfcUpdateStoredAmiiboData(void) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x9,0,2); // 0x90002 + cmdbuf[1]=IPC_Desc_CurProcessHandle(); + + if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +Result nfcGetTagState(NFC_TagState *state) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0xD,0,0); // 0xD0000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + if(R_SUCCEEDED(ret) && state)*state = cmdbuf[2] & 0xff; + + return ret; +} + +static Result NFC_CommunicationGetStatus(u8 *out) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0xF,0,0); // 0xF0000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + if(R_SUCCEEDED(ret) && out)*out = cmdbuf[2]; + + return ret; +} + +Result nfcGetTagInfo(NFC_TagInfo *out) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x11,0,0); // 0x110000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_TagInfo)); + + return ret; +} + +static Result NFC_CommunicationGetResult(Result *out) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x12,0,0); // 0x120000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + if(R_SUCCEEDED(ret) && out)*out = cmdbuf[2]; + + return ret; +} + +Result nfcOpenAppData(u32 amiibo_appid) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x13,1,0); // 0x130040 + cmdbuf[1]=amiibo_appid; + + if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + return ret; +} + +Result nfcInitializeWriteAppData(u32 amiibo_appid, const void *buf, size_t size) +{ + Result ret=0; + NFC_AppDataInitStruct initstruct; + + ret = NFC_GetAppDataInitStruct(&initstruct); + if(R_FAILED(ret))return ret; + + return NFC_InitializeWriteAppData(amiibo_appid, &initstruct, buf, size); +} + +static Result NFC_InitializeWriteAppData(u32 amiibo_appid, NFC_AppDataInitStruct *initstruct, const void *buf, size_t size) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x14,14,4); // 0x140384 + cmdbuf[1]=amiibo_appid; + cmdbuf[2]=size; + memcpy(&cmdbuf[3], initstruct->data_xc, sizeof(initstruct->data_xc)); + cmdbuf[15]=IPC_Desc_CurProcessHandle(); + cmdbuf[17]=IPC_Desc_StaticBuffer(size, 0); + cmdbuf[18]=(u32)buf; + + Result ret=0; + if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; + + return cmdbuf[1]; +} + +Result nfcReadAppData(void *buf, size_t size) +{ + u32* cmdbuf=getThreadCommandBuffer(); + u32 saved_threadstorage[2]; + + cmdbuf[0]=IPC_MakeHeader(0x15,1,0); // 0x150040 + cmdbuf[1]=size; + + u32 * staticbufs = getThreadStaticBuffers(); + saved_threadstorage[0] = staticbufs[0]; + saved_threadstorage[1] = staticbufs[1]; + + staticbufs[0] = IPC_Desc_StaticBuffer(size,0); + staticbufs[1] = (u32)buf; + + Result ret=0; + ret=svcSendSyncRequest(nfcHandle); + + staticbufs[0] = saved_threadstorage[0]; + staticbufs[1] = saved_threadstorage[1]; + + if(R_FAILED(ret))return ret; + + ret = cmdbuf[1]; + + return ret; +} + +Result nfcWriteAppData(const void *buf, size_t size, NFC_TagInfo *taginfo) +{ + u32* cmdbuf=getThreadCommandBuffer(); + NFC_AppDataWriteStruct writestruct; + + cmdbuf[0]=IPC_MakeHeader(0x16,9,2); // 0x160242 + cmdbuf[1]=size; + cmdbuf[10]=IPC_Desc_StaticBuffer(size, 0); + cmdbuf[11]=(u32)buf; + + if(taginfo==NULL)return -1; + if(taginfo->id_offset_size>10)return -2; + + memset(&writestruct, 0, sizeof(NFC_AppDataWriteStruct)); + writestruct.id_size = taginfo->id_offset_size; + memcpy(writestruct.id, taginfo->id, sizeof(writestruct.id)); + + memcpy(&cmdbuf[2], &writestruct, sizeof(NFC_AppDataWriteStruct)); + + Result ret=0; + if(R_FAILED(ret=svcSendSyncRequest(nfcHandle)))return ret; + + return cmdbuf[1]; +} + +Result nfcGetAmiiboSettings(NFC_AmiiboSettings *out) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x17,0,0); // 0x170000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AmiiboSettings)); + + return ret; +} + +Result nfcGetAmiiboConfig(NFC_AmiiboConfig *out) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x18,0,0); // 0x180000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AmiiboConfig)); + + return ret; +} + +static Result NFC_GetAppDataInitStruct(NFC_AppDataInitStruct *out) +{ + Result ret=0; + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0x19,0,0); // 0x190000 + + if(R_FAILED(ret = svcSendSyncRequest(nfcHandle)))return ret; + ret = cmdbuf[1]; + + if(R_SUCCEEDED(ret) && out)memcpy(out, &cmdbuf[2], sizeof(NFC_AppDataInitStruct)); + + return ret; +} + diff --git a/libctru/source/services/ns.c b/libctru/source/services/ns.c index 8c66d7c..5867f37 100644 --- a/libctru/source/services/ns.c +++ b/libctru/source/services/ns.c @@ -33,9 +33,9 @@ Result NS_LaunchFIRM(u64 titleid) cmdbuf[0] = IPC_MakeHeader(0x1,3,0); // 0x100C0 cmdbuf[1] = titleid & 0xffffffff; cmdbuf[2] = (titleid >> 32) & 0xffffffff; - + if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; - + return (Result)cmdbuf[1]; } @@ -48,11 +48,11 @@ Result NS_LaunchTitle(u64 titleid, u32 launch_flags, u32 *procid) cmdbuf[1] = titleid & 0xffffffff; cmdbuf[2] = (titleid >> 32) & 0xffffffff; cmdbuf[3] = launch_flags; - + if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; if(procid != NULL) *procid = cmdbuf[2]; - + return (Result)cmdbuf[1]; } @@ -65,9 +65,9 @@ Result NS_LaunchApplicationFIRM(u64 titleid, u32 flags) cmdbuf[1] = titleid & 0xffffffff; cmdbuf[2] = (titleid >> 32) & 0xffffffff; cmdbuf[3] = flags; - + if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; - + return (Result)cmdbuf[1]; } @@ -83,7 +83,7 @@ Result NS_RebootToTitle(u8 mediatype, u64 titleid) cmdbuf[4] = mediatype; cmdbuf[5] = 0x0; // reserved cmdbuf[6] = 0x0; - + if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; return (Result)cmdbuf[1]; diff --git a/libctru/source/services/pm.c b/libctru/source/services/pm.c index f0133c9..d782ddb 100644 --- a/libctru/source/services/pm.c +++ b/libctru/source/services/pm.c @@ -37,9 +37,9 @@ Result PM_LaunchTitle(u8 mediatype, u64 titleid, u32 launch_flags) cmdbuf[3] = mediatype; cmdbuf[4] = 0x0; cmdbuf[5] = launch_flags; - + if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; - + return (Result)cmdbuf[1]; } @@ -53,11 +53,11 @@ Result PM_GetTitleExheaderFlags(u8 mediatype, u64 titleid, u8* out) cmdbuf[2] = (titleid >> 32) & 0xffffffff; cmdbuf[3] = mediatype; cmdbuf[4] = 0x0; - + if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; - + memcpy(out, (u8*)(&cmdbuf[2]), 8); - + return (Result)cmdbuf[1]; } @@ -70,9 +70,9 @@ Result PM_SetFIRMLaunchParams(u32 size, u8* in) cmdbuf[1] = size; cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R); cmdbuf[3] = (u32)in; - + if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; - + return (Result)cmdbuf[1]; } @@ -85,9 +85,9 @@ Result PM_GetFIRMLaunchParams(u32 size, u8* out) cmdbuf[1] = size; cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_W); cmdbuf[3] = (u32)out; - + if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; - + return (Result)cmdbuf[1]; } @@ -101,8 +101,8 @@ Result PM_LaunchFIRMSetParams(u32 firm_titleid_low, u32 size, u8* in) cmdbuf[2] = size; cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R); cmdbuf[4] = (u32)in; - + if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret; - + return (Result)cmdbuf[1]; } \ No newline at end of file diff --git a/libctru/source/services/soc/soc_accept.c b/libctru/source/services/soc/soc_accept.c index 2c62040..b009975 100644 --- a/libctru/source/services/soc/soc_accept.c +++ b/libctru/source/services/soc/soc_accept.c @@ -50,10 +50,10 @@ int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) staticbufs[1] = (u32)tmpaddr; ret = svcSendSyncRequest(SOCU_handle); - + staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; - + if(ret != 0) { __release_handle(fd); errno = SYNC_ERROR; diff --git a/libctru/source/services/soc/soc_getaddrinfo.c b/libctru/source/services/soc/soc_getaddrinfo.c index e2c6816..68a19c3 100644 --- a/libctru/source/services/soc/soc_getaddrinfo.c +++ b/libctru/source/services/soc/soc_getaddrinfo.c @@ -140,7 +140,7 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi Result ret; addrinfo_3ds_t *info = NULL, *tmp; s32 count = DEFAULT_NUM_ADDRINFO, info_count; - + if(node == NULL && service == NULL) { return EAI_NONAME; diff --git a/libctru/source/services/soc/soc_getnameinfo.c b/libctru/source/services/soc/soc_getnameinfo.c index 05c9ab6..08f37cb 100644 --- a/libctru/source/services/soc/soc_getnameinfo.c +++ b/libctru/source/services/soc/soc_getnameinfo.c @@ -57,7 +57,7 @@ int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_ if(R_FAILED(ret)) { errno = SYNC_ERROR; return ret; - } + } ret = cmdbuf[1]; if(R_FAILED(ret)) { diff --git a/libctru/source/services/soc/soc_getnetworkopt.c b/libctru/source/services/soc/soc_getnetworkopt.c index dc3f915..908a396 100644 --- a/libctru/source/services/soc/soc_getnetworkopt.c +++ b/libctru/source/services/soc/soc_getnetworkopt.c @@ -38,9 +38,9 @@ int SOCU_GetNetworkOpt(int level, NetworkOpt optname, void * optval, socklen_t * { errno = SYNC_ERROR; return ret; - + } - + ret = _net_convert_error(cmdbuf[2]); if(ret < 0) { diff --git a/libctru/source/services/soc/soc_getpeername.c b/libctru/source/services/soc/soc_getpeername.c index 11f3d60..2a55dbf 100644 --- a/libctru/source/services/soc/soc_getpeername.c +++ b/libctru/source/services/soc/soc_getpeername.c @@ -29,10 +29,10 @@ int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen) staticbufs[1] = (u32)tmpaddr; ret = svcSendSyncRequest(SOCU_handle); - + staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; - + if(ret != 0) { errno = SYNC_ERROR; return ret; diff --git a/libctru/source/services/soc/soc_getsockopt.c b/libctru/source/services/soc/soc_getsockopt.c index d2409c6..7014d92 100644 --- a/libctru/source/services/soc/soc_getsockopt.c +++ b/libctru/source/services/soc/soc_getsockopt.c @@ -30,10 +30,10 @@ int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optl staticbufs[1] = (u32)optval; ret = svcSendSyncRequest(SOCU_handle); - + staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; - + if(ret != 0) { errno = SYNC_ERROR; return ret; diff --git a/libctru/source/services/soc/soc_init.c b/libctru/source/services/soc/soc_init.c index 90409fb..2edc9ae 100644 --- a/libctru/source/services/soc/soc_init.c +++ b/libctru/source/services/soc/soc_init.c @@ -122,7 +122,7 @@ Result socExit(void) { Result ret = 0; int dev; - + svcCloseHandle(socMemhandle); socMemhandle = 0; @@ -154,7 +154,7 @@ soc_close(struct _reent *r, int fd) { Handle sockfd = *(Handle*)fd; - + int ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); diff --git a/libctru/source/services/soc/soc_ioctl.c b/libctru/source/services/soc/soc_ioctl.c index ba43a8c..227f28b 100644 --- a/libctru/source/services/soc/soc_ioctl.c +++ b/libctru/source/services/soc/soc_ioctl.c @@ -29,7 +29,7 @@ int ioctl(int sockfd, int request, ...) } flags = fcntl(sockfd, F_GETFL, 0); - if(flags == -1) + if(flags == -1) return -1; if(*value) diff --git a/libctru/source/services/soc/soc_poll.c b/libctru/source/services/soc/soc_poll.c index a458e69..664ee43 100644 --- a/libctru/source/services/soc/soc_poll.c +++ b/libctru/source/services/soc/soc_poll.c @@ -51,10 +51,10 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout) staticbufs[1] = (u32)tmp_fds; ret = svcSendSyncRequest(SOCU_handle); - + staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; - + if(ret != 0) { free(tmp_fds); errno = SYNC_ERROR; diff --git a/libctru/source/services/soc/soc_recvfrom.c b/libctru/source/services/soc/soc_recvfrom.c index 207df99..e0a25f1 100644 --- a/libctru/source/services/soc/soc_recvfrom.c +++ b/libctru/source/services/soc/soc_recvfrom.c @@ -33,10 +33,10 @@ ssize_t socuipc_cmd7(int sockfd, void *buf, size_t len, int flags, struct sockad staticbufs[1] = (u32)tmpaddr; ret = svcSendSyncRequest(SOCU_handle); - + staticbufs[0] = saved_threadstorage[0]; staticbufs[1] = saved_threadstorage[1]; - + if(ret != 0) { errno = SYNC_ERROR; 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) { int ret = 0; - u32 *cmdbuf = getThreadCommandBuffer(); + u32 *cmdbuf = getThreadCommandBuffer(); u32 tmp_addrlen = 0; u8 tmpaddr[0x1c]; 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[2] = cmdbuf[0x108>>2]; saved_threadstorage[3] = cmdbuf[0x10c>>2]; - + cmdbuf[0x100>>2] = (((u32)len)<<14) | 2; cmdbuf[0x104>>2] = (u32)buf; cmdbuf[0x108>>2] = (tmp_addrlen<<14) | 2; diff --git a/libctru/source/services/sslc.c b/libctru/source/services/sslc.c index facc533..96773ba 100644 --- a/libctru/source/services/sslc.c +++ b/libctru/source/services/sslc.c @@ -45,7 +45,7 @@ static Result sslcipc_Initialize(void) cmdbuf[0]=IPC_MakeHeader(0x1,0,2); // 0x10002 cmdbuf[1]=IPC_Desc_CurProcessHandle(); - + Result ret=0; 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[1]=context->sslchandle; cmdbuf[2]=IPC_Desc_CurProcessHandle(); - + Result ret=0; 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[3]=IPC_Desc_SharedHandles(1); cmdbuf[4]=context->sharedmem_handle; - + Result ret=0; if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret; diff --git a/libctru/source/svc.s b/libctru/source/svc.s index d3815e3..4edb4d6 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -69,11 +69,11 @@ SVC_BEGIN svcGetThreadPriority ldr r3, [sp], #4 str r1, [r3] bx lr - + SVC_BEGIN svcSetThreadPriority svc 0x0C bx lr - + SVC_BEGIN svcGetThreadAffinityMask svc 0x0D bx lr @@ -81,14 +81,14 @@ SVC_BEGIN svcGetThreadAffinityMask SVC_BEGIN svcSetThreadAffinityMask svc 0x0E bx lr - + SVC_BEGIN svcGetThreadIdealProcessor str r0, [sp, #-0x4]! svc 0x0F ldr r3, [sp], #4 str r1, [r3] bx lr - + SVC_BEGIN svcSetThreadIdealProcessor svc 0x10 bx lr @@ -281,7 +281,7 @@ SVC_BEGIN svcOpenThread pop {r2} str r1, [r2] bx lr - + SVC_BEGIN svcGetProcessId str r0, [sp, #-0x4]! svc 0x35 @@ -295,7 +295,7 @@ SVC_BEGIN svcGetProcessIdOfThread ldr r3, [sp], #4 str r1, [r3] bx lr - + SVC_BEGIN svcGetThreadId str r0, [sp, #-0x4]! svc 0x37 @@ -407,7 +407,7 @@ SVC_BEGIN svcTerminateDebugProcess SVC_BEGIN svcGetProcessDebugEvent svc 0x63 bx lr - + SVC_BEGIN svcContinueDebugEvent svc 0x64 bx lr diff --git a/libctru/source/util/rbtree/rbtree_find.c b/libctru/source/util/rbtree/rbtree_find.c index 2bcf06b..3b5ff99 100644 --- a/libctru/source/util/rbtree/rbtree_find.c +++ b/libctru/source/util/rbtree/rbtree_find.c @@ -25,6 +25,6 @@ rbtree_find(const rbtree_t *tree, tmp = tmp->child[LEFT]; } } - + return save; }