]> Chaos Git - corbenik/ctrulib.git/commitdiff
whitespace fixes
authorDave Murphy <davem@devkitpro.org>
Sun, 4 Dec 2016 17:21:44 +0000 (17:21 +0000)
committerDave Murphy <davem@devkitpro.org>
Sun, 4 Dec 2016 17:21:44 +0000 (17:21 +0000)
35 files changed:
libctru/include/3ds/console.h
libctru/include/3ds/gpu/enums.h
libctru/include/3ds/gpu/registers.h
libctru/include/3ds/gpu/shaderProgram.h
libctru/include/3ds/services/hb.h
libctru/include/3ds/services/y2r.h
libctru/source/console.c
libctru/source/gpu/shaderProgram.c
libctru/source/gpu/shbin.c
libctru/source/sdmc_dev.c
libctru/source/services/am.c
libctru/source/services/apt.c
libctru/source/services/dsp.c
libctru/source/services/gsplcd.c
libctru/source/services/hb.c
libctru/source/services/httpc.c
libctru/source/services/irrst.c
libctru/source/services/mvd.c
libctru/source/services/news.c
libctru/source/services/nfc.c
libctru/source/services/ns.c
libctru/source/services/pm.c
libctru/source/services/soc/soc_accept.c
libctru/source/services/soc/soc_getaddrinfo.c
libctru/source/services/soc/soc_getnameinfo.c
libctru/source/services/soc/soc_getnetworkopt.c
libctru/source/services/soc/soc_getpeername.c
libctru/source/services/soc/soc_getsockopt.c
libctru/source/services/soc/soc_init.c
libctru/source/services/soc/soc_ioctl.c
libctru/source/services/soc/soc_poll.c
libctru/source/services/soc/soc_recvfrom.c
libctru/source/services/sslc.c
libctru/source/svc.s
libctru/source/util/rbtree/rbtree_find.c

index 6a3678663b0b2537abd73048c7db9ae95668b4fc..e2e4a87c0e766c145cb14fcbfdd278f03f8413a9 100644 (file)
-/**\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
index e89e3f8634d54957992727c4931366b2a0001a2b..a8ab577b98dbc9fa09cf24597b872ca3bf63a3fb 100644 (file)
@@ -202,7 +202,7 @@ typedef enum
        GPU_WRITE_BLUE  = 0x04, ///< Write blue.
        GPU_WRITE_ALPHA = 0x08, ///< Write alpha.
        GPU_WRITE_DEPTH = 0x10, ///< Write depth.
-       
+
        GPU_WRITE_COLOR = 0x0F, ///< Write all color components.
        GPU_WRITE_ALL   = 0x1F, ///< Write all components.
 } GPU_WRITEMASK;
index 3a0fe94ed5cb7afc4735e79920312fd9126faccb..4aed7f63abb8b7ba1b889b1e659650eaf4f13df6 100644 (file)
-/**\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.
+///@}
index e0d5302ff75cc8168f8241c39d0e2caef1a26249..303c49dfc7e395a5d3fce3203b1a727c1c394022 100644 (file)
-/**\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);
index 63740f32bcd9df8ff2dce8da94332b2e6ec254ea..6aefe96d472806dcb15fc0b7a5a2b7294e78b358 100644 (file)
@@ -1,38 +1,38 @@
-/**\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);
index dc51698cce5ce06b2eaf951dc3c5ca16dff04a17..635cdbf1cb03b1984fbaad4852b49a8100594962 100644 (file)
@@ -29,7 +29,7 @@ typedef enum
        OUTPUT_RGB_32     = 0x0, ///< 32-bit RGBA8888. The alpha component is the 8-bit value set by @ref Y2RU_SetAlpha
        OUTPUT_RGB_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.
index bb15ce9c16a9a8efa6e73cded5df2fcef398d821..ca940db6a22d4c00db99fc439da2bb6480da3bc2 100644 (file)
-#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 = &currentCopy;\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", &parameter, &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", &parameter, &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", &parameter, &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", &parameter, &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", &parameter, &consumed);\r
-                                                       } else {\r
-                                                               sscanf(escapeseq,"%dm%n", &parameter, &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 = &currentConsole->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 = &currentConsole->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 = &currentCopy;
+
+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", &parameter, &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", &parameter, &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", &parameter, &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", &parameter, &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", &parameter, &consumed);
+                                                       } else {
+                                                               sscanf(escapeseq,"%dm%n", &parameter, &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 = &currentConsole->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 = &currentConsole->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;
+
+}
+
+
index edfcf988c878e083a83e69e40e942a5931ff9f07..0e5a74a9346f2a4313fc9c372a1c16bd27db0855 100644 (file)
-#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);
+}
index 7f60150920b0ee81c6d764590140bc820ed42342..8647a8e147ca37184036a29231483b5a6918252c 100644 (file)
@@ -114,7 +114,7 @@ void DVLE_GenerateOutmap(DVLE_s* dvle)
                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);
index fbc6df89a1e765835114e15ac4d89975005e128f..b3bd0086dd8356b6efc0e7f8a92b5644c3fc0f0d 100644 (file)
@@ -548,7 +548,7 @@ sdmc_write_safe(struct _reent *r,
     memcpy(tmp_buffer, ptr, toWrite);
 
     /* write the data */
-    rc = FSFILE_Write(file->fd, &bytes, file->offset, 
+    rc = FSFILE_Write(file->fd, &bytes, file->offset,
                       (u32*)tmp_buffer, (u32)toWrite, sync);
     if(R_FAILED(rc))
     {
index 96d5e417bf4d67011efdb30a9c635c5f821fbf4a..f310ab4707f3a7d592dcc75f12243185737e9788 100644 (file)
@@ -62,7 +62,7 @@ Result AM_GetTitleCount(FS_MediaType mediatype, u32 *count)
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(count) *count = cmdbuf[2];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -78,7 +78,7 @@ Result AM_GetTitleList(u32* titlesRead, FS_MediaType mediatype, u32 titleCount,
        cmdbuf[4] = (u32)titleIds;
 
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
-       
+
        if(titlesRead) *titlesRead = cmdbuf[2];
 
        return (Result)cmdbuf[1];
@@ -112,7 +112,7 @@ Result AM_GetTicketCount(u32 *count)
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(count) *count = cmdbuf[2];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -128,7 +128,7 @@ Result AM_GetTicketList(u32 *ticketsRead, u32 ticketCount, u32 skip, u64 *ticket
        cmdbuf[4] = (u32)ticketIds;
 
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
-       
+
        if(ticketsRead) *ticketsRead = cmdbuf[2];
 
        return (Result)cmdbuf[1];
@@ -146,7 +146,7 @@ Result AM_GetPendingTitleCount(u32 *count, FS_MediaType mediatype, u32 statusMas
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(count) *count = cmdbuf[2];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -163,7 +163,7 @@ Result AM_GetPendingTitleList(u32 *titlesRead, u32 titleCount, FS_MediaType medi
        cmdbuf[5] = (u32)titleIds;
 
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
-       
+
        if(titlesRead) *titlesRead = cmdbuf[2];
 
        return (Result)cmdbuf[1];
@@ -197,7 +197,7 @@ Result AM_GetDeviceId(u32 *deviceID)
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(deviceID) *deviceID = cmdbuf[3];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -297,7 +297,7 @@ Result AM_StartCiaInstall(FS_MediaType mediatype, Handle *ciaHandle)
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(ciaHandle) *ciaHandle = cmdbuf[3];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -311,7 +311,7 @@ Result AM_StartDlpChildCiaInstall(Handle *ciaHandle)
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(ciaHandle) *ciaHandle = cmdbuf[3];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -458,12 +458,12 @@ Result AM_GetTitleProductCode(FS_MediaType mediatype, u64 titleId, char *product
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
-       
+
        cmdbuf[0] = IPC_MakeHeader(0x5,3,0); // 0x000500C0
        cmdbuf[1] = mediatype;
        cmdbuf[2] = titleId & 0xffffffff;
        cmdbuf[3] = (u32)(titleId >> 32);
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        // The product code string can use the full 16 bytes without NULL terminator
@@ -476,12 +476,12 @@ Result AM_GetTitleExtDataId(u64 *extDataId, FS_MediaType mediatype, u64 titleId)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
-       
+
        cmdbuf[0] = IPC_MakeHeader(0x6,3,0); // 0x000600C0
        cmdbuf[1] = mediatype;
        cmdbuf[2] = titleId & 0xffffffff;
        cmdbuf[3] = (u32)(titleId >> 32);
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(extDataId) *extDataId = (u64)cmdbuf[2] | ((u64)cmdbuf[3] << 32);
@@ -493,7 +493,7 @@ Result AM_GetCiaFileInfo(FS_MediaType mediatype, AM_TitleEntry *titleEntry, Hand
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
-       
+
        cmdbuf[0] = IPC_MakeHeader(0x408,1,2); // 0x04080042
        cmdbuf[1] = mediatype;
        cmdbuf[2] = IPC_Desc_SharedHandles(1);
@@ -594,7 +594,7 @@ Result AM_GetCiaMetaSection(void *meta, u32 size, Handle fileHandle)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
-       
+
        cmdbuf[0] = IPC_MakeHeader(0x414,1,4); // 0x04140044
        cmdbuf[1] = size;
        cmdbuf[2] = IPC_Desc_SharedHandles(1);
@@ -648,7 +648,7 @@ Result AM_InstallTicketBegin(Handle *ticketHandle)
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(ticketHandle) *ticketHandle = cmdbuf[3];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -775,7 +775,7 @@ Result AM_InstallTmdBegin(Handle *tmdHandle)
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(tmdHandle) *tmdHandle = cmdbuf[3];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -834,7 +834,7 @@ Result AM_InstallContentBegin(Handle *contentHandle, u16 index)
        if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
 
        if(contentHandle) *contentHandle = cmdbuf[3];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -864,7 +864,7 @@ Result AM_InstallContentResume(Handle *contentHandle, u64* resumeOffset, u16 ind
 
        if(contentHandle) *contentHandle = cmdbuf[5];
        if(resumeOffset) *resumeOffset = cmdbuf[2] | ((u64)cmdbuf[3] << 32);
-       
+
        return (Result)cmdbuf[1];
 }
 
index ccd7957b1ff4152ca7e4a0fc330777758167f23f..b7b9163e388e6492578a7eaa256044f841c02d1f 100644 (file)
@@ -153,7 +153,7 @@ static void aptInitCaptureInfo(aptCaptureBufInfo* capinfo)
 
        // Fill in display-capture info for NS.
        capinfo->is3D = (gspcapinfo.screencapture[0].format & 0x20) != 0;
-       
+
        capinfo->top.format    = gspcapinfo.screencapture[0].format & 0x7;
        capinfo->bottom.format = gspcapinfo.screencapture[1].format & 0x7;
 
@@ -555,7 +555,7 @@ Result APT_GetLockHandle(u16 flags, Handle* lockHandle)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x1,1,0); // 0x10040
        cmdbuf[1]=flags;
-       
+
        Result ret = aptSendCommand(cmdbuf);
        if (R_SUCCEEDED(ret))
                *lockHandle = cmdbuf[5];
@@ -569,7 +569,7 @@ Result APT_Initialize(NS_APPID appId, APT_AppletAttr attr, Handle* signalEvent,
        cmdbuf[0]=IPC_MakeHeader(0x2,2,0); // 0x20080
        cmdbuf[1]=appId;
        cmdbuf[2]=attr;
-       
+
        Result ret = aptSendCommand(cmdbuf);
        if (R_SUCCEEDED(ret))
        {
@@ -585,7 +585,7 @@ Result APT_Finalize(NS_APPID appId)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x4,1,0); // 0x40040
        cmdbuf[1]=appId;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -593,7 +593,7 @@ Result APT_HardwareResetAsync(void)
 {
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x4E,0,0); // 0x4E0000
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -602,7 +602,7 @@ Result APT_Enable(APT_AppletAttr attr)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x3,1,0); // 0x30040
        cmdbuf[1]=attr;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -611,7 +611,7 @@ Result APT_GetAppletManInfo(APT_AppletPos inpos, APT_AppletPos* outpos, NS_APPID
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040
        cmdbuf[1]=inpos;
-       
+
        Result ret = aptSendCommand(cmdbuf);
        if (R_SUCCEEDED(ret))
        {
@@ -620,7 +620,7 @@ Result APT_GetAppletManInfo(APT_AppletPos inpos, APT_AppletPos* outpos, NS_APPID
                if (menu_appid)   *menu_appid  =cmdbuf[4];
                if (active_appid) *active_appid=cmdbuf[5];
        }
-       
+
        return ret;
 }
 
@@ -662,7 +662,7 @@ Result APT_GetProgramID(u64* pProgramID)
        u32 cmdbuf[16];
        cmdbuf[0] = IPC_MakeHeader(0x58,0,2); // 0x580002
        cmdbuf[1] = IPC_Desc_CurProcessHandle();
-       
+
        Result ret = aptSendCommand(cmdbuf);
        if (R_SUCCEEDED(ret))
                *pProgramID=((u64)cmdbuf[3]<<32)|cmdbuf[2];
@@ -675,7 +675,7 @@ Result APT_IsRegistered(NS_APPID appID, bool* out)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x9,1,0); // 0x90040
        cmdbuf[1]=appID;
-       
+
        Result ret = aptSendCommand(cmdbuf);
        if (R_SUCCEEDED(ret))
                *out=cmdbuf[2] & 0xFF;
@@ -688,7 +688,7 @@ Result APT_InquireNotification(u32 appID, APT_Signal* signalType)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0xB,1,0); // 0xB0040
        cmdbuf[1]=appID;
-       
+
        Result ret = aptSendCommand(cmdbuf);
        if (R_SUCCEEDED(ret))
        {
@@ -703,7 +703,7 @@ Result APT_PrepareToJumpToHomeMenu(void)
 {
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x2B,0,0); // 0x2B0000
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -738,7 +738,7 @@ Result APT_JumpToApplication(const void* param, size_t paramSize, Handle handle)
        cmdbuf[3]=handle;
        cmdbuf[4]=IPC_Desc_StaticBuffer(cmdbuf[1],0);
        cmdbuf[5]= (u32) param;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -747,7 +747,7 @@ Result APT_NotifyToWait(NS_APPID appID)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x43,1,0); // 0x430040
        cmdbuf[1]=appID;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -767,7 +767,7 @@ Result APT_AppletUtility(int id, void* out, size_t outSize, const void* in, size
        saved_threadstorage[1]=staticbufs[1];
        staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[3],0);
        staticbufs[1]=(u32)out;
-       
+
        Result ret = aptSendCommand(cmdbuf);
        staticbufs[0]=saved_threadstorage[0];
        staticbufs[1]=saved_threadstorage[1];
@@ -805,7 +805,7 @@ Result APT_GlanceParameter(NS_APPID appID, void* buffer, size_t bufferSize, NS_A
        saved_threadstorage[1]=staticbufs[1];
        staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[2],0);
        staticbufs[1]=(u32)buffer;
-       
+
        Result ret = aptSendCommand(cmdbuf);
        staticbufs[0]=saved_threadstorage[0];
        staticbufs[1]=saved_threadstorage[1];
@@ -835,7 +835,7 @@ Result APT_ReceiveParameter(NS_APPID appID, void* buffer, size_t bufferSize, NS_
        saved_threadstorage[1]=staticbufs[1];
        staticbufs[0]=IPC_Desc_StaticBuffer(cmdbuf[2],0);
        staticbufs[1]=(u32)buffer;
-       
+
        Result ret = aptSendCommand(cmdbuf);
        staticbufs[0]=saved_threadstorage[0];
        staticbufs[1]=saved_threadstorage[1];
@@ -865,10 +865,10 @@ Result APT_SendParameter(NS_APPID source, NS_APPID dest, APT_Command command, co
 
        cmdbuf[5] = IPC_Desc_SharedHandles(1);
        cmdbuf[6] = parameter;
-       
+
        cmdbuf[7] = IPC_Desc_StaticBuffer(cmdbuf[4],0);
        cmdbuf[8] = (u32)buffer;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -897,7 +897,7 @@ Result APT_SendCaptureBufferInfo(const aptCaptureBufInfo* captureBuf)
        cmdbuf[1] = sizeof(*captureBuf);
        cmdbuf[2] = IPC_Desc_StaticBuffer(cmdbuf[1],0);
        cmdbuf[3] = (u32)captureBuf;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -907,7 +907,7 @@ Result APT_ReplySleepQuery(NS_APPID appID, APT_QueryReply reply)
        cmdbuf[0]=IPC_MakeHeader(0x3E,2,0); // 0x3E0080
        cmdbuf[1]=appID;
        cmdbuf[2]=reply;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -916,7 +916,7 @@ Result APT_ReplySleepNotificationComplete(NS_APPID appID)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x3F,1,0); // 0x3F0040
        cmdbuf[1]=appID;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -925,7 +925,7 @@ Result APT_PrepareToCloseApplication(bool cancelPreload)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x22,1,0); // 0x220040
        cmdbuf[1]=cancelPreload;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -938,7 +938,7 @@ Result APT_CloseApplication(const void* param, size_t paramSize, Handle handle)
        cmdbuf[3]=handle;
        cmdbuf[4]=IPC_Desc_StaticBuffer(cmdbuf[1],0);
        cmdbuf[5]= (u32) param;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -949,7 +949,7 @@ Result APT_SetAppCpuTimeLimit(u32 percent)
        cmdbuf[0]=IPC_MakeHeader(0x4F,2,0); // 0x4F0080
        cmdbuf[1]=1;
        cmdbuf[2]=percent;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -958,7 +958,7 @@ Result APT_GetAppCpuTimeLimit(u32 *percent)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x50,1,0); // 0x500040
        cmdbuf[1]=1;
-       
+
        Result ret = aptSendCommand(cmdbuf);
        if (R_SUCCEEDED(ret))
                *percent=cmdbuf[2];
@@ -970,7 +970,7 @@ static Result APT_CheckNew3DS_System(bool* out)
 {
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x102,0,0); // 0x1020000
-       
+
        Result ret = aptSendCommand(cmdbuf);
        if (R_SUCCEEDED(ret))
                *out = cmdbuf[2] & 0xFF;
@@ -1001,7 +1001,7 @@ Result APT_PrepareToDoApplicationJump(u8 flags, u64 programID, u8 mediatype)
        cmdbuf[2]=(u32)programID;
        cmdbuf[3]=(u32)(programID>>32);
        cmdbuf[4]=mediatype;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -1015,7 +1015,7 @@ Result APT_DoApplicationJump(const void* param, size_t paramSize, const void* hm
        cmdbuf[4]=(u32)param;
        cmdbuf[5]=IPC_Desc_StaticBuffer(cmdbuf[2],2);
        cmdbuf[6]=(u32)hmac;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -1024,7 +1024,7 @@ Result APT_PrepareToStartLibraryApplet(NS_APPID appID)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x18,1,0); // 0x180040
        cmdbuf[1]=appID;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -1038,7 +1038,7 @@ Result APT_StartLibraryApplet(NS_APPID appID, const void* param, size_t paramSiz
        cmdbuf[4]=handle;
        cmdbuf[5]=IPC_Desc_StaticBuffer(cmdbuf[2],0);
        cmdbuf[6]=(u32)param;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -1047,7 +1047,7 @@ Result APT_PrepareToStartSystemApplet(NS_APPID appID)
        u32 cmdbuf[16];
        cmdbuf[0]=IPC_MakeHeader(0x19,1,0); // 0x190040
        cmdbuf[1]=appID;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
@@ -1061,7 +1061,7 @@ Result APT_StartSystemApplet(NS_APPID appID, const void* param, size_t paramSize
        cmdbuf[4] = handle;
        cmdbuf[5] = IPC_Desc_StaticBuffer(cmdbuf[2],0);
        cmdbuf[6] = (u32)param;
-       
+
        return aptSendCommand(cmdbuf);
 }
 
index 0a8aba662840e592c085453b355ab63a1db18990..3594f3240c85b8ffc7872f2f077d78d6a3197b0a 100644 (file)
@@ -152,9 +152,9 @@ Result DSP_ReadPipeIfPossible(u32 channel, u32 peer, void* buffer, u16 length, u
 
        staticbufs[0] = saved1;
        staticbufs[1] = saved2;
-       
+
        if (R_FAILED(ret)) return ret;
-       
+
        if (length_read)
                *length_read = cmdbuf[2] & 0xFFFF;
        return cmdbuf[1];
index 0c27cb80b30530b155ba576414ce0a837674ab18..d293efe4c6ad844729446f5e88659e04b0837384 100644 (file)
@@ -60,7 +60,7 @@ Result GSPLCD_GetVendors(u8 *vendors)
 
        Result ret=0;
        if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
-       
+
        if(vendors) *vendors = cmdbuf[2] & 0xFF;
 
        return cmdbuf[1];
index bbfbc156b9ab5669c5d928fb367d5bad29abb75b..5344ddd0ceb3984b601d67b18eeb988a8f7fb8e5 100644 (file)
@@ -1,77 +1,77 @@
-#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];
+}
index aa954c343dd1d05036582ae28a2b5a0934a27db9..4b77dfac5a7917ab05b106c07e4a602cc7ede78c 100644 (file)
@@ -135,7 +135,7 @@ Result httpcCancelConnection(httpcContext *context)
 
        cmdbuf[0]=IPC_MakeHeader(0x4,1,0); // 0x40040
        cmdbuf[1]=context->httphandle;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(__httpc_servhandle)))return ret;
 
@@ -181,7 +181,7 @@ static Result HTTPC_Initialize(Handle handle, u32 sharedmem_size, Handle sharedm
        cmdbuf[2]=IPC_Desc_CurProcessHandle();
        cmdbuf[4]=IPC_Desc_SharedHandles(1);
        cmdbuf[5]=sharedmem_handle;// POST buffer memory block handle
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
@@ -210,10 +210,10 @@ static Result HTTPC_CreateContext(Handle handle, HTTPC_RequestMethod method, con
        cmdbuf[2]=method;
        cmdbuf[3]=IPC_Desc_Buffer(l,IPC_BUFFER_R);
        cmdbuf[4]=(u32)url;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
-       
+
        if(contextHandle)*contextHandle=cmdbuf[2];
 
        return cmdbuf[1];
@@ -226,7 +226,7 @@ static Result HTTPC_InitializeConnectionSession(Handle handle, Handle contextHan
        cmdbuf[0]=IPC_MakeHeader(0x8,1,2); // 0x80042
        cmdbuf[1]=contextHandle;
        cmdbuf[2]=IPC_Desc_CurProcessHandle();
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
@@ -239,7 +239,7 @@ static Result HTTPC_SetProxyDefault(Handle handle, Handle contextHandle)
 
        cmdbuf[0]=IPC_MakeHeader(0xE,1,0); // 0xE0040
        cmdbuf[1]=contextHandle;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
@@ -252,7 +252,7 @@ static Result HTTPC_CloseContext(Handle handle, Handle contextHandle)
 
        cmdbuf[0]=IPC_MakeHeader(0x3,1,0); // 0x30040
        cmdbuf[1]=contextHandle;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
 
@@ -274,7 +274,7 @@ Result httpcAddRequestHeaderField(httpcContext *context, const char* name, const
        cmdbuf[5]=(u32)name;
        cmdbuf[6]=IPC_Desc_Buffer(value_len,IPC_BUFFER_R);
        cmdbuf[7]=(u32)value;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
@@ -296,7 +296,7 @@ Result httpcAddPostDataAscii(httpcContext *context, const char* name, const char
        cmdbuf[5]=(u32)name;
        cmdbuf[6]=IPC_Desc_Buffer(value_len,IPC_BUFFER_R);
        cmdbuf[7]=(u32)value;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
@@ -327,7 +327,7 @@ Result httpcBeginRequest(httpcContext *context)
 
        cmdbuf[0]=IPC_MakeHeader(0x9,1,0); // 0x90040
        cmdbuf[1]=context->httphandle;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
@@ -343,7 +343,7 @@ Result httpcReceiveData(httpcContext *context, u8* buffer, u32 size)
        cmdbuf[2]=size;
        cmdbuf[3]=IPC_Desc_Buffer(size,IPC_BUFFER_W);
        cmdbuf[4]=(u32)buffer;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
@@ -361,7 +361,7 @@ Result httpcReceiveDataTimeout(httpcContext *context, u8* buffer, u32 size, u64
        cmdbuf[4]=(timeout >> 32) & 0xffffffff;
        cmdbuf[5]=IPC_Desc_Buffer(size,IPC_BUFFER_W);
        cmdbuf[6]=(u32)buffer;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
@@ -374,7 +374,7 @@ Result httpcGetRequestState(httpcContext *context, HTTPC_RequestStatus* out)
 
        cmdbuf[0]=IPC_MakeHeader(0x5,1,0); // 0x50040
        cmdbuf[1]=context->httphandle;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
@@ -389,7 +389,7 @@ Result httpcGetDownloadSizeState(httpcContext *context, u32* downloadedsize, u32
 
        cmdbuf[0]=IPC_MakeHeader(0x6,1,0); // 0x60040
        cmdbuf[1]=context->httphandle;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
@@ -425,7 +425,7 @@ Result httpcGetResponseStatusCode(httpcContext *context, u32* out)
 
        cmdbuf[0]=IPC_MakeHeader(0x22,1,0); // 0x220040
        cmdbuf[1]=context->httphandle;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
@@ -443,7 +443,7 @@ Result httpcGetResponseStatusCodeTimeout(httpcContext *context, u32* out, u64 ti
        cmdbuf[1]=context->httphandle;
        cmdbuf[2]=timeout & 0xffffffff;
        cmdbuf[3]=(timeout >> 32) & 0xffffffff;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
index 2f93fc16b56566b49006bedd5211e6637fb5565a..9e0979784f1a83a25cf821179f159346a9034c93 100644 (file)
@@ -109,7 +109,7 @@ u32 irrstCheckSectionUpdateTime(vu32 *sharedmem_section, u32 id)
 void irrstScanInput(void)
 {
        if(irrstRefCount==0)return;
-       
+
        u32 Id=0;
        kHeld = 0;
        memset(&csPos, 0, sizeof(circlePosition));
index 675a8bd588872f48bf85f97665b28952c0da4de2..da16c4715c923b81d0211b47bfab029097f28f01 100644 (file)
@@ -252,7 +252,7 @@ Result mvdstdInit(MVDSTD_Mode mode, MVDSTD_InputFormat input_type, MVDSTD_Output
        if(mvdstd_mode==MVDMODE_VIDEOPROCESSING)
        {
                ret = MVDSTD_cmd5(tmpinitstruct.cmd5_inval0, tmpinitstruct.cmd5_inval1, tmpinitstruct.cmd5_inval2, tmpinitstruct.cmd5_inval3);
-               if(ret!=MVD_STATUS_OK) goto cleanup3; 
+               if(ret!=MVD_STATUS_OK) goto cleanup3;
        }
 
        ret = MVDSTD_cmd18();
@@ -261,7 +261,7 @@ Result mvdstdInit(MVDSTD_Mode mode, MVDSTD_InputFormat input_type, MVDSTD_Output
        if(mvdstd_mode==MVDMODE_VIDEOPROCESSING)
        {
                ret = MVDSTD_cmd1b(tmpinitstruct.cmd1b_inval);
-               if(ret!=MVD_STATUS_OK) goto cleanup3; 
+               if(ret!=MVD_STATUS_OK) goto cleanup3;
        }
 
        return 0;
index cf7663d0ee75b5b6e5b2b8357efcb2227aabe105..35fc26a9c7a24fbfbe75067f08d7463c456a0406 100644 (file)
@@ -71,9 +71,9 @@ Result NEWS_GetTotalNotifications(u32* num)
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = IPC_MakeHeader(0x5,0,0);
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
-       
+
        *num = cmdbuf[2];
        return (Result)cmdbuf[1];
 }
@@ -88,7 +88,7 @@ Result NEWS_SetNotificationHeader(u32 news_id, const NotificationHeader* header)
        cmdbuf[2] = sizeof(NotificationHeader);
        cmdbuf[3] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_R);
        cmdbuf[4] = (u32)header;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
        return (Result)cmdbuf[1];
 }
@@ -103,7 +103,7 @@ Result NEWS_GetNotificationHeader(u32 news_id, NotificationHeader* header)
        cmdbuf[2] = sizeof(NotificationHeader);
        cmdbuf[3] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_W);
        cmdbuf[4] = (u32)header;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
        return (Result)cmdbuf[1];
 }
@@ -118,7 +118,7 @@ Result NEWS_SetNotificationMessage(u32 news_id, const u16* message, u32 size)
        cmdbuf[2] = size;
        cmdbuf[3] = IPC_Desc_Buffer((size_t)0x1780,IPC_BUFFER_R);
        cmdbuf[4] = (u32)message;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
        return (Result)cmdbuf[1];
 }
@@ -133,7 +133,7 @@ Result NEWS_GetNotificationMessage(u32 news_id, u16* message, u32* size)
        cmdbuf[2] = 0x1780; // Default size used by Notifications Applet
        cmdbuf[3] = IPC_Desc_Buffer((size_t)0x1780,IPC_BUFFER_W);
        cmdbuf[4] = (u32)message;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
     if(size) *size = cmdbuf[2];
        return (Result)cmdbuf[1];
@@ -149,7 +149,7 @@ Result NEWS_SetNotificationImage(u32 news_id, const void* buffer, u32 size)
        cmdbuf[2] = size;
        cmdbuf[3] = IPC_Desc_Buffer((size_t)0x10000,IPC_BUFFER_R);
        cmdbuf[4] = (u32)buffer;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
        return (Result)cmdbuf[1];
 }
@@ -164,7 +164,7 @@ Result NEWS_GetNotificationImage(u32 news_id, void* buffer, u32* size)
        cmdbuf[2] = 0x10000; // Default size used by Notifications Applet
        cmdbuf[3] = IPC_Desc_Buffer((size_t)0x10000,IPC_BUFFER_W);
        cmdbuf[4] = (u32)buffer;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
        if(size) *size = cmdbuf[2];
        return (Result)cmdbuf[1];
index 044d449a5c10d1fe07b220bf25e245742d4fddbd..d11608ab8ee9fbc9078473c2e755070f17581a25 100644 (file)
-#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;
+}
+
index 8c66d7cce34cce4b0de2c5d52cbbada8db17975f..5867f37ccba06d97d5294a660d02756dc9509219 100644 (file)
@@ -33,9 +33,9 @@ Result NS_LaunchFIRM(u64 titleid)
        cmdbuf[0] = IPC_MakeHeader(0x1,3,0); // 0x100C0
        cmdbuf[1] = titleid & 0xffffffff;
        cmdbuf[2] = (titleid >> 32) & 0xffffffff;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -48,11 +48,11 @@ Result NS_LaunchTitle(u64 titleid, u32 launch_flags, u32 *procid)
        cmdbuf[1] = titleid & 0xffffffff;
        cmdbuf[2] = (titleid >> 32) & 0xffffffff;
        cmdbuf[3] = launch_flags;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
 
        if(procid != NULL) *procid = cmdbuf[2];
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -65,9 +65,9 @@ Result NS_LaunchApplicationFIRM(u64 titleid, u32 flags)
        cmdbuf[1] = titleid & 0xffffffff;
        cmdbuf[2] = (titleid >> 32) & 0xffffffff;
        cmdbuf[3] = flags;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -83,7 +83,7 @@ Result NS_RebootToTitle(u8 mediatype, u64 titleid)
        cmdbuf[4] = mediatype;
        cmdbuf[5] = 0x0; // reserved
        cmdbuf[6] = 0x0;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
 
        return (Result)cmdbuf[1];
index f0133c9f61cd1c78c0d5afe5596438fedf3327ea..d782ddbf4e611954f83650c08eb1e61b47ce907e 100644 (file)
@@ -37,9 +37,9 @@ Result PM_LaunchTitle(u8 mediatype, u64 titleid, u32 launch_flags)
        cmdbuf[3] = mediatype;
        cmdbuf[4] = 0x0;
        cmdbuf[5] = launch_flags;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -53,11 +53,11 @@ Result PM_GetTitleExheaderFlags(u8 mediatype, u64 titleid, u8* out)
        cmdbuf[2] = (titleid >> 32) & 0xffffffff;
        cmdbuf[3] = mediatype;
        cmdbuf[4] = 0x0;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
-       
+
        memcpy(out, (u8*)(&cmdbuf[2]), 8);
-       
+
        return (Result)cmdbuf[1];
 }
 
@@ -70,9 +70,9 @@ Result PM_SetFIRMLaunchParams(u32 size, u8* in)
        cmdbuf[1] = size;
        cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
        cmdbuf[3] = (u32)in;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
-               
+
        return (Result)cmdbuf[1];
 }
 
@@ -85,9 +85,9 @@ Result PM_GetFIRMLaunchParams(u32 size, u8* out)
        cmdbuf[1] = size;
        cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
        cmdbuf[3] = (u32)out;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
-               
+
        return (Result)cmdbuf[1];
 }
 
@@ -101,8 +101,8 @@ Result PM_LaunchFIRMSetParams(u32 firm_titleid_low, u32 size, u8* in)
        cmdbuf[2] = size;
        cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
        cmdbuf[4] = (u32)in;
-       
+
        if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
-               
+
        return (Result)cmdbuf[1];
 }
\ No newline at end of file
index 2c62040ee863f7684a2e0f3c483fb15a34083fde..b00997546fce86ef111e72559c7a5e8fe06fd0a7 100644 (file)
@@ -50,10 +50,10 @@ int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
        staticbufs[1] = (u32)tmpaddr;
 
        ret = svcSendSyncRequest(SOCU_handle);
-       
+
        staticbufs[0] = saved_threadstorage[0];
        staticbufs[1] = saved_threadstorage[1];
-       
+
        if(ret != 0) {
                __release_handle(fd);
                errno = SYNC_ERROR;
index e2c6816f6876db462fece3c00a7571bd50ce23ae..68a19c363a4a1495d0aa214c360f3ad712b7d13f 100644 (file)
@@ -140,7 +140,7 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi
        Result ret;
        addrinfo_3ds_t *info = NULL, *tmp;
        s32            count = DEFAULT_NUM_ADDRINFO, info_count;
-       
+
        if(node == NULL && service == NULL)
        {
                return EAI_NONAME;
index 05c9ab6e2427cfd5697b02670d011b38f97e05e7..08f37cbce48f169bf90bf78af364f4a8dc988d38 100644 (file)
@@ -57,7 +57,7 @@ int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_
        if(R_FAILED(ret)) {
                errno = SYNC_ERROR;
                return ret;
-       }       
+       }
 
        ret = cmdbuf[1];
        if(R_FAILED(ret)) {
index dc3f91573846ce389ebbb87ab55a979a7973c251..908a3964e68a60a72dede6ecd52a10d0698bfaee 100644 (file)
@@ -38,9 +38,9 @@ int SOCU_GetNetworkOpt(int level, NetworkOpt optname, void * optval, socklen_t *
        {
                errno = SYNC_ERROR;
                return ret;
-       
+
        }
-       
+
        ret = _net_convert_error(cmdbuf[2]);
 
        if(ret < 0) {
index 11f3d60815e98728a71b9a51031cdc648bace507..2a55dbfabb027c9b656ea80395cbedcb131842a2 100644 (file)
@@ -29,10 +29,10 @@ int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
        staticbufs[1] = (u32)tmpaddr;
 
        ret = svcSendSyncRequest(SOCU_handle);
-       
+
        staticbufs[0] = saved_threadstorage[0];
        staticbufs[1] = saved_threadstorage[1];
-       
+
        if(ret != 0) {
                errno = SYNC_ERROR;
                return ret;
index d2409c69b0476ee1d508476c711c56fe94200d04..7014d92436b9243e83cd842012f44bc8c1d61a39 100644 (file)
@@ -30,10 +30,10 @@ int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optl
        staticbufs[1] = (u32)optval;
 
        ret = svcSendSyncRequest(SOCU_handle);
-       
+
        staticbufs[0] = saved_threadstorage[0];
        staticbufs[1] = saved_threadstorage[1];
-       
+
        if(ret != 0) {
                errno = SYNC_ERROR;
                return ret;
index 90409fb2dc5fb42a15d2566fcdfce87e5454d112..2edc9ae069c3643c42a9347576002ea92a65a3a4 100644 (file)
@@ -122,7 +122,7 @@ Result socExit(void)
 {
        Result ret = 0;
        int dev;
-       
+
        svcCloseHandle(socMemhandle);
        socMemhandle = 0;
 
@@ -154,7 +154,7 @@ soc_close(struct _reent *r,
           int           fd)
 {
        Handle sockfd = *(Handle*)fd;
-       
+
        int ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
index ba43a8c31913206a40c416c425855d7e3eefbc2e..227f28b2c34dc031260c4542799258f76656ac55 100644 (file)
@@ -29,7 +29,7 @@ int ioctl(int sockfd, int request, ...)
                }
 
                flags = fcntl(sockfd, F_GETFL, 0);
-               if(flags == -1) 
+               if(flags == -1)
                        return -1;
 
                if(*value)
index a458e69f7c66e46febea535a810e0dbb29aca124..664ee43c0e5f895c48280e328f8ea38d7882c28c 100644 (file)
@@ -51,10 +51,10 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout)
        staticbufs[1] = (u32)tmp_fds;
 
        ret = svcSendSyncRequest(SOCU_handle);
-       
+
        staticbufs[0] = saved_threadstorage[0];
        staticbufs[1] = saved_threadstorage[1];
-       
+
        if(ret != 0) {
                free(tmp_fds);
                errno = SYNC_ERROR;
index 207df99907974420338ed5107682c3a16ed3ca29..e0a25f1cee40c2cf9b063031180e0f1f8708527e 100644 (file)
@@ -33,10 +33,10 @@ ssize_t socuipc_cmd7(int sockfd, void *buf, size_t len, int flags, struct sockad
        staticbufs[1] = (u32)tmpaddr;
 
        ret = svcSendSyncRequest(SOCU_handle);
-       
+
        staticbufs[0] = saved_threadstorage[0];
        staticbufs[1] = saved_threadstorage[1];
-       
+
        if(ret != 0) {
                errno = SYNC_ERROR;
                return -1;
@@ -64,7 +64,7 @@ ssize_t socuipc_cmd7(int sockfd, void *buf, size_t len, int flags, struct sockad
 ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
 {
        int ret = 0;
-       u32 *cmdbuf = getThreadCommandBuffer(); 
+       u32 *cmdbuf = getThreadCommandBuffer();
        u32 tmp_addrlen = 0;
        u8 tmpaddr[0x1c];
        u32 saved_threadstorage[4];
@@ -85,7 +85,7 @@ ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockad
        saved_threadstorage[1] = cmdbuf[0x104>>2];
        saved_threadstorage[2] = cmdbuf[0x108>>2];
        saved_threadstorage[3] = cmdbuf[0x10c>>2];
-       
+
        cmdbuf[0x100>>2] = (((u32)len)<<14) | 2;
        cmdbuf[0x104>>2] = (u32)buf;
        cmdbuf[0x108>>2] = (tmp_addrlen<<14) | 2;
index facc533ca4eece099aca50e2fdc44bcfe048b6b0..96773ba09318a4fca7b6f3c488b56782aa7f3e6c 100644 (file)
@@ -45,7 +45,7 @@ static Result sslcipc_Initialize(void)
 
        cmdbuf[0]=IPC_MakeHeader(0x1,0,2); // 0x10002
        cmdbuf[1]=IPC_Desc_CurProcessHandle();
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(__sslc_servhandle)))return ret;
 
@@ -235,7 +235,7 @@ static Result sslcipc_InitializeConnectionSession(sslcContext *context)
        cmdbuf[0]=IPC_MakeHeader(0x12,1,2); // 0x120042
        cmdbuf[1]=context->sslchandle;
        cmdbuf[2]=IPC_Desc_CurProcessHandle();
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
@@ -371,7 +371,7 @@ static Result sslcipc_ContextInitSharedmem(sslcContext *context, u32 size)
        cmdbuf[2]=size;
        cmdbuf[3]=IPC_Desc_SharedHandles(1);
        cmdbuf[4]=context->sharedmem_handle;
-       
+
        Result ret=0;
        if(R_FAILED(ret=svcSendSyncRequest(context->servhandle)))return ret;
 
index d3815e3bd56d9822ae04e477697a1191563c0346..4edb4d6f210a2402cab1edb10aea94ba35f8eaab 100644 (file)
@@ -69,11 +69,11 @@ SVC_BEGIN svcGetThreadPriority
        ldr r3, [sp], #4
        str r1, [r3]
        bx  lr
-       
+
 SVC_BEGIN svcSetThreadPriority
        svc 0x0C
        bx  lr
-       
+
 SVC_BEGIN svcGetThreadAffinityMask
        svc 0x0D
        bx  lr
@@ -81,14 +81,14 @@ SVC_BEGIN svcGetThreadAffinityMask
 SVC_BEGIN svcSetThreadAffinityMask
        svc 0x0E
        bx  lr
-       
+
 SVC_BEGIN svcGetThreadIdealProcessor
        str r0, [sp, #-0x4]!
        svc 0x0F
        ldr r3, [sp], #4
        str r1, [r3]
        bx  lr
-       
+
 SVC_BEGIN svcSetThreadIdealProcessor
        svc 0x10
        bx  lr
@@ -281,7 +281,7 @@ SVC_BEGIN svcOpenThread
        pop {r2}
        str r1, [r2]
        bx  lr
-       
+
 SVC_BEGIN svcGetProcessId
        str r0, [sp, #-0x4]!
        svc 0x35
@@ -295,7 +295,7 @@ SVC_BEGIN svcGetProcessIdOfThread
        ldr r3, [sp], #4
        str r1, [r3]
        bx  lr
-       
+
 SVC_BEGIN svcGetThreadId
        str r0, [sp, #-0x4]!
        svc 0x37
@@ -407,7 +407,7 @@ SVC_BEGIN svcTerminateDebugProcess
 SVC_BEGIN svcGetProcessDebugEvent
        svc 0x63
        bx  lr
-       
+
 SVC_BEGIN svcContinueDebugEvent
        svc 0x64
        bx  lr
index 2bcf06ba2fe02690f5b1ddb32f516f2662ceec1e..3b5ff99dda2b3000831ecb6f44075d2d1b54c552 100644 (file)
@@ -25,6 +25,6 @@ rbtree_find(const rbtree_t      *tree,
       tmp = tmp->child[LEFT];
     }
   }
+
   return save;
 }