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