From 46c0a1763c0796d356324fcc31507ff502d6e75e Mon Sep 17 00:00:00 2001 From: Yuri Kunde Schlesner Date: Thu, 11 Dec 2014 16:44:09 -0200 Subject: [PATCH 01/61] Add MEMPERM_DONTCARE to MemPerm --- libctru/include/3ds/svc.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libctru/include/3ds/svc.h b/libctru/include/3ds/svc.h index ab0230c..271408f 100644 --- a/libctru/include/3ds/svc.h +++ b/libctru/include/3ds/svc.h @@ -16,10 +16,11 @@ typedef enum { } MemOp; typedef enum { - MEMPERM_READ =1, - MEMPERM_WRITE =2, - MEMPERM_EXECUTE=4, - MEMPERM_MAX =0xFFFFFFFF //force 4-byte + MEMPERM_READ = 1, + MEMPERM_WRITE = 2, + MEMPERM_EXECUTE = 4, + MEMPERM_DONTCARE = 0x10000000, + MEMPERM_MAX = 0xFFFFFFFF //force 4-byte } MemPerm; typedef struct { From 1a575891eb77f3c02c0efcfdb5013369d0599e20 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Thu, 11 Dec 2014 22:23:58 +0000 Subject: [PATCH 02/61] allow independent setting of double buffering --- libctru/include/3ds/gfx.h | 2 +- libctru/source/gfx.c | 33 ++++++++++++++++++--------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/libctru/include/3ds/gfx.h b/libctru/include/3ds/gfx.h index e7b33d3..1d426d0 100644 --- a/libctru/include/3ds/gfx.h +++ b/libctru/include/3ds/gfx.h @@ -22,7 +22,7 @@ void gfxExit(); //control stuff void gfxSet3D(bool enable); void gfxSetScreenFormat(gfxScreen_t screen, GSP_FramebufferFormats format); -void gfxSetDoubleBuffering(bool doubleBuffering); +void gfxSetDoubleBuffering(gfxScreen_t screen, bool doubleBuffering); void gfxFlushBuffers(); void gfxSwapBuffers(); void gfxSwapBuffersGpu(); diff --git a/libctru/source/gfx.c b/libctru/source/gfx.c index df99fcc..129903e 100644 --- a/libctru/source/gfx.c +++ b/libctru/source/gfx.c @@ -12,9 +12,9 @@ u8* gfxTopLeftFramebuffers[2]; u8* gfxTopRightFramebuffers[2]; u8* gfxBottomFramebuffers[2]; -static u8 currentBuffer; static bool enable3d; -static int doubleBuf = 1; +static u8 currentBuffer[2]; +static int doubleBuf[2] = {1,1}; Handle gspEvent, gspSharedMemHandle; @@ -33,8 +33,8 @@ void gfxSetScreenFormat(gfxScreen_t screen, GSP_FramebufferFormats format) { botFormat = format; } -void gfxSetDoubleBuffering(bool doubleBuffering) { - doubleBuf = doubleBuffering ? 1 : 0; // make sure they're the integer values '1' and '0' +void gfxSetDoubleBuffering( gfxScreen_t screen, bool doubleBuffering) { + doubleBuf[screen] = doubleBuffering ? 1 : 0; // make sure they're the integer values '1' and '0' } static u32 __get_bytes_per_pixel(GSP_FramebufferFormats format) { @@ -81,7 +81,7 @@ void gfxWriteFramebufferInfo(gfxScreen_t screen) u8* framebufferInfoHeader=gfxSharedMemory+0x200+gfxThreadID*0x80; if(screen==GFX_BOTTOM)framebufferInfoHeader+=0x40; GSP_FramebufferInfo* framebufferInfo=(GSP_FramebufferInfo*)&framebufferInfoHeader[0x4]; - framebufferInfoHeader[0x0]^=doubleBuf; + framebufferInfoHeader[0x0]^=doubleBuf[0x0]; framebufferInfo[framebufferInfoHeader[0x0]]=(screen==GFX_TOP)?(topFramebufferInfo):(bottomFramebufferInfo); framebufferInfoHeader[0x1]=1; } @@ -124,7 +124,8 @@ void gfxInit() //GSP shared mem : 0x2779F000 gxCmdBuf=(u32*)(gfxSharedMemory+0x800+gfxThreadID*0x200); - currentBuffer=0; + currentBuffer[0]=0; + currentBuffer[1]=0; // Initialize event handler and wait for VBlank gspInitEventHandler(gspEvent, (vu8*)gfxSharedMemory, gfxThreadID); @@ -153,7 +154,7 @@ void gfxExit() svcCloseHandle(gspEvent); GSPGPU_ReleaseRight(NULL); - + gspExit(); } @@ -164,10 +165,10 @@ u8* gfxGetFramebuffer(gfxScreen_t screen, gfx3dSide_t side, u16* width, u16* hei if(screen==GFX_TOP) { if(height)*height=400; - return (side==GFX_LEFT || !enable3d)?(gfxTopLeftFramebuffers[currentBuffer^doubleBuf]):(gfxTopRightFramebuffers[currentBuffer^doubleBuf]); + return (side==GFX_LEFT || !enable3d)?(gfxTopLeftFramebuffers[currentBuffer[0]^doubleBuf[0]]):(gfxTopRightFramebuffers[currentBuffer[0]^doubleBuf[0]]); }else{ if(height)*height=320; - return gfxBottomFramebuffers[currentBuffer^doubleBuf]; + return gfxBottomFramebuffers[currentBuffer[1]^doubleBuf[1]]; } } @@ -180,18 +181,20 @@ void gfxFlushBuffers() void gfxSwapBuffers() { - currentBuffer^=doubleBuf; - gfxSetFramebufferInfo(GFX_TOP, currentBuffer); - gfxSetFramebufferInfo(GFX_BOTTOM, currentBuffer); + currentBuffer[0]^=doubleBuf[0]; + currentBuffer[1]^=doubleBuf[1]; + gfxSetFramebufferInfo(GFX_TOP, currentBuffer[0]); + gfxSetFramebufferInfo(GFX_BOTTOM, currentBuffer[1]); GSPGPU_SetBufferSwap(NULL, GFX_TOP, &topFramebufferInfo); GSPGPU_SetBufferSwap(NULL, GFX_BOTTOM, &bottomFramebufferInfo); } void gfxSwapBuffersGpu() { - currentBuffer^=doubleBuf; - gfxSetFramebufferInfo(GFX_TOP, currentBuffer); - gfxSetFramebufferInfo(GFX_BOTTOM, currentBuffer); + currentBuffer[0]^=doubleBuf[0]; + currentBuffer[1]^=doubleBuf[1]; + gfxSetFramebufferInfo(GFX_TOP, currentBuffer[0]); + gfxSetFramebufferInfo(GFX_BOTTOM, currentBuffer[1]); gfxWriteFramebufferInfo(GFX_TOP); gfxWriteFramebufferInfo(GFX_BOTTOM); } From 36e3a3de3a1d3e9269dfd6a147b0d6a7b2d4551f Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Thu, 11 Dec 2014 23:03:29 +0000 Subject: [PATCH 03/61] add macro for building RGB565 colors --- libctru/include/3ds/gfx.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libctru/include/3ds/gfx.h b/libctru/include/3ds/gfx.h index 1d426d0..7074953 100644 --- a/libctru/include/3ds/gfx.h +++ b/libctru/include/3ds/gfx.h @@ -2,6 +2,8 @@ #include <3ds/types.h> #include <3ds/services/gsp.h> +#define RGB565(r,g,b) (((b)&0x1f)|(((g)&0x3f)<<5)|(((r)&0x1f)<<11)) + typedef enum { GFX_TOP = 0, From bc980fb34d3cb8c3decf36248bc54d4adea2ea98 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 12 Dec 2014 00:16:23 +0000 Subject: [PATCH 04/61] use correct doubleBuf variable --- libctru/source/gfx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libctru/source/gfx.c b/libctru/source/gfx.c index 129903e..578cc32 100644 --- a/libctru/source/gfx.c +++ b/libctru/source/gfx.c @@ -81,7 +81,7 @@ void gfxWriteFramebufferInfo(gfxScreen_t screen) u8* framebufferInfoHeader=gfxSharedMemory+0x200+gfxThreadID*0x80; if(screen==GFX_BOTTOM)framebufferInfoHeader+=0x40; GSP_FramebufferInfo* framebufferInfo=(GSP_FramebufferInfo*)&framebufferInfoHeader[0x4]; - framebufferInfoHeader[0x0]^=doubleBuf[0x0]; + framebufferInfoHeader[0x0]^=doubleBuf[screen]; framebufferInfo[framebufferInfoHeader[0x0]]=(screen==GFX_TOP)?(topFramebufferInfo):(bottomFramebufferInfo); framebufferInfoHeader[0x1]=1; } From a645436ebe5b5d709dfe313822d0d5ffc1b1f877 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Thu, 11 Dec 2014 23:05:29 +0000 Subject: [PATCH 05/61] add console --- libctru/data/default_font.bin | Bin 0 -> 2048 bytes libctru/include/3ds.h | 1 + libctru/include/3ds/console.h | 138 +++++++++ libctru/source/console.c | 552 ++++++++++++++++++++++++++++++++++ 4 files changed, 691 insertions(+) create mode 100644 libctru/data/default_font.bin create mode 100644 libctru/include/3ds/console.h create mode 100644 libctru/source/console.c diff --git a/libctru/data/default_font.bin b/libctru/data/default_font.bin new file mode 100644 index 0000000000000000000000000000000000000000..73436fc909db8bb3a7ca8af9133084e68c4f354e GIT binary patch literal 2048 zcmcIlO=}cE5G|ZxT$W}NmK++g^mrH)JV-<1xWr-FKn@;6@Sxx!5EvMPS>!f>obodI0d=RJk;2=#8c@tGfO03V_ zP4=mAIhW+GpUwzk9W38>a@IGt>CY6cwGx%rr8p?oIyv3LWQt5&L2=+_7;qZK(wHKB z6PK0f$CF<4FXB)Z`zfK9)I)?mu`L5bhrP_;ME?LLS!f~np@1u}R>Q8s9PdZ~F!?hc z`&YdM0Vy5^)dupx{5W`GHQxj})36S17=;m+rU{c*6+VWnYuj+Qix+&Mhwd;cmxrNl#fQy9sdCmUUPhQjI zSN^#v%p8_K=RcDlCymaLyAU@GP~?WreSNZNu?)82R4K!?)(eesa;BV4a2a?Tj#In6 z`)qd`^U7z{Od3|wpZB`h{&?sNEE%t2>~^co#jn~!jdiTY@WDl|w{RqZV) zx3V6vkBawpKFMjd|CKtrupZ}cl;d3E{N|&C zW}0xkk&ri$>nl6?Y^yt~_n{c&5f4Me{)A?lFyN)29q~bzV|+!#QAAut+>s-`FXIh; z81UX9+fWygbrG4Lc%}~p`W=q_>irz$SXTdpW|}bQy>asS+c0n5SKK#5!!uKR)Tj3z zc@&XH5&bKo&fn}Jo4KntLBF08qx|9iD1SiZiT4T5GT)0)jyCZwz1->ZFd9`s{eMNAO4oOR$I2=j1zi988Y|0Vn{*&UA5(0`)E*q<`c{pA1v literal 0 HcmV?d00001 diff --git a/libctru/include/3ds.h b/libctru/include/3ds.h index beec914..d128d25 100644 --- a/libctru/include/3ds.h +++ b/libctru/include/3ds.h @@ -11,6 +11,7 @@ extern "C" { #include <3ds/linear.h> #include <3ds/os.h> #include <3ds/gfx.h> +#include <3ds/console.h> #include <3ds/services/ac.h> #include <3ds/services/apt.h> diff --git a/libctru/include/3ds/console.h b/libctru/include/3ds/console.h new file mode 100644 index 0000000..fe694bf --- /dev/null +++ b/libctru/include/3ds/console.h @@ -0,0 +1,138 @@ + + +/*! \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: +consoleDemoInit() +or to customize the console usage by: +consoleInit() + +*/ + +#ifndef CONSOLE_H +#define CONSOLE_H + +#include <3ds/types.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef bool(* ConsolePrint)(void* con, char 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(); +
+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
+};
+
+*/ +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_BRIGHT (1<<0) +#define CONSOLE_COLOR_REVERSE (1<<1) + +/*! \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, other wise 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 console A pointer to the console data to initialze (if it's NULL, the default console will be used) + \return A pointer to the current console. +*/ +PrintConsole* consoleInit(PrintConsole* console); + +//! Clears the screan by using iprintf("\x1b[2J"); +void consoleClear(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libctru/source/console.c b/libctru/source/console.c new file mode 100644 index 0000000..451fe0c --- /dev/null +++ b/libctru/source/console.c @@ -0,0 +1,552 @@ +#include +#include +#include +#include <3ds/gfx.h> +#include <3ds/console.h> + +#include "default_font_bin.h" + +//set up the palette for color printing +static u16 colorTable[] = { + RGB565( 0, 0, 0), // normal black + RGB565(17, 0, 0), // normal red + RGB565( 0,15, 0), // normal green + RGB565(17,34, 0), // normal yellow + RGB565( 0, 0,17), // normal blue + RGB565(17, 0,17), // normal magenta + RGB565( 0,34,17), // normal cyan + RGB565(17,34,17), // normal white + RGB565( 0, 0, 0), // bright black + RGB565(25, 0, 0), // bright red + RGB565( 0,52, 0), // bright green + RGB565(25,52, 0), // bright yellow + RGB565( 4,18,31), // bright blue + RGB565(25, 0,25), // bright magenta + RGB565( 0,52,25), // bright cyan + RGB565(28,57,28) // bright white +}; + +PrintConsole defaultConsole = +{ + //Font: + { + (u8*)default_font_bin, //font gfx + 0, //first ascii character in the set + 128 //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 + CONSOLE_COLOR_BRIGHT, // flags + 0, //print callback + false //console initialized +}; + +PrintConsole currentCopy; + +PrintConsole* currentConsole = ¤tCopy; + +PrintConsole* consoleGetDefault(void){return &defaultConsole;} + +void consolePrintChar(char 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; + } + } +} +//--------------------------------------------------------------------------------- +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; + } + default: + { + colTemp = currentConsole->cursorX ; + + while(i++ < (currentConsole->windowWidth - colTemp)) { + consolePrintChar(' '); + } + + currentConsole->cursorX = colTemp; + + break; + } + } +} + + +//--------------------------------------------------------------------------------- +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(icursorY = (currentConsole->cursorY - parameter) < 0 ? 0 : currentConsole->cursorY - parameter; + escaping = false; + break; + case 'B': + sscanf(escapeseq,"[%dB", ¶meter); + currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter; + escaping = false; + break; + case 'C': + sscanf(escapeseq,"[%dC", ¶meter); + currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter; + escaping = false; + break; + case 'D': + sscanf(escapeseq,"[%dD", ¶meter); + currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter; + escaping = false; + break; + //--------------------------------------- + // Cursor position movement + //--------------------------------------- + case 'H': + case 'f': + sscanf(escapeseq,"[%d;%df", ¤tConsole->cursorY , ¤tConsole->cursorX ); + escaping = false; + break; + //--------------------------------------- + // Screen clear + //--------------------------------------- + case 'J': + consoleCls(escapeseq[escapelen-2]); + escaping = false; + break; + //--------------------------------------- + // Line clear + //--------------------------------------- + case 'K': + consoleClearLine(escapeseq[escapelen-2]); + escaping = false; + break; + //--------------------------------------- + // Save cursor position + //--------------------------------------- + case 's': + currentConsole->prevCursorX = currentConsole->cursorX ; + currentConsole->prevCursorY = currentConsole->cursorY ; + escaping = false; + break; + //--------------------------------------- + // Load cursor position + //--------------------------------------- + case 'u': + currentConsole->cursorX = currentConsole->prevCursorX ; + currentConsole->cursorY = currentConsole->prevCursorY ; + escaping = false; + break; + //--------------------------------------- + // Color scan codes + //--------------------------------------- + case 'm': + escapeseq++; + scanning = true; + +// do while doesn't work at -O2 +// do { + sscanf(escapeseq,"%d;%n", ¶meter, &consumed); + escapeseq += consumed; + + if (parameter == 0 ) { + currentConsole->flags |= CONSOLE_COLOR_BRIGHT; + currentConsole->flags &= ~CONSOLE_COLOR_REVERSE; + currentConsole->bg = 0; + currentConsole->fg = 7; + } else if (parameter == 7) { // reverse video + currentConsole->flags |= CONSOLE_COLOR_REVERSE; + } else if (parameter == 2) { // half bright + currentConsole->flags &= ~CONSOLE_COLOR_BRIGHT; + } else if (parameter >= 30 && parameter <= 37) { // writing color + currentConsole->fg = parameter - 30; + } else if (parameter >= 40 && parameter <= 47) { // screen color + currentConsole->bg = parameter - 40; + } + if(escapeseq >= tmp) scanning = false; +// } while(scanning); + + 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 +}; + +static const devoptab_t dotab_null = { + "null", + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +//--------------------------------------------------------------------------------- +PrintConsole* consoleInit(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(GFX_BOTTOM,GSP_RGB565_OES); + gfxSetDoubleBuffering(GFX_BOTTOM,false); + console->frameBuffer = (u16*)gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); + + + consoleCls('2'); + + return currentConsole; + +} +//--------------------------------------------------------------------------------- +PrintConsole *consoleSelect(PrintConsole* console){ +//--------------------------------------------------------------------------------- + PrintConsole *tmp = currentConsole; + currentConsole = console; + return tmp; +} + +//--------------------------------------------------------------------------------- +void consoleSetFont(PrintConsole* console, ConsoleFont* font){ +//--------------------------------------------------------------------------------- + + if(!console) console = currentConsole; + + console->font = *font; + +} + +//--------------------------------------------------------------------------------- +static void newRow() { +//--------------------------------------------------------------------------------- + + + currentConsole->cursorY ++; + + if(currentConsole->cursorY >= currentConsole->windowHeight) { + currentConsole->cursorY --; + u16 *dst = ¤tConsole->frameBuffer[(currentConsole->windowX * 8 * 240) + (239 - (currentConsole->windowY * 8))]; + u16 *src = dst - 8; + + int i,j; + + for (i=0; iwindowWidth*8; i++) { + u32 *from=(u32*)src; + u32 *to = (u32*)dst; + for (j=0; j<((currentConsole->windowHeight*8)-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_BRIGHT) { + writingColor |= 8; + screenColor |=8; + } + + 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++); + + u8 mask = 0x80; + + + int i; + + int x = (currentConsole->cursorX + currentConsole->windowX) * 8; + int y = ((currentConsole->cursorY + currentConsole->windowY) *8 ); + + u16 *screen = ¤tConsole->frameBuffer[(x * 240) + (239 - (y + 7))]; + + for (i=0;i<8;i++) { + if (b8 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b7 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b6 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b5 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b4 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b3 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b2 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + if (b1 & mask) { *(screen++) = fg; }else{ *(screen++) = bg; } + mask >>= 1; + screen += 240 - 8; + } + +} + +//--------------------------------------------------------------------------------- +void consolePrintChar(char 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; + 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; + +} + + From 5fe960fda09e3477d2101d42e5d623503b13cd1f Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 12 Dec 2014 09:57:58 +0000 Subject: [PATCH 06/61] fix color code scanning --- libctru/source/console.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index 451fe0c..d2dcd34 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -203,8 +203,7 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { do { chr = *(tmp++); i++; count++; escapelen++; - int parameter, consumed, assigned; - bool scanning; + int parameter, assigned, consumed; switch (chr) { //--------------------------------------- @@ -274,12 +273,22 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { //--------------------------------------- case 'm': escapeseq++; - scanning = true; + escapelen--; + + if (escapelen == 1) { + escaping = false; + break; + } + + do { + if (strchr(escapeseq,';')) { + sscanf(escapeseq,"%d;%n", ¶meter, &consumed); + } else { + sscanf(escapeseq,"%dm%n", ¶meter, &consumed); + } -// do while doesn't work at -O2 -// do { - sscanf(escapeseq,"%d;%n", ¶meter, &consumed); escapeseq += consumed; + escapelen -= consumed; if (parameter == 0 ) { currentConsole->flags |= CONSOLE_COLOR_BRIGHT; @@ -295,8 +304,7 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { } else if (parameter >= 40 && parameter <= 47) { // screen color currentConsole->bg = parameter - 40; } - if(escapeseq >= tmp) scanning = false; -// } while(scanning); + } while (escapelen > 0); escaping = false; break; From 382f1320ce7c9996ae07f140f404ebbf113d74fc Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 12 Dec 2014 10:58:16 +0000 Subject: [PATCH 07/61] lighten up half bright green --- libctru/source/console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index d2dcd34..be91236 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -10,7 +10,7 @@ static u16 colorTable[] = { RGB565( 0, 0, 0), // normal black RGB565(17, 0, 0), // normal red - RGB565( 0,15, 0), // normal green + RGB565( 0,34, 0), // normal green RGB565(17,34, 0), // normal yellow RGB565( 0, 0,17), // normal blue RGB565(17, 0,17), // normal magenta From c0a0ec1fb2c12aadd31365f3abb4e30e28ef0ab7 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 12 Dec 2014 12:05:45 +0000 Subject: [PATCH 08/61] fix console scrolling --- libctru/source/console.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index be91236..0b0c05b 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -402,6 +402,7 @@ static void newRow() { currentConsole->cursorY ++; + if(currentConsole->cursorY >= currentConsole->windowHeight) { currentConsole->cursorY --; u16 *dst = ¤tConsole->frameBuffer[(currentConsole->windowX * 8 * 240) + (239 - (currentConsole->windowY * 8))]; @@ -410,10 +411,9 @@ static void newRow() { int i,j; for (i=0; iwindowWidth*8; i++) { - u32 *from=(u32*)src; - u32 *to = (u32*)dst; - for (j=0; j<((currentConsole->windowHeight*8)-8)/2;j++) *(to--) = *(from--); - + u16 *from = src; + u16 *to = dst; + for (j=0; j<((currentConsole->windowHeight*8));j++) *(to--) = *(from--); dst += 240; src += 240; } From 35307ad5f2f9fa913a169338bf88db4bf4a3c21a Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 12 Dec 2014 12:18:00 +0000 Subject: [PATCH 09/61] use word copy for extra speed in console scroll --- libctru/source/console.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index 0b0c05b..19e0f95 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -411,9 +411,9 @@ static void newRow() { int i,j; for (i=0; iwindowWidth*8; i++) { - u16 *from = src; - u16 *to = dst; - for (j=0; j<((currentConsole->windowHeight*8));j++) *(to--) = *(from--); + u32 *from = (u32*)((int)src & ~3); + u32 *to = (u32*)((int)dst & ~3); + for (j=0; j<((currentConsole->windowHeight*8)/2);j++) *(to--) = *(from--); dst += 240; src += 240; } From d6a58d4a2f7fbeadfa99328252ff1c8ae3f0b812 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 12 Dec 2014 13:40:54 +0000 Subject: [PATCH 10/61] fix scroll size --- libctru/source/console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index 19e0f95..040955b 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -413,7 +413,7 @@ static void newRow() { for (i=0; iwindowWidth*8; i++) { u32 *from = (u32*)((int)src & ~3); u32 *to = (u32*)((int)dst & ~3); - for (j=0; j<((currentConsole->windowHeight*8)/2);j++) *(to--) = *(from--); + for (j=0;j<(((currentConsole->windowHeight-1)*8)/2);j++) *(to--) = *(from--); dst += 240; src += 240; } From a39890ef48606805c3fe9858c4f76b3ff3da3eaf Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 12 Dec 2014 13:43:40 +0000 Subject: [PATCH 11/61] allow console on either screen --- libctru/include/3ds/console.h | 3 ++- libctru/source/console.c | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libctru/include/3ds/console.h b/libctru/include/3ds/console.h index fe694bf..f8bcde6 100644 --- a/libctru/include/3ds/console.h +++ b/libctru/include/3ds/console.h @@ -123,10 +123,11 @@ PrintConsole* consoleGetDefault(void); 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 initialze (if it's NULL, the default console will be used) \return A pointer to the current console. */ -PrintConsole* consoleInit(PrintConsole* console); +PrintConsole* consoleInit(gfxScreen_t screen, PrintConsole* console); //! Clears the screan by using iprintf("\x1b[2J"); void consoleClear(void); diff --git a/libctru/source/console.c b/libctru/source/console.c index 040955b..087bce7 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -342,7 +342,7 @@ static const devoptab_t dotab_null = { }; //--------------------------------------------------------------------------------- -PrintConsole* consoleInit(PrintConsole* console) { +PrintConsole* consoleInit(gfxScreen_t screen, PrintConsole* console) { //--------------------------------------------------------------------------------- static bool firstConsoleInit = true; @@ -367,9 +367,14 @@ PrintConsole* consoleInit(PrintConsole* console) { console->consoleInitialised = 1; - gfxSetScreenFormat(GFX_BOTTOM,GSP_RGB565_OES); - gfxSetDoubleBuffering(GFX_BOTTOM,false); - console->frameBuffer = (u16*)gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); + gfxSetScreenFormat(screen,GSP_RGB565_OES); + gfxSetDoubleBuffering(screen,false); + console->frameBuffer = (u16*)gfxGetFramebuffer(screen, GFX_LEFT, NULL, NULL); + + if(screen==GFX_TOP) { + console->consoleWidth = 50; + console->windowWidth = 50; + } consoleCls('2'); From 493d7dc55a1ec24f3ade6f47eaad77bcae8907d0 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 12 Dec 2014 22:57:24 +0000 Subject: [PATCH 12/61] add macro to convert 8bit RGB to RGB565 --- libctru/include/3ds/gfx.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libctru/include/3ds/gfx.h b/libctru/include/3ds/gfx.h index 7074953..7d85eef 100644 --- a/libctru/include/3ds/gfx.h +++ b/libctru/include/3ds/gfx.h @@ -3,6 +3,7 @@ #include <3ds/services/gsp.h> #define RGB565(r,g,b) (((b)&0x1f)|(((g)&0x3f)<<5)|(((r)&0x1f)<<11)) +#define RGB8_to_565(r,g,b) (((b)>>3)&0x1f)|((((g)>>2)&0x3f)<<5)|((((r)>>3)&0x1f)<<11) typedef enum { From 6a36d31568ad2634a7fa9ce6539d7daa53cc179f Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 02:21:50 +0000 Subject: [PATCH 13/61] use 3 intensity levels --- libctru/include/3ds/console.h | 5 +-- libctru/source/console.c | 68 +++++++++++++++++++++-------------- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/libctru/include/3ds/console.h b/libctru/include/3ds/console.h index f8bcde6..fd65284 100644 --- a/libctru/include/3ds/console.h +++ b/libctru/include/3ds/console.h @@ -92,8 +92,9 @@ typedef struct PrintConsole bool consoleInitialised; /*!< True if the console is initialized */ }PrintConsole; -#define CONSOLE_COLOR_BRIGHT (1<<0) -#define CONSOLE_COLOR_REVERSE (1<<1) +#define CONSOLE_COLOR_BOLD (1<<0) +#define CONSOLE_COLOR_FAINT (1<<1) +#define CONSOLE_COLOR_REVERSE (1<<2) /*! \brief Loads the font into the console \param console pointer to the console to update, if NULL it will update the current console diff --git a/libctru/source/console.c b/libctru/source/console.c index 087bce7..24946e1 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -8,22 +8,32 @@ //set up the palette for color printing static u16 colorTable[] = { - RGB565( 0, 0, 0), // normal black - RGB565(17, 0, 0), // normal red - RGB565( 0,34, 0), // normal green - RGB565(17,34, 0), // normal yellow - RGB565( 0, 0,17), // normal blue - RGB565(17, 0,17), // normal magenta - RGB565( 0,34,17), // normal cyan - RGB565(17,34,17), // normal white - RGB565( 0, 0, 0), // bright black - RGB565(25, 0, 0), // bright red - RGB565( 0,52, 0), // bright green - RGB565(25,52, 0), // bright yellow - RGB565( 4,18,31), // bright blue - RGB565(25, 0,25), // bright magenta - RGB565( 0,52,25), // bright cyan - RGB565(28,57,28) // bright white + 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 = @@ -36,7 +46,7 @@ PrintConsole defaultConsole = }, (u16*)NULL, 0,0, //cursorX cursorY - 0,0, //prevcursorX prevcursorY + 0,0, //prevcursorX prevcursorY 40, //console width 30, //console height 0, //window x @@ -46,7 +56,7 @@ PrintConsole defaultConsole = 3, //tab size 7, // foreground color 0, // background color - CONSOLE_COLOR_BRIGHT, // flags + 0, // flags 0, //print callback false //console initialized }; @@ -290,15 +300,18 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { escapeseq += consumed; escapelen -= consumed; - if (parameter == 0 ) { - currentConsole->flags |= CONSOLE_COLOR_BRIGHT; - currentConsole->flags &= ~CONSOLE_COLOR_REVERSE; - currentConsole->bg = 0; - currentConsole->fg = 7; + if (parameter == 0 ) { //reset + currentConsole->flags = 0; + currentConsole->bg = 0; + currentConsole->fg = 7; } else if (parameter == 7) { // reverse video currentConsole->flags |= CONSOLE_COLOR_REVERSE; + } else if (parameter == 1) { // bright + currentConsole->flags |= CONSOLE_COLOR_BOLD; + currentConsole->flags &= ~CONSOLE_COLOR_FAINT; } else if (parameter == 2) { // half bright - currentConsole->flags &= ~CONSOLE_COLOR_BRIGHT; + currentConsole->flags &= ~CONSOLE_COLOR_BOLD; + currentConsole->flags |= CONSOLE_COLOR_FAINT; } else if (parameter >= 30 && parameter <= 37) { // writing color currentConsole->fg = parameter - 30; } else if (parameter >= 40 && parameter <= 47) { // screen color @@ -437,9 +450,10 @@ void consoleDrawChar(int c) { int writingColor = currentConsole->fg; int screenColor = currentConsole->bg; - if (currentConsole->flags & CONSOLE_COLOR_BRIGHT) { - writingColor |= 8; - screenColor |=8; + if (currentConsole->flags & CONSOLE_COLOR_BOLD) { + writingColor += 8; + } else if (currentConsole->flags & CONSOLE_COLOR_FAINT) { + writingColor += 16; } if (currentConsole->flags & CONSOLE_COLOR_REVERSE) { From 49200b8b9694516273bc401e4d7dbd4a9b5893c9 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 02:24:24 +0000 Subject: [PATCH 14/61] use switch for 'm' parameters --- libctru/source/console.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index 24946e1..081473e 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -300,22 +300,43 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { escapeseq += consumed; escapelen -= consumed; - if (parameter == 0 ) { //reset + switch (parameter) { + + case 0: // reset currentConsole->flags = 0; currentConsole->bg = 0; currentConsole->fg = 7; - } else if (parameter == 7) { // reverse video - currentConsole->flags |= CONSOLE_COLOR_REVERSE; - } else if (parameter == 1) { // bright - currentConsole->flags |= CONSOLE_COLOR_BOLD; + break; + + case 1: // bold currentConsole->flags &= ~CONSOLE_COLOR_FAINT; - } else if (parameter == 2) { // half bright + currentConsole->flags |= CONSOLE_COLOR_BOLD; + break; + + case 2: // faint currentConsole->flags &= ~CONSOLE_COLOR_BOLD; currentConsole->flags |= CONSOLE_COLOR_FAINT; - } else if (parameter >= 30 && parameter <= 37) { // writing color + break; + + case 7: // reverse video + currentConsole->flags |= CONSOLE_COLOR_REVERSE; + break; + + case 30 ... 37: // writing color currentConsole->fg = parameter - 30; - } else if (parameter >= 40 && parameter <= 47) { // screen color + 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); From e8df59be59e7e8b7964f96fea645a20e246d6a9f Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 02:32:21 +0000 Subject: [PATCH 15/61] check parameters are valid as we parse --- libctru/source/console.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index 081473e..a6e4ce2 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -207,14 +207,19 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { if ( chr == 0x1b && *tmp == '[' ) { bool escaping = true; - char *escapeseq = tmp; - int escapelen = 0; + 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 From 28ef35f4a627cfc5309cdfcd51f8eabf8982765b Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 02:40:25 +0000 Subject: [PATCH 16/61] intialise parameter, ignore unsupported escapes --- libctru/source/console.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index a6e4ce2..9dd3dfd 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -296,7 +296,10 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { } do { - if (strchr(escapeseq,';')) { + parameter = 0; + if (escapelen == 1) { + consumed = 1; + } else if (strchr(escapeseq,';')) { sscanf(escapeseq,"%d;%n", ¶meter, &consumed); } else { sscanf(escapeseq,"%dm%n", ¶meter, &consumed); @@ -347,6 +350,11 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { escaping = false; break; + + default: + // some sort of unsupported escape; just gloss over it + escaping = false; + break; } } while (escaping); continue; From 2de946890dd3055d26d3f0d8a32c977467feadd8 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 02:51:57 +0000 Subject: [PATCH 17/61] support more codes --- libctru/include/3ds/console.h | 8 ++++- libctru/source/console.c | 60 +++++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/libctru/include/3ds/console.h b/libctru/include/3ds/console.h index fd65284..95b39a1 100644 --- a/libctru/include/3ds/console.h +++ b/libctru/include/3ds/console.h @@ -94,7 +94,13 @@ typedef struct PrintConsole #define CONSOLE_COLOR_BOLD (1<<0) #define CONSOLE_COLOR_FAINT (1<<1) -#define CONSOLE_COLOR_REVERSE (1<<2) +#define CONSOLE_ITALIC (1<<2) +#define CONSOLE_UNDERLINE (1<<3) +#define CONSOLE_BLINK_SLOW (1<<4) +#define CONSOLE_BLINK_FAST (1<<5) +#define CONSOLE_COLOR_REVERSE (1<<6) +#define CONSOLE_CONCEAL (1<<7) +#define CONSOLE_CROSSED_OUT (1<<8) /*! \brief Loads the font into the console \param console pointer to the console to update, if NULL it will update the current console diff --git a/libctru/source/console.c b/libctru/source/console.c index 9dd3dfd..a00e765 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -326,8 +326,64 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { currentConsole->flags |= CONSOLE_COLOR_FAINT; break; - case 7: // reverse video - currentConsole->flags |= CONSOLE_COLOR_REVERSE; + 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 From 94591dc5f7fe2bdeb987e9ef8985dc37a3624594 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 02:58:07 +0000 Subject: [PATCH 18/61] better parameter checking --- libctru/source/console.c | 98 +++++++++++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 26 deletions(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index a00e765..f54213e 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -225,24 +225,35 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { // Cursor directional movement //--------------------------------------- case 'A': - assigned = sscanf(escapeseq,"[%dA", ¶meter); + consumed = 0; + assigned = sscanf(escapeseq,"[%dA%n", ¶meter, &consumed); if (assigned==0) parameter = 1; - currentConsole->cursorY = (currentConsole->cursorY - parameter) < 0 ? 0 : currentConsole->cursorY - parameter; + if (consumed) + currentConsole->cursorY = (currentConsole->cursorY - parameter) < 0 ? 0 : currentConsole->cursorY - parameter; escaping = false; break; case 'B': - sscanf(escapeseq,"[%dB", ¶meter); - currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter; + consumed = 0; + assigned = sscanf(escapeseq,"[%dB%n", ¶meter, &consumed); + if (assigned==0) parameter = 1; + if (consumed) + currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter; escaping = false; break; case 'C': - sscanf(escapeseq,"[%dC", ¶meter); - currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter; + consumed = 0; + assigned = sscanf(escapeseq,"[%dC%n", ¶meter, &consumed); + if (assigned==0) parameter = 1; + if (consumed) + currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter; escaping = false; break; case 'D': - sscanf(escapeseq,"[%dD", ¶meter); - currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter; + consumed = 0; + assigned = sscanf(escapeseq,"[%dD%n", ¶meter, &consumed); + if (assigned==0) parameter = 1; + if (consumed) + currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter; escaping = false; break; //--------------------------------------- @@ -250,37 +261,78 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { //--------------------------------------- case 'H': case 'f': - sscanf(escapeseq,"[%d;%df", ¤tConsole->cursorY , ¤tConsole->cursorX ); + { + 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': - consoleCls(escapeseq[escapelen-2]); + if(escapelen <= 3) + consoleCls(escapeseq[escapelen-2]); escaping = false; break; //--------------------------------------- // Line clear //--------------------------------------- case 'K': - consoleClearLine(escapeseq[escapelen-2]); + if(escapelen <= 3) + consoleClearLine(escapeseq[escapelen-2]); escaping = false; break; //--------------------------------------- // Save cursor position //--------------------------------------- case 's': - currentConsole->prevCursorX = currentConsole->cursorX ; - currentConsole->prevCursorY = currentConsole->cursorY ; + if(escapelen == 2) { + currentConsole->prevCursorX = currentConsole->cursorX ; + currentConsole->prevCursorY = currentConsole->cursorY ; + } escaping = false; break; //--------------------------------------- // Load cursor position //--------------------------------------- case 'u': - currentConsole->cursorX = currentConsole->prevCursorX ; - currentConsole->cursorY = currentConsole->prevCursorY ; + if(escapelen == 2) { + currentConsole->cursorX = currentConsole->prevCursorX ; + currentConsole->cursorY = currentConsole->prevCursorY ; + } escaping = false; break; //--------------------------------------- @@ -290,11 +342,6 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { escapeseq++; escapelen--; - if (escapelen == 1) { - escaping = false; - break; - } - do { parameter = 0; if (escapelen == 1) { @@ -308,8 +355,7 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { escapeseq += consumed; escapelen -= consumed; - switch (parameter) { - + switch(parameter) { case 0: // reset currentConsole->flags = 0; currentConsole->bg = 0; @@ -344,10 +390,10 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) { currentConsole->flags |= CONSOLE_BLINK_FAST; break; - case 7: // reverse video - currentConsole->flags |= CONSOLE_COLOR_REVERSE; - break; - + case 7: // reverse video + currentConsole->flags |= CONSOLE_COLOR_REVERSE; + break; + case 8: // conceal currentConsole->flags |= CONSOLE_CONCEAL; break; From 5c64201fa52898d2e4366fe3377f9cef46ee273c Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 03:07:00 +0000 Subject: [PATCH 19/61] unneeded default case --- libctru/source/console.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index f54213e..7efb987 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -169,18 +169,6 @@ static void consoleClearLine(char mode) { currentConsole->cursorX = colTemp; - break; - } - default: - { - colTemp = currentConsole->cursorX ; - - while(i++ < (currentConsole->windowWidth - colTemp)) { - consolePrintChar(' '); - } - - currentConsole->cursorX = colTemp; - break; } } From b05f5748899a0682f2792116da87930437764245 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 03:07:41 +0000 Subject: [PATCH 20/61] fix formatting --- libctru/source/console.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index 7efb987..5020860 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -45,19 +45,19 @@ PrintConsole defaultConsole = 128 //number of characters in the font set }, (u16*)NULL, - 0,0, //cursorX cursorY + 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 + 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 + 0, //print callback false //console initialized }; From 7bcd9b22704a399b392bcd992daf440544094760 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 03:11:21 +0000 Subject: [PATCH 21/61] make it build --- libctru/source/console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libctru/source/console.c b/libctru/source/console.c index 5020860..042a95f 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -48,7 +48,7 @@ PrintConsole defaultConsole = 0,0, //cursorX cursorY 0,0, //prevcursorX prevcursorY 40, //console width - 30 //console height + 30, //console height 0, //window x 0, //window y 40, //window width From 478d11f46840f1e546487e9fe1f1c0db91738920 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 03:19:57 +0000 Subject: [PATCH 22/61] render strikethrough & underline --- libctru/source/console.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libctru/source/console.c b/libctru/source/console.c index 042a95f..ffd5d49 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -598,6 +598,10 @@ void consoleDrawChar(int c) { u8 b7 = *(fontdata++); u8 b8 = *(fontdata++); + if (currentConsole->flags & CONSOLE_UNDERLINE) b8 = 0xff; + + if (currentConsole->flags & CONSOLE_CROSSED_OUT) b4 = 0xff; + u8 mask = 0x80; From 9849deca010e1249f2996e1e4017615d12f2aebf Mon Sep 17 00:00:00 2001 From: Aurelio Mannara Date: Sat, 13 Dec 2014 13:10:54 +0100 Subject: [PATCH 23/61] Added 2 hid functions -Added HIDUSER_GetGyroscopeRawToDpsCoefficient(float *coeff) -Added HIDUSER_GetSoundVolume(u8 *volume) --- libctru/include/3ds/services/hid.h | 3 ++- libctru/source/services/hid.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/libctru/include/3ds/services/hid.h b/libctru/include/3ds/services/hid.h index 4ba6aa7..87a99cf 100644 --- a/libctru/include/3ds/services/hid.h +++ b/libctru/include/3ds/services/hid.h @@ -102,4 +102,5 @@ Result HIDUSER_EnableAccelerometer(); Result HIDUSER_DisableAccelerometer(); Result HIDUSER_EnableGyroscope(); Result HIDUSER_DisableGyroscope(); - +Result HIDUSER_GetGyroscopeRawToDpsCoefficient(float *coeff); +Result HIDUSER_GetSoundVolume(u8 *volume); //Return the volume slider value (0-63) diff --git a/libctru/source/services/hid.c b/libctru/source/services/hid.c index d48f30c..2379151 100644 --- a/libctru/source/services/hid.c +++ b/libctru/source/services/hid.c @@ -245,3 +245,28 @@ Result HIDUSER_DisableGyroscope() return cmdbuf[1]; } +Result HIDUSER_GetGyroscopeRawToDpsCoefficient(float *coeff) +{ + u32* cmdbuf=getThreadCommandBuffer(); + cmdbuf[0]=0x150000; //request header code + + Result ret=0; + if((ret=svcSendSyncRequest(hidHandle)))return ret; + + *coeff = (float)cmdbuf[2]; + + return cmdbuf[1]; +} + +Result HIDUSER_GetSoundVolume(u8 *volume) +{ + u32* cmdbuf=getThreadCommandBuffer(); + cmdbuf[0]=0x170000; //request header code + + Result ret=0; + if((ret=svcSendSyncRequest(hidHandle)))return ret; + + *volume = (u8)cmdbuf[2]; + + return cmdbuf[1]; +} From ab3b08139854fd1d0e3a8b1aac889ed6b2423ecc Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 14:03:12 +0000 Subject: [PATCH 24/61] allow redirecting stderr to 3dmoo --- libctru/include/3ds/console.h | 13 +++++++++++ libctru/source/console.c | 44 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/libctru/include/3ds/console.h b/libctru/include/3ds/console.h index 95b39a1..48c7224 100644 --- a/libctru/include/3ds/console.h +++ b/libctru/include/3ds/console.h @@ -102,6 +102,13 @@ typedef struct PrintConsole #define CONSOLE_CONCEAL (1<<7) #define CONSOLE_CROSSED_OUT (1<<8) +//! 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 @@ -136,6 +143,12 @@ PrintConsole *consoleSelect(PrintConsole* 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); diff --git a/libctru/source/console.c b/libctru/source/console.c index ffd5d49..c6469f2 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -3,6 +3,7 @@ #include #include <3ds/gfx.h> #include <3ds/console.h> +#include <3ds/svc.h> #include "default_font_bin.h" @@ -467,6 +468,25 @@ static const devoptab_t dotab_stdout = { 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, @@ -519,6 +539,30 @@ PrintConsole* consoleInit(gfxScreen_t screen, PrintConsole* console) { 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){ //--------------------------------------------------------------------------------- From ee0a97f3ced26cd6aea6b2f10eae2937ad03b3b3 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 16:20:54 +0000 Subject: [PATCH 25/61] fix PM_LaunchFIRMSetParams and PM_LaunchTitle prototypes --- libctru/include/3ds/services/pm.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libctru/include/3ds/services/pm.h b/libctru/include/3ds/services/pm.h index cb5c948..27b827a 100644 --- a/libctru/include/3ds/services/pm.h +++ b/libctru/include/3ds/services/pm.h @@ -14,7 +14,7 @@ About: Launches a title titleid TitleId of title to launch launch_flags use if you know of any */ -Result PM_LaunchTitle(u8 mediatype, u64 titleid); +Result PM_LaunchTitle(u8 mediatype, u64 titleid, u32 launch_flags); /* PM_GetTitleExheaderFlags() About: Writes to a buffer the launch flags (8 bytes) from a title exheader. @@ -28,7 +28,7 @@ Result PM_GetTitleExheaderFlags(u8 mediatype, u64 titleid, u8* out); /* PM_SetFIRMLaunchParams() About: Sets the FIRM launch params from in - size size of FIRM launch params + size size of FIRM launch params in ptr to location of FIRM launch params */ Result PM_SetFIRMLaunchParams(u32 size, u8* in); @@ -36,7 +36,7 @@ Result PM_SetFIRMLaunchParams(u32 size, u8* in); /* PM_GetFIRMLaunchParams() About: Sets the FIRM launch params from in - size size of buffer to store FIRM launch params + size size of buffer to store FIRM launch params out ptr to location to write FIRM launch params */ Result PM_GetFIRMLaunchParams(u32 size, u8* out); @@ -45,7 +45,7 @@ Result PM_GetFIRMLaunchParams(u32 size, u8* out); About: Same as PM_SetFIRMLaunchParams(), but also triggers a FIRM launch firm_titleid_low TitleID low of firm title to launch - size size of FIRM launch params + size size of FIRM launch params in ptr to location of FIRM launch params */ -Result PM_LaunchFIRMSetParams(u64 firm_titleid_low, u32 size, u8* in); \ No newline at end of file +Result PM_LaunchFIRMSetParams(u32 firm_titleid_low, u32 size, u8* in); From c76ea75ae2c01cbf3243a21143927618c9d02b6b Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sat, 13 Dec 2014 16:36:54 +0000 Subject: [PATCH 26/61] stop building everything when any header changes --- libctru/source/allocator/linear.cpp | 2 +- libctru/source/allocator/mem_pool.h | 2 +- libctru/source/gfx.c | 5 +++- libctru/source/gpu/gpu.c | 5 +++- libctru/source/gpu/shdr.c | 5 ++-- libctru/source/initSystem.c | 3 ++- libctru/source/os.c | 5 +++- libctru/source/sdmc_dev.c | 6 ++++- libctru/source/services/ac.c | 5 +++- libctru/source/services/am.c | 5 +++- libctru/source/services/apt.c | 7 ++++- libctru/source/services/cfgnor.c | 5 +++- libctru/source/services/cfgu.c | 5 +++- libctru/source/services/csnd.c | 6 ++++- libctru/source/services/fs.c | 5 +++- libctru/source/services/gsp.c | 5 +++- libctru/source/services/gx.c | 6 ++++- libctru/source/services/hid.c | 7 ++++- libctru/source/services/httpc.c | 5 +++- libctru/source/services/ir.c | 5 +++- libctru/source/services/irrst.c | 5 +++- libctru/source/services/mic.c | 5 +++- libctru/source/services/mvd.c | 7 ++++- libctru/source/services/ns.c | 5 +++- libctru/source/services/pm.c | 5 +++- libctru/source/services/ps.c | 33 +++++++++++++----------- libctru/source/services/ptm.c | 6 ++++- libctru/source/services/soc/soc_common.h | 5 +++- libctru/source/srv.c | 4 ++- 29 files changed, 130 insertions(+), 44 deletions(-) diff --git a/libctru/source/allocator/linear.cpp b/libctru/source/allocator/linear.cpp index b0a4b27..b160e7f 100644 --- a/libctru/source/allocator/linear.cpp +++ b/libctru/source/allocator/linear.cpp @@ -1,4 +1,4 @@ -#include <3ds.h> +#include <3ds/types.h> #include <3ds/util/rbtree.h> #include "mem_pool.h" diff --git a/libctru/source/allocator/mem_pool.h b/libctru/source/allocator/mem_pool.h index 97ca60b..87013e6 100644 --- a/libctru/source/allocator/mem_pool.h +++ b/libctru/source/allocator/mem_pool.h @@ -1,5 +1,5 @@ #pragma once -#include <3ds.h> +#include <3ds/types.h> #include struct MemChunk diff --git a/libctru/source/gfx.c b/libctru/source/gfx.c index 578cc32..6f9b94f 100644 --- a/libctru/source/gfx.c +++ b/libctru/source/gfx.c @@ -1,7 +1,10 @@ #include #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/gfx.h> +#include <3ds/svc.h> +#include <3ds/linear.h> GSP_FramebufferInfo topFramebufferInfo, bottomFramebufferInfo; diff --git a/libctru/source/gpu/gpu.c b/libctru/source/gpu/gpu.c index 97d14db..ccde474 100644 --- a/libctru/source/gpu/gpu.c +++ b/libctru/source/gpu/gpu.c @@ -4,7 +4,10 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/gpu/gpu.h> +#include <3ds/gpu/gx.h> +#include <3ds/gpu/shdr.h> u32* gpuCmdBuf; u32 gpuCmdBufSize; diff --git a/libctru/source/gpu/shdr.c b/libctru/source/gpu/shdr.c index a9d2de5..47ac389 100644 --- a/libctru/source/gpu/shdr.c +++ b/libctru/source/gpu/shdr.c @@ -4,8 +4,9 @@ #include #include -#include <3ds.h> - +#include <3ds/types.h> +#include <3ds/gpu/gpu.h> +#include <3ds/gpu/shdr.h> //please don't feed this an invalid SHBIN DVLB_s* SHDR_ParseSHBIN(u32* shbinData, u32 shbinSize) diff --git a/libctru/source/initSystem.c b/libctru/source/initSystem.c index 039f862..7d6c222 100644 --- a/libctru/source/initSystem.c +++ b/libctru/source/initSystem.c @@ -1,6 +1,7 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> // System globals we define here int __system_argc; diff --git a/libctru/source/os.c b/libctru/source/os.c index e2677ed..f622105 100644 --- a/libctru/source/os.c +++ b/libctru/source/os.c @@ -1,4 +1,7 @@ -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/os.h> +#include <3ds/svc.h> + #define TICKS_PER_MSEC 268123.480 diff --git a/libctru/source/sdmc_dev.c b/libctru/source/sdmc_dev.c index 1450574..27efc49 100644 --- a/libctru/source/sdmc_dev.c +++ b/libctru/source/sdmc_dev.c @@ -6,7 +6,11 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/sdmc.h> +#include <3ds/services/fs.h> + + /*! @internal * diff --git a/libctru/source/services/ac.c b/libctru/source/services/ac.c index 9e957c3..3579a21 100644 --- a/libctru/source/services/ac.c +++ b/libctru/source/services/ac.c @@ -1,5 +1,8 @@ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/ac.h> static Handle acHandle; diff --git a/libctru/source/services/am.c b/libctru/source/services/am.c index dc16ba9..4105e89 100644 --- a/libctru/source/services/am.c +++ b/libctru/source/services/am.c @@ -1,5 +1,8 @@ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/am.h> static Handle amHandle = 0; diff --git a/libctru/source/services/apt.c b/libctru/source/services/apt.c index 242abc1..c6ea5f0 100644 --- a/libctru/source/services/apt.c +++ b/libctru/source/services/apt.c @@ -4,7 +4,12 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/apt.h> +#include <3ds/services/gsp.h> + #define APT_HANDLER_STACKSIZE (0x1000) diff --git a/libctru/source/services/cfgnor.c b/libctru/source/services/cfgnor.c index 2041b99..e467655 100644 --- a/libctru/source/services/cfgnor.c +++ b/libctru/source/services/cfgnor.c @@ -1,5 +1,8 @@ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/cfgnor.h> Handle CFGNOR_handle = 0; diff --git a/libctru/source/services/cfgu.c b/libctru/source/services/cfgu.c index 14ac5c4..c28a6cc 100644 --- a/libctru/source/services/cfgu.c +++ b/libctru/source/services/cfgu.c @@ -1,5 +1,8 @@ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/cfgu.h> static Handle CFGU_handle = 0; diff --git a/libctru/source/services/csnd.c b/libctru/source/services/csnd.c index 77b1686..52f95ec 100644 --- a/libctru/source/services/csnd.c +++ b/libctru/source/services/csnd.c @@ -1,6 +1,10 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/os.h> +#include <3ds/services/csnd.h> //See here regarding CSND shared-mem commands, etc: http://3dbrew.org/wiki/CSND_Shared_Memory diff --git a/libctru/source/services/fs.c b/libctru/source/services/fs.c index 6c75a51..cec30d1 100644 --- a/libctru/source/services/fs.c +++ b/libctru/source/services/fs.c @@ -1,5 +1,8 @@ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/fs.h> /*! @internal * diff --git a/libctru/source/services/gsp.c b/libctru/source/services/gsp.c index 7240fbc..9a88c3a 100644 --- a/libctru/source/services/gsp.c +++ b/libctru/source/services/gsp.c @@ -4,7 +4,10 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/gsp.h> #define GSP_EVENT_STACK_SIZE 0x1000 diff --git a/libctru/source/services/gx.c b/libctru/source/services/gx.c index 3e79fa0..4257710 100644 --- a/libctru/source/services/gx.c +++ b/libctru/source/services/gx.c @@ -3,7 +3,11 @@ */ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/gpu/gx.h> +#include <3ds/services/gsp.h> u32* gxCmdBuf; diff --git a/libctru/source/services/hid.c b/libctru/source/services/hid.c index d48f30c..384daad 100644 --- a/libctru/source/services/hid.c +++ b/libctru/source/services/hid.c @@ -3,7 +3,12 @@ */ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/apt.h> +#include <3ds/services/hid.h> +#include <3ds/services/irrst.h> Handle hidHandle; Handle hidMemHandle; diff --git a/libctru/source/services/httpc.c b/libctru/source/services/httpc.c index 00cb8a7..e299b8d 100644 --- a/libctru/source/services/httpc.c +++ b/libctru/source/services/httpc.c @@ -1,5 +1,8 @@ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/httpc.h> Handle __httpc_servhandle = 0; diff --git a/libctru/source/services/ir.c b/libctru/source/services/ir.c index 22ec39a..874319b 100644 --- a/libctru/source/services/ir.c +++ b/libctru/source/services/ir.c @@ -1,6 +1,9 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/ir.h> static Handle iru_handle=0; static Handle iru_sharedmem_handle=0; diff --git a/libctru/source/services/irrst.c b/libctru/source/services/irrst.c index c7a54ff..1536640 100644 --- a/libctru/source/services/irrst.c +++ b/libctru/source/services/irrst.c @@ -3,7 +3,10 @@ */ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/irrst.h> Handle irrstHandle; Handle irrstMemHandle; diff --git a/libctru/source/services/mic.c b/libctru/source/services/mic.c index 463f94d..da30a8d 100644 --- a/libctru/source/services/mic.c +++ b/libctru/source/services/mic.c @@ -1,6 +1,9 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/mic.h> //See also: http://3dbrew.org/wiki/MIC_Services diff --git a/libctru/source/services/mvd.c b/libctru/source/services/mvd.c index ac3190f..89fd732 100644 --- a/libctru/source/services/mvd.c +++ b/libctru/source/services/mvd.c @@ -4,7 +4,12 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/os.h> +#include <3ds/linear.h> +#include <3ds/services/mvd.h> Handle mvdstdHandle; static u32 mvdstdInitialized = 0; diff --git a/libctru/source/services/ns.c b/libctru/source/services/ns.c index ffd7294..7b36552 100644 --- a/libctru/source/services/ns.c +++ b/libctru/source/services/ns.c @@ -1,5 +1,8 @@ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/ns.h> static Handle nsHandle; diff --git a/libctru/source/services/pm.c b/libctru/source/services/pm.c index 6c74ed2..7a5fdfd 100644 --- a/libctru/source/services/pm.c +++ b/libctru/source/services/pm.c @@ -1,6 +1,9 @@ #include #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/pm.h> static Handle pmHandle; diff --git a/libctru/source/services/ps.c b/libctru/source/services/ps.c index 6ea4fb2..f850954 100644 --- a/libctru/source/services/ps.c +++ b/libctru/source/services/ps.c @@ -1,11 +1,14 @@ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/ps.h> static Handle psHandle; Result psInit() { - return srvGetServiceHandle(&psHandle, "ps:ps"); + return srvGetServiceHandle(&psHandle, "ps:ps"); } Result psExit() @@ -17,7 +20,7 @@ Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, u32 aes_algo, u32 key_typ { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); - + u32 *_iv = (u32*)iv; cmdbuf[0] = 0x000401C4; @@ -32,14 +35,14 @@ Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, u32 aes_algo, u32 key_typ cmdbuf[9] = (u32)in; cmdbuf[10] = (size << 0x8) | 0x14; cmdbuf[11] = (u32)out; - + if((ret = svcSendSyncRequest(psHandle))!=0)return ret; _iv[0] = cmdbuf[2]; _iv[1] = cmdbuf[3]; _iv[2] = cmdbuf[4]; _iv[3] = cmdbuf[5]; - + return (Result)cmdbuf[1]; } @@ -47,7 +50,7 @@ Result PS_EncryptSignDecryptVerifyAesCcm(u8* in, u32 in_size, u8* out, u32 out_s { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); - + u32 *_nonce = (u32*)nonce; cmdbuf[0] = 0x00050284; @@ -65,9 +68,9 @@ Result PS_EncryptSignDecryptVerifyAesCcm(u8* in, u32 in_size, u8* out, u32 out_s cmdbuf[9] = (u32)in; cmdbuf[10] = (out_size << 0x8) | 0x14; cmdbuf[11] = (u32)out; - + if((ret = svcSendSyncRequest(psHandle))!=0)return ret; - + return (Result)cmdbuf[1]; } @@ -75,13 +78,13 @@ Result PS_GetLocalFriendCodeSeed(u64* seed) { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); - + cmdbuf[0] = 0x000A0000; - + if((ret = svcSendSyncRequest(psHandle))!=0)return ret; *seed = (u64)cmdbuf[2] | (u64)cmdbuf[3] << 32; - + return (Result)cmdbuf[1]; } @@ -89,12 +92,12 @@ Result PS_GetDeviceId(u32* device_id) { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer(); - + cmdbuf[0] = 0x000B0000; - + if((ret = svcSendSyncRequest(psHandle))!=0)return ret; *device_id = cmdbuf[2]; - + return (Result)cmdbuf[1]; -} \ No newline at end of file +} diff --git a/libctru/source/services/ptm.c b/libctru/source/services/ptm.c index e9abfb6..1c30206 100644 --- a/libctru/source/services/ptm.c +++ b/libctru/source/services/ptm.c @@ -1,5 +1,9 @@ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/ptm.h> + static Handle ptmHandle; diff --git a/libctru/source/services/soc/soc_common.h b/libctru/source/services/soc/soc_common.h index f5cfe96..5cf5dee 100644 --- a/libctru/source/services/soc/soc_common.h +++ b/libctru/source/services/soc/soc_common.h @@ -1,7 +1,10 @@ #pragma once #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/soc.h> extern Handle SOCU_handle; extern int SOCU_errno; diff --git a/libctru/source/srv.c b/libctru/source/srv.c index ad6e510..8f9d524 100644 --- a/libctru/source/srv.c +++ b/libctru/source/srv.c @@ -3,7 +3,9 @@ */ #include -#include <3ds.h> +#include <3ds/types.h> +#include <3ds/srv.h> +#include <3ds/svc.h> /* From 60d7d571e6dc0e80e53c35fb61d3594ffc1a6cff Mon Sep 17 00:00:00 2001 From: fincs Date: Sat, 13 Dec 2014 20:05:48 +0100 Subject: [PATCH 27/61] Fix linear.cpp --- libctru/source/allocator/linear.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libctru/source/allocator/linear.cpp b/libctru/source/allocator/linear.cpp index b160e7f..0d7819b 100644 --- a/libctru/source/allocator/linear.cpp +++ b/libctru/source/allocator/linear.cpp @@ -1,5 +1,9 @@ -#include <3ds/types.h> -#include <3ds/util/rbtree.h> +extern "C" +{ + #include <3ds/types.h> + #include <3ds/linear.h> + #include <3ds/util/rbtree.h> +} #include "mem_pool.h" From e99b0def409c7ff2dd7db3968535675573528263 Mon Sep 17 00:00:00 2001 From: profi200 Date: Sun, 14 Dec 2014 00:21:29 +0100 Subject: [PATCH 28/61] Fixed weird blackscreen issue --- libctru/source/gfx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libctru/source/gfx.c b/libctru/source/gfx.c index 6f9b94f..9b499ef 100644 --- a/libctru/source/gfx.c +++ b/libctru/source/gfx.c @@ -96,7 +96,6 @@ void gfxInit() gfxSharedMemory=(u8*)0x10002000; GSPGPU_AcquireRight(NULL, 0x0); - GSPGPU_SetLcdForceBlack(NULL, 0x0); //setup our gsp shared mem section svcCreateEvent(&gspEvent, 0x0); @@ -133,6 +132,8 @@ void gfxInit() // Initialize event handler and wait for VBlank gspInitEventHandler(gspEvent, (vu8*)gfxSharedMemory, gfxThreadID); gspWaitForVBlank(); + + GSPGPU_SetLcdForceBlack(NULL, 0x0); } void gfxExit() From 55a7f4bd2591c11ddbb8a5bd033d580116be2f44 Mon Sep 17 00:00:00 2001 From: Aurelio Mannara Date: Sun, 14 Dec 2014 17:29:29 +0100 Subject: [PATCH 29/61] Added an Hello World example --- .../Graphics/Printing/HelloWorld/Makefile | 170 ++++++++++++++++++ .../Printing/HelloWorld/source/main.cpp | 63 +++++++ 2 files changed, 233 insertions(+) create mode 100755 examples/Graphics/Printing/HelloWorld/Makefile create mode 100644 examples/Graphics/Printing/HelloWorld/source/main.cpp diff --git a/examples/Graphics/Printing/HelloWorld/Makefile b/examples/Graphics/Printing/HelloWorld/Makefile new file mode 100755 index 0000000..c4c758e --- /dev/null +++ b/examples/Graphics/Printing/HelloWorld/Makefile @@ -0,0 +1,170 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITARM)/3ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# +# NO_SMDH: if set to anything, no SMDH file is generated. +# APP_TITLE is the name of the app stored in the SMDH file (Optional) +# APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional) +# APP_AUTHOR is the author of the app stored in the SMDH file (Optional) +# ICON is the filename of the icon (.png), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .png +# - icon.png +# - /default_icon.png +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=softfp + +CFLAGS := -g -Wall -O2 -mword-relocations \ + -fomit-frame-pointer -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM11 -D_3DS + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lctru -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.png) + ifneq (,$(findstring $(TARGET).png,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).png + else + ifneq (,$(findstring icon.png,$(icons))) + export APP_ICON := $(TOPDIR)/icon.png + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +ifeq ($(strip $(NO_SMDH)),) +.PHONY: all +all : $(OUTPUT).3dsx $(OUTPUT).smdh +endif +$(OUTPUT).3dsx : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +# WARNING: This is not the right way to do this! TODO: Do it right! +#--------------------------------------------------------------------------------- +%.vsh.o : %.vsh +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @python $(AEMSTRO)/aemstro_as.py $< ../$(notdir $<).shbin + @bin2s ../$(notdir $<).shbin | $(PREFIX)as -o $@ + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u32" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(notdir $<).shbin | tr . _)`.h + @rm ../$(notdir $<).shbin + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/examples/Graphics/Printing/HelloWorld/source/main.cpp b/examples/Graphics/Printing/HelloWorld/source/main.cpp new file mode 100644 index 0000000..a954290 --- /dev/null +++ b/examples/Graphics/Printing/HelloWorld/source/main.cpp @@ -0,0 +1,63 @@ +/* + Hello World example made by Aurelio Mannara for ctrulib + This code was modified for the last time on: 12/12/2014 21:00 UTC+1 + + This wouldn't be possible without the amazing work done by: + -Smealum + -fincs + -WinterMute + -yellows8 + -plutoo + -mtheall + -Many others who worked on 3DS and I'm surely forgetting about +*/ + +#include <3ds.h> +#include + +int main(int argc, char **argv) +{ + // Initialize services + srvInit(); + aptInit(); + gfxInit(); + hidInit(NULL); + + //Initialize console on top screen. Using NULL as the second argument tells the console library to use the internal console structure as current one + consoleInit(GFX_TOP, NULL); + + //Move the cursor to row 15 and column 19 and then prints "Hello World!" + //To move the cursor you have tu print "\x1b[r;cH", where r and c are respectively + //the row and column where you want your cursor to move + //The top screen has 30 rows and 50 columns + //The bottom screen has 30 rows and 40 columns + printf("\x1b[15;19HHello World!"); + + printf("\x1b[29;15HPress Start to exit."); + + // Main loop + while (aptMainLoop()) + { + //Scan all the inputs. This should be done once for each frame + hidScanInput(); + + //hidKeysDown returns information about which buttons have been just pressed (and they weren't in the previous frame) + u32 kDown = hidKeysDown(); + + if (kDown & KEY_START) break; // break in order to return to hbmenu + + // Flush and swap framebuffers + gfxFlushBuffers(); + gfxSwapBuffers(); + + //Wait for VBlank + gspWaitForVBlank(); + } + + // Exit services + gfxExit(); + hidExit(); + aptExit(); + srvExit(); + return 0; +} From 99186f42589f438cacc36b1e528702d8602e94ae Mon Sep 17 00:00:00 2001 From: fincs Date: Sun, 14 Dec 2014 17:47:34 +0100 Subject: [PATCH 30/61] Add a VRAM allocator --- libctru/include/3ds.h | 1 + libctru/include/3ds/vram.h | 8 +++ libctru/source/allocator/addrmap.h | 48 ++++++++++++++++ libctru/source/allocator/linear.cpp | 47 +--------------- libctru/source/allocator/vram.cpp | 86 +++++++++++++++++++++++++++++ 5 files changed, 144 insertions(+), 46 deletions(-) create mode 100644 libctru/include/3ds/vram.h create mode 100644 libctru/source/allocator/addrmap.h create mode 100644 libctru/source/allocator/vram.cpp diff --git a/libctru/include/3ds.h b/libctru/include/3ds.h index d128d25..7373406 100644 --- a/libctru/include/3ds.h +++ b/libctru/include/3ds.h @@ -9,6 +9,7 @@ extern "C" { #include <3ds/svc.h> #include <3ds/srv.h> #include <3ds/linear.h> +#include <3ds/vram.h> #include <3ds/os.h> #include <3ds/gfx.h> #include <3ds/console.h> diff --git a/libctru/include/3ds/vram.h b/libctru/include/3ds/vram.h new file mode 100644 index 0000000..9743410 --- /dev/null +++ b/libctru/include/3ds/vram.h @@ -0,0 +1,8 @@ +#pragma once + +// Functions for allocating/deallocating VRAM +void* vramAlloc(size_t size); // returns a 16-byte aligned address +void* vramMemAlign(size_t size, size_t alignment); +void* vramRealloc(void* mem, size_t size); // not implemented yet +void vramFree(void* mem); +u32 vramSpaceFree(); // get free VRAM space in bytes diff --git a/libctru/source/allocator/addrmap.h b/libctru/source/allocator/addrmap.h new file mode 100644 index 0000000..11e8183 --- /dev/null +++ b/libctru/source/allocator/addrmap.h @@ -0,0 +1,48 @@ +#pragma once + +static rbtree_t sAddrMap; + +struct addrMapNode +{ + rbtree_node node; + MemChunk chunk; +}; + +#define getAddrMapNode(x) rbtree_item((x), addrMapNode, node) + +static int addrMapNodeComparator(const rbtree_node_t* _lhs, const rbtree_node_t* _rhs) +{ + auto lhs = getAddrMapNode(_lhs)->chunk.addr; + auto rhs = getAddrMapNode(_rhs)->chunk.addr; + if (lhs < rhs) + return -1; + if (lhs > rhs) + return 1; + return 0; +} + +static void addrMapNodeDestructor(rbtree_node_t* a) +{ + free(getAddrMapNode(a)); +} + +static addrMapNode* getNode(void* addr) +{ + addrMapNode n; + n.chunk.addr = (u8*)addr; + auto p = rbtree_find(&sAddrMap, &n.node); + return p ? getAddrMapNode(p) : nullptr; +} + +static addrMapNode* newNode(const MemChunk& chunk) +{ + auto p = (addrMapNode*)malloc(sizeof(addrMapNode)); + if (!p) return nullptr; + p->chunk = chunk; + return p; +} + +static void delNode(addrMapNode* node) +{ + rbtree_remove(&sAddrMap, &node->node, addrMapNodeDestructor); +} diff --git a/libctru/source/allocator/linear.cpp b/libctru/source/allocator/linear.cpp index 0d7819b..0ad052c 100644 --- a/libctru/source/allocator/linear.cpp +++ b/libctru/source/allocator/linear.cpp @@ -6,56 +6,11 @@ extern "C" } #include "mem_pool.h" +#include "addrmap.h" extern u32 __linear_heap, __linear_heap_size; static MemPool sLinearPool; -static rbtree_t sAddrMap; - -struct addrMapNode -{ - rbtree_node node; - MemChunk chunk; -}; - -#define getAddrMapNode(x) rbtree_item((x), addrMapNode, node) - -static int addrMapNodeComparator(const rbtree_node_t* _lhs, const rbtree_node_t* _rhs) -{ - auto lhs = getAddrMapNode(_lhs)->chunk.addr; - auto rhs = getAddrMapNode(_rhs)->chunk.addr; - if (lhs < rhs) - return -1; - if (lhs > rhs) - return 1; - return 0; -} - -static void addrMapNodeDestructor(rbtree_node_t* a) -{ - free(getAddrMapNode(a)); -} - -static addrMapNode* getNode(void* addr) -{ - addrMapNode n; - n.chunk.addr = (u8*)addr; - auto p = rbtree_find(&sAddrMap, &n.node); - return p ? getAddrMapNode(p) : nullptr; -} - -static addrMapNode* newNode(const MemChunk& chunk) -{ - auto p = (addrMapNode*)malloc(sizeof(addrMapNode)); - if (!p) return nullptr; - p->chunk = chunk; - return p; -} - -static void delNode(addrMapNode* node) -{ - rbtree_remove(&sAddrMap, &node->node, addrMapNodeDestructor); -} static bool linearInit() { diff --git a/libctru/source/allocator/vram.cpp b/libctru/source/allocator/vram.cpp new file mode 100644 index 0000000..4918729 --- /dev/null +++ b/libctru/source/allocator/vram.cpp @@ -0,0 +1,86 @@ +extern "C" +{ + #include <3ds/types.h> + #include <3ds/vram.h> + #include <3ds/util/rbtree.h> +} + +#include "mem_pool.h" +#include "addrmap.h" + +static MemPool sVramPool; + +static bool vramInit() +{ + auto blk = MemBlock::Create((u8*)0x1F000000, 0x00600000); + if (blk) + { + sVramPool.AddBlock(blk); + rbtree_init(&sAddrMap, addrMapNodeComparator); + return true; + } + return false; +} + +void* vramMemAlign(size_t size, size_t alignment) +{ + // Enforce minimum alignment + if (alignment < 16) + alignment = 16; + + // Convert alignment to shift amount + int shift; + for (shift = 4; shift < 32; shift ++) + { + if ((1U<node)); + return chunk.addr; +} + +void* vramAlloc(size_t size) +{ + return vramMemAlign(size, 16); +} + +void* vramRealloc(void* mem, size_t size) +{ + // TODO + return NULL; +} + +void vramFree(void* mem) +{ + auto node = getNode(mem); + if (!node) return; + + // Free the chunk + sVramPool.Deallocate(node->chunk); + + // Free the node + delNode(node); +} + +u32 vramSpaceFree() +{ + return sVramPool.GetFreeSpace(); +} From d93524b3930b276b4331511e98da902fe601e9f5 Mon Sep 17 00:00:00 2001 From: mtheall Date: Sun, 14 Dec 2014 14:56:20 -0600 Subject: [PATCH 31/61] Fix inet_aton. --- libctru/source/services/soc/soc_inet_aton.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/libctru/source/services/soc/soc_inet_aton.c b/libctru/source/services/soc/soc_inet_aton.c index 6e1f206..57f2bd4 100644 --- a/libctru/source/services/soc/soc_inet_aton.c +++ b/libctru/source/services/soc/soc_inet_aton.c @@ -54,23 +54,20 @@ int inet_aton(const char *cp, struct in_addr *inp) switch(num_bytes) { case 0: - return 0; - - case 1: break; - case 2: + case 1: if(val > 0xFFFFFF) return 0; val |= bytes[0] << 24; break; - case 3: + case 2: if(val > 0xFFFF) return 0; val |= bytes[0] << 24; val |= bytes[1] << 16; break; - case 4: + case 3: if(val > 0xFF) return 0; val |= bytes[0] << 24; val |= bytes[1] << 16; From 2d22fcd5e530f7ad12aaafc437e4cce85b46ae68 Mon Sep 17 00:00:00 2001 From: plutoo Date: Mon, 15 Dec 2014 01:33:37 +0100 Subject: [PATCH 32/61] Fixed handle leak in httpc --- libctru/source/services/httpc.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libctru/source/services/httpc.c b/libctru/source/services/httpc.c index e299b8d..a9095c3 100644 --- a/libctru/source/services/httpc.c +++ b/libctru/source/services/httpc.c @@ -39,12 +39,18 @@ Result httpcOpenContext(httpcContext *context, char* url, u32 use_defaultproxy) if(ret!=0)return ret; ret = HTTPC_InitializeConnectionSession(context->servhandle, context->httphandle); - if(ret!=0)return ret; + if(ret!=0) { + svcCloseHandle(context->servhandle); + return ret; + } if(use_defaultproxy==0)return 0; ret = HTTPC_SetProxyDefault(context->servhandle, context->httphandle); - if(ret!=0)return ret; + if(ret!=0) { + svcCloseHandle(context->servhandle); + return ret; + } return 0; } @@ -54,7 +60,6 @@ Result httpcCloseContext(httpcContext *context) Result ret=0; ret = HTTPC_CloseContext(context->servhandle, context->httphandle); - svcCloseHandle(context->servhandle); return ret; From a3febb5fe18e4017fa0e1d8601692994a3aaeeca Mon Sep 17 00:00:00 2001 From: plutoo Date: Mon, 15 Dec 2014 01:36:25 +0100 Subject: [PATCH 33/61] Proposed fix for issue #66 --- libctru/source/services/httpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libctru/source/services/httpc.c b/libctru/source/services/httpc.c index a9095c3..9d9ab38 100644 --- a/libctru/source/services/httpc.c +++ b/libctru/source/services/httpc.c @@ -59,7 +59,7 @@ Result httpcCloseContext(httpcContext *context) { Result ret=0; - ret = HTTPC_CloseContext(context->servhandle, context->httphandle); + ret = HTTPC_CloseContext(__httpc_servhandle, context->httphandle); svcCloseHandle(context->servhandle); return ret; From a720cb6e49478390b9a44f7226f87347c05afd77 Mon Sep 17 00:00:00 2001 From: plutoo Date: Mon, 15 Dec 2014 01:43:18 +0100 Subject: [PATCH 34/61] Reverting previous commit, fixing more resource leaks --- libctru/source/services/httpc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libctru/source/services/httpc.c b/libctru/source/services/httpc.c index 9d9ab38..a9f1eb9 100644 --- a/libctru/source/services/httpc.c +++ b/libctru/source/services/httpc.c @@ -36,10 +36,14 @@ Result httpcOpenContext(httpcContext *context, char* url, u32 use_defaultproxy) if(ret!=0)return ret; ret = srvGetServiceHandle(&context->servhandle, "http:C"); - if(ret!=0)return ret; + if(ret!=0) { + HTTPC_CloseContext(__httpc_servhandle, context->httphandle); + return ret; + } ret = HTTPC_InitializeConnectionSession(context->servhandle, context->httphandle); if(ret!=0) { + HTTPC_CloseContext(__httpc_servhandle, context->httphandle); svcCloseHandle(context->servhandle); return ret; } @@ -48,6 +52,7 @@ Result httpcOpenContext(httpcContext *context, char* url, u32 use_defaultproxy) ret = HTTPC_SetProxyDefault(context->servhandle, context->httphandle); if(ret!=0) { + HTTPC_CloseContext(__httpc_servhandle, context->httphandle); svcCloseHandle(context->servhandle); return ret; } @@ -59,7 +64,7 @@ Result httpcCloseContext(httpcContext *context) { Result ret=0; - ret = HTTPC_CloseContext(__httpc_servhandle, context->httphandle); + ret = HTTPC_CloseContext(context->servhandle, context->httphandle); svcCloseHandle(context->servhandle); return ret; From 93dbdfd74ab1e2587adeb7e41071040349643c41 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Mon, 15 Dec 2014 02:40:11 +0000 Subject: [PATCH 35/61] stop svcOutputDebugString trashing string --- libctru/source/svc.s | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libctru/source/svc.s b/libctru/source/svc.s index 4969df8..555eb13 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -100,7 +100,7 @@ svcSignalEvent: svcClearEvent: svc 0x19 bx lr - + .global svcCreateTimer .type svcCreateTimer, %function svcCreateTimer: @@ -109,19 +109,19 @@ svcCreateTimer: ldr r2, [sp], #4 str r1, [r2] bx lr - + .global svcSetTimer .type svcSetTimer, %function svcSetTimer: svc 0x1B bx lr - + .global svcCancelTimer .type svcCancelTimer, %function svcCancelTimer: svc 0x1C bx lr - + .global svcClearTimer .type svcClearTimer, %function svcClearTimer: @@ -259,10 +259,7 @@ svcGetProcessId: .global svcOutputDebugString .type svcOutputDebugString, %function svcOutputDebugString: - str r0, [sp, #-0x4]! svc 0x3D - ldr r2, [sp], #4 - str r1, [r2] bx lr .global svcCreateSemaphore From 9db5f7d9d157fa96b972a1f646dbdb96ed7ede86 Mon Sep 17 00:00:00 2001 From: Aurelio Mannara Date: Mon, 15 Dec 2014 09:23:03 +0100 Subject: [PATCH 36/61] Used *.c extension and lower case dir name --- .../main.cpp => graphics/printing/helloworld/source/main.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{Graphics/Printing/HelloWorld/source/main.cpp => graphics/printing/helloworld/source/main.c} (100%) diff --git a/examples/Graphics/Printing/HelloWorld/source/main.cpp b/examples/graphics/printing/helloworld/source/main.c similarity index 100% rename from examples/Graphics/Printing/HelloWorld/source/main.cpp rename to examples/graphics/printing/helloworld/source/main.c From 6a96abf2cbe0e7a44b54089232b139054a932cee Mon Sep 17 00:00:00 2001 From: Aurelio Mannara Date: Mon, 15 Dec 2014 09:32:48 +0100 Subject: [PATCH 37/61] Used *.c extension and lower case dir name --- .../graphics/printing/hello-world/Makefile | 170 ++++++++++++++++++ .../{helloworld => hello-world}/source/main.c | 0 2 files changed, 170 insertions(+) create mode 100755 examples/graphics/printing/hello-world/Makefile rename examples/graphics/printing/{helloworld => hello-world}/source/main.c (100%) diff --git a/examples/graphics/printing/hello-world/Makefile b/examples/graphics/printing/hello-world/Makefile new file mode 100755 index 0000000..c4c758e --- /dev/null +++ b/examples/graphics/printing/hello-world/Makefile @@ -0,0 +1,170 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITARM)/3ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# +# NO_SMDH: if set to anything, no SMDH file is generated. +# APP_TITLE is the name of the app stored in the SMDH file (Optional) +# APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional) +# APP_AUTHOR is the author of the app stored in the SMDH file (Optional) +# ICON is the filename of the icon (.png), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .png +# - icon.png +# - /default_icon.png +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=softfp + +CFLAGS := -g -Wall -O2 -mword-relocations \ + -fomit-frame-pointer -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM11 -D_3DS + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lctru -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.png) + ifneq (,$(findstring $(TARGET).png,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).png + else + ifneq (,$(findstring icon.png,$(icons))) + export APP_ICON := $(TOPDIR)/icon.png + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +ifeq ($(strip $(NO_SMDH)),) +.PHONY: all +all : $(OUTPUT).3dsx $(OUTPUT).smdh +endif +$(OUTPUT).3dsx : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +# WARNING: This is not the right way to do this! TODO: Do it right! +#--------------------------------------------------------------------------------- +%.vsh.o : %.vsh +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @python $(AEMSTRO)/aemstro_as.py $< ../$(notdir $<).shbin + @bin2s ../$(notdir $<).shbin | $(PREFIX)as -o $@ + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u32" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(notdir $<).shbin | tr . _)`.h + @rm ../$(notdir $<).shbin + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/examples/graphics/printing/helloworld/source/main.c b/examples/graphics/printing/hello-world/source/main.c similarity index 100% rename from examples/graphics/printing/helloworld/source/main.c rename to examples/graphics/printing/hello-world/source/main.c From 27c8da8a1138922d73b4c97cc15c015a3ed020f2 Mon Sep 17 00:00:00 2001 From: Aurelio Mannara Date: Mon, 15 Dec 2014 09:53:39 +0100 Subject: [PATCH 38/61] Fixed a little mess I made with dir-names :D --- .../Graphics/Printing/HelloWorld/Makefile | 170 ------------------ 1 file changed, 170 deletions(-) delete mode 100755 examples/Graphics/Printing/HelloWorld/Makefile diff --git a/examples/Graphics/Printing/HelloWorld/Makefile b/examples/Graphics/Printing/HelloWorld/Makefile deleted file mode 100755 index c4c758e..0000000 --- a/examples/Graphics/Printing/HelloWorld/Makefile +++ /dev/null @@ -1,170 +0,0 @@ -#--------------------------------------------------------------------------------- -.SUFFIXES: -#--------------------------------------------------------------------------------- - -ifeq ($(strip $(DEVKITARM)),) -$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") -endif - -TOPDIR ?= $(CURDIR) -include $(DEVKITARM)/3ds_rules - -#--------------------------------------------------------------------------------- -# TARGET is the name of the output -# BUILD is the directory where object files & intermediate files will be placed -# SOURCES is a list of directories containing source code -# DATA is a list of directories containing data files -# INCLUDES is a list of directories containing header files -# -# NO_SMDH: if set to anything, no SMDH file is generated. -# APP_TITLE is the name of the app stored in the SMDH file (Optional) -# APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional) -# APP_AUTHOR is the author of the app stored in the SMDH file (Optional) -# ICON is the filename of the icon (.png), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .png -# - icon.png -# - /default_icon.png -#--------------------------------------------------------------------------------- -TARGET := $(notdir $(CURDIR)) -BUILD := build -SOURCES := source -DATA := data -INCLUDES := include - -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=softfp - -CFLAGS := -g -Wall -O2 -mword-relocations \ - -fomit-frame-pointer -ffast-math \ - $(ARCH) - -CFLAGS += $(INCLUDE) -DARM11 -D_3DS - -CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 - -ASFLAGS := -g $(ARCH) -LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) - -LIBS := -lctru -lm - -#--------------------------------------------------------------------------------- -# list of directories containing libraries, this must be the top level containing -# include and lib -#--------------------------------------------------------------------------------- -LIBDIRS := $(CTRULIB) - - -#--------------------------------------------------------------------------------- -# no real need to edit anything past this point unless you need to add additional -# rules for different file extensions -#--------------------------------------------------------------------------------- -ifneq ($(BUILD),$(notdir $(CURDIR))) -#--------------------------------------------------------------------------------- - -export OUTPUT := $(CURDIR)/$(TARGET) -export TOPDIR := $(CURDIR) - -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) - -export DEPSDIR := $(CURDIR)/$(BUILD) - -CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) -CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) -SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- -ifeq ($(strip $(CPPFILES)),) -#--------------------------------------------------------------------------------- - export LD := $(CC) -#--------------------------------------------------------------------------------- -else -#--------------------------------------------------------------------------------- - export LD := $(CXX) -#--------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------- - -export OFILES := $(addsuffix .o,$(BINFILES)) \ - $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) - -export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ - $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ - -I$(CURDIR)/$(BUILD) - -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) - -ifeq ($(strip $(ICON)),) - icons := $(wildcard *.png) - ifneq (,$(findstring $(TARGET).png,$(icons))) - export APP_ICON := $(TOPDIR)/$(TARGET).png - else - ifneq (,$(findstring icon.png,$(icons))) - export APP_ICON := $(TOPDIR)/icon.png - endif - endif -else - export APP_ICON := $(TOPDIR)/$(ICON) -endif - -.PHONY: $(BUILD) clean all - -#--------------------------------------------------------------------------------- -all: $(BUILD) - -$(BUILD): - @[ -d $@ ] || mkdir -p $@ - @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile - -#--------------------------------------------------------------------------------- -clean: - @echo clean ... - @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf - - -#--------------------------------------------------------------------------------- -else - -DEPENDS := $(OFILES:.o=.d) - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- -ifeq ($(strip $(NO_SMDH)),) -.PHONY: all -all : $(OUTPUT).3dsx $(OUTPUT).smdh -endif -$(OUTPUT).3dsx : $(OUTPUT).elf -$(OUTPUT).elf : $(OFILES) - -#--------------------------------------------------------------------------------- -# you need a rule like this for each extension you use as binary data -#--------------------------------------------------------------------------------- -%.bin.o : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -# WARNING: This is not the right way to do this! TODO: Do it right! -#--------------------------------------------------------------------------------- -%.vsh.o : %.vsh -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @python $(AEMSTRO)/aemstro_as.py $< ../$(notdir $<).shbin - @bin2s ../$(notdir $<).shbin | $(PREFIX)as -o $@ - @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(notdir $<).shbin | tr . _)`.h - @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(notdir $<).shbin | tr . _)`.h - @echo "extern const u32" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(notdir $<).shbin | tr . _)`.h - @rm ../$(notdir $<).shbin - --include $(DEPENDS) - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- From 60edc69d736a34817b56bb7e3c47348d1f26e227 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Mon, 15 Dec 2014 23:23:04 +0000 Subject: [PATCH 39/61] sdmc_open: implement O_EXCL and O_TRUNC --- libctru/source/sdmc_dev.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/libctru/source/sdmc_dev.c b/libctru/source/sdmc_dev.c index 27efc49..085c574 100644 --- a/libctru/source/sdmc_dev.c +++ b/libctru/source/sdmc_dev.c @@ -244,7 +244,18 @@ sdmc_open(struct _reent *r, if(flags & O_CREAT) sdmc_flags |= FS_OPEN_CREATE; - /* TODO: Test O_EXCL. */ + /* Test O_EXCL. */ + if((flags & O_CREAT) && (flags & O_EXCL)) + { + rc = FSUSER_CreateFile(NULL, sdmcArchive, FS_makePath(PATH_CHAR, pathptr), 0); + if(rc != 0) + { + r->_errno = rc; + if(rc == 0x82044BE) + r->_errno = EEXIST; + return -1; + } + } /* set attributes */ /*if(!(mode & S_IWUSR)) @@ -255,6 +266,16 @@ sdmc_open(struct _reent *r, sdmc_flags, attributes); if(rc == 0) { + if((flags & O_ACCMODE) != O_RDONLY && (flags & O_TRUNC)) + { + rc = FSFILE_SetSize(fd, 0); + if(rc != 0) + { + FSFILE_Close(fd); + r->_errno = rc; + return -1; + } + } file->fd = fd; file->flags = (flags & (O_ACCMODE|O_APPEND|O_SYNC)); file->offset = 0; From 7692b4eb5405dc88ce592b67836861a5454033e0 Mon Sep 17 00:00:00 2001 From: smea Date: Wed, 17 Dec 2014 22:28:26 -0800 Subject: [PATCH 40/61] added registers.h --- libctru/include/3ds/gpu/gpu.h | 6 + libctru/include/3ds/gpu/registers.h | 729 ++++++++++++++++++++++++++++ libctru/include/3ds/gpu/shdr.h | 4 +- libctru/source/gpu/gpu.c | 7 +- libctru/source/gpu/shdr.c | 58 ++- 5 files changed, 772 insertions(+), 32 deletions(-) create mode 100644 libctru/include/3ds/gpu/registers.h diff --git a/libctru/include/3ds/gpu/gpu.h b/libctru/include/3ds/gpu/gpu.h index 5fd3071..ac25969 100644 --- a/libctru/include/3ds/gpu/gpu.h +++ b/libctru/include/3ds/gpu/gpu.h @@ -1,8 +1,14 @@ #pragma once +#include "3ds/gpu/registers.h" + +//GPU void GPU_Init(Handle *gsphandle); void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize); +//GPUCMD +#define GPUCMD_HEADER(consec, mask, reg) (((consec)<<31)|(((mask)&0xF)<<16)|((reg)&0x3FF)) + void GPUCMD_SetBuffer(u32* adr, u32 size, u32 offset); void GPUCMD_SetBufferOffset(u32 offset); void GPUCMD_GetBuffer(u32** adr, u32* size, u32* offset); diff --git a/libctru/include/3ds/gpu/registers.h b/libctru/include/3ds/gpu/registers.h new file mode 100644 index 0000000..abbf61e --- /dev/null +++ b/libctru/include/3ds/gpu/registers.h @@ -0,0 +1,729 @@ +#pragma once + +#define GPUREG_0000 0x0000 +#define GPUREG_0001 0x0001 +#define GPUREG_0002 0x0002 +#define GPUREG_0003 0x0003 +#define GPUREG_0004 0x0004 +#define GPUREG_0005 0x0005 +#define GPUREG_0006 0x0006 +#define GPUREG_0007 0x0007 +#define GPUREG_0008 0x0008 +#define GPUREG_0009 0x0009 +#define GPUREG_000A 0x000A +#define GPUREG_000B 0x000B +#define GPUREG_000C 0x000C +#define GPUREG_000D 0x000D +#define GPUREG_000E 0x000E +#define GPUREG_000F 0x000F +#define GPUREG_FINALIZE 0x0010 +#define GPUREG_0011 0x0011 +#define GPUREG_0012 0x0012 +#define GPUREG_0013 0x0013 +#define GPUREG_0014 0x0014 +#define GPUREG_0015 0x0015 +#define GPUREG_0016 0x0016 +#define GPUREG_0017 0x0017 +#define GPUREG_0018 0x0018 +#define GPUREG_0019 0x0019 +#define GPUREG_001A 0x001A +#define GPUREG_001B 0x001B +#define GPUREG_001C 0x001C +#define GPUREG_001D 0x001D +#define GPUREG_001E 0x001E +#define GPUREG_001F 0x001F +#define GPUREG_0020 0x0020 +#define GPUREG_0021 0x0021 +#define GPUREG_0022 0x0022 +#define GPUREG_0023 0x0023 +#define GPUREG_0024 0x0024 +#define GPUREG_0025 0x0025 +#define GPUREG_0026 0x0026 +#define GPUREG_0027 0x0027 +#define GPUREG_0028 0x0028 +#define GPUREG_0029 0x0029 +#define GPUREG_002A 0x002A +#define GPUREG_002B 0x002B +#define GPUREG_002C 0x002C +#define GPUREG_002D 0x002D +#define GPUREG_002E 0x002E +#define GPUREG_002F 0x002F +#define GPUREG_0030 0x0030 +#define GPUREG_0031 0x0031 +#define GPUREG_0032 0x0032 +#define GPUREG_0033 0x0033 +#define GPUREG_0034 0x0034 +#define GPUREG_0035 0x0035 +#define GPUREG_0036 0x0036 +#define GPUREG_0037 0x0037 +#define GPUREG_0038 0x0038 +#define GPUREG_0039 0x0039 +#define GPUREG_003A 0x003A +#define GPUREG_003B 0x003B +#define GPUREG_003C 0x003C +#define GPUREG_003D 0x003D +#define GPUREG_003E 0x003E +#define GPUREG_003F 0x003F +#define GPUREG_FACECULLING_CONFIG 0x0040 +#define GPUREG_0041 0x0041 +#define GPUREG_0042 0x0042 +#define GPUREG_0043 0x0043 +#define GPUREG_0044 0x0044 +#define GPUREG_0045 0x0045 +#define GPUREG_0046 0x0046 +#define GPUREG_0047 0x0047 +#define GPUREG_0048 0x0048 +#define GPUREG_0049 0x0049 +#define GPUREG_004A 0x004A +#define GPUREG_004B 0x004B +#define GPUREG_004C 0x004C +#define GPUREG_DEPTHRANGE_NEAR 0x004D +#define GPUREG_DEPTHRANGE_FAR 0x004E +#define GPUREG_SH_OUTMAP_TOTAL 0x004F +#define GPUREG_SH_OUTMAP_O0 0x0050 +#define GPUREG_SH_OUTMAP_O1 0x0051 +#define GPUREG_SH_OUTMAP_O2 0x0052 +#define GPUREG_SH_OUTMAP_O3 0x0053 +#define GPUREG_SH_OUTMAP_O4 0x0054 +#define GPUREG_SH_OUTMAP_O5 0x0055 +#define GPUREG_SH_OUTMAP_O6 0x0056 +#define GPUREG_0057 0x0057 +#define GPUREG_0058 0x0058 +#define GPUREG_0059 0x0059 +#define GPUREG_005A 0x005A +#define GPUREG_005B 0x005B +#define GPUREG_005C 0x005C +#define GPUREG_005D 0x005D +#define GPUREG_005E 0x005E +#define GPUREG_005F 0x005F +#define GPUREG_0060 0x0060 +#define GPUREG_0061 0x0061 +#define GPUREG_0062 0x0062 +#define GPUREG_0063 0x0063 +#define GPUREG_0064 0x0064 +#define GPUREG_SCISSORTEST_MODE 0x0065 +#define GPUREG_SCISSORTEST_POS 0x0066 +#define GPUREG_SCISSORTEST_DIM 0x0067 +#define GPUREG_0068 0x0068 +#define GPUREG_0069 0x0069 +#define GPUREG_006A 0x006A +#define GPUREG_006B 0x006B +#define GPUREG_006C 0x006C +#define GPUREG_006D 0x006D +#define GPUREG_006E 0x006E +#define GPUREG_006F 0x006F +#define GPUREG_0070 0x0070 +#define GPUREG_0071 0x0071 +#define GPUREG_0072 0x0072 +#define GPUREG_0073 0x0073 +#define GPUREG_0074 0x0074 +#define GPUREG_0075 0x0075 +#define GPUREG_0076 0x0076 +#define GPUREG_0077 0x0077 +#define GPUREG_0078 0x0078 +#define GPUREG_0079 0x0079 +#define GPUREG_007A 0x007A +#define GPUREG_007B 0x007B +#define GPUREG_007C 0x007C +#define GPUREG_007D 0x007D +#define GPUREG_007E 0x007E +#define GPUREG_007F 0x007F +#define GPUREG_TEXUNITS_CONFIG 0x0080 +#define GPUREG_0081 0x0081 +#define GPUREG_TEXUNIT0_DIM 0x0082 +#define GPUREG_TEXUNIT0_PARAM 0x0083 +#define GPUREG_0084 0x0084 +#define GPUREG_TEXUNIT0_LOC 0x0085 +#define GPUREG_0086 0x0086 +#define GPUREG_0087 0x0087 +#define GPUREG_0088 0x0088 +#define GPUREG_0089 0x0089 +#define GPUREG_008A 0x008A +#define GPUREG_008B 0x008B +#define GPUREG_008C 0x008C +#define GPUREG_008D 0x008D +#define GPUREG_TEXUNIT0_TYPE 0x008E +#define GPUREG_008F 0x008F +#define GPUREG_0090 0x0090 +#define GPUREG_0091 0x0091 +#define GPUREG_TEXUNIT1_DIM 0x0092 +#define GPUREG_TEXUNIT1_PARAM 0x0093 +#define GPUREG_0094 0x0094 +#define GPUREG_TEXUNIT1_LOC 0x0095 +#define GPUREG_TEXUNIT1_TYPE 0x0096 +#define GPUREG_0097 0x0097 +#define GPUREG_0098 0x0098 +#define GPUREG_0099 0x0099 +#define GPUREG_TEXUNIT2_DIM 0x009A +#define GPUREG_TEXUNIT2_PARAM 0x009B +#define GPUREG_009C 0x009C +#define GPUREG_TEXUNIT2_LOC 0x009D +#define GPUREG_TEXUNIT2_TYPE 0x009E +#define GPUREG_009F 0x009F +#define GPUREG_00A0 0x00A0 +#define GPUREG_00A1 0x00A1 +#define GPUREG_00A2 0x00A2 +#define GPUREG_00A3 0x00A3 +#define GPUREG_00A4 0x00A4 +#define GPUREG_00A5 0x00A5 +#define GPUREG_00A6 0x00A6 +#define GPUREG_00A7 0x00A7 +#define GPUREG_00A8 0x00A8 +#define GPUREG_00A9 0x00A9 +#define GPUREG_00AA 0x00AA +#define GPUREG_00AB 0x00AB +#define GPUREG_00AC 0x00AC +#define GPUREG_00AD 0x00AD +#define GPUREG_00AE 0x00AE +#define GPUREG_00AF 0x00AF +#define GPUREG_00B0 0x00B0 +#define GPUREG_00B1 0x00B1 +#define GPUREG_00B2 0x00B2 +#define GPUREG_00B3 0x00B3 +#define GPUREG_00B4 0x00B4 +#define GPUREG_00B5 0x00B5 +#define GPUREG_00B6 0x00B6 +#define GPUREG_00B7 0x00B7 +#define GPUREG_00B8 0x00B8 +#define GPUREG_00B9 0x00B9 +#define GPUREG_00BA 0x00BA +#define GPUREG_00BB 0x00BB +#define GPUREG_00BC 0x00BC +#define GPUREG_00BD 0x00BD +#define GPUREG_00BE 0x00BE +#define GPUREG_00BF 0x00BF +#define GPUREG_TEXENV0_CONFIG0 0x00C0 +#define GPUREG_TEXENV0_CONFIG1 0x00C1 +#define GPUREG_TEXENV0_CONFIG2 0x00C2 +#define GPUREG_TEXENV0_CONFIG3 0x00C3 +#define GPUREG_TEXENV0_CONFIG4 0x00C4 +#define GPUREG_00C5 0x00C5 +#define GPUREG_00C6 0x00C6 +#define GPUREG_00C7 0x00C7 +#define GPUREG_TEXENV1_CONFIG0 0x00C8 +#define GPUREG_TEXENV1_CONFIG1 0x00C9 +#define GPUREG_TEXENV1_CONFIG2 0x00CA +#define GPUREG_TEXENV1_CONFIG3 0x00CB +#define GPUREG_TEXENV1_CONFIG4 0x00CC +#define GPUREG_00CD 0x00CD +#define GPUREG_00CE 0x00CE +#define GPUREG_00CF 0x00CF +#define GPUREG_TEXENV2_CONFIG0 0x00D0 +#define GPUREG_TEXENV2_CONFIG1 0x00D1 +#define GPUREG_TEXENV2_CONFIG2 0x00D2 +#define GPUREG_TEXENV2_CONFIG3 0x00D3 +#define GPUREG_TEXENV2_CONFIG4 0x00D4 +#define GPUREG_00D5 0x00D5 +#define GPUREG_00D6 0x00D6 +#define GPUREG_00D7 0x00D7 +#define GPUREG_TEXENV3_CONFIG0 0x00D8 +#define GPUREG_TEXENV3_CONFIG1 0x00D9 +#define GPUREG_TEXENV3_CONFIG2 0x00DA +#define GPUREG_TEXENV3_CONFIG3 0x00DB +#define GPUREG_TEXENV3_CONFIG4 0x00DC +#define GPUREG_00DD 0x00DD +#define GPUREG_00DE 0x00DE +#define GPUREG_00DF 0x00DF +#define GPUREG_00E0 0x00E0 +#define GPUREG_00E1 0x00E1 +#define GPUREG_00E2 0x00E2 +#define GPUREG_00E3 0x00E3 +#define GPUREG_00E4 0x00E4 +#define GPUREG_00E5 0x00E5 +#define GPUREG_00E6 0x00E6 +#define GPUREG_00E7 0x00E7 +#define GPUREG_00E8 0x00E8 +#define GPUREG_00E9 0x00E9 +#define GPUREG_00EA 0x00EA +#define GPUREG_00EB 0x00EB +#define GPUREG_00EC 0x00EC +#define GPUREG_00ED 0x00ED +#define GPUREG_00EE 0x00EE +#define GPUREG_00EF 0x00EF +#define GPUREG_TEXENV4_CONFIG0 0x00F0 +#define GPUREG_TEXENV4_CONFIG1 0x00F1 +#define GPUREG_TEXENV4_CONFIG2 0x00F2 +#define GPUREG_TEXENV4_CONFIG3 0x00F3 +#define GPUREG_TEXENV4_CONFIG4 0x00F4 +#define GPUREG_00F5 0x00F5 +#define GPUREG_00F6 0x00F6 +#define GPUREG_00F7 0x00F7 +#define GPUREG_TEXENV5_CONFIG0 0x00F8 +#define GPUREG_TEXENV5_CONFIG1 0x00F9 +#define GPUREG_TEXENV5_CONFIG2 0x00FA +#define GPUREG_TEXENV5_CONFIG3 0x00FB +#define GPUREG_TEXENV5_CONFIG4 0x00FC +#define GPUREG_00FD 0x00FD +#define GPUREG_00FE 0x00FE +#define GPUREG_00FF 0x00FF +#define GPUREG_COLOROUTPUT_CONFIG 0x0100 +#define GPUREG_BLEND_CONFIG 0x0101 +#define GPUREG_COLORLOGICOP_CONFIG 0x0102 +#define GPUREG_BLEND_COLOR 0x0103 +#define GPUREG_ALPHATEST_CONFIG 0x0104 +#define GPUREG_STENCILTEST_CONFIG 0x0105 +#define GPUREG_STENCILOP_CONFIG 0x0106 +#define GPUREG_DEPTHTEST_CONFIG 0x0107 +#define GPUREG_0108 0x0108 +#define GPUREG_0109 0x0109 +#define GPUREG_010A 0x010A +#define GPUREG_010B 0x010B +#define GPUREG_010C 0x010C +#define GPUREG_010D 0x010D +#define GPUREG_010E 0x010E +#define GPUREG_010F 0x010F +#define GPUREG_0110 0x0110 +#define GPUREG_0111 0x0111 +#define GPUREG_0112 0x0112 +#define GPUREG_0113 0x0113 +#define GPUREG_0114 0x0114 +#define GPUREG_0115 0x0115 +#define GPUREG_DEPTHBUFFER_FORMAT 0x0116 +#define GPUREG_COLORBUFFER_FORMAT 0x0117 +#define GPUREG_0118 0x0118 +#define GPUREG_0119 0x0119 +#define GPUREG_011A 0x011A +#define GPUREG_011B 0x011B +#define GPUREG_DEPTHBUFFER_LOC 0x011C +#define GPUREG_COLORBUFFER_LOC 0x011D +#define GPUREG_OUTBUFFER_DIM 0x011E +#define GPUREG_011F 0x011F +#define GPUREG_0120 0x0120 +#define GPUREG_0121 0x0121 +#define GPUREG_0122 0x0122 +#define GPUREG_0123 0x0123 +#define GPUREG_0124 0x0124 +#define GPUREG_0125 0x0125 +#define GPUREG_0126 0x0126 +#define GPUREG_0127 0x0127 +#define GPUREG_0128 0x0128 +#define GPUREG_0129 0x0129 +#define GPUREG_012A 0x012A +#define GPUREG_012B 0x012B +#define GPUREG_012C 0x012C +#define GPUREG_012D 0x012D +#define GPUREG_012E 0x012E +#define GPUREG_012F 0x012F +#define GPUREG_0130 0x0130 +#define GPUREG_0131 0x0131 +#define GPUREG_0132 0x0132 +#define GPUREG_0133 0x0133 +#define GPUREG_0134 0x0134 +#define GPUREG_0135 0x0135 +#define GPUREG_0136 0x0136 +#define GPUREG_0137 0x0137 +#define GPUREG_0138 0x0138 +#define GPUREG_0139 0x0139 +#define GPUREG_013A 0x013A +#define GPUREG_013B 0x013B +#define GPUREG_013C 0x013C +#define GPUREG_013D 0x013D +#define GPUREG_013E 0x013E +#define GPUREG_013F 0x013F +#define GPUREG_0140 0x0140 +#define GPUREG_0141 0x0141 +#define GPUREG_0142 0x0142 +#define GPUREG_0143 0x0143 +#define GPUREG_0144 0x0144 +#define GPUREG_0145 0x0145 +#define GPUREG_0146 0x0146 +#define GPUREG_0147 0x0147 +#define GPUREG_0148 0x0148 +#define GPUREG_0149 0x0149 +#define GPUREG_014A 0x014A +#define GPUREG_014B 0x014B +#define GPUREG_014C 0x014C +#define GPUREG_014D 0x014D +#define GPUREG_014E 0x014E +#define GPUREG_014F 0x014F +#define GPUREG_0150 0x0150 +#define GPUREG_0151 0x0151 +#define GPUREG_0152 0x0152 +#define GPUREG_0153 0x0153 +#define GPUREG_0154 0x0154 +#define GPUREG_0155 0x0155 +#define GPUREG_0156 0x0156 +#define GPUREG_0157 0x0157 +#define GPUREG_0158 0x0158 +#define GPUREG_0159 0x0159 +#define GPUREG_015A 0x015A +#define GPUREG_015B 0x015B +#define GPUREG_015C 0x015C +#define GPUREG_015D 0x015D +#define GPUREG_015E 0x015E +#define GPUREG_015F 0x015F +#define GPUREG_0160 0x0160 +#define GPUREG_0161 0x0161 +#define GPUREG_0162 0x0162 +#define GPUREG_0163 0x0163 +#define GPUREG_0164 0x0164 +#define GPUREG_0165 0x0165 +#define GPUREG_0166 0x0166 +#define GPUREG_0167 0x0167 +#define GPUREG_0168 0x0168 +#define GPUREG_0169 0x0169 +#define GPUREG_016A 0x016A +#define GPUREG_016B 0x016B +#define GPUREG_016C 0x016C +#define GPUREG_016D 0x016D +#define GPUREG_016E 0x016E +#define GPUREG_016F 0x016F +#define GPUREG_0170 0x0170 +#define GPUREG_0171 0x0171 +#define GPUREG_0172 0x0172 +#define GPUREG_0173 0x0173 +#define GPUREG_0174 0x0174 +#define GPUREG_0175 0x0175 +#define GPUREG_0176 0x0176 +#define GPUREG_0177 0x0177 +#define GPUREG_0178 0x0178 +#define GPUREG_0179 0x0179 +#define GPUREG_017A 0x017A +#define GPUREG_017B 0x017B +#define GPUREG_017C 0x017C +#define GPUREG_017D 0x017D +#define GPUREG_017E 0x017E +#define GPUREG_017F 0x017F +#define GPUREG_0180 0x0180 +#define GPUREG_0181 0x0181 +#define GPUREG_0182 0x0182 +#define GPUREG_0183 0x0183 +#define GPUREG_0184 0x0184 +#define GPUREG_0185 0x0185 +#define GPUREG_0186 0x0186 +#define GPUREG_0187 0x0187 +#define GPUREG_0188 0x0188 +#define GPUREG_0189 0x0189 +#define GPUREG_018A 0x018A +#define GPUREG_018B 0x018B +#define GPUREG_018C 0x018C +#define GPUREG_018D 0x018D +#define GPUREG_018E 0x018E +#define GPUREG_018F 0x018F +#define GPUREG_0190 0x0190 +#define GPUREG_0191 0x0191 +#define GPUREG_0192 0x0192 +#define GPUREG_0193 0x0193 +#define GPUREG_0194 0x0194 +#define GPUREG_0195 0x0195 +#define GPUREG_0196 0x0196 +#define GPUREG_0197 0x0197 +#define GPUREG_0198 0x0198 +#define GPUREG_0199 0x0199 +#define GPUREG_019A 0x019A +#define GPUREG_019B 0x019B +#define GPUREG_019C 0x019C +#define GPUREG_019D 0x019D +#define GPUREG_019E 0x019E +#define GPUREG_019F 0x019F +#define GPUREG_01A0 0x01A0 +#define GPUREG_01A1 0x01A1 +#define GPUREG_01A2 0x01A2 +#define GPUREG_01A3 0x01A3 +#define GPUREG_01A4 0x01A4 +#define GPUREG_01A5 0x01A5 +#define GPUREG_01A6 0x01A6 +#define GPUREG_01A7 0x01A7 +#define GPUREG_01A8 0x01A8 +#define GPUREG_01A9 0x01A9 +#define GPUREG_01AA 0x01AA +#define GPUREG_01AB 0x01AB +#define GPUREG_01AC 0x01AC +#define GPUREG_01AD 0x01AD +#define GPUREG_01AE 0x01AE +#define GPUREG_01AF 0x01AF +#define GPUREG_01B0 0x01B0 +#define GPUREG_01B1 0x01B1 +#define GPUREG_01B2 0x01B2 +#define GPUREG_01B3 0x01B3 +#define GPUREG_01B4 0x01B4 +#define GPUREG_01B5 0x01B5 +#define GPUREG_01B6 0x01B6 +#define GPUREG_01B7 0x01B7 +#define GPUREG_01B8 0x01B8 +#define GPUREG_01B9 0x01B9 +#define GPUREG_01BA 0x01BA +#define GPUREG_01BB 0x01BB +#define GPUREG_01BC 0x01BC +#define GPUREG_01BD 0x01BD +#define GPUREG_01BE 0x01BE +#define GPUREG_01BF 0x01BF +#define GPUREG_01C0 0x01C0 +#define GPUREG_01C1 0x01C1 +#define GPUREG_01C2 0x01C2 +#define GPUREG_01C3 0x01C3 +#define GPUREG_01C4 0x01C4 +#define GPUREG_01C5 0x01C5 +#define GPUREG_01C6 0x01C6 +#define GPUREG_01C7 0x01C7 +#define GPUREG_01C8 0x01C8 +#define GPUREG_01C9 0x01C9 +#define GPUREG_01CA 0x01CA +#define GPUREG_01CB 0x01CB +#define GPUREG_01CC 0x01CC +#define GPUREG_01CD 0x01CD +#define GPUREG_01CE 0x01CE +#define GPUREG_01CF 0x01CF +#define GPUREG_01D0 0x01D0 +#define GPUREG_01D1 0x01D1 +#define GPUREG_01D2 0x01D2 +#define GPUREG_01D3 0x01D3 +#define GPUREG_01D4 0x01D4 +#define GPUREG_01D5 0x01D5 +#define GPUREG_01D6 0x01D6 +#define GPUREG_01D7 0x01D7 +#define GPUREG_01D8 0x01D8 +#define GPUREG_01D9 0x01D9 +#define GPUREG_01DA 0x01DA +#define GPUREG_01DB 0x01DB +#define GPUREG_01DC 0x01DC +#define GPUREG_01DD 0x01DD +#define GPUREG_01DE 0x01DE +#define GPUREG_01DF 0x01DF +#define GPUREG_01E0 0x01E0 +#define GPUREG_01E1 0x01E1 +#define GPUREG_01E2 0x01E2 +#define GPUREG_01E3 0x01E3 +#define GPUREG_01E4 0x01E4 +#define GPUREG_01E5 0x01E5 +#define GPUREG_01E6 0x01E6 +#define GPUREG_01E7 0x01E7 +#define GPUREG_01E8 0x01E8 +#define GPUREG_01E9 0x01E9 +#define GPUREG_01EA 0x01EA +#define GPUREG_01EB 0x01EB +#define GPUREG_01EC 0x01EC +#define GPUREG_01ED 0x01ED +#define GPUREG_01EE 0x01EE +#define GPUREG_01EF 0x01EF +#define GPUREG_01F0 0x01F0 +#define GPUREG_01F1 0x01F1 +#define GPUREG_01F2 0x01F2 +#define GPUREG_01F3 0x01F3 +#define GPUREG_01F4 0x01F4 +#define GPUREG_01F5 0x01F5 +#define GPUREG_01F6 0x01F6 +#define GPUREG_01F7 0x01F7 +#define GPUREG_01F8 0x01F8 +#define GPUREG_01F9 0x01F9 +#define GPUREG_01FA 0x01FA +#define GPUREG_01FB 0x01FB +#define GPUREG_01FC 0x01FC +#define GPUREG_01FD 0x01FD +#define GPUREG_01FE 0x01FE +#define GPUREG_01FF 0x01FF +#define pipeline 0xGeometry +#define GPUREG_ATTRIBBUFFERS_LOC 0x0200 +#define GPUREG_ATTRIBBUFFERS_FORMAT_LOW 0x0201 +#define GPUREG_ATTRIBBUFFERS_FORMAT_HIGH 0x0202 +#define GPUREG_ATTRIBBUFFER0_CONFIG0 0x0203 +#define GPUREG_ATTRIBBUFFER0_CONFIG1 0x0204 +#define GPUREG_ATTRIBBUFFER0_CONFIG2 0x0205 +#define GPUREG_ATTRIBBUFFER1_CONFIG0 0x0206 +#define GPUREG_ATTRIBBUFFER1_CONFIG1 0x0207 +#define GPUREG_ATTRIBBUFFER1_CONFIG2 0x0208 +#define GPUREG_ATTRIBBUFFER2_CONFIG0 0x0209 +#define GPUREG_ATTRIBBUFFER2_CONFIG1 0x020A +#define GPUREG_ATTRIBBUFFER2_CONFIG2 0x020B +#define GPUREG_ATTRIBBUFFER3_CONFIG0 0x020C +#define GPUREG_ATTRIBBUFFER3_CONFIG1 0x020D +#define GPUREG_ATTRIBBUFFER3_CONFIG2 0x020E +#define GPUREG_ATTRIBBUFFER4_CONFIG0 0x020F +#define GPUREG_ATTRIBBUFFER4_CONFIG1 0x0210 +#define GPUREG_ATTRIBBUFFER4_CONFIG2 0x0211 +#define GPUREG_ATTRIBBUFFER5_CONFIG0 0x0212 +#define GPUREG_ATTRIBBUFFER5_CONFIG1 0x0213 +#define GPUREG_ATTRIBBUFFER5_CONFIG2 0x0214 +#define GPUREG_ATTRIBBUFFER6_CONFIG0 0x0215 +#define GPUREG_ATTRIBBUFFER6_CONFIG1 0x0216 +#define GPUREG_ATTRIBBUFFER6_CONFIG2 0x0217 +#define GPUREG_ATTRIBBUFFER7_CONFIG0 0x0218 +#define GPUREG_ATTRIBBUFFER7_CONFIG1 0x0219 +#define GPUREG_ATTRIBBUFFER7_CONFIG2 0x021A +#define GPUREG_ATTRIBBUFFER8_CONFIG0 0x021B +#define GPUREG_ATTRIBBUFFER8_CONFIG1 0x021C +#define GPUREG_ATTRIBBUFFER8_CONFIG2 0x021D +#define GPUREG_ATTRIBBUFFER9_CONFIG0 0x021E +#define GPUREG_ATTRIBBUFFER9_CONFIG1 0x021F +#define GPUREG_ATTRIBBUFFER9_CONFIG2 0x0220 +#define GPUREG_ATTRIBBUFFERA_CONFIG0 0x0221 +#define GPUREG_ATTRIBBUFFERA_CONFIG1 0x0222 +#define GPUREG_ATTRIBBUFFERA_CONFIG2 0x0223 +#define GPUREG_ATTRIBBUFFERB_CONFIG0 0x0224 +#define GPUREG_ATTRIBBUFFERB_CONFIG1 0x0225 +#define GPUREG_ATTRIBBUFFERB_CONFIG2 0x0226 +#define GPUREG_INDEXBUFFER_CONFIG 0x0227 +#define GPUREG_NUMVERTICES 0x0228 +#define GPUREG_GEOSTAGE_CONFIG 0x0229 +#define GPUREG_022A 0x022A +#define GPUREG_022B 0x022B +#define GPUREG_022C 0x022C +#define GPUREG_022D 0x022D +#define GPUREG_DRAWARRAYS 0x022E +#define GPUREG_DRAWELEMENTS 0x022F +#define GPUREG_0230 0x0230 +#define GPUREG_0231 0x0231 +#define GPUREG_0232 0x0232 +#define GPUREG_0233 0x0233 +#define GPUREG_0234 0x0234 +#define GPUREG_0235 0x0235 +#define GPUREG_0236 0x0236 +#define GPUREG_0237 0x0237 +#define GPUREG_0238 0x0238 +#define GPUREG_0239 0x0239 +#define GPUREG_023A 0x023A +#define GPUREG_023B 0x023B +#define GPUREG_023C 0x023C +#define GPUREG_023D 0x023D +#define GPUREG_023E 0x023E +#define GPUREG_023F 0x023F +#define GPUREG_0240 0x0240 +#define GPUREG_0241 0x0241 +#define GPUREG_0242 0x0242 +#define GPUREG_0243 0x0243 +#define GPUREG_0244 0x0244 +#define GPUREG_0245 0x0245 +#define GPUREG_0246 0x0246 +#define GPUREG_0247 0x0247 +#define GPUREG_0248 0x0248 +#define GPUREG_0249 0x0249 +#define GPUREG_024A 0x024A +#define GPUREG_024B 0x024B +#define GPUREG_024C 0x024C +#define GPUREG_024D 0x024D +#define GPUREG_024E 0x024E +#define GPUREG_024F 0x024F +#define GPUREG_0250 0x0250 +#define GPUREG_0251 0x0251 +#define GPUREG_0252 0x0252 +#define GPUREG_0253 0x0253 +#define GPUREG_0254 0x0254 +#define GPUREG_0255 0x0255 +#define GPUREG_0256 0x0256 +#define GPUREG_0257 0x0257 +#define GPUREG_0258 0x0258 +#define GPUREG_0259 0x0259 +#define GPUREG_025A 0x025A +#define GPUREG_025B 0x025B +#define GPUREG_025C 0x025C +#define GPUREG_025D 0x025D +#define GPUREG_PRIMITIVE_CONFIG 0x025E +#define GPUREG_025F 0x025F +#define GPUREG_0260 0x0260 +#define GPUREG_0261 0x0261 +#define GPUREG_0262 0x0262 +#define GPUREG_0263 0x0263 +#define GPUREG_0264 0x0264 +#define GPUREG_0265 0x0265 +#define GPUREG_0266 0x0266 +#define GPUREG_0267 0x0267 +#define GPUREG_0268 0x0268 +#define GPUREG_0269 0x0269 +#define GPUREG_026A 0x026A +#define GPUREG_026B 0x026B +#define GPUREG_026C 0x026C +#define GPUREG_026D 0x026D +#define GPUREG_026E 0x026E +#define GPUREG_026F 0x026F +#define GPUREG_0270 0x0270 +#define GPUREG_0271 0x0271 +#define GPUREG_0272 0x0272 +#define GPUREG_0273 0x0273 +#define GPUREG_0274 0x0274 +#define GPUREG_0275 0x0275 +#define GPUREG_0276 0x0276 +#define GPUREG_0277 0x0277 +#define GPUREG_0278 0x0278 +#define GPUREG_0279 0x0279 +#define GPUREG_027A 0x027A +#define GPUREG_027B 0x027B +#define GPUREG_027C 0x027C +#define GPUREG_027D 0x027D +#define GPUREG_027E 0x027E +#define GPUREG_027F 0x027F +#define GPUREG_GSH_BOOLUNIFORM 0x0280 +#define GPUREG_GSH_INTUNIFORM_I0 0x0281 +#define GPUREG_GSH_INTUNIFORM_I1 0x0282 +#define GPUREG_GSH_INTUNIFORM_I2 0x0283 +#define GPUREG_GSH_INTUNIFORM_I3 0x0284 +#define GPUREG_0285 0x0285 +#define GPUREG_0286 0x0286 +#define GPUREG_0287 0x0287 +#define GPUREG_0288 0x0288 +#define GPUREG_GSH_INPUTBUFFER_CONFIG 0x0289 +#define GPUREG_GSH_ENTRYPOINT 0x028A +#define GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW 0x028B +#define GPUREG_GSH_ATTRIBUTES_PERMUTATION_HIGH 0x028C +#define GPUREG_GSH_OUTMAP_MASK 0x028D +#define GPUREG_028E 0x028E +#define GPUREG_GSH_CODETRANSFER_END 0x028F +#define GPUREG_GSH_FLOATUNIFORM_CONFIG 0x0290 +#define GPUREG_GSH_FLOATUNIFORM_DATA 0x0291 +#define GPUREG_0299 0x0299 +#define GPUREG_029A 0x029A +#define GPUREG_GSH_CODETRANSFER_CONFIG 0x029B +#define GPUREG_GSH_CODETRANSFER_DATA 0x029C +#define GPUREG_02A4 0x02A4 +#define GPUREG_GSH_OPDESCS_CONFIG 0x02A5 +#define GPUREG_GSH_OPDESCS_DATA 0x02A6 +#define GPUREG_02AE 0x02AE +#define GPUREG_02AF 0x02AF +#define GPUREG_VSH_BOOLUNIFORM 0x02B0 +#define GPUREG_VSH_INTUNIFORM_I0 0x02B1 +#define GPUREG_VSH_INTUNIFORM_I1 0x02B2 +#define GPUREG_VSH_INTUNIFORM_I2 0x02B3 +#define GPUREG_VSH_INTUNIFORM_I3 0x02B4 +#define GPUREG_02B5 0x02B5 +#define GPUREG_02B6 0x02B6 +#define GPUREG_02B7 0x02B7 +#define GPUREG_02B8 0x02B8 +#define GPUREG_VSH_INPUTBUFFER_CONFIG 0x02B9 +#define GPUREG_VSH_ENTRYPOINT 0x02BA +#define GPUREG_VSH_ATTRIBUTES_PERMUTATION_LOW 0x02BB +#define GPUREG_VSH_ATTRIBUTES_PERMUTATION_HIGH 0x02BC +#define GPUREG_VSH_OUTMAP_MASK 0x02BD +#define GPUREG_02BE 0x02BE +#define GPUREG_VSH_CODETRANSFER_END 0x02BF +#define GPUREG_VSH_FLOATUNIFORM_CONFIG 0x02C0 +#define GPUREG_VSH_FLOATUNIFORM_DATA 0x02C1 +#define GPUREG_02C9 0x02C9 +#define GPUREG_02CA 0x02CA +#define GPUREG_VSH_CODETRANSFER_CONFIG 0x02CB +#define GPUREG_VSH_CODETRANSFER_DATA 0x02CC +#define GPUREG_02D4 0x02D4 +#define GPUREG_VSH_OPDESCS_CONFIG 0x02D5 +#define GPUREG_VSH_OPDESCS_DATA 0x02D6 +#define GPUREG_02DE 0x02DE +#define GPUREG_02DF 0x02DF +#define GPUREG_02E0 0x02E0 +#define GPUREG_02E1 0x02E1 +#define GPUREG_02E2 0x02E2 +#define GPUREG_02E3 0x02E3 +#define GPUREG_02E4 0x02E4 +#define GPUREG_02E5 0x02E5 +#define GPUREG_02E6 0x02E6 +#define GPUREG_02E7 0x02E7 +#define GPUREG_02E8 0x02E8 +#define GPUREG_02E9 0x02E9 +#define GPUREG_02EA 0x02EA +#define GPUREG_02EB 0x02EB +#define GPUREG_02EC 0x02EC +#define GPUREG_02ED 0x02ED +#define GPUREG_02EE 0x02EE +#define GPUREG_02EF 0x02EF +#define GPUREG_02F0 0x02F0 +#define GPUREG_02F1 0x02F1 +#define GPUREG_02F2 0x02F2 +#define GPUREG_02F3 0x02F3 +#define GPUREG_02F4 0x02F4 +#define GPUREG_02F5 0x02F5 +#define GPUREG_02F6 0x02F6 +#define GPUREG_02F7 0x02F7 +#define GPUREG_02F8 0x02F8 +#define GPUREG_02F9 0x02F9 +#define GPUREG_02FA 0x02FA +#define GPUREG_02FB 0x02FB +#define GPUREG_02FC 0x02FC +#define GPUREG_02FD 0x02FD +#define GPUREG_02FE 0x02FE +#define GPUREG_02FF 0x02FF diff --git a/libctru/include/3ds/gpu/shdr.h b/libctru/include/3ds/gpu/shdr.h index 02b5128..1a89ddb 100644 --- a/libctru/include/3ds/gpu/shdr.h +++ b/libctru/include/3ds/gpu/shdr.h @@ -61,8 +61,8 @@ void SHDR_UseProgram(DVLB_s* dvlb, u8 id); void SHDR_FreeDVLB(DVLB_s* dvlb); s8 SHDR_GetUniformRegister(DVLB_s* dvlb, const char* name, u8 programID); -void DVLP_SendCode(DVLP_s* dvlp); -void DVLP_SendOpDesc(DVLP_s* dvlp); +void DVLP_SendCode(DVLP_s* dvlp, SHDR_type type); +void DVLP_SendOpDesc(DVLP_s* dvlp, SHDR_type type); void DVLE_SendOutmap(DVLE_s* dvle); void DVLE_SendConstants(DVLE_s* dvle); diff --git a/libctru/source/gpu/gpu.c b/libctru/source/gpu/gpu.c index 97d14db..6e0586d 100644 --- a/libctru/source/gpu/gpu.c +++ b/libctru/source/gpu/gpu.c @@ -467,23 +467,18 @@ void GPU_SetTexEnv(u8 id, u16 rgbSources, u16 alphaSources, u16 rgbOperands, u16 void GPU_DrawArray(GPU_Primitive_t primitive, u32 n) { - // //? - // GPUCMD_AddSingleParam(0x00040080, 0x00010000); //set primitive type GPUCMD_AddSingleParam(0x0002025E, primitive); GPUCMD_AddSingleParam(0x0002025F, 0x00000001); - //index buffer not used for drawArrays but 0x000F0227 still required - GPUCMD_AddSingleParam(0x000F0227, 0x80000000); //pass number of vertices GPUCMD_AddSingleParam(0x000F0228, n); + //all the following except 0x000F022E might be useless GPUCMD_AddSingleParam(0x00010253, 0x00000001); - GPUCMD_AddSingleParam(0x00010245, 0x00000000); GPUCMD_AddSingleParam(0x000F022E, 0x00000001); GPUCMD_AddSingleParam(0x00010245, 0x00000001); GPUCMD_AddSingleParam(0x000F0231, 0x00000001); - GPUCMD_AddSingleParam(0x000F0111, 0x00000001); } diff --git a/libctru/source/gpu/shdr.c b/libctru/source/gpu/shdr.c index a9d2de5..0efe3fa 100644 --- a/libctru/source/gpu/shdr.c +++ b/libctru/source/gpu/shdr.c @@ -71,23 +71,27 @@ s8 SHDR_GetUniformRegister(DVLB_s* dvlb, const char* name, u8 programID) return -1; } -void DVLP_SendCode(DVLP_s* dvlp) +void DVLP_SendCode(DVLP_s* dvlp, SHDR_type type) { if(!dvlp)return; - GPUCMD_AddSingleParam(0x000F02CB, 0x00000000); + u32 regOffset=(type==GEOMETRY_SHDR)?(-0x30):(0x0); + + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_CODETRANSFER_CONFIG)+regOffset, 0x00000000); int i; - for(i=0;icodeSize;i+=0x80)GPUCMD_Add(0x000F02CC, &dvlp->codeData[i], ((dvlp->codeSize-i)<0x80)?(dvlp->codeSize-i):0x80); + for(i=0;icodeSize;i+=0x80)GPUCMD_Add(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_CODETRANSFER_DATA)+regOffset, &dvlp->codeData[i], ((dvlp->codeSize-i)<0x80)?(dvlp->codeSize-i):0x80); - GPUCMD_AddSingleParam(0x000F02BF, 0x00000001); + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_CODETRANSFER_END)+regOffset, 0x00000001); } -void DVLP_SendOpDesc(DVLP_s* dvlp) +void DVLP_SendOpDesc(DVLP_s* dvlp, SHDR_type type) { if(!dvlp)return; - GPUCMD_AddSingleParam(0x000F02D5, 0x00000000); + u32 regOffset=(type==GEOMETRY_SHDR)?(-0x30):(0x0); + + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_OPDESCS_CONFIG)+regOffset, 0x00000000); u32 param[0x20]; @@ -95,13 +99,15 @@ void DVLP_SendOpDesc(DVLP_s* dvlp) //TODO : should probably preprocess this for(i=0;iopdescSize;i++)param[i]=dvlp->opcdescData[i*2]; - GPUCMD_Add(0x000F02D6, param, dvlp->opdescSize); + GPUCMD_Add(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_OPDESCS_DATA)+regOffset, param, dvlp->opdescSize); } void DVLE_SendOutmap(DVLE_s* dvle) { if(!dvle)return; + u32 regOffset=(dvle->type==GEOMETRY_SHDR)?(-0x30):(0x0); + u32 param[0x7]={0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F, 0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F}; @@ -131,18 +137,20 @@ void DVLE_SendOutmap(DVLE_s* dvle) if(dvle->outTableData[i].regID+1>maxAttr)maxAttr=dvle->outTableData[i].regID+1; } - GPUCMD_AddSingleParam(0x000F0251, numAttr-1); //? - GPUCMD_AddSingleParam(0x000F024A, numAttr-1); //? - GPUCMD_AddSingleParam(0x000F02BD, attrMask); //? - GPUCMD_AddSingleParam(0x0001025E, numAttr-1); //? - GPUCMD_AddSingleParam(0x000F004F, numAttr); //? - GPUCMD_Add(0x800F0050, param, 0x00000007); + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_0251), numAttr-1); //? + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_024A), numAttr-1); //? + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_OUTMAP_MASK)+regOffset, attrMask); + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0x1, GPUREG_PRIMITIVE_CONFIG), numAttr-1); + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_SH_OUTMAP_TOTAL), numAttr); + GPUCMD_Add(GPUCMD_HEADER(1, 0xF, GPUREG_SH_OUTMAP_O0), param, 0x00000007); } void DVLE_SendConstants(DVLE_s* dvle) { if(!dvle)return; + u32 regOffset=(dvle->type==GEOMETRY_SHDR)?(-0x30):(0x0); + u32 param[4]; u32 rev[3]; u8* rev8=(u8*)rev; @@ -161,7 +169,7 @@ void DVLE_SendConstants(DVLE_s* dvle) param[0x2]=rev[1]; param[0x3]=rev[0]; - GPUCMD_Add(0x800F02C0, param, 0x00000004); + GPUCMD_Add(GPUCMD_HEADER(1, 0xF, GPUREG_VSH_FLOATUNIFORM_CONFIG)+regOffset, param, 0x00000004); } } @@ -170,24 +178,26 @@ void SHDR_UseProgram(DVLB_s* dvlb, u8 id) if(!dvlb || id>dvlb->numDVLE)return; DVLE_s* dvle=&dvlb->DVLE[id]; - //? - GPUCMD_AddSingleParam(0x00010229, 0x00000000); - GPUCMD_AddSingleParam(0x00010244, 0x00000000); + u32 regOffset=(dvlb->DVLE[id].type==GEOMETRY_SHDR)?(-0x30):(0x0); - DVLP_SendCode(&dvlb->DVLP); - DVLP_SendOpDesc(&dvlb->DVLP); + + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0x1, GPUREG_GEOSTAGE_CONFIG), 0x00000000); + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0x1, GPUREG_0244), (dvlb->DVLE[id].type==GEOMETRY_SHDR)?0x1:0x0); + + DVLP_SendCode(&dvlb->DVLP, dvlb->DVLE[id].type); + DVLP_SendOpDesc(&dvlb->DVLP, dvlb->DVLE[id].type); DVLE_SendConstants(dvle); - GPUCMD_AddSingleParam(0x00080229, 0x00000000); - GPUCMD_AddSingleParam(0x000F02BA, 0x7FFF0000|(dvle->mainOffset&0xFFFF)); //set entrypoint + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0x8, GPUREG_GEOSTAGE_CONFIG), 0x00000000); + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_ENTRYPOINT)-regOffset, 0x7FFF0000|(dvle->mainOffset&0xFFFF)); //set entrypoint - GPUCMD_AddSingleParam(0x000F0252, 0x00000000); // should all be part of DVLE_SendOutmap ? + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_0252), 0x00000000); // should all be part of DVLE_SendOutmap ? DVLE_SendOutmap(dvle); //? - GPUCMD_AddSingleParam(0x000F0064, 0x00000001); - GPUCMD_AddSingleParam(0x000F006F, 0x00000703); + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_0064), 0x00000001); + GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_006F), 0x00000703); } //TODO From 934f0f80b07de2d00f2a2f0ee5d216ac9f0b7eef Mon Sep 17 00:00:00 2001 From: smea Date: Wed, 17 Dec 2014 22:41:31 -0800 Subject: [PATCH 41/61] Revert "Merge branch 'master' of github.com:smealum/ctrulib" This reverts commit f934dc0982859d9c334e76db766c4a9400c5c8bc, reversing changes made to 60edc69d736a34817b56bb7e3c47348d1f26e227. --- libctru/include/3ds/gpu/gpu.h | 6 - libctru/include/3ds/gpu/registers.h | 729 ---------------------------- libctru/include/3ds/gpu/shdr.h | 4 +- libctru/source/gpu/gpu.c | 7 +- libctru/source/gpu/shdr.c | 58 +-- 5 files changed, 32 insertions(+), 772 deletions(-) delete mode 100644 libctru/include/3ds/gpu/registers.h diff --git a/libctru/include/3ds/gpu/gpu.h b/libctru/include/3ds/gpu/gpu.h index ac25969..5fd3071 100644 --- a/libctru/include/3ds/gpu/gpu.h +++ b/libctru/include/3ds/gpu/gpu.h @@ -1,14 +1,8 @@ #pragma once -#include "3ds/gpu/registers.h" - -//GPU void GPU_Init(Handle *gsphandle); void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize); -//GPUCMD -#define GPUCMD_HEADER(consec, mask, reg) (((consec)<<31)|(((mask)&0xF)<<16)|((reg)&0x3FF)) - void GPUCMD_SetBuffer(u32* adr, u32 size, u32 offset); void GPUCMD_SetBufferOffset(u32 offset); void GPUCMD_GetBuffer(u32** adr, u32* size, u32* offset); diff --git a/libctru/include/3ds/gpu/registers.h b/libctru/include/3ds/gpu/registers.h deleted file mode 100644 index abbf61e..0000000 --- a/libctru/include/3ds/gpu/registers.h +++ /dev/null @@ -1,729 +0,0 @@ -#pragma once - -#define GPUREG_0000 0x0000 -#define GPUREG_0001 0x0001 -#define GPUREG_0002 0x0002 -#define GPUREG_0003 0x0003 -#define GPUREG_0004 0x0004 -#define GPUREG_0005 0x0005 -#define GPUREG_0006 0x0006 -#define GPUREG_0007 0x0007 -#define GPUREG_0008 0x0008 -#define GPUREG_0009 0x0009 -#define GPUREG_000A 0x000A -#define GPUREG_000B 0x000B -#define GPUREG_000C 0x000C -#define GPUREG_000D 0x000D -#define GPUREG_000E 0x000E -#define GPUREG_000F 0x000F -#define GPUREG_FINALIZE 0x0010 -#define GPUREG_0011 0x0011 -#define GPUREG_0012 0x0012 -#define GPUREG_0013 0x0013 -#define GPUREG_0014 0x0014 -#define GPUREG_0015 0x0015 -#define GPUREG_0016 0x0016 -#define GPUREG_0017 0x0017 -#define GPUREG_0018 0x0018 -#define GPUREG_0019 0x0019 -#define GPUREG_001A 0x001A -#define GPUREG_001B 0x001B -#define GPUREG_001C 0x001C -#define GPUREG_001D 0x001D -#define GPUREG_001E 0x001E -#define GPUREG_001F 0x001F -#define GPUREG_0020 0x0020 -#define GPUREG_0021 0x0021 -#define GPUREG_0022 0x0022 -#define GPUREG_0023 0x0023 -#define GPUREG_0024 0x0024 -#define GPUREG_0025 0x0025 -#define GPUREG_0026 0x0026 -#define GPUREG_0027 0x0027 -#define GPUREG_0028 0x0028 -#define GPUREG_0029 0x0029 -#define GPUREG_002A 0x002A -#define GPUREG_002B 0x002B -#define GPUREG_002C 0x002C -#define GPUREG_002D 0x002D -#define GPUREG_002E 0x002E -#define GPUREG_002F 0x002F -#define GPUREG_0030 0x0030 -#define GPUREG_0031 0x0031 -#define GPUREG_0032 0x0032 -#define GPUREG_0033 0x0033 -#define GPUREG_0034 0x0034 -#define GPUREG_0035 0x0035 -#define GPUREG_0036 0x0036 -#define GPUREG_0037 0x0037 -#define GPUREG_0038 0x0038 -#define GPUREG_0039 0x0039 -#define GPUREG_003A 0x003A -#define GPUREG_003B 0x003B -#define GPUREG_003C 0x003C -#define GPUREG_003D 0x003D -#define GPUREG_003E 0x003E -#define GPUREG_003F 0x003F -#define GPUREG_FACECULLING_CONFIG 0x0040 -#define GPUREG_0041 0x0041 -#define GPUREG_0042 0x0042 -#define GPUREG_0043 0x0043 -#define GPUREG_0044 0x0044 -#define GPUREG_0045 0x0045 -#define GPUREG_0046 0x0046 -#define GPUREG_0047 0x0047 -#define GPUREG_0048 0x0048 -#define GPUREG_0049 0x0049 -#define GPUREG_004A 0x004A -#define GPUREG_004B 0x004B -#define GPUREG_004C 0x004C -#define GPUREG_DEPTHRANGE_NEAR 0x004D -#define GPUREG_DEPTHRANGE_FAR 0x004E -#define GPUREG_SH_OUTMAP_TOTAL 0x004F -#define GPUREG_SH_OUTMAP_O0 0x0050 -#define GPUREG_SH_OUTMAP_O1 0x0051 -#define GPUREG_SH_OUTMAP_O2 0x0052 -#define GPUREG_SH_OUTMAP_O3 0x0053 -#define GPUREG_SH_OUTMAP_O4 0x0054 -#define GPUREG_SH_OUTMAP_O5 0x0055 -#define GPUREG_SH_OUTMAP_O6 0x0056 -#define GPUREG_0057 0x0057 -#define GPUREG_0058 0x0058 -#define GPUREG_0059 0x0059 -#define GPUREG_005A 0x005A -#define GPUREG_005B 0x005B -#define GPUREG_005C 0x005C -#define GPUREG_005D 0x005D -#define GPUREG_005E 0x005E -#define GPUREG_005F 0x005F -#define GPUREG_0060 0x0060 -#define GPUREG_0061 0x0061 -#define GPUREG_0062 0x0062 -#define GPUREG_0063 0x0063 -#define GPUREG_0064 0x0064 -#define GPUREG_SCISSORTEST_MODE 0x0065 -#define GPUREG_SCISSORTEST_POS 0x0066 -#define GPUREG_SCISSORTEST_DIM 0x0067 -#define GPUREG_0068 0x0068 -#define GPUREG_0069 0x0069 -#define GPUREG_006A 0x006A -#define GPUREG_006B 0x006B -#define GPUREG_006C 0x006C -#define GPUREG_006D 0x006D -#define GPUREG_006E 0x006E -#define GPUREG_006F 0x006F -#define GPUREG_0070 0x0070 -#define GPUREG_0071 0x0071 -#define GPUREG_0072 0x0072 -#define GPUREG_0073 0x0073 -#define GPUREG_0074 0x0074 -#define GPUREG_0075 0x0075 -#define GPUREG_0076 0x0076 -#define GPUREG_0077 0x0077 -#define GPUREG_0078 0x0078 -#define GPUREG_0079 0x0079 -#define GPUREG_007A 0x007A -#define GPUREG_007B 0x007B -#define GPUREG_007C 0x007C -#define GPUREG_007D 0x007D -#define GPUREG_007E 0x007E -#define GPUREG_007F 0x007F -#define GPUREG_TEXUNITS_CONFIG 0x0080 -#define GPUREG_0081 0x0081 -#define GPUREG_TEXUNIT0_DIM 0x0082 -#define GPUREG_TEXUNIT0_PARAM 0x0083 -#define GPUREG_0084 0x0084 -#define GPUREG_TEXUNIT0_LOC 0x0085 -#define GPUREG_0086 0x0086 -#define GPUREG_0087 0x0087 -#define GPUREG_0088 0x0088 -#define GPUREG_0089 0x0089 -#define GPUREG_008A 0x008A -#define GPUREG_008B 0x008B -#define GPUREG_008C 0x008C -#define GPUREG_008D 0x008D -#define GPUREG_TEXUNIT0_TYPE 0x008E -#define GPUREG_008F 0x008F -#define GPUREG_0090 0x0090 -#define GPUREG_0091 0x0091 -#define GPUREG_TEXUNIT1_DIM 0x0092 -#define GPUREG_TEXUNIT1_PARAM 0x0093 -#define GPUREG_0094 0x0094 -#define GPUREG_TEXUNIT1_LOC 0x0095 -#define GPUREG_TEXUNIT1_TYPE 0x0096 -#define GPUREG_0097 0x0097 -#define GPUREG_0098 0x0098 -#define GPUREG_0099 0x0099 -#define GPUREG_TEXUNIT2_DIM 0x009A -#define GPUREG_TEXUNIT2_PARAM 0x009B -#define GPUREG_009C 0x009C -#define GPUREG_TEXUNIT2_LOC 0x009D -#define GPUREG_TEXUNIT2_TYPE 0x009E -#define GPUREG_009F 0x009F -#define GPUREG_00A0 0x00A0 -#define GPUREG_00A1 0x00A1 -#define GPUREG_00A2 0x00A2 -#define GPUREG_00A3 0x00A3 -#define GPUREG_00A4 0x00A4 -#define GPUREG_00A5 0x00A5 -#define GPUREG_00A6 0x00A6 -#define GPUREG_00A7 0x00A7 -#define GPUREG_00A8 0x00A8 -#define GPUREG_00A9 0x00A9 -#define GPUREG_00AA 0x00AA -#define GPUREG_00AB 0x00AB -#define GPUREG_00AC 0x00AC -#define GPUREG_00AD 0x00AD -#define GPUREG_00AE 0x00AE -#define GPUREG_00AF 0x00AF -#define GPUREG_00B0 0x00B0 -#define GPUREG_00B1 0x00B1 -#define GPUREG_00B2 0x00B2 -#define GPUREG_00B3 0x00B3 -#define GPUREG_00B4 0x00B4 -#define GPUREG_00B5 0x00B5 -#define GPUREG_00B6 0x00B6 -#define GPUREG_00B7 0x00B7 -#define GPUREG_00B8 0x00B8 -#define GPUREG_00B9 0x00B9 -#define GPUREG_00BA 0x00BA -#define GPUREG_00BB 0x00BB -#define GPUREG_00BC 0x00BC -#define GPUREG_00BD 0x00BD -#define GPUREG_00BE 0x00BE -#define GPUREG_00BF 0x00BF -#define GPUREG_TEXENV0_CONFIG0 0x00C0 -#define GPUREG_TEXENV0_CONFIG1 0x00C1 -#define GPUREG_TEXENV0_CONFIG2 0x00C2 -#define GPUREG_TEXENV0_CONFIG3 0x00C3 -#define GPUREG_TEXENV0_CONFIG4 0x00C4 -#define GPUREG_00C5 0x00C5 -#define GPUREG_00C6 0x00C6 -#define GPUREG_00C7 0x00C7 -#define GPUREG_TEXENV1_CONFIG0 0x00C8 -#define GPUREG_TEXENV1_CONFIG1 0x00C9 -#define GPUREG_TEXENV1_CONFIG2 0x00CA -#define GPUREG_TEXENV1_CONFIG3 0x00CB -#define GPUREG_TEXENV1_CONFIG4 0x00CC -#define GPUREG_00CD 0x00CD -#define GPUREG_00CE 0x00CE -#define GPUREG_00CF 0x00CF -#define GPUREG_TEXENV2_CONFIG0 0x00D0 -#define GPUREG_TEXENV2_CONFIG1 0x00D1 -#define GPUREG_TEXENV2_CONFIG2 0x00D2 -#define GPUREG_TEXENV2_CONFIG3 0x00D3 -#define GPUREG_TEXENV2_CONFIG4 0x00D4 -#define GPUREG_00D5 0x00D5 -#define GPUREG_00D6 0x00D6 -#define GPUREG_00D7 0x00D7 -#define GPUREG_TEXENV3_CONFIG0 0x00D8 -#define GPUREG_TEXENV3_CONFIG1 0x00D9 -#define GPUREG_TEXENV3_CONFIG2 0x00DA -#define GPUREG_TEXENV3_CONFIG3 0x00DB -#define GPUREG_TEXENV3_CONFIG4 0x00DC -#define GPUREG_00DD 0x00DD -#define GPUREG_00DE 0x00DE -#define GPUREG_00DF 0x00DF -#define GPUREG_00E0 0x00E0 -#define GPUREG_00E1 0x00E1 -#define GPUREG_00E2 0x00E2 -#define GPUREG_00E3 0x00E3 -#define GPUREG_00E4 0x00E4 -#define GPUREG_00E5 0x00E5 -#define GPUREG_00E6 0x00E6 -#define GPUREG_00E7 0x00E7 -#define GPUREG_00E8 0x00E8 -#define GPUREG_00E9 0x00E9 -#define GPUREG_00EA 0x00EA -#define GPUREG_00EB 0x00EB -#define GPUREG_00EC 0x00EC -#define GPUREG_00ED 0x00ED -#define GPUREG_00EE 0x00EE -#define GPUREG_00EF 0x00EF -#define GPUREG_TEXENV4_CONFIG0 0x00F0 -#define GPUREG_TEXENV4_CONFIG1 0x00F1 -#define GPUREG_TEXENV4_CONFIG2 0x00F2 -#define GPUREG_TEXENV4_CONFIG3 0x00F3 -#define GPUREG_TEXENV4_CONFIG4 0x00F4 -#define GPUREG_00F5 0x00F5 -#define GPUREG_00F6 0x00F6 -#define GPUREG_00F7 0x00F7 -#define GPUREG_TEXENV5_CONFIG0 0x00F8 -#define GPUREG_TEXENV5_CONFIG1 0x00F9 -#define GPUREG_TEXENV5_CONFIG2 0x00FA -#define GPUREG_TEXENV5_CONFIG3 0x00FB -#define GPUREG_TEXENV5_CONFIG4 0x00FC -#define GPUREG_00FD 0x00FD -#define GPUREG_00FE 0x00FE -#define GPUREG_00FF 0x00FF -#define GPUREG_COLOROUTPUT_CONFIG 0x0100 -#define GPUREG_BLEND_CONFIG 0x0101 -#define GPUREG_COLORLOGICOP_CONFIG 0x0102 -#define GPUREG_BLEND_COLOR 0x0103 -#define GPUREG_ALPHATEST_CONFIG 0x0104 -#define GPUREG_STENCILTEST_CONFIG 0x0105 -#define GPUREG_STENCILOP_CONFIG 0x0106 -#define GPUREG_DEPTHTEST_CONFIG 0x0107 -#define GPUREG_0108 0x0108 -#define GPUREG_0109 0x0109 -#define GPUREG_010A 0x010A -#define GPUREG_010B 0x010B -#define GPUREG_010C 0x010C -#define GPUREG_010D 0x010D -#define GPUREG_010E 0x010E -#define GPUREG_010F 0x010F -#define GPUREG_0110 0x0110 -#define GPUREG_0111 0x0111 -#define GPUREG_0112 0x0112 -#define GPUREG_0113 0x0113 -#define GPUREG_0114 0x0114 -#define GPUREG_0115 0x0115 -#define GPUREG_DEPTHBUFFER_FORMAT 0x0116 -#define GPUREG_COLORBUFFER_FORMAT 0x0117 -#define GPUREG_0118 0x0118 -#define GPUREG_0119 0x0119 -#define GPUREG_011A 0x011A -#define GPUREG_011B 0x011B -#define GPUREG_DEPTHBUFFER_LOC 0x011C -#define GPUREG_COLORBUFFER_LOC 0x011D -#define GPUREG_OUTBUFFER_DIM 0x011E -#define GPUREG_011F 0x011F -#define GPUREG_0120 0x0120 -#define GPUREG_0121 0x0121 -#define GPUREG_0122 0x0122 -#define GPUREG_0123 0x0123 -#define GPUREG_0124 0x0124 -#define GPUREG_0125 0x0125 -#define GPUREG_0126 0x0126 -#define GPUREG_0127 0x0127 -#define GPUREG_0128 0x0128 -#define GPUREG_0129 0x0129 -#define GPUREG_012A 0x012A -#define GPUREG_012B 0x012B -#define GPUREG_012C 0x012C -#define GPUREG_012D 0x012D -#define GPUREG_012E 0x012E -#define GPUREG_012F 0x012F -#define GPUREG_0130 0x0130 -#define GPUREG_0131 0x0131 -#define GPUREG_0132 0x0132 -#define GPUREG_0133 0x0133 -#define GPUREG_0134 0x0134 -#define GPUREG_0135 0x0135 -#define GPUREG_0136 0x0136 -#define GPUREG_0137 0x0137 -#define GPUREG_0138 0x0138 -#define GPUREG_0139 0x0139 -#define GPUREG_013A 0x013A -#define GPUREG_013B 0x013B -#define GPUREG_013C 0x013C -#define GPUREG_013D 0x013D -#define GPUREG_013E 0x013E -#define GPUREG_013F 0x013F -#define GPUREG_0140 0x0140 -#define GPUREG_0141 0x0141 -#define GPUREG_0142 0x0142 -#define GPUREG_0143 0x0143 -#define GPUREG_0144 0x0144 -#define GPUREG_0145 0x0145 -#define GPUREG_0146 0x0146 -#define GPUREG_0147 0x0147 -#define GPUREG_0148 0x0148 -#define GPUREG_0149 0x0149 -#define GPUREG_014A 0x014A -#define GPUREG_014B 0x014B -#define GPUREG_014C 0x014C -#define GPUREG_014D 0x014D -#define GPUREG_014E 0x014E -#define GPUREG_014F 0x014F -#define GPUREG_0150 0x0150 -#define GPUREG_0151 0x0151 -#define GPUREG_0152 0x0152 -#define GPUREG_0153 0x0153 -#define GPUREG_0154 0x0154 -#define GPUREG_0155 0x0155 -#define GPUREG_0156 0x0156 -#define GPUREG_0157 0x0157 -#define GPUREG_0158 0x0158 -#define GPUREG_0159 0x0159 -#define GPUREG_015A 0x015A -#define GPUREG_015B 0x015B -#define GPUREG_015C 0x015C -#define GPUREG_015D 0x015D -#define GPUREG_015E 0x015E -#define GPUREG_015F 0x015F -#define GPUREG_0160 0x0160 -#define GPUREG_0161 0x0161 -#define GPUREG_0162 0x0162 -#define GPUREG_0163 0x0163 -#define GPUREG_0164 0x0164 -#define GPUREG_0165 0x0165 -#define GPUREG_0166 0x0166 -#define GPUREG_0167 0x0167 -#define GPUREG_0168 0x0168 -#define GPUREG_0169 0x0169 -#define GPUREG_016A 0x016A -#define GPUREG_016B 0x016B -#define GPUREG_016C 0x016C -#define GPUREG_016D 0x016D -#define GPUREG_016E 0x016E -#define GPUREG_016F 0x016F -#define GPUREG_0170 0x0170 -#define GPUREG_0171 0x0171 -#define GPUREG_0172 0x0172 -#define GPUREG_0173 0x0173 -#define GPUREG_0174 0x0174 -#define GPUREG_0175 0x0175 -#define GPUREG_0176 0x0176 -#define GPUREG_0177 0x0177 -#define GPUREG_0178 0x0178 -#define GPUREG_0179 0x0179 -#define GPUREG_017A 0x017A -#define GPUREG_017B 0x017B -#define GPUREG_017C 0x017C -#define GPUREG_017D 0x017D -#define GPUREG_017E 0x017E -#define GPUREG_017F 0x017F -#define GPUREG_0180 0x0180 -#define GPUREG_0181 0x0181 -#define GPUREG_0182 0x0182 -#define GPUREG_0183 0x0183 -#define GPUREG_0184 0x0184 -#define GPUREG_0185 0x0185 -#define GPUREG_0186 0x0186 -#define GPUREG_0187 0x0187 -#define GPUREG_0188 0x0188 -#define GPUREG_0189 0x0189 -#define GPUREG_018A 0x018A -#define GPUREG_018B 0x018B -#define GPUREG_018C 0x018C -#define GPUREG_018D 0x018D -#define GPUREG_018E 0x018E -#define GPUREG_018F 0x018F -#define GPUREG_0190 0x0190 -#define GPUREG_0191 0x0191 -#define GPUREG_0192 0x0192 -#define GPUREG_0193 0x0193 -#define GPUREG_0194 0x0194 -#define GPUREG_0195 0x0195 -#define GPUREG_0196 0x0196 -#define GPUREG_0197 0x0197 -#define GPUREG_0198 0x0198 -#define GPUREG_0199 0x0199 -#define GPUREG_019A 0x019A -#define GPUREG_019B 0x019B -#define GPUREG_019C 0x019C -#define GPUREG_019D 0x019D -#define GPUREG_019E 0x019E -#define GPUREG_019F 0x019F -#define GPUREG_01A0 0x01A0 -#define GPUREG_01A1 0x01A1 -#define GPUREG_01A2 0x01A2 -#define GPUREG_01A3 0x01A3 -#define GPUREG_01A4 0x01A4 -#define GPUREG_01A5 0x01A5 -#define GPUREG_01A6 0x01A6 -#define GPUREG_01A7 0x01A7 -#define GPUREG_01A8 0x01A8 -#define GPUREG_01A9 0x01A9 -#define GPUREG_01AA 0x01AA -#define GPUREG_01AB 0x01AB -#define GPUREG_01AC 0x01AC -#define GPUREG_01AD 0x01AD -#define GPUREG_01AE 0x01AE -#define GPUREG_01AF 0x01AF -#define GPUREG_01B0 0x01B0 -#define GPUREG_01B1 0x01B1 -#define GPUREG_01B2 0x01B2 -#define GPUREG_01B3 0x01B3 -#define GPUREG_01B4 0x01B4 -#define GPUREG_01B5 0x01B5 -#define GPUREG_01B6 0x01B6 -#define GPUREG_01B7 0x01B7 -#define GPUREG_01B8 0x01B8 -#define GPUREG_01B9 0x01B9 -#define GPUREG_01BA 0x01BA -#define GPUREG_01BB 0x01BB -#define GPUREG_01BC 0x01BC -#define GPUREG_01BD 0x01BD -#define GPUREG_01BE 0x01BE -#define GPUREG_01BF 0x01BF -#define GPUREG_01C0 0x01C0 -#define GPUREG_01C1 0x01C1 -#define GPUREG_01C2 0x01C2 -#define GPUREG_01C3 0x01C3 -#define GPUREG_01C4 0x01C4 -#define GPUREG_01C5 0x01C5 -#define GPUREG_01C6 0x01C6 -#define GPUREG_01C7 0x01C7 -#define GPUREG_01C8 0x01C8 -#define GPUREG_01C9 0x01C9 -#define GPUREG_01CA 0x01CA -#define GPUREG_01CB 0x01CB -#define GPUREG_01CC 0x01CC -#define GPUREG_01CD 0x01CD -#define GPUREG_01CE 0x01CE -#define GPUREG_01CF 0x01CF -#define GPUREG_01D0 0x01D0 -#define GPUREG_01D1 0x01D1 -#define GPUREG_01D2 0x01D2 -#define GPUREG_01D3 0x01D3 -#define GPUREG_01D4 0x01D4 -#define GPUREG_01D5 0x01D5 -#define GPUREG_01D6 0x01D6 -#define GPUREG_01D7 0x01D7 -#define GPUREG_01D8 0x01D8 -#define GPUREG_01D9 0x01D9 -#define GPUREG_01DA 0x01DA -#define GPUREG_01DB 0x01DB -#define GPUREG_01DC 0x01DC -#define GPUREG_01DD 0x01DD -#define GPUREG_01DE 0x01DE -#define GPUREG_01DF 0x01DF -#define GPUREG_01E0 0x01E0 -#define GPUREG_01E1 0x01E1 -#define GPUREG_01E2 0x01E2 -#define GPUREG_01E3 0x01E3 -#define GPUREG_01E4 0x01E4 -#define GPUREG_01E5 0x01E5 -#define GPUREG_01E6 0x01E6 -#define GPUREG_01E7 0x01E7 -#define GPUREG_01E8 0x01E8 -#define GPUREG_01E9 0x01E9 -#define GPUREG_01EA 0x01EA -#define GPUREG_01EB 0x01EB -#define GPUREG_01EC 0x01EC -#define GPUREG_01ED 0x01ED -#define GPUREG_01EE 0x01EE -#define GPUREG_01EF 0x01EF -#define GPUREG_01F0 0x01F0 -#define GPUREG_01F1 0x01F1 -#define GPUREG_01F2 0x01F2 -#define GPUREG_01F3 0x01F3 -#define GPUREG_01F4 0x01F4 -#define GPUREG_01F5 0x01F5 -#define GPUREG_01F6 0x01F6 -#define GPUREG_01F7 0x01F7 -#define GPUREG_01F8 0x01F8 -#define GPUREG_01F9 0x01F9 -#define GPUREG_01FA 0x01FA -#define GPUREG_01FB 0x01FB -#define GPUREG_01FC 0x01FC -#define GPUREG_01FD 0x01FD -#define GPUREG_01FE 0x01FE -#define GPUREG_01FF 0x01FF -#define pipeline 0xGeometry -#define GPUREG_ATTRIBBUFFERS_LOC 0x0200 -#define GPUREG_ATTRIBBUFFERS_FORMAT_LOW 0x0201 -#define GPUREG_ATTRIBBUFFERS_FORMAT_HIGH 0x0202 -#define GPUREG_ATTRIBBUFFER0_CONFIG0 0x0203 -#define GPUREG_ATTRIBBUFFER0_CONFIG1 0x0204 -#define GPUREG_ATTRIBBUFFER0_CONFIG2 0x0205 -#define GPUREG_ATTRIBBUFFER1_CONFIG0 0x0206 -#define GPUREG_ATTRIBBUFFER1_CONFIG1 0x0207 -#define GPUREG_ATTRIBBUFFER1_CONFIG2 0x0208 -#define GPUREG_ATTRIBBUFFER2_CONFIG0 0x0209 -#define GPUREG_ATTRIBBUFFER2_CONFIG1 0x020A -#define GPUREG_ATTRIBBUFFER2_CONFIG2 0x020B -#define GPUREG_ATTRIBBUFFER3_CONFIG0 0x020C -#define GPUREG_ATTRIBBUFFER3_CONFIG1 0x020D -#define GPUREG_ATTRIBBUFFER3_CONFIG2 0x020E -#define GPUREG_ATTRIBBUFFER4_CONFIG0 0x020F -#define GPUREG_ATTRIBBUFFER4_CONFIG1 0x0210 -#define GPUREG_ATTRIBBUFFER4_CONFIG2 0x0211 -#define GPUREG_ATTRIBBUFFER5_CONFIG0 0x0212 -#define GPUREG_ATTRIBBUFFER5_CONFIG1 0x0213 -#define GPUREG_ATTRIBBUFFER5_CONFIG2 0x0214 -#define GPUREG_ATTRIBBUFFER6_CONFIG0 0x0215 -#define GPUREG_ATTRIBBUFFER6_CONFIG1 0x0216 -#define GPUREG_ATTRIBBUFFER6_CONFIG2 0x0217 -#define GPUREG_ATTRIBBUFFER7_CONFIG0 0x0218 -#define GPUREG_ATTRIBBUFFER7_CONFIG1 0x0219 -#define GPUREG_ATTRIBBUFFER7_CONFIG2 0x021A -#define GPUREG_ATTRIBBUFFER8_CONFIG0 0x021B -#define GPUREG_ATTRIBBUFFER8_CONFIG1 0x021C -#define GPUREG_ATTRIBBUFFER8_CONFIG2 0x021D -#define GPUREG_ATTRIBBUFFER9_CONFIG0 0x021E -#define GPUREG_ATTRIBBUFFER9_CONFIG1 0x021F -#define GPUREG_ATTRIBBUFFER9_CONFIG2 0x0220 -#define GPUREG_ATTRIBBUFFERA_CONFIG0 0x0221 -#define GPUREG_ATTRIBBUFFERA_CONFIG1 0x0222 -#define GPUREG_ATTRIBBUFFERA_CONFIG2 0x0223 -#define GPUREG_ATTRIBBUFFERB_CONFIG0 0x0224 -#define GPUREG_ATTRIBBUFFERB_CONFIG1 0x0225 -#define GPUREG_ATTRIBBUFFERB_CONFIG2 0x0226 -#define GPUREG_INDEXBUFFER_CONFIG 0x0227 -#define GPUREG_NUMVERTICES 0x0228 -#define GPUREG_GEOSTAGE_CONFIG 0x0229 -#define GPUREG_022A 0x022A -#define GPUREG_022B 0x022B -#define GPUREG_022C 0x022C -#define GPUREG_022D 0x022D -#define GPUREG_DRAWARRAYS 0x022E -#define GPUREG_DRAWELEMENTS 0x022F -#define GPUREG_0230 0x0230 -#define GPUREG_0231 0x0231 -#define GPUREG_0232 0x0232 -#define GPUREG_0233 0x0233 -#define GPUREG_0234 0x0234 -#define GPUREG_0235 0x0235 -#define GPUREG_0236 0x0236 -#define GPUREG_0237 0x0237 -#define GPUREG_0238 0x0238 -#define GPUREG_0239 0x0239 -#define GPUREG_023A 0x023A -#define GPUREG_023B 0x023B -#define GPUREG_023C 0x023C -#define GPUREG_023D 0x023D -#define GPUREG_023E 0x023E -#define GPUREG_023F 0x023F -#define GPUREG_0240 0x0240 -#define GPUREG_0241 0x0241 -#define GPUREG_0242 0x0242 -#define GPUREG_0243 0x0243 -#define GPUREG_0244 0x0244 -#define GPUREG_0245 0x0245 -#define GPUREG_0246 0x0246 -#define GPUREG_0247 0x0247 -#define GPUREG_0248 0x0248 -#define GPUREG_0249 0x0249 -#define GPUREG_024A 0x024A -#define GPUREG_024B 0x024B -#define GPUREG_024C 0x024C -#define GPUREG_024D 0x024D -#define GPUREG_024E 0x024E -#define GPUREG_024F 0x024F -#define GPUREG_0250 0x0250 -#define GPUREG_0251 0x0251 -#define GPUREG_0252 0x0252 -#define GPUREG_0253 0x0253 -#define GPUREG_0254 0x0254 -#define GPUREG_0255 0x0255 -#define GPUREG_0256 0x0256 -#define GPUREG_0257 0x0257 -#define GPUREG_0258 0x0258 -#define GPUREG_0259 0x0259 -#define GPUREG_025A 0x025A -#define GPUREG_025B 0x025B -#define GPUREG_025C 0x025C -#define GPUREG_025D 0x025D -#define GPUREG_PRIMITIVE_CONFIG 0x025E -#define GPUREG_025F 0x025F -#define GPUREG_0260 0x0260 -#define GPUREG_0261 0x0261 -#define GPUREG_0262 0x0262 -#define GPUREG_0263 0x0263 -#define GPUREG_0264 0x0264 -#define GPUREG_0265 0x0265 -#define GPUREG_0266 0x0266 -#define GPUREG_0267 0x0267 -#define GPUREG_0268 0x0268 -#define GPUREG_0269 0x0269 -#define GPUREG_026A 0x026A -#define GPUREG_026B 0x026B -#define GPUREG_026C 0x026C -#define GPUREG_026D 0x026D -#define GPUREG_026E 0x026E -#define GPUREG_026F 0x026F -#define GPUREG_0270 0x0270 -#define GPUREG_0271 0x0271 -#define GPUREG_0272 0x0272 -#define GPUREG_0273 0x0273 -#define GPUREG_0274 0x0274 -#define GPUREG_0275 0x0275 -#define GPUREG_0276 0x0276 -#define GPUREG_0277 0x0277 -#define GPUREG_0278 0x0278 -#define GPUREG_0279 0x0279 -#define GPUREG_027A 0x027A -#define GPUREG_027B 0x027B -#define GPUREG_027C 0x027C -#define GPUREG_027D 0x027D -#define GPUREG_027E 0x027E -#define GPUREG_027F 0x027F -#define GPUREG_GSH_BOOLUNIFORM 0x0280 -#define GPUREG_GSH_INTUNIFORM_I0 0x0281 -#define GPUREG_GSH_INTUNIFORM_I1 0x0282 -#define GPUREG_GSH_INTUNIFORM_I2 0x0283 -#define GPUREG_GSH_INTUNIFORM_I3 0x0284 -#define GPUREG_0285 0x0285 -#define GPUREG_0286 0x0286 -#define GPUREG_0287 0x0287 -#define GPUREG_0288 0x0288 -#define GPUREG_GSH_INPUTBUFFER_CONFIG 0x0289 -#define GPUREG_GSH_ENTRYPOINT 0x028A -#define GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW 0x028B -#define GPUREG_GSH_ATTRIBUTES_PERMUTATION_HIGH 0x028C -#define GPUREG_GSH_OUTMAP_MASK 0x028D -#define GPUREG_028E 0x028E -#define GPUREG_GSH_CODETRANSFER_END 0x028F -#define GPUREG_GSH_FLOATUNIFORM_CONFIG 0x0290 -#define GPUREG_GSH_FLOATUNIFORM_DATA 0x0291 -#define GPUREG_0299 0x0299 -#define GPUREG_029A 0x029A -#define GPUREG_GSH_CODETRANSFER_CONFIG 0x029B -#define GPUREG_GSH_CODETRANSFER_DATA 0x029C -#define GPUREG_02A4 0x02A4 -#define GPUREG_GSH_OPDESCS_CONFIG 0x02A5 -#define GPUREG_GSH_OPDESCS_DATA 0x02A6 -#define GPUREG_02AE 0x02AE -#define GPUREG_02AF 0x02AF -#define GPUREG_VSH_BOOLUNIFORM 0x02B0 -#define GPUREG_VSH_INTUNIFORM_I0 0x02B1 -#define GPUREG_VSH_INTUNIFORM_I1 0x02B2 -#define GPUREG_VSH_INTUNIFORM_I2 0x02B3 -#define GPUREG_VSH_INTUNIFORM_I3 0x02B4 -#define GPUREG_02B5 0x02B5 -#define GPUREG_02B6 0x02B6 -#define GPUREG_02B7 0x02B7 -#define GPUREG_02B8 0x02B8 -#define GPUREG_VSH_INPUTBUFFER_CONFIG 0x02B9 -#define GPUREG_VSH_ENTRYPOINT 0x02BA -#define GPUREG_VSH_ATTRIBUTES_PERMUTATION_LOW 0x02BB -#define GPUREG_VSH_ATTRIBUTES_PERMUTATION_HIGH 0x02BC -#define GPUREG_VSH_OUTMAP_MASK 0x02BD -#define GPUREG_02BE 0x02BE -#define GPUREG_VSH_CODETRANSFER_END 0x02BF -#define GPUREG_VSH_FLOATUNIFORM_CONFIG 0x02C0 -#define GPUREG_VSH_FLOATUNIFORM_DATA 0x02C1 -#define GPUREG_02C9 0x02C9 -#define GPUREG_02CA 0x02CA -#define GPUREG_VSH_CODETRANSFER_CONFIG 0x02CB -#define GPUREG_VSH_CODETRANSFER_DATA 0x02CC -#define GPUREG_02D4 0x02D4 -#define GPUREG_VSH_OPDESCS_CONFIG 0x02D5 -#define GPUREG_VSH_OPDESCS_DATA 0x02D6 -#define GPUREG_02DE 0x02DE -#define GPUREG_02DF 0x02DF -#define GPUREG_02E0 0x02E0 -#define GPUREG_02E1 0x02E1 -#define GPUREG_02E2 0x02E2 -#define GPUREG_02E3 0x02E3 -#define GPUREG_02E4 0x02E4 -#define GPUREG_02E5 0x02E5 -#define GPUREG_02E6 0x02E6 -#define GPUREG_02E7 0x02E7 -#define GPUREG_02E8 0x02E8 -#define GPUREG_02E9 0x02E9 -#define GPUREG_02EA 0x02EA -#define GPUREG_02EB 0x02EB -#define GPUREG_02EC 0x02EC -#define GPUREG_02ED 0x02ED -#define GPUREG_02EE 0x02EE -#define GPUREG_02EF 0x02EF -#define GPUREG_02F0 0x02F0 -#define GPUREG_02F1 0x02F1 -#define GPUREG_02F2 0x02F2 -#define GPUREG_02F3 0x02F3 -#define GPUREG_02F4 0x02F4 -#define GPUREG_02F5 0x02F5 -#define GPUREG_02F6 0x02F6 -#define GPUREG_02F7 0x02F7 -#define GPUREG_02F8 0x02F8 -#define GPUREG_02F9 0x02F9 -#define GPUREG_02FA 0x02FA -#define GPUREG_02FB 0x02FB -#define GPUREG_02FC 0x02FC -#define GPUREG_02FD 0x02FD -#define GPUREG_02FE 0x02FE -#define GPUREG_02FF 0x02FF diff --git a/libctru/include/3ds/gpu/shdr.h b/libctru/include/3ds/gpu/shdr.h index 1a89ddb..02b5128 100644 --- a/libctru/include/3ds/gpu/shdr.h +++ b/libctru/include/3ds/gpu/shdr.h @@ -61,8 +61,8 @@ void SHDR_UseProgram(DVLB_s* dvlb, u8 id); void SHDR_FreeDVLB(DVLB_s* dvlb); s8 SHDR_GetUniformRegister(DVLB_s* dvlb, const char* name, u8 programID); -void DVLP_SendCode(DVLP_s* dvlp, SHDR_type type); -void DVLP_SendOpDesc(DVLP_s* dvlp, SHDR_type type); +void DVLP_SendCode(DVLP_s* dvlp); +void DVLP_SendOpDesc(DVLP_s* dvlp); void DVLE_SendOutmap(DVLE_s* dvle); void DVLE_SendConstants(DVLE_s* dvle); diff --git a/libctru/source/gpu/gpu.c b/libctru/source/gpu/gpu.c index 8e33bc8..ccde474 100644 --- a/libctru/source/gpu/gpu.c +++ b/libctru/source/gpu/gpu.c @@ -470,18 +470,23 @@ void GPU_SetTexEnv(u8 id, u16 rgbSources, u16 alphaSources, u16 rgbOperands, u16 void GPU_DrawArray(GPU_Primitive_t primitive, u32 n) { + // //? + // GPUCMD_AddSingleParam(0x00040080, 0x00010000); //set primitive type GPUCMD_AddSingleParam(0x0002025E, primitive); GPUCMD_AddSingleParam(0x0002025F, 0x00000001); + //index buffer not used for drawArrays but 0x000F0227 still required + GPUCMD_AddSingleParam(0x000F0227, 0x80000000); //pass number of vertices GPUCMD_AddSingleParam(0x000F0228, n); - //all the following except 0x000F022E might be useless GPUCMD_AddSingleParam(0x00010253, 0x00000001); + GPUCMD_AddSingleParam(0x00010245, 0x00000000); GPUCMD_AddSingleParam(0x000F022E, 0x00000001); GPUCMD_AddSingleParam(0x00010245, 0x00000001); GPUCMD_AddSingleParam(0x000F0231, 0x00000001); + GPUCMD_AddSingleParam(0x000F0111, 0x00000001); } diff --git a/libctru/source/gpu/shdr.c b/libctru/source/gpu/shdr.c index 350f603..47ac389 100644 --- a/libctru/source/gpu/shdr.c +++ b/libctru/source/gpu/shdr.c @@ -72,27 +72,23 @@ s8 SHDR_GetUniformRegister(DVLB_s* dvlb, const char* name, u8 programID) return -1; } -void DVLP_SendCode(DVLP_s* dvlp, SHDR_type type) +void DVLP_SendCode(DVLP_s* dvlp) { if(!dvlp)return; - u32 regOffset=(type==GEOMETRY_SHDR)?(-0x30):(0x0); - - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_CODETRANSFER_CONFIG)+regOffset, 0x00000000); + GPUCMD_AddSingleParam(0x000F02CB, 0x00000000); int i; - for(i=0;icodeSize;i+=0x80)GPUCMD_Add(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_CODETRANSFER_DATA)+regOffset, &dvlp->codeData[i], ((dvlp->codeSize-i)<0x80)?(dvlp->codeSize-i):0x80); + for(i=0;icodeSize;i+=0x80)GPUCMD_Add(0x000F02CC, &dvlp->codeData[i], ((dvlp->codeSize-i)<0x80)?(dvlp->codeSize-i):0x80); - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_CODETRANSFER_END)+regOffset, 0x00000001); + GPUCMD_AddSingleParam(0x000F02BF, 0x00000001); } -void DVLP_SendOpDesc(DVLP_s* dvlp, SHDR_type type) +void DVLP_SendOpDesc(DVLP_s* dvlp) { if(!dvlp)return; - u32 regOffset=(type==GEOMETRY_SHDR)?(-0x30):(0x0); - - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_OPDESCS_CONFIG)+regOffset, 0x00000000); + GPUCMD_AddSingleParam(0x000F02D5, 0x00000000); u32 param[0x20]; @@ -100,15 +96,13 @@ void DVLP_SendOpDesc(DVLP_s* dvlp, SHDR_type type) //TODO : should probably preprocess this for(i=0;iopdescSize;i++)param[i]=dvlp->opcdescData[i*2]; - GPUCMD_Add(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_OPDESCS_DATA)+regOffset, param, dvlp->opdescSize); + GPUCMD_Add(0x000F02D6, param, dvlp->opdescSize); } void DVLE_SendOutmap(DVLE_s* dvle) { if(!dvle)return; - u32 regOffset=(dvle->type==GEOMETRY_SHDR)?(-0x30):(0x0); - u32 param[0x7]={0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F, 0x1F1F1F1F,0x1F1F1F1F,0x1F1F1F1F}; @@ -138,20 +132,18 @@ void DVLE_SendOutmap(DVLE_s* dvle) if(dvle->outTableData[i].regID+1>maxAttr)maxAttr=dvle->outTableData[i].regID+1; } - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_0251), numAttr-1); //? - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_024A), numAttr-1); //? - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_OUTMAP_MASK)+regOffset, attrMask); - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0x1, GPUREG_PRIMITIVE_CONFIG), numAttr-1); - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_SH_OUTMAP_TOTAL), numAttr); - GPUCMD_Add(GPUCMD_HEADER(1, 0xF, GPUREG_SH_OUTMAP_O0), param, 0x00000007); + GPUCMD_AddSingleParam(0x000F0251, numAttr-1); //? + GPUCMD_AddSingleParam(0x000F024A, numAttr-1); //? + GPUCMD_AddSingleParam(0x000F02BD, attrMask); //? + GPUCMD_AddSingleParam(0x0001025E, numAttr-1); //? + GPUCMD_AddSingleParam(0x000F004F, numAttr); //? + GPUCMD_Add(0x800F0050, param, 0x00000007); } void DVLE_SendConstants(DVLE_s* dvle) { if(!dvle)return; - u32 regOffset=(dvle->type==GEOMETRY_SHDR)?(-0x30):(0x0); - u32 param[4]; u32 rev[3]; u8* rev8=(u8*)rev; @@ -170,7 +162,7 @@ void DVLE_SendConstants(DVLE_s* dvle) param[0x2]=rev[1]; param[0x3]=rev[0]; - GPUCMD_Add(GPUCMD_HEADER(1, 0xF, GPUREG_VSH_FLOATUNIFORM_CONFIG)+regOffset, param, 0x00000004); + GPUCMD_Add(0x800F02C0, param, 0x00000004); } } @@ -179,26 +171,24 @@ void SHDR_UseProgram(DVLB_s* dvlb, u8 id) if(!dvlb || id>dvlb->numDVLE)return; DVLE_s* dvle=&dvlb->DVLE[id]; - u32 regOffset=(dvlb->DVLE[id].type==GEOMETRY_SHDR)?(-0x30):(0x0); + //? + GPUCMD_AddSingleParam(0x00010229, 0x00000000); + GPUCMD_AddSingleParam(0x00010244, 0x00000000); - - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0x1, GPUREG_GEOSTAGE_CONFIG), 0x00000000); - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0x1, GPUREG_0244), (dvlb->DVLE[id].type==GEOMETRY_SHDR)?0x1:0x0); - - DVLP_SendCode(&dvlb->DVLP, dvlb->DVLE[id].type); - DVLP_SendOpDesc(&dvlb->DVLP, dvlb->DVLE[id].type); + DVLP_SendCode(&dvlb->DVLP); + DVLP_SendOpDesc(&dvlb->DVLP); DVLE_SendConstants(dvle); - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0x8, GPUREG_GEOSTAGE_CONFIG), 0x00000000); - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_VSH_ENTRYPOINT)-regOffset, 0x7FFF0000|(dvle->mainOffset&0xFFFF)); //set entrypoint + GPUCMD_AddSingleParam(0x00080229, 0x00000000); + GPUCMD_AddSingleParam(0x000F02BA, 0x7FFF0000|(dvle->mainOffset&0xFFFF)); //set entrypoint - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_0252), 0x00000000); // should all be part of DVLE_SendOutmap ? + GPUCMD_AddSingleParam(0x000F0252, 0x00000000); // should all be part of DVLE_SendOutmap ? DVLE_SendOutmap(dvle); //? - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_0064), 0x00000001); - GPUCMD_AddSingleParam(GPUCMD_HEADER(0, 0xF, GPUREG_006F), 0x00000703); + GPUCMD_AddSingleParam(0x000F0064, 0x00000001); + GPUCMD_AddSingleParam(0x000F006F, 0x00000703); } //TODO From 6aa30b4c3ee24c42d4d25c2cafdc007f9df3f56a Mon Sep 17 00:00:00 2001 From: fincs Date: Fri, 19 Dec 2014 19:47:10 +0100 Subject: [PATCH 42/61] Fix osGetTime(), this time for real (also: race condition fix by mtheall) --- libctru/source/os.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/libctru/source/os.c b/libctru/source/os.c index f622105..d0287ad 100644 --- a/libctru/source/os.c +++ b/libctru/source/os.c @@ -13,9 +13,9 @@ typedef struct { static volatile u32* __datetime_selector = (u32*) 0x1FF81000; -static volatile datetime_t* __datetime1 = +static volatile datetime_t* __datetime0 = (datetime_t*) 0x1FF81020; -static volatile datetime_t* __datetime2 = +static volatile datetime_t* __datetime1 = (datetime_t*) 0x1FF81040; @@ -41,19 +41,27 @@ u32 osConvertOldLINEARMemToNew(u32 vaddr) // Returns number of milliseconds since 1st Jan 1900 00:00. u64 osGetTime() { - volatile datetime_t* dt; + u32 s1, s2 = *__datetime_selector & 1; + datetime_t dt; - switch(*__datetime_selector & 1) { - case 0: - dt = __datetime1; - break; - case 1: - dt = __datetime2; - break; - } + do { + s1 = s2; + if(!s1) + dt = *__datetime0; + else + dt = *__datetime1; + s2 = *__datetime_selector & 1; + } while(s2 != s1); - u64 offset = (u32)((u32)(svcGetSystemTick() - dt->update_tick) / TICKS_PER_MSEC); - return dt->date_time + offset; + u64 delta = svcGetSystemTick() - dt.update_tick; + + // Work around the VFP not supporting 64-bit integer <--> floating point conversion + double temp = (u32)(delta >> 32); + temp *= 0x100000000ULL; + temp += (u32)delta; + + u32 offset = temp / TICKS_PER_MSEC; + return dt.date_time + offset; } u32 osGetFirmVersion() { From edf2c1c139aaf84bbfab55d838bdc2e568fe283c Mon Sep 17 00:00:00 2001 From: mtheall Date: Fri, 19 Dec 2014 23:38:30 -0600 Subject: [PATCH 43/61] Add gfxGetScreenFormat(). --- libctru/include/3ds/gfx.h | 1 + libctru/source/gfx.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/libctru/include/3ds/gfx.h b/libctru/include/3ds/gfx.h index 7d85eef..9cfcae0 100644 --- a/libctru/include/3ds/gfx.h +++ b/libctru/include/3ds/gfx.h @@ -25,6 +25,7 @@ void gfxExit(); //control stuff void gfxSet3D(bool enable); void gfxSetScreenFormat(gfxScreen_t screen, GSP_FramebufferFormats format); +GSP_FramebufferFormats gfxGetScreenFormat(gfxScreen_t screen); void gfxSetDoubleBuffering(gfxScreen_t screen, bool doubleBuffering); void gfxFlushBuffers(); void gfxSwapBuffers(); diff --git a/libctru/source/gfx.c b/libctru/source/gfx.c index 9b499ef..9c9aded 100644 --- a/libctru/source/gfx.c +++ b/libctru/source/gfx.c @@ -36,6 +36,13 @@ void gfxSetScreenFormat(gfxScreen_t screen, GSP_FramebufferFormats format) { botFormat = format; } +GSP_FramebufferFormats gfxGetScreenFormat(gfxScreen_t screen) { + if(screen==GFX_TOP) + return topFormat; + else + return botFormat; +} + void gfxSetDoubleBuffering( gfxScreen_t screen, bool doubleBuffering) { doubleBuf[screen] = doubleBuffering ? 1 : 0; // make sure they're the integer values '1' and '0' } From a58f2def09deb26eaa176293909573c1263208ba Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sun, 21 Dec 2014 03:13:15 +0000 Subject: [PATCH 44/61] set errno for file too big --- libctru/source/sdmc_dev.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libctru/source/sdmc_dev.c b/libctru/source/sdmc_dev.c index 085c574..c21b224 100644 --- a/libctru/source/sdmc_dev.c +++ b/libctru/source/sdmc_dev.c @@ -253,6 +253,8 @@ sdmc_open(struct _reent *r, r->_errno = rc; if(rc == 0x82044BE) r->_errno = EEXIST; + if(rc == 0x86044D2) + r->_errno = ENOSPC; return -1; } } From 1a72193dc57930051d61599be4f0ff8e03d5ba08 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Sun, 21 Dec 2014 01:02:23 -0500 Subject: [PATCH 45/61] Added qtm support + example. --- examples/qtm/Makefile | 175 +++++++++++++++++++++++++++++ examples/qtm/README.md | 6 + examples/qtm/source/main.c | 92 +++++++++++++++ libctru/include/3ds.h | 1 + libctru/include/3ds/services/qtm.h | 25 +++++ libctru/source/services/qtm.c | 87 ++++++++++++++ 6 files changed, 386 insertions(+) create mode 100644 examples/qtm/Makefile create mode 100644 examples/qtm/README.md create mode 100644 examples/qtm/source/main.c create mode 100644 libctru/include/3ds/services/qtm.h create mode 100644 libctru/source/services/qtm.c diff --git a/examples/qtm/Makefile b/examples/qtm/Makefile new file mode 100644 index 0000000..1ed1097 --- /dev/null +++ b/examples/qtm/Makefile @@ -0,0 +1,175 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITARM)/3ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# +# NO_SMDH: if set to anything, no SMDH file is generated. +# APP_TITLE is the name of the app stored in the SMDH file (Optional) +# APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional) +# APP_AUTHOR is the author of the app stored in the SMDH file (Optional) +# ICON is the filename of the icon (.png), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .png +# - icon.png +# - /default_icon.png +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=softfp + +CFLAGS := -g -Wall -O2 -mword-relocations \ + -fomit-frame-pointer -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM11 -D_3DS + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lctru -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.png) + ifneq (,$(findstring $(TARGET).png,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).png + else + ifneq (,$(findstring icon.png,$(icons))) + export APP_ICON := $(TOPDIR)/icon.png + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_SMDH)),) + export _3DSXFLAGS += --smdh=$(CURDIR)/$(TARGET).smdh +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +ifeq ($(strip $(NO_SMDH)),) +$(OUTPUT).3dsx : $(OUTPUT).elf $(OUTPUT).smdh +else +$(OUTPUT).3dsx : $(OUTPUT).elf +endif + +$(OUTPUT).elf : $(OFILES) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +# WARNING: This is not the right way to do this! TODO: Do it right! +#--------------------------------------------------------------------------------- +%.vsh.o : %.vsh +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @python $(AEMSTRO)/aemstro_as.py $< ../$(notdir $<).shbin + @bin2s ../$(notdir $<).shbin | $(PREFIX)as -o $@ + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u32" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(notdir $<).shbin | tr . _)`.h + @rm ../$(notdir $<).shbin + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/examples/qtm/README.md b/examples/qtm/README.md new file mode 100644 index 0000000..2ad4cc6 --- /dev/null +++ b/examples/qtm/README.md @@ -0,0 +1,6 @@ +# qtm + +This is an example for using New3DS QTM for head-tracking. + +This is currently not usable from the homebrew launcher. + diff --git a/examples/qtm/source/main.c b/examples/qtm/source/main.c new file mode 100644 index 0000000..5464a42 --- /dev/null +++ b/examples/qtm/source/main.c @@ -0,0 +1,92 @@ +#include +#include +#include <3ds.h> + +int main() +{ + u32 pos; + u32 x, y; + Result ret; + bool qtm_usable; + qtmHeadtrackingInfo qtminfo; + u32 colors[4] = {0x0000FF, 0x00FF00, 0xFF0000, 0xFFFFFF}; + + // Initialize services + srvInit(); + aptInit(); + hidInit(NULL); + gfxInit(); + //gfxSet3D(true); // uncomment if using stereoscopic 3D + + qtmInit(); + + consoleInit(GFX_BOTTOM, NULL); + + printf("qtm example\n"); + + qtm_usable = qtmCheckInitialized(); + if(!qtm_usable)printf("QTM is not usable, therefore this example won't do anything with QTM.\n"); + + // Main loop + while (aptMainLoop()) + { + gspWaitForVBlank(); + hidScanInput(); + + u32 kDown = hidKeysDown(); + if (kDown & KEY_START) + break; // break in order to return to hbmenu + + if(qtm_usable) + { + u8* fb = gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL); + memset(fb, 0, 400*240*3); + + ret = qtmGetHeadtrackingInfo(0, &qtminfo); + if(ret==0) + { + consoleClear(); + + for(pos=0; pos<5; pos++) + { + printf("flags[%x]=0x%x", (unsigned int)pos, qtminfo.flags[pos]); + if(pos<4)printf(", "); + } + + printf("\nfloatdata_x08: %f\n", qtminfo.floatdata_x08); + + printf("coords0: "); + for(pos=0; pos<4; pos++) + { + printf("[%x].x=%f, y=%f", (unsigned int)pos, qtminfo.coords0[pos].x, qtminfo.coords0[pos].y); + if(pos<3)printf(", "); + } + + printf("\n"); + + if(qtmCheckHeadFullyDetected(&qtminfo)) + { + for(pos=0; pos<4; pos++) + { + ret = qtmConvertCoordToScreen(&qtminfo.coords0[pos], NULL, NULL, &x, &y); + + if(ret==0)memcpy(&fb[(x*240 + y) * 3], &colors[pos], 3); + } + } + } + } + + // Flush and swap framebuffers + gfxFlushBuffers(); + gfxSwapBuffers(); + } + + // Exit services + qtmExit(); + gfxExit(); + hidExit(); + aptExit(); + srvExit(); + return 0; +} + diff --git a/libctru/include/3ds.h b/libctru/include/3ds.h index 7373406..3366a84 100644 --- a/libctru/include/3ds.h +++ b/libctru/include/3ds.h @@ -29,6 +29,7 @@ extern "C" { #include <3ds/services/soc.h> #include <3ds/services/mic.h> #include <3ds/services/mvd.h> +#include <3ds/services/qtm.h> #include <3ds/gpu/gx.h> #include <3ds/gpu/gpu.h> diff --git a/libctru/include/3ds/services/qtm.h b/libctru/include/3ds/services/qtm.h new file mode 100644 index 0000000..931195e --- /dev/null +++ b/libctru/include/3ds/services/qtm.h @@ -0,0 +1,25 @@ +#pragma once + +//See also: http://3dbrew.org/wiki/QTM_Services + +typedef struct { + float x; + float y; +} qtmHeadtrackingInfoCoord; + +typedef struct { + u8 flags[5]; + u8 padding[3]; + float floatdata_x08;//"not used by System_Settings." + qtmHeadtrackingInfoCoord coords0[4]; + u32 unk_x2c[5];//"Not used by System_Settings." +} qtmHeadtrackingInfo; + +Result qtmInit(); +void qtmExit(); +bool qtmCheckInitialized(); + +Result qtmGetHeadtrackingInfo(u64 val, qtmHeadtrackingInfo *out);//val is normally 0. +bool qtmCheckHeadFullyDetected(qtmHeadtrackingInfo *info); +Result qtmConvertCoordToScreen(qtmHeadtrackingInfoCoord *coord, float *screen_width, float *screen_height, u32 *x, u32 *y);//screen_* can be NULL to use the default values for the top-screen. + diff --git a/libctru/source/services/qtm.c b/libctru/source/services/qtm.c new file mode 100644 index 0000000..95a78e1 --- /dev/null +++ b/libctru/source/services/qtm.c @@ -0,0 +1,87 @@ +/* + qtm.c - New3DS head-tracking +*/ +#include +#include +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/qtm.h> + +Handle qtmHandle; + +static bool qtmInitialized = false; + +Result qtmInit() +{ + Result ret=0; + + if(qtmInitialized)return 0; + + if((ret=srvGetServiceHandle(&qtmHandle, "qtm:u")))return ret; + + qtmInitialized = true; + + return 0; +} + +void qtmExit() +{ + if(!qtmInitialized)return; + + svcCloseHandle(qtmHandle); + qtmInitialized = false; +} + +bool qtmCheckInitialized() +{ + return qtmInitialized; +} + +Result qtmGetHeadtrackingInfo(u64 val, qtmHeadtrackingInfo *out) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + if(!qtmInitialized)return -1; + + cmdbuf[0]=0x00020080; //request header code + memcpy(&cmdbuf[1], &val, 8); + + Result ret=0; + if((ret=svcSendSyncRequest(qtmHandle)))return ret; + + ret = (Result)cmdbuf[1]; + if(ret!=0)return ret; + + if(out)memcpy(out, &cmdbuf[2], sizeof(qtmHeadtrackingInfo)); + + return 0; +} + +bool qtmCheckHeadFullyDetected(qtmHeadtrackingInfo *info) +{ + if(info==NULL)return false; + + if(info->flags[0] && info->flags[1] && info->flags[2])return true; + return false; +} + +Result qtmConvertCoordToScreen(qtmHeadtrackingInfoCoord *coord, float *screen_width, float *screen_height, u32 *x, u32 *y) +{ + float width = 200.0f; + float height = 160.0f; + + if(coord==NULL || x==NULL || y==NULL)return -1; + + if(screen_width)width = (*screen_width) / 2; + if(screen_height)height = (*screen_height) / 2; + + if(coord->x > 1.0f || coord->x < -1.0f)return -2; + if(coord->y > 1.0f || coord->y < -1.0f)return -2; + + *x = (u32)((coord->x * width) + width); + *y = (u32)((coord->y * height) + height); + + return 0; +} + From 2c04f993d6c74a494f4f06198765b3cf1df832ce Mon Sep 17 00:00:00 2001 From: smea Date: Tue, 23 Dec 2014 20:47:00 -0800 Subject: [PATCH 46/61] added HB service support (ninjhax only) --- libctru/include/3ds.h | 1 + libctru/include/3ds/services/hb.h | 16 +++++++++++ libctru/source/services/hb.c | 48 +++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 libctru/include/3ds/services/hb.h create mode 100644 libctru/source/services/hb.c diff --git a/libctru/include/3ds.h b/libctru/include/3ds.h index 3366a84..1713255 100644 --- a/libctru/include/3ds.h +++ b/libctru/include/3ds.h @@ -30,6 +30,7 @@ extern "C" { #include <3ds/services/mic.h> #include <3ds/services/mvd.h> #include <3ds/services/qtm.h> +#include <3ds/services/hb.h> #include <3ds/gpu/gx.h> #include <3ds/gpu/gpu.h> diff --git a/libctru/include/3ds/services/hb.h b/libctru/include/3ds/services/hb.h new file mode 100644 index 0000000..4c9db57 --- /dev/null +++ b/libctru/include/3ds/services/hb.h @@ -0,0 +1,16 @@ +#ifndef HB_H +#define HB_H + +// 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 initHb FOR ERRORS + +#include <3ds/types.h> + +Result initHb(); +void exitHb(); + +Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv); +Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages); + +#endif diff --git a/libctru/source/services/hb.c b/libctru/source/services/hb.c new file mode 100644 index 0000000..8221a4e --- /dev/null +++ b/libctru/source/services/hb.c @@ -0,0 +1,48 @@ +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/services/hb.h> + +static Handle hbHandle; + +Result initHb() +{ + return srvGetServiceHandle(&hbHandle, "hb:HB"); +} + +void exitHb() +{ + svcCloseHandle(hbHandle); +} + +Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x00060000; + + if((ret = svcSendSyncRequest(hbHandle))!=0) 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] = 0x000900C0; + cmdbuf[1] = (u32)addr; + cmdbuf[2] = pages; + cmdbuf[3] = mode; + + if((ret = svcSendSyncRequest(hbHandle))!=0) return ret; + + if(reprotectedPages)*reprotectedPages=(u32)cmdbuf[2]; + + return (Result)cmdbuf[1]; +} From 8f9a2edd1a1f6462c9f658e682da61df55fadcea Mon Sep 17 00:00:00 2001 From: smea Date: Tue, 23 Dec 2014 21:05:55 -0800 Subject: [PATCH 47/61] additional HB stuff --- libctru/include/3ds/services/hb.h | 11 +++++++++++ libctru/source/services/hb.c | 15 +++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/libctru/include/3ds/services/hb.h b/libctru/include/3ds/services/hb.h index 4c9db57..e71dd0f 100644 --- a/libctru/include/3ds/services/hb.h +++ b/libctru/include/3ds/services/hb.h @@ -10,7 +10,18 @@ Result initHb(); void exitHb(); +// flushes/invalidates entire data/instruction cache +// can be useful when writing code to executable pages +Result HB_FlushInvalidateCache(void); + +// fetches the address for ninjhax bootloader addresses, useful for running 3dsx executables +// void (*callBootloader)(Handle hb, Handle file); +// void (*setArgs)(u32* src, u32 length); Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv); + +// 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 Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages); #endif diff --git a/libctru/source/services/hb.c b/libctru/source/services/hb.c index 8221a4e..cf21f07 100644 --- a/libctru/source/services/hb.c +++ b/libctru/source/services/hb.c @@ -15,6 +15,21 @@ void exitHb() svcCloseHandle(hbHandle); } +Result HB_FlushInvalidateCache(void) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x00010042; + cmdbuf[1] = 0x00000000; + cmdbuf[2] = 0x00000000; + cmdbuf[3] = 0xFFFF8001; + + if((ret = svcSendSyncRequest(hbHandle))!=0) return ret; + + return (Result)cmdbuf[1]; +} + Result HB_GetBootloaderAddresses(void** load3dsx, void** setArgv) { Result ret = 0; From 2c4e229370fe8232ecbf5599a1b55e31dadd8240 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Wed, 24 Dec 2014 19:32:18 +0000 Subject: [PATCH 48/61] move template to examples/templates/application --- {template => examples/templates/application}/Makefile | 0 examples/templates/application/README.md | 3 +++ {template => examples/templates/application}/source/main.c | 0 template/README.md | 3 --- 4 files changed, 3 insertions(+), 3 deletions(-) rename {template => examples/templates/application}/Makefile (100%) create mode 100644 examples/templates/application/README.md rename {template => examples/templates/application}/source/main.c (100%) delete mode 100644 template/README.md diff --git a/template/Makefile b/examples/templates/application/Makefile similarity index 100% rename from template/Makefile rename to examples/templates/application/Makefile diff --git a/examples/templates/application/README.md b/examples/templates/application/README.md new file mode 100644 index 0000000..8a43ac1 --- /dev/null +++ b/examples/templates/application/README.md @@ -0,0 +1,3 @@ +# template + +This is a template for starting new 3DS libctru projects. diff --git a/template/source/main.c b/examples/templates/application/source/main.c similarity index 100% rename from template/source/main.c rename to examples/templates/application/source/main.c diff --git a/template/README.md b/template/README.md deleted file mode 100644 index c10896a..0000000 --- a/template/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# template - -This is a template for starting new 3DS/ctrulib projects. From ced5424bd4adebc6d17e5911a7726406b1dc6926 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Wed, 24 Dec 2014 19:32:49 +0000 Subject: [PATCH 49/61] add library template --- examples/templates/library/Makefile | 121 ++++++++++++++++++ examples/templates/library/README.md | 3 + .../templates/library/include/templatelib.h | 6 + .../templates/library/source/templatelib.c | 6 + 4 files changed, 136 insertions(+) create mode 100644 examples/templates/library/Makefile create mode 100644 examples/templates/library/README.md create mode 100644 examples/templates/library/include/templatelib.h create mode 100644 examples/templates/library/source/templatelib.c diff --git a/examples/templates/library/Makefile b/examples/templates/library/Makefile new file mode 100644 index 0000000..2e8b155 --- /dev/null +++ b/examples/templates/library/Makefile @@ -0,0 +1,121 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +include $(DEVKITARM)/3ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +#--------------------------------------------------------------------------------- +TARGET := $(shell basename $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=softfp + +CFLAGS := -g -Wall -O2\ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM11 -D_3DS +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions + +ASFLAGS := -g $(ARCH) + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/lib/lib$(TARGET).a + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +lib: + @[ -d $@ ] || mkdir -p $@ + +$(BUILD): lib + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) lib + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT) : $(OFILES) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/examples/templates/library/README.md b/examples/templates/library/README.md new file mode 100644 index 0000000..8089b6e --- /dev/null +++ b/examples/templates/library/README.md @@ -0,0 +1,3 @@ +# template + +This is a template for starting new 3DS library projects. diff --git a/examples/templates/library/include/templatelib.h b/examples/templates/library/include/templatelib.h new file mode 100644 index 0000000..1d02448 --- /dev/null +++ b/examples/templates/library/include/templatelib.h @@ -0,0 +1,6 @@ +#ifndef _templatelib_h_ +#define _templatelib_h_ + +int myLibFunction(); + +#endif // _templatelib_h_ diff --git a/examples/templates/library/source/templatelib.c b/examples/templates/library/source/templatelib.c new file mode 100644 index 0000000..570d9e5 --- /dev/null +++ b/examples/templates/library/source/templatelib.c @@ -0,0 +1,6 @@ +int myLibFunction() { + + + return 42; + +} From 7f0d169c10154210b8767bd690e2b5a77fc19857 Mon Sep 17 00:00:00 2001 From: smea Date: Wed, 24 Dec 2014 21:06:09 -0800 Subject: [PATCH 50/61] fixed hb naming --- libctru/include/3ds/services/hb.h | 4 ++-- libctru/source/services/hb.c | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libctru/include/3ds/services/hb.h b/libctru/include/3ds/services/hb.h index e71dd0f..c575984 100644 --- a/libctru/include/3ds/services/hb.h +++ b/libctru/include/3ds/services/hb.h @@ -7,8 +7,8 @@ #include <3ds/types.h> -Result initHb(); -void exitHb(); +Result hbInit(); +void hbExit(); // flushes/invalidates entire data/instruction cache // can be useful when writing code to executable pages diff --git a/libctru/source/services/hb.c b/libctru/source/services/hb.c index cf21f07..96d5a03 100644 --- a/libctru/source/services/hb.c +++ b/libctru/source/services/hb.c @@ -5,12 +5,12 @@ static Handle hbHandle; -Result initHb() +Result hbInit() { return srvGetServiceHandle(&hbHandle, "hb:HB"); } -void exitHb() +void hbExit() { svcCloseHandle(hbHandle); } @@ -57,7 +57,11 @@ Result HB_ReprotectMemory(u32* addr, u32 pages, u32 mode, u32* reprotectedPages) if((ret = svcSendSyncRequest(hbHandle))!=0) return ret; - if(reprotectedPages)*reprotectedPages=(u32)cmdbuf[2]; + if(reprotectedPages) + { + if(!ret)*reprotectedPages=(u32)cmdbuf[2]; + else *reprotectedPages=0; + } return (Result)cmdbuf[1]; } From 766ee2c70317ea2e20c0a1bea8484fdb55d2051c Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Thu, 25 Dec 2014 10:50:38 +0000 Subject: [PATCH 51/61] split up sysyem initialisation and allow overriding --- libctru/Makefile | 4 +- libctru/source/initSystem.c | 119 -------------------------- libctru/source/system/allocateHeaps.c | 24 ++++++ libctru/source/system/ctru_exit.c | 37 ++++++++ libctru/source/system/initArgv.c | 48 +++++++++++ libctru/source/system/initSystem.c | 36 ++++++++ 6 files changed, 148 insertions(+), 120 deletions(-) delete mode 100644 libctru/source/initSystem.c create mode 100644 libctru/source/system/allocateHeaps.c create mode 100644 libctru/source/system/ctru_exit.c create mode 100644 libctru/source/system/initArgv.c create mode 100644 libctru/source/system/initSystem.c diff --git a/libctru/Makefile b/libctru/Makefile index 37ed8e8..5ee809b 100644 --- a/libctru/Makefile +++ b/libctru/Makefile @@ -29,7 +29,9 @@ SOURCES := source \ source/gpu \ source/services \ source/services/soc \ - source/util + source/util \ + source/system + DATA := data INCLUDES := include diff --git a/libctru/source/initSystem.c b/libctru/source/initSystem.c deleted file mode 100644 index 7d6c222..0000000 --- a/libctru/source/initSystem.c +++ /dev/null @@ -1,119 +0,0 @@ -#include -#include -#include <3ds/types.h> -#include <3ds/svc.h> - -// System globals we define here -int __system_argc; -char** __system_argv; -void (*__system_retAddr)(void); -u32 __linear_heap; - -// Data from _prm structure -extern void* __service_ptr; // used to detect if we're run from a homebrew launcher -extern u32 __heap_size, __linear_heap_size; -extern const char* __system_arglist; - -// newlib definitions we need -void __libc_init_array(void); -void __libc_fini_array(void); -extern char* fake_heap_start; -extern char* fake_heap_end; - -static void initArgv(); -static u32 heapBase; - -void __destroy_handle_list(void); - -void __attribute__((noreturn)) __ctru_exit(int rc) -{ - u32 tmp=0; - - // Run the global destructors - __libc_fini_array(); - - // TODO: APT exit goes here - - // Unmap the linear heap - svcControlMemory(&tmp, __linear_heap, 0x0, __linear_heap_size, MEMOP_FREE, 0x0); - - // Unmap the application heap - svcControlMemory(&tmp, heapBase, 0x0, __heap_size, MEMOP_FREE, 0x0); - - // Close some handles - __destroy_handle_list(); - - // Jump to the loader if it provided a callback - if (__system_retAddr) - __system_retAddr(); - - // Since above did not jump, end this process - svcExitProcess(); -} - -void initSystem(void (*retAddr)(void)) -{ - u32 tmp=0; - - // Register newlib exit() syscall - __syscalls.exit = __ctru_exit; - __system_retAddr = __service_ptr ? retAddr : NULL; - - // Allocate the application heap - heapBase = 0x08000000; - svcControlMemory(&tmp, heapBase, 0x0, __heap_size, MEMOP_ALLOC, 0x3); - - // Allocate the linear heap - svcControlMemory(&__linear_heap, 0x0, 0x0, __linear_heap_size, MEMOP_ALLOC_LINEAR, 0x3); - - // Set up newlib heap - fake_heap_start = (char*)heapBase; - fake_heap_end = fake_heap_start + __heap_size; - - // Build argc/argv if present - initArgv(); - - // TODO: APT init goes here - - // Run the global constructors - __libc_init_array(); -} - -void initArgv() -{ - int i; - const char* temp = __system_arglist; - - // Check if the argument list is present - if (!temp) - return; - - // Retrieve argc - __system_argc = *(u32*)temp; - temp += sizeof(u32); - - // Find the end of the argument data - for (i = 0; i < __system_argc; i ++) - { - for (; *temp; temp ++); - temp ++; - } - - // Reserve heap memory for argv data - u32 argSize = temp - __system_arglist - sizeof(u32); - __system_argv = (char**)fake_heap_start; - fake_heap_start += sizeof(char**)*(__system_argc + 1); - char* argCopy = fake_heap_start; - fake_heap_start += argSize; - - // Fill argv array - memcpy(argCopy, &__system_arglist[4], argSize); - temp = argCopy; - for (i = 0; i < __system_argc; i ++) - { - __system_argv[i] = (char*)temp; - for (; *temp; temp ++); - temp ++; - } - __system_argv[__system_argc] = NULL; -} diff --git a/libctru/source/system/allocateHeaps.c b/libctru/source/system/allocateHeaps.c new file mode 100644 index 0000000..1714a77 --- /dev/null +++ b/libctru/source/system/allocateHeaps.c @@ -0,0 +1,24 @@ +#include <3ds/types.h> +#include <3ds/svc.h> + +extern char* fake_heap_start; +extern char* fake_heap_end; +u32 __linear_heap; +u32 __heapBase; +extern u32 __heap_size, __linear_heap_size; + + +void __attribute__((weak)) __allocateHeaps() { + u32 tmp=0; + + // Allocate the application heap + __heapBase = 0x08000000; + svcControlMemory(&tmp, __heapBase, 0x0, __heap_size, MEMOP_ALLOC, 0x3); + + // Allocate the linear heap + svcControlMemory(&__linear_heap, 0x0, 0x0, __linear_heap_size, MEMOP_ALLOC_LINEAR, 0x3); + // Set up newlib heap + fake_heap_start = (char*)__heapBase; + fake_heap_end = fake_heap_start + __heap_size; + +} \ No newline at end of file diff --git a/libctru/source/system/ctru_exit.c b/libctru/source/system/ctru_exit.c new file mode 100644 index 0000000..9a86609 --- /dev/null +++ b/libctru/source/system/ctru_exit.c @@ -0,0 +1,37 @@ +#include <3ds/types.h> +#include <3ds/svc.h> + +extern u32 __linear_heap; +extern u32 __heapBase; +extern u32 __heap_size, __linear_heap_size; +extern void (*__system_retAddr)(void); + +void __destroy_handle_list(void); + +void __libc_fini_array(void); + +void __attribute__((weak)) __attribute__((noreturn)) __ctru_exit(int rc) +{ + u32 tmp=0; + + // Run the global destructors + __libc_fini_array(); + + // TODO: APT exit goes here + + // Unmap the linear heap + svcControlMemory(&tmp, __linear_heap, 0x0, __linear_heap_size, MEMOP_FREE, 0x0); + + // Unmap the application heap + svcControlMemory(&tmp, __heapBase, 0x0, __heap_size, MEMOP_FREE, 0x0); + + // Close some handles + __destroy_handle_list(); + + // Jump to the loader if it provided a callback + if (__system_retAddr) + __system_retAddr(); + + // Since above did not jump, end this process + svcExitProcess(); +} diff --git a/libctru/source/system/initArgv.c b/libctru/source/system/initArgv.c new file mode 100644 index 0000000..6fb12d8 --- /dev/null +++ b/libctru/source/system/initArgv.c @@ -0,0 +1,48 @@ +#include <3ds/types.h> + +// System globals we define here +int __system_argc; +char** __system_argv; +extern const char* __system_arglist; + +extern char* fake_heap_start; +extern char* fake_heap_end; + +void __system_initArgv() +{ + int i; + const char* temp = __system_arglist; + + // Check if the argument list is present + if (!temp) + return; + + // Retrieve argc + __system_argc = *(u32*)temp; + temp += sizeof(u32); + + // Find the end of the argument data + for (i = 0; i < __system_argc; i ++) + { + for (; *temp; temp ++); + temp ++; + } + + // Reserve heap memory for argv data + u32 argSize = temp - __system_arglist - sizeof(u32); + __system_argv = (char**)fake_heap_start; + fake_heap_start += sizeof(char**)*(__system_argc + 1); + char* argCopy = fake_heap_start; + fake_heap_start += argSize; + + // Fill argv array + memcpy(argCopy, &__system_arglist[4], argSize); + temp = argCopy; + for (i = 0; i < __system_argc; i ++) + { + __system_argv[i] = (char*)temp; + for (; *temp; temp ++); + temp ++; + } + __system_argv[__system_argc] = NULL; +} diff --git a/libctru/source/system/initSystem.c b/libctru/source/system/initSystem.c new file mode 100644 index 0000000..be5c118 --- /dev/null +++ b/libctru/source/system/initSystem.c @@ -0,0 +1,36 @@ +#include +#include +#include <3ds/types.h> +#include <3ds/svc.h> + +void (*__system_retAddr)(void); + +// Data from _prm structure +extern void* __service_ptr; // used to detect if we're run from a homebrew launcher + +void __system_allocateHeaps(); +void __system_initArgv(); + +// newlib definitions we need +void __libc_init_array(void); + + +void __ctru_exit(int rc); + +void __attribute__((weak)) initSystem(void (*retAddr)(void)) +{ + + // Register newlib exit() syscall + __syscalls.exit = __ctru_exit; + __system_retAddr = __service_ptr ? retAddr : NULL; + + __system_allocateHeaps(); + + // Build argc/argv if present + __system_initArgv(); + + // TODO: APT init goes here + + // Run the global constructors + __libc_init_array(); +} From b5cd5e10c80739560ad9c9d7b56a313732a13839 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Thu, 25 Dec 2014 10:52:52 +0000 Subject: [PATCH 52/61] include header for memcpy --- libctru/source/system/initArgv.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libctru/source/system/initArgv.c b/libctru/source/system/initArgv.c index 6fb12d8..0fae5dd 100644 --- a/libctru/source/system/initArgv.c +++ b/libctru/source/system/initArgv.c @@ -1,5 +1,7 @@ #include <3ds/types.h> +#include + // System globals we define here int __system_argc; char** __system_argv; From f6ec6850865a529d6fe17a13b3c959dc4aec5a63 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Thu, 25 Dec 2014 10:59:22 +0000 Subject: [PATCH 53/61] give function the right name --- libctru/source/system/allocateHeaps.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libctru/source/system/allocateHeaps.c b/libctru/source/system/allocateHeaps.c index 1714a77..4009f8e 100644 --- a/libctru/source/system/allocateHeaps.c +++ b/libctru/source/system/allocateHeaps.c @@ -8,7 +8,7 @@ u32 __heapBase; extern u32 __heap_size, __linear_heap_size; -void __attribute__((weak)) __allocateHeaps() { +void __attribute__((weak)) __system_allocateHeaps() { u32 tmp=0; // Allocate the application heap From 78b94b4eeac38f273f6e54ef86e038725086b65a Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Thu, 25 Dec 2014 23:27:36 +0000 Subject: [PATCH 54/61] auto initialise commonly used services, prevent double initialisation --- libctru/source/sdmc_dev.c | 11 +++++++++-- libctru/source/services/apt.c | 8 ++++++++ libctru/source/services/fs.c | 13 ++++++++++++- libctru/source/services/hid.c | 7 ++++++- libctru/source/srv.c | 3 +++ libctru/source/system/appExit.c | 17 +++++++++++++++++ libctru/source/system/appInit.c | 17 +++++++++++++++++ libctru/source/system/ctru_exit.c | 3 ++- libctru/source/system/initSystem.c | 3 ++- 9 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 libctru/source/system/appExit.c create mode 100644 libctru/source/system/appInit.c diff --git a/libctru/source/sdmc_dev.c b/libctru/source/sdmc_dev.c index c21b224..d9604b0 100644 --- a/libctru/source/sdmc_dev.c +++ b/libctru/source/sdmc_dev.c @@ -130,11 +130,14 @@ static const char *sdmc_fixpath(const char *path) extern int __system_argc; extern char** __system_argv; +static bool sdmcInitialised = false; + /*! Initialize SDMC device */ Result sdmcInit(void) { - Result rc; + Result rc = 0; + if (sdmcInitialised) return rc; rc = FSUSER_OpenArchive(NULL, &sdmcArchive); @@ -161,13 +164,17 @@ Result sdmcInit(void) } } + sdmcInitialised = true; + return rc; } /*! Clean up SDMC device */ Result sdmcExit(void) { - Result rc; + Result rc = 0; + + if (!sdmcInitialised) return rc; rc = FSUSER_CloseArchive(NULL, &sdmcArchive); if(rc == 0) diff --git a/libctru/source/services/apt.c b/libctru/source/services/apt.c index c6ea5f0..d4bdd1c 100644 --- a/libctru/source/services/apt.c +++ b/libctru/source/services/apt.c @@ -410,10 +410,14 @@ void aptEventHandler(u32 arg) svcExitThread(); } +static bool aptInitialised = false; + Result aptInit(void) { Result ret=0; + if (aptInitialised) return ret; + // Initialize APT stuff, escape load screen. ret = __apt_initservicehandle(); if(ret!=0)return ret; @@ -445,11 +449,15 @@ Result aptInit(void) } else aptAppStarted(); + aptInitialised = true; + return 0; } void aptExit() { + if (!aptInitialised) return; + if(!(__system_runflags&RUNFLAG_APTWORKAROUND))aptAppletUtility_Exit_RetToApp(0); // This is only executed when application-termination was triggered via the home-menu power-off screen. diff --git a/libctru/source/services/fs.c b/libctru/source/services/fs.c index cec30d1..d7fe22e 100644 --- a/libctru/source/services/fs.c +++ b/libctru/source/services/fs.c @@ -37,12 +37,21 @@ FS_makePath(FS_pathType type, * * @returns error */ + +static bool fsInitialised = false; + Result fsInit(void) { - Result ret; + Result ret = 0; + + if (fsInitialised) return ret; + if((ret=srvGetServiceHandle(&fsuHandle, "fs:USER"))!=0)return ret; if(__get_handle_from_list("fs:USER")==0)ret=FSUSER_Initialize(NULL); + + fsInitialised = true; + return ret; } @@ -53,6 +62,8 @@ fsInit(void) Result fsExit(void) { + if (!fsInitialised) return 0; + return svcCloseHandle(fsuHandle); } diff --git a/libctru/source/services/hid.c b/libctru/source/services/hid.c index a66a4fd..54657da 100644 --- a/libctru/source/services/hid.c +++ b/libctru/source/services/hid.c @@ -23,13 +23,16 @@ static circlePosition cPos; static accelVector aVec; static angularRate gRate; +static bool hidInitialised; Result hidInit(u32* sharedMem) { u8 val=0; + Result ret=0; + + if(hidInitialised) return ret; if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT; - Result ret=0; // Request service. if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret; @@ -61,6 +64,8 @@ cleanup1: void hidExit() { + if(!hidInitialised) return; + // Unmap HID sharedmem and close handles. u8 val=0; int i; for(i=0; i<5; i++)svcCloseHandle(hidEvents[i]); diff --git a/libctru/source/srv.c b/libctru/source/srv.c index 8f9d524..366eca6 100644 --- a/libctru/source/srv.c +++ b/libctru/source/srv.c @@ -72,10 +72,13 @@ void __destroy_handle_list(void) { __service_ptr->num = 0; } + Result srvInit() { Result rc = 0; + if(g_srv_handle != 0) return rc; + if((rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc; if((rc = srvRegisterClient())) { diff --git a/libctru/source/system/appExit.c b/libctru/source/system/appExit.c new file mode 100644 index 0000000..d2e9d48 --- /dev/null +++ b/libctru/source/system/appExit.c @@ -0,0 +1,17 @@ +#include <3ds/types.h> +#include <3ds/srv.h> +#include <3ds/gfx.h> +#include <3ds/sdmc.h> +#include <3ds/services/apt.h> +#include <3ds/services/fs.h> +#include <3ds/services/hid.h> + +void __attribute__((weak)) __appExit() { + // Exit services + sdmcExit(); + fsExit(); + + hidExit(); + aptExit(); + srvExit(); +} diff --git a/libctru/source/system/appInit.c b/libctru/source/system/appInit.c new file mode 100644 index 0000000..ac90ae6 --- /dev/null +++ b/libctru/source/system/appInit.c @@ -0,0 +1,17 @@ +#include <3ds/types.h> +#include <3ds/srv.h> +#include <3ds/gfx.h> +#include <3ds/sdmc.h> +#include <3ds/services/apt.h> +#include <3ds/services/fs.h> +#include <3ds/services/hid.h> + +void __attribute__((weak)) __appInit() { + // Initialize services + srvInit(); + aptInit(); + hidInit(NULL); + + fsInit(); + sdmcInit(); +} diff --git a/libctru/source/system/ctru_exit.c b/libctru/source/system/ctru_exit.c index 9a86609..058ea7c 100644 --- a/libctru/source/system/ctru_exit.c +++ b/libctru/source/system/ctru_exit.c @@ -7,6 +7,7 @@ extern u32 __heap_size, __linear_heap_size; extern void (*__system_retAddr)(void); void __destroy_handle_list(void); +void __appExit(); void __libc_fini_array(void); @@ -17,7 +18,7 @@ void __attribute__((weak)) __attribute__((noreturn)) __ctru_exit(int rc) // Run the global destructors __libc_fini_array(); - // TODO: APT exit goes here + __appExit(); // Unmap the linear heap svcControlMemory(&tmp, __linear_heap, 0x0, __linear_heap_size, MEMOP_FREE, 0x0); diff --git a/libctru/source/system/initSystem.c b/libctru/source/system/initSystem.c index be5c118..080d125 100644 --- a/libctru/source/system/initSystem.c +++ b/libctru/source/system/initSystem.c @@ -10,6 +10,7 @@ extern void* __service_ptr; // used to detect if we're run from a homebrew launc void __system_allocateHeaps(); void __system_initArgv(); +void __appInit(); // newlib definitions we need void __libc_init_array(void); @@ -29,7 +30,7 @@ void __attribute__((weak)) initSystem(void (*retAddr)(void)) // Build argc/argv if present __system_initArgv(); - // TODO: APT init goes here + __appInit(); // Run the global constructors __libc_init_array(); From 0f8a756276a82515688638a3a3ad37c8b52d193a Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 26 Dec 2014 00:57:54 +0000 Subject: [PATCH 55/61] put data in C file where it belongs --- examples/sdmc/source/costable.c | 50 +++++++++++++++++++++++++++++++++ examples/sdmc/source/costable.h | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 examples/sdmc/source/costable.c diff --git a/examples/sdmc/source/costable.c b/examples/sdmc/source/costable.c new file mode 100644 index 0000000..7788b2d --- /dev/null +++ b/examples/sdmc/source/costable.c @@ -0,0 +1,50 @@ +#include <3ds/types.h> + +s32 costable[] = { 4096, 4095, 4094, 4093, 4091, 4088, 4084, 4080, 4076, 4071, 4065, + 4058, 4051, 4044, 4035, 4026, 4017, 4007, 3996, 3985, 3973, 3960, + 3947, 3934, 3919, 3904, 3889, 3873, 3856, 3839, 3821, 3803, 3784, + 3765, 3744, 3724, 3703, 3681, 3659, 3636, 3612, 3588, 3564, 3539, + 3513, 3487, 3461, 3434, 3406, 3378, 3349, 3320, 3290, 3260, 3229, + 3198, 3167, 3135, 3102, 3069, 3035, 3002, 2967, 2932, 2897, 2861, + 2825, 2788, 2751, 2714, 2676, 2638, 2599, 2560, 2521, 2481, 2441, + 2401, 2360, 2318, 2277, 2235, 2193, 2150, 2107, 2064, 2020, 1976, + 1932, 1888, 1843, 1798, 1753, 1707, 1662, 1616, 1569, 1523, 1476, + 1429, 1382, 1334, 1287, 1239, 1191, 1143, 1095, 1046, 997, 949, + 900, 851, 801, 752, 703, 653, 603, 554, 504, 454, 404, 354, 304, + 254, 204, 153, 103, 53, 3, -46, -97, -147, -197, -247, -297, -347, + -398, -448, -497, -547, -597, -647, -696, -746, -795, -844, -893, + -942, -991, -1040, -1088, -1137, -1185, -1233, -1281, -1328, -1376, + -1423, -1470, -1517, -1563, -1610, -1656, -1701, -1747, -1792, -1837, + -1882, -1927, -1971, -2015, -2058, -2102, -2144, -2187, -2229, -2271, + -2313, -2354, -2395, -2436, -2476, -2516, -2555, -2594, -2633, -2671, + -2709, -2747, -2784, -2820, -2857, -2892, -2928, -2963, -2997, -3031, + -3065, -3098, -3130, -3163, -3194, -3225, -3256, -3286, -3316, -3345, + -3374, -3402, -3430, -3457, -3484, -3510, -3536, -3561, -3585, -3609, + -3633, -3656, -3678, -3700, -3721, -3742, -3762, -3782, -3801, -3819, + -3837, -3854, -3871, -3887, -3902, -3917, -3932, -3946, -3959, -3971, + -3983, -3995, -4005, -4016, -4025, -4034, -4042, -4050, -4057, -4064, + -4070, -4075, -4080, -4084, -4087, -4090, -4092, -4094, -4095, -4095, + -4095, -4094, -4093, -4091, -4088, -4085, -4081, -4076, -4071, -4066, + -4059, -4052, -4045, -4036, -4028, -4018, -4008, -3997, -3986, -3974, + -3962, -3949, -3935, -3921, -3906, -3891, -3875, -3858, -3841, -3824, + -3805, -3787, -3767, -3747, -3727, -3705, -3684, -3662, -3639, -3615, + -3592, -3567, -3542, -3517, -3491, -3464, -3437, -3409, -3381, -3353, + -3324, -3294, -3264, -3233, -3202, -3171, -3139, -3106, -3073, -3040, + -3006, -2972, -2937, -2902, -2866, -2830, -2793, -2756, -2719, -2681, + -2643, -2604, -2565, -2526, -2486, -2446, -2406, -2365, -2324, -2282, + -2240, -2198, -2156, -2113, -2069, -2026, -1982, -1938, -1894, -1849, + -1804, -1759, -1713, -1668, -1622, -1575, -1529, -1482, -1435, -1388, + -1341, -1293, -1245, -1197, -1149, -1101, -1052, -1004, -955, -906, + -857, -808, -758, -709, -660, -610, -560, -510, -460, -411, -360, + -310, -260, -210, -160, -110, -60, -9, 40, 90, 140, 191, 241, 291, + 341, 391, 441, 491, 541, 591, 640, 690, 739, 789, 838, 887, 936, + 985, 1033, 1082, 1130, 1179, 1227, 1274, 1322, 1370, 1417, 1464, + 1511, 1557, 1604, 1650, 1695, 1741, 1786, 1831, 1876, 1921, 1965, + 2009, 2053, 2096, 2139, 2182, 2224, 2266, 2308, 2349, 2390, 2431, + 2471, 2511, 2550, 2589, 2628, 2666, 2704, 2742, 2779, 2816, 2852, + 2888, 2923, 2958, 2993, 3027, 3060, 3093, 3126, 3158, 3190, 3221, + 3252, 3282, 3312, 3342, 3370, 3399, 3426, 3454, 3480, 3507, 3532, + 3557, 3582, 3606, 3630, 3653, 3675, 3697, 3718, 3739, 3759, 3779, + 3798, 3817, 3835, 3852, 3869, 3885, 3900, 3915, 3930, 3944, 3957, + 3970, 3982, 3993, 4004, 4014, 4024, 4033, 4041, 4049, 4056, 4063, + 4069, 4074, 4079, 4083, 4087, 4090, 4092, 4094, 4095}; diff --git a/examples/sdmc/source/costable.h b/examples/sdmc/source/costable.h index 1c9b8ec..f53eb36 100644 --- a/examples/sdmc/source/costable.h +++ b/examples/sdmc/source/costable.h @@ -1,6 +1,6 @@ #ifndef COSTABLE_H #define COSTABLE_H -s32 costable[] = {4096, 4095, 4094, 4093, 4091, 4088, 4084, 4080, 4076, 4071, 4065, 4058, 4051, 4044, 4035, 4026, 4017, 4007, 3996, 3985, 3973, 3960, 3947, 3934, 3919, 3904, 3889, 3873, 3856, 3839, 3821, 3803, 3784, 3765, 3744, 3724, 3703, 3681, 3659, 3636, 3612, 3588, 3564, 3539, 3513, 3487, 3461, 3434, 3406, 3378, 3349, 3320, 3290, 3260, 3229, 3198, 3167, 3135, 3102, 3069, 3035, 3002, 2967, 2932, 2897, 2861, 2825, 2788, 2751, 2714, 2676, 2638, 2599, 2560, 2521, 2481, 2441, 2401, 2360, 2318, 2277, 2235, 2193, 2150, 2107, 2064, 2020, 1976, 1932, 1888, 1843, 1798, 1753, 1707, 1662, 1616, 1569, 1523, 1476, 1429, 1382, 1334, 1287, 1239, 1191, 1143, 1095, 1046, 997, 949, 900, 851, 801, 752, 703, 653, 603, 554, 504, 454, 404, 354, 304, 254, 204, 153, 103, 53, 3, -46, -97, -147, -197, -247, -297, -347, -398, -448, -497, -547, -597, -647, -696, -746, -795, -844, -893, -942, -991, -1040, -1088, -1137, -1185, -1233, -1281, -1328, -1376, -1423, -1470, -1517, -1563, -1610, -1656, -1701, -1747, -1792, -1837, -1882, -1927, -1971, -2015, -2058, -2102, -2144, -2187, -2229, -2271, -2313, -2354, -2395, -2436, -2476, -2516, -2555, -2594, -2633, -2671, -2709, -2747, -2784, -2820, -2857, -2892, -2928, -2963, -2997, -3031, -3065, -3098, -3130, -3163, -3194, -3225, -3256, -3286, -3316, -3345, -3374, -3402, -3430, -3457, -3484, -3510, -3536, -3561, -3585, -3609, -3633, -3656, -3678, -3700, -3721, -3742, -3762, -3782, -3801, -3819, -3837, -3854, -3871, -3887, -3902, -3917, -3932, -3946, -3959, -3971, -3983, -3995, -4005, -4016, -4025, -4034, -4042, -4050, -4057, -4064, -4070, -4075, -4080, -4084, -4087, -4090, -4092, -4094, -4095, -4095, -4095, -4094, -4093, -4091, -4088, -4085, -4081, -4076, -4071, -4066, -4059, -4052, -4045, -4036, -4028, -4018, -4008, -3997, -3986, -3974, -3962, -3949, -3935, -3921, -3906, -3891, -3875, -3858, -3841, -3824, -3805, -3787, -3767, -3747, -3727, -3705, -3684, -3662, -3639, -3615, -3592, -3567, -3542, -3517, -3491, -3464, -3437, -3409, -3381, -3353, -3324, -3294, -3264, -3233, -3202, -3171, -3139, -3106, -3073, -3040, -3006, -2972, -2937, -2902, -2866, -2830, -2793, -2756, -2719, -2681, -2643, -2604, -2565, -2526, -2486, -2446, -2406, -2365, -2324, -2282, -2240, -2198, -2156, -2113, -2069, -2026, -1982, -1938, -1894, -1849, -1804, -1759, -1713, -1668, -1622, -1575, -1529, -1482, -1435, -1388, -1341, -1293, -1245, -1197, -1149, -1101, -1052, -1004, -955, -906, -857, -808, -758, -709, -660, -610, -560, -510, -460, -411, -360, -310, -260, -210, -160, -110, -60, -9, 40, 90, 140, 191, 241, 291, 341, 391, 441, 491, 541, 591, 640, 690, 739, 789, 838, 887, 936, 985, 1033, 1082, 1130, 1179, 1227, 1274, 1322, 1370, 1417, 1464, 1511, 1557, 1604, 1650, 1695, 1741, 1786, 1831, 1876, 1921, 1965, 2009, 2053, 2096, 2139, 2182, 2224, 2266, 2308, 2349, 2390, 2431, 2471, 2511, 2550, 2589, 2628, 2666, 2704, 2742, 2779, 2816, 2852, 2888, 2923, 2958, 2993, 3027, 3060, 3093, 3126, 3158, 3190, 3221, 3252, 3282, 3312, 3342, 3370, 3399, 3426, 3454, 3480, 3507, 3532, 3557, 3582, 3606, 3630, 3653, 3675, 3697, 3718, 3739, 3759, 3779, 3798, 3817, 3835, 3852, 3869, 3885, 3900, 3915, 3930, 3944, 3957, 3970, 3982, 3993, 4004, 4014, 4024, 4033, 4041, 4049, 4056, 4063, 4069, 4074, 4079, 4083, 4087, 4090, 4092, 4094, 4095}; +extern s32 costable[]; #endif From b0b125cc20bbce9eba0a58ff8945523362a19d60 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Fri, 26 Dec 2014 01:11:13 +0000 Subject: [PATCH 56/61] use stdio and malloc --- examples/sdmc/README.md | 3 +-- examples/sdmc/source/main.c | 54 +++++++++++++++---------------------- 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/examples/sdmc/README.md b/examples/sdmc/README.md index 69ab596..4658c41 100644 --- a/examples/sdmc/README.md +++ b/examples/sdmc/README.md @@ -1,6 +1,5 @@ sdmc ======= -very simple example of how to access SD files with ctrulib; requires proper exheader flags for direct SDMC access. +very simple example of how to access SD files with libctru; -**WARNING/TODO**: THIS EXAMPLE IS OUTDATED AND NEEDS TO BE FIXED - PLEASE DO NOT LOOK AT IT UNTIL IT IS UPDATED diff --git a/examples/sdmc/source/main.c b/examples/sdmc/source/main.c index c65292f..b946f0a 100644 --- a/examples/sdmc/source/main.c +++ b/examples/sdmc/source/main.c @@ -3,9 +3,11 @@ /////////////////////////////////////// //this example shows you how to load a binary image file from the SD card and display it on the lower screen -//for this to work you should copy test.bin to the root of your SD card +//for this to work you should copy test.bin to same folder as your .3dsx //this file was generated with GIMP by saving a 240x320 image to raw RGB #include +#include +#include #include <3ds.h> #include "costable.h" @@ -42,42 +44,33 @@ void renderEffect() int main(int argc, char** argv) { - //initialize the services we're going to be using - srvInit(); //needed for everything - aptInit(); //needed for everything - hidInit(NULL); //needed for input + gfxInit(); //makes displaying to screen easier - fsInit(); //needed for filesystem stuff - u64 size; - u32 bytesRead; - Handle fileHandle; - //setup SDMC archive - FS_archive sdmcArchive=(FS_archive){ARCH_SDMC, (FS_path){PATH_EMPTY, 1, (u8*)""}}; - //create file path struct (note : FS_makePath actually only supports PATH_CHAR, it will change in the future) - FS_path filePath=FS_makePath(PATH_CHAR, "/test.bin"); + FILE *file = fopen("test.bin","rb"); + if (file == NULL) goto exit; - //open file - Result ret=FSUSER_OpenFileDirectly(NULL, &fileHandle, sdmcArchive, filePath, FS_OPEN_READ, FS_ATTRIBUTE_NONE); - //check for errors : exit if there is one - if(ret)goto exit; + // seek to end of file + fseek(file,0,SEEK_END); - //get file size - ret=FSFILE_GetSize(fileHandle, &size); - if(ret)goto exit; + // file pointer tells us the size + off_t size = ftell(file); - //allocate a buffer on linear heap (could just be a malloc fwiw) - buffer=linearAlloc(size); + // seek back to start + fseek(file,0,SEEK_SET); + + //allocate a buffer + buffer=malloc(size); if(!buffer)goto exit; //read contents ! - ret=FSFILE_Read(fileHandle, &bytesRead, 0x0, buffer, size); - if(ret || size!=bytesRead)goto exit; + off_t bytesRead = fread(buffer,1,size,file); //close the file because we like being nice and tidy - ret=FSFILE_Close(fileHandle); - if(ret)goto exit; - + fclose(file); + + if(size!=bytesRead)goto exit; + while(aptMainLoop()) { //exit when user hits B @@ -98,13 +91,8 @@ int main(int argc, char** argv) //cleanup and return //returning from main() returns to hbmenu when run under ninjhax exit: - //closing all handles is super important - svcCloseHandle(fileHandle); + //closing all services even more so - fsExit(); gfxExit(); - hidExit(); - aptExit(); - srvExit(); return 0; } From 95fe42b294dc389306b1df5bde25712ed63ee783 Mon Sep 17 00:00:00 2001 From: smea Date: Fri, 26 Dec 2014 12:45:25 -0800 Subject: [PATCH 57/61] Update hid.c --- libctru/source/services/hid.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libctru/source/services/hid.c b/libctru/source/services/hid.c index 54657da..036fe33 100644 --- a/libctru/source/services/hid.c +++ b/libctru/source/services/hid.c @@ -52,6 +52,7 @@ Result hidInit(u32* sharedMem) } // Reset internal state. + hidInitialised = true; kOld = kHeld = kDown = kUp = 0; return ret; From 805e757b496314db2f119c9a86afe6c587798118 Mon Sep 17 00:00:00 2001 From: smea Date: Fri, 26 Dec 2014 12:46:01 -0800 Subject: [PATCH 58/61] Update hid.c --- libctru/source/services/hid.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libctru/source/services/hid.c b/libctru/source/services/hid.c index 036fe33..5d99369 100644 --- a/libctru/source/services/hid.c +++ b/libctru/source/services/hid.c @@ -80,6 +80,8 @@ void hidExit() { irrstExit(); } + + hidInitialised = false; } void hidWaitForEvent(HID_Event id, bool nextEvent) From dac642f61385e0065e07acf156fb5c4d77ba7145 Mon Sep 17 00:00:00 2001 From: smea Date: Fri, 26 Dec 2014 12:49:19 -0800 Subject: [PATCH 59/61] Update sdmc_dev.c --- libctru/source/sdmc_dev.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libctru/source/sdmc_dev.c b/libctru/source/sdmc_dev.c index d9604b0..2a6a833 100644 --- a/libctru/source/sdmc_dev.c +++ b/libctru/source/sdmc_dev.c @@ -180,6 +180,8 @@ Result sdmcExit(void) if(rc == 0) RemoveDevice("sdmc"); + sdmcInitialised = false; + return rc; } From 8e6056f1a04c270baec500a3894f6bea6a8a1609 Mon Sep 17 00:00:00 2001 From: smea Date: Fri, 26 Dec 2014 12:50:34 -0800 Subject: [PATCH 60/61] Update fs.c --- libctru/source/services/fs.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libctru/source/services/fs.c b/libctru/source/services/fs.c index d7fe22e..2c610b3 100644 --- a/libctru/source/services/fs.c +++ b/libctru/source/services/fs.c @@ -63,6 +63,8 @@ Result fsExit(void) { if (!fsInitialised) return 0; + + fsInitialised = false; return svcCloseHandle(fsuHandle); } From 800cb7b56624a44076596c66dd5639079a4c9d6d Mon Sep 17 00:00:00 2001 From: smea Date: Fri, 26 Dec 2014 12:51:01 -0800 Subject: [PATCH 61/61] Update apt.c --- libctru/source/services/apt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libctru/source/services/apt.c b/libctru/source/services/apt.c index d4bdd1c..1d9bc48 100644 --- a/libctru/source/services/apt.c +++ b/libctru/source/services/apt.c @@ -484,6 +484,8 @@ void aptExit() svcCloseHandle(aptStatusMutex); svcCloseHandle(aptLockHandle); svcCloseHandle(aptStatusEvent); + + aptInitialised = false; } bool aptMainLoop()