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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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 99186f42589f438cacc36b1e528702d8602e94ae Mon Sep 17 00:00:00 2001 From: fincs Date: Sun, 14 Dec 2014 17:47:34 +0100 Subject: [PATCH 29/35] 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 30/35] 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 31/35] 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 32/35] 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 33/35] 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 34/35] 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 60edc69d736a34817b56bb7e3c47348d1f26e227 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Mon, 15 Dec 2014 23:23:04 +0000 Subject: [PATCH 35/35] 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;