From adfb94c5c9146dafba0d84a89cc79cb97b029e0a Mon Sep 17 00:00:00 2001 From: ApacheThunder Date: Mon, 25 Nov 2024 20:55:13 -0600 Subject: [PATCH] Update nrio-usb-disk * Fixed bug with nrio-usb-disk that prevented it from mounting EZP when using latest version of DLDI. (turns out to be the last sector bug) * Moved some frequently used functions to ITCM. --- NitroFS/Nitro.img | Bin 3846144 -> 3846144 bytes arm9/Makefile | 4 +- arm9/{source => include/common}/nrio_detect.c | 0 arm9/{source => include/common}/nrio_detect.h | 0 arm9/{source => include/common}/skin.cpp | 586 +++++++++--------- arm9/{source => include/common}/skin.h | 20 +- arm9/{source => include/common}/tonccpy.h | 0 .../common/tonccpy.itcm.c} | 0 .../defaultBanners.dtcm.s} | 10 +- arm9/{source => include/ez5n}/ez5n.h | 0 .../ez5n.c => include/ez5n/ez5n.itcm.c} | 0 arm9/{source => include/ez5n}/ioezp.h | 0 .../ioezp.c => include/ez5n/ioezp.itcm.c} | 0 arm9/{source => include/ez5n}/libtwl_card.h | 0 .../ez5n/libtwl_card.itcm.c} | 0 arm9/source/iconTitle.cpp | 3 +- 16 files changed, 312 insertions(+), 311 deletions(-) rename arm9/{source => include/common}/nrio_detect.c (100%) rename arm9/{source => include/common}/nrio_detect.h (100%) rename arm9/{source => include/common}/skin.cpp (95%) rename arm9/{source => include/common}/skin.h (92%) rename arm9/{source => include/common}/tonccpy.h (100%) rename arm9/{source/tonccpy.c => include/common/tonccpy.itcm.c} (100%) rename arm9/{source/defaultBanners.s => include/defaultBanners.dtcm.s} (94%) rename arm9/{source => include/ez5n}/ez5n.h (100%) rename arm9/{source/ez5n.c => include/ez5n/ez5n.itcm.c} (100%) rename arm9/{source => include/ez5n}/ioezp.h (100%) rename arm9/{source/ioezp.c => include/ez5n/ioezp.itcm.c} (100%) rename arm9/{source => include/ez5n}/libtwl_card.h (100%) rename arm9/{source/libtwl_card.c => include/ez5n/libtwl_card.itcm.c} (100%) diff --git a/NitroFS/Nitro.img b/NitroFS/Nitro.img index 9bd0fe8fa43fd9ef8c96f6f5a6e5a56dc823dcd3..6c5010f95ac3baa68e944d65380d5e4c972bec75 100644 GIT binary patch delta 6030 zcmd5=eN+?9Ja{JK%i-@psAcUyz|0`6BFR#{O0;udFr`bA*G$Hj~jv5pPx` zSQUx+it%>EguRN14#lKq#bl(MVphsCs+W)`AEYiYtK}K$CHd;5c6D_fF_HC->W|1+ zBKua~Cn4T0`M6crkgt>M)&7d8VJ`Wv`G!k&!8WNEacoyvF4yn@P;Zp4KqxJFiZE+R=G5fOEHiC<;Ukr2{M(b? z<>=5jD?!OCK;as$u-aQQJ!#SIvfMy~l65FEGu6!h9#73S8(-V4S9>P9m%Wga0@4~Z zB@L~FshRNK7agfS=M@sfMG>wkUhNT`1F9Ay)ZtUT&?`^12O)>DdXIYgY%?mszZvEc z$r_(C_X8A{p+TwHnKR~OPxY)u_f*yOkM96_5uu?3#=Op^YSt!NB#k&qXEkDT&$`<#@4)<{&nl#}%*bzlX8X^-)y8tmrt+4wYnE6 z-A-gyx&GYc5WZ*ebLbRY$JWfD6Y-1e=p4FW=6koz$Y_znQsY#vg9Gi^(0=E({p5#& z>r@u3clvuo_#(yzs|AG-SY*d-<0*%b3S&R+vl1c|J_J$P@)Mn`rK^oC5kH{(xO7piN&X%_!J7an~l@$IHE8-U*X!s@M8F+tt@dd>|=#|uYIdjvY3u0 zc%yV+2~8vTU+nHuI(f`nT_@6sYgUgv{P?u1%8>jIY|2MN@=+KLS6YynxK8z=aAnwg z(@?d-j1!0p_p&DoX{zsozP%QO`Mk0&qt1q1v)Hjh8jV}o^+Fn&^mT8#fL-04K4ZPj z_%Wr+*ok5~n>M8@UH+Y$Y@5=93#SXlc%|z>N0wlY!>+c@mtjoR$;K4Xu|aL!*sO5P z>?xfwu~buyqJ5pu!RR+^LlKR~*Vxe_I#HL?msg0QaT9W7vmc7+!r1&iY)Q*7>BSLg z=?XiUqe7}GyV;Hvu0`Gb^lW$Z0_>SGkyR|C{&*RCa~X~GpWn-k6T?-zFU;>Bzr+5z zjE*dK_BsST!bk}~Mx?Y`6=*B$`+PXb>Gu&yzY8Z6Bl|Uklsvk4Toi(TxNqJEdJ@p1 z;?9#v7f{0%C@!%5th$smxRsJ31>|2^TH7dtEY&F2-r(p2R;t^ll zLXfIj4CmIOrnsBEmh-j{`*~YvrKvJj9qVHvp((M-SbZ$vPN?mWEoak5S);rau03-9 zc5m-MF?{Qe^o=4Zn;Ctap>RDbqez2OX)&Wy(0dws zYESPE&|3&SWz$FL3fHSL4o_GkL2IKd*`&v71<9t|sjjvOO~P)WfsJ2I3ov23meZ;6 zMLp?403-r^oWhlKS6!oUJtRBAkogNjTnqd5wI`MKx##{&=3(ahEWMr}HdsXh)HSE|EmI< z6W|kxtGI)>E_P_b70Jly(?VQl*n$-_$hM~?5)Q-2PUISQSM$c@wpwaZ2J3%l%RpO_ z(N%prHjgR%S4CBtPkR=!hENI)(_d|?PX4ON^!StQHo>%hQt6)x|E66uHI99}f`(@I z=bl05oq>p;;C(Y75)cR23Ml0X5}f=#w0T6-L0=2eq9E848RgO1%QhjWh&$<37PXQt z^?$v4PFv~26EsC}A{ zS7dzeLIDmNgETcBM>~DmCY0red!rC*FsQiKw!Vxa?<5?FuH0@*7d|cUhK-(c!zSnx zD$Z4WW;fe}$`n5|uV8mUpF67iek-!Pli_XOXc?mNx9jZw_BOVvm`dgA+KMwY_T2*( zENi7T(yrN0%$6)boElVE4p2 zF|5^OxKUe5z_Nd`_|=fo7+bKK2IGxv-D(d+{%OKrPA2DHfe*5`;6#4( z##*$swet@rqw{lGZeBL*z7z6>kcSti-fGVltO53o)H2d+lY^bscO0_r_2xW=4WBo4F%Y%x`D1d+lryJ?goLq zTH4AN>;DF0%hwsxD*1wxWv`)`_zU*-8k(q+-3dM2m5@K2f$W<#G-~9mPT5U+_(pc$ zI%LZ$y4u=ZiJ}!vcvQNx*WD|lM{twu_F|*g(x~`Pf?Wj@%e+xd zN}oFv)ZFYw4|C71YCCuQyq1m(FYJ=tr@K|VHja69J{~pPX|;T!wIZD2oiapS znlZ%3+rExn06|p>2<~C>S{gn4X>e$FSFih~tlX8p+#aS?>Flaqi)`A;UCHQjDa$CK zp{A>HY^X z{&xS$iZGMPWbn76a1&ek91Tk=0rQ{kR7~@$)PaEPeyEH4j{EozW`qX)%oBSY)R5fY z2<2!VKyIjjs`>%+&w}6IXIGx1;i})tvil0d>*)C5n>tNulh3nGMRbr8Uy*t{t`xGs0X6~1@GD(-l-@~3VW;fA(6zXAo;3jJt={0~x$Uz1 z1-7x2M!`LJw3G&G`wc-TQfextK_u}cTv4%5fW|`YaR%BND^hmJvH^IC(Fp0|0T+S4 zI3Ym+NKhG7P}zj8hmx$BOHg zH&9=NYO9*FGVF8}UMv04PHQo)XLDbI8~-)7`6W8?r+LyxFM;mF2mUYtuv`cE6y+l` zqCeiw=rp{19I~9*fXIgg?>dvkUV07bHKA{`aPMf(5&aKZmH zhS{A>)PyTpwMY~3bJ76%WhdVGu3ALj3E+~ z9r1!{0C16Q*i2{O9_g#i^f1OftZWOl;U?+xEl^!1HiJY}uT1!i4rupWLnKLq$#mG7 z*+7c{kpLqA0bq^Zcs5}h9T{2x4+modfn-N|d1W2?2_o1=^U>e?+9Rb6+o0OPJK6Tv zXn7!ihfF$yNCg17WPJ?u3t7bLl$DQzW)dJ3Fb%#a9WWN!aZm#Z&>q9bfKCN~_R8Wk zhrs6$n_`-&(pXuOQk=%+InUUjM@kz;dJ9F^WxYde!|a}#AI7+D49^W!~$~bG@hzsGvB2C!KXcJr45Cd3Zbk<$klb9TXC9gc$0n>!QW`S`l*zWQ?2# zZKzj$oj{EoU{4jpd*~LwK^8aFGo8J)2hMsGJGF=29K(gH1{8QELEj?6pN?u*JTSip$7CY4$?e=Pp-4ZSu2q5Uj&KMjYM>dgJ{mW*db`{`$){5W+0 z_z{b_j>rRO<8)M5oW>_)9H1+eb--r%g~8vmgZ1>H4k~+62ht$PCNB=pz{{nk-%=g+ z%Yya3htzl97j9;t#nRn_aISyk-v-`tka@r|579I~J9IgCsCnA#z#+QQk7pzvv%!VP z71?7vb&y3IhCFakT5_1W3En0xc#m$w*eTsP3RzKA0vc9G1;^-ptm@Y?=Qy>&hO*xr zr=Mob-j9g>03x@6HUlmX;8oy_1w;al96_W8V5vvs-r;__6==*ryX_Dnl)Za`uFrFGzG4ePcBh^>A@x1teA8bbZ}f8z%`&8w+4XW z7rv7td3X^N`zKya4E_<6$^LPb1_d7b7?EBW!VW~X0i6K-5*B(5qHqJO&gCnBZUk(W z-nvF-5PVU(`*(f|JEhIdG)0N$u&-{>O)4XQ=t{Y*)I@N-RMJkzlL*e^=bD!>2qgim zuk`;&(xDlDh>zUXoR*rtgY delta 5607 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 -#include -#include -#include -#include -#include -#include -#include - -#include "skin.h" - - -#define BI_RGB (0) -#define BI_RLE8 (1) -#define BI_RLE4 (2) -#define BI_Bitfields (3) - -typedef struct { - u8 bfType[2]; - u32 bfSize; - u16 bfReserved1; - u16 bfReserved2; - u32 bfOffset; - u32 biSize; - u32 biWidth; - u32 biHeight; - u16 biPlanes; - u16 biBitCount; - u32 biCopmression; - u32 biSizeImage; - u32 biXPixPerMeter; - u32 biYPixPerMeter; - u32 biClrUsed; - u32 biCirImportant; - u8 *pPalette; - u8 *pBitmap; - u32 DataWidth; -} TBMPHeader; - - -static u16 GetVariable16bit(void *pb) { - u16 res; - u8 *pb8=(u8*)pb; - - res=(u32)pb8[0] << 0; - res+=(u32)pb8[1] << 8; - - return(res); -} - -static u32 GetVariable32bit(void *pb) { - u32 res; - u8 *pb8=(u8*)pb; - - res=(u32)pb8[0] << 0; - res+=(u32)pb8[1] << 8; - res+=(u32)pb8[2] << 16; - res+=(u32)pb8[3] << 24; - - return(res); -} - - -static bool GetBMPHeader(u8 *pb,TBMPHeader *pBMPHeader) { - if(pb==NULL){ -// BMP_LoadErrorStr="SourceData Null."; - return(false); - } - if(pBMPHeader==NULL){ -// BMP_LoadErrorStr="pBMPHeader Null."; - return(false); - } - - pBMPHeader->bfType[0]=pb[0]; - pBMPHeader->bfType[1]=pb[1]; - pBMPHeader->bfSize=GetVariable32bit(&pb[2]); - pBMPHeader->bfReserved1=GetVariable16bit(&pb[6]); - pBMPHeader->bfReserved2=GetVariable16bit(&pb[8]); - pBMPHeader->bfOffset=GetVariable32bit(&pb[10]); - pBMPHeader->biSize=GetVariable32bit(&pb[14+0]); - pBMPHeader->biWidth=GetVariable32bit(&pb[14+4]); - pBMPHeader->biHeight=GetVariable32bit(&pb[14+8]); - pBMPHeader->biPlanes=GetVariable16bit(&pb[14+12]); - pBMPHeader->biBitCount=GetVariable16bit(&pb[14+14]); - pBMPHeader->biCopmression=GetVariable32bit(&pb[14+16]); - pBMPHeader->biSizeImage=GetVariable32bit(&pb[14+20]); - pBMPHeader->biXPixPerMeter=GetVariable32bit(&pb[14+24]); - pBMPHeader->biYPixPerMeter=GetVariable32bit(&pb[14+28]); - pBMPHeader->biClrUsed=GetVariable32bit(&pb[14+32]); - pBMPHeader->biCirImportant=GetVariable32bit(&pb[14+36]); - - pBMPHeader->pPalette=&pb[14+40]; - pBMPHeader->pBitmap=&pb[pBMPHeader->bfOffset]; - - pBMPHeader->DataWidth=0; - - if((pBMPHeader->bfType[0]!='B')||(pBMPHeader->bfType[1]!='M')){ -// BMP_LoadErrorStr="Error MagicID!=BM"; - return(false); - } - - if(pBMPHeader->biCopmression!=BI_RGB){ -// BMP_LoadErrorStr="Error notsupport Compression"; - return(false); - } - - if(pBMPHeader->biHeight>=0x80000000){ -// BMP_LoadErrorStr="Error notsupport OS/2 format"; - return(false); - } - - if(pBMPHeader->biPlanes!=1){ -// BMP_LoadErrorStr="Error notsupport Planes!=1"; - return(false); - } - - switch(pBMPHeader->biBitCount){ - case 1: -// BMP_LoadErrorStr="Error notsupport 1bitcolor."; - return(false); - case 4: -// BMP_LoadErrorStr="Error notsupport 4bitcolor."; - return(false); - case 8: - pBMPHeader->DataWidth=pBMPHeader->biWidth*1; - break; - case 16: -// BMP_LoadErrorStr="Error notsupport 16bitcolor."; - return(false); - case 24: - pBMPHeader->DataWidth=pBMPHeader->biWidth*3; - break; - case 32: - pBMPHeader->DataWidth=pBMPHeader->biWidth*4; - break; - default: -// BMP_LoadErrorStr="Error Unknown xxBitColor."; - return(false); - } - - if((pBMPHeader->DataWidth&3)!=0){ - pBMPHeader->DataWidth+=4-(pBMPHeader->DataWidth&3); - } - -// BMP_LoadErrorStr=""; - return(true); -} - - -static bool intLoadBM(const char *bmpfn,u16 *pbm,const u32 bmw,const u32 bmh) { - FILE *fh; - - if(pbm == NULL)return(false); - - u8 *bmdata = NULL; - u32 bmsize; - - fh=fopen(bmpfn, "rb"); - - if(fh != NULL) { - fseek(fh, 0, SEEK_END); - bmsize=ftell(fh); - fseek(fh, 0, SEEK_SET); - bmdata = (u8*)malloc(bmsize); - - fread(bmdata, 1, bmsize, fh); - fclose(fh); - } - - if(bmdata==NULL)return(false); - - TBMPHeader BMPHeader; - - if(!GetBMPHeader(bmdata,&BMPHeader)) { - free(bmdata); bmdata=NULL; - return(false); - } - - if((BMPHeader.biWidth==1)&&(BMPHeader.biHeight==1)) { - free(bmdata); - bmdata=NULL; - return false; - } - - if(BMPHeader.biBitCount==32) { - free(bmdata); - bmdata = NULL; - return false; - } - - if((BMPHeader.biWidth>3; \ - if((c&(~0x1f))!=0) c=(c<0) ? 0x00 : 0x1f; \ -} - - for(u32 y=0;y +#include +#include +#include +#include +#include +#include +#include + +#include "skin.h" + + +#define BI_RGB (0) +#define BI_RLE8 (1) +#define BI_RLE4 (2) +#define BI_Bitfields (3) + +typedef struct { + u8 bfType[2]; + u32 bfSize; + u16 bfReserved1; + u16 bfReserved2; + u32 bfOffset; + u32 biSize; + u32 biWidth; + u32 biHeight; + u16 biPlanes; + u16 biBitCount; + u32 biCopmression; + u32 biSizeImage; + u32 biXPixPerMeter; + u32 biYPixPerMeter; + u32 biClrUsed; + u32 biCirImportant; + u8 *pPalette; + u8 *pBitmap; + u32 DataWidth; +} TBMPHeader; + + +static u16 GetVariable16bit(void *pb) { + u16 res; + u8 *pb8=(u8*)pb; + + res=(u32)pb8[0] << 0; + res+=(u32)pb8[1] << 8; + + return(res); +} + +static u32 GetVariable32bit(void *pb) { + u32 res; + u8 *pb8=(u8*)pb; + + res=(u32)pb8[0] << 0; + res+=(u32)pb8[1] << 8; + res+=(u32)pb8[2] << 16; + res+=(u32)pb8[3] << 24; + + return(res); +} + + +static bool GetBMPHeader(u8 *pb,TBMPHeader *pBMPHeader) { + if(pb==NULL){ +// BMP_LoadErrorStr="SourceData Null."; + return(false); + } + if(pBMPHeader==NULL){ +// BMP_LoadErrorStr="pBMPHeader Null."; + return(false); + } + + pBMPHeader->bfType[0]=pb[0]; + pBMPHeader->bfType[1]=pb[1]; + pBMPHeader->bfSize=GetVariable32bit(&pb[2]); + pBMPHeader->bfReserved1=GetVariable16bit(&pb[6]); + pBMPHeader->bfReserved2=GetVariable16bit(&pb[8]); + pBMPHeader->bfOffset=GetVariable32bit(&pb[10]); + pBMPHeader->biSize=GetVariable32bit(&pb[14+0]); + pBMPHeader->biWidth=GetVariable32bit(&pb[14+4]); + pBMPHeader->biHeight=GetVariable32bit(&pb[14+8]); + pBMPHeader->biPlanes=GetVariable16bit(&pb[14+12]); + pBMPHeader->biBitCount=GetVariable16bit(&pb[14+14]); + pBMPHeader->biCopmression=GetVariable32bit(&pb[14+16]); + pBMPHeader->biSizeImage=GetVariable32bit(&pb[14+20]); + pBMPHeader->biXPixPerMeter=GetVariable32bit(&pb[14+24]); + pBMPHeader->biYPixPerMeter=GetVariable32bit(&pb[14+28]); + pBMPHeader->biClrUsed=GetVariable32bit(&pb[14+32]); + pBMPHeader->biCirImportant=GetVariable32bit(&pb[14+36]); + + pBMPHeader->pPalette=&pb[14+40]; + pBMPHeader->pBitmap=&pb[pBMPHeader->bfOffset]; + + pBMPHeader->DataWidth=0; + + if((pBMPHeader->bfType[0]!='B')||(pBMPHeader->bfType[1]!='M')){ +// BMP_LoadErrorStr="Error MagicID!=BM"; + return(false); + } + + if(pBMPHeader->biCopmression!=BI_RGB){ +// BMP_LoadErrorStr="Error notsupport Compression"; + return(false); + } + + if(pBMPHeader->biHeight>=0x80000000){ +// BMP_LoadErrorStr="Error notsupport OS/2 format"; + return(false); + } + + if(pBMPHeader->biPlanes!=1){ +// BMP_LoadErrorStr="Error notsupport Planes!=1"; + return(false); + } + + switch(pBMPHeader->biBitCount){ + case 1: +// BMP_LoadErrorStr="Error notsupport 1bitcolor."; + return(false); + case 4: +// BMP_LoadErrorStr="Error notsupport 4bitcolor."; + return(false); + case 8: + pBMPHeader->DataWidth=pBMPHeader->biWidth*1; + break; + case 16: +// BMP_LoadErrorStr="Error notsupport 16bitcolor."; + return(false); + case 24: + pBMPHeader->DataWidth=pBMPHeader->biWidth*3; + break; + case 32: + pBMPHeader->DataWidth=pBMPHeader->biWidth*4; + break; + default: +// BMP_LoadErrorStr="Error Unknown xxBitColor."; + return(false); + } + + if((pBMPHeader->DataWidth&3)!=0){ + pBMPHeader->DataWidth+=4-(pBMPHeader->DataWidth&3); + } + +// BMP_LoadErrorStr=""; + return(true); +} + + +static bool intLoadBM(const char *bmpfn,u16 *pbm,const u32 bmw,const u32 bmh) { + FILE *fh; + + if(pbm == NULL)return(false); + + u8 *bmdata = NULL; + u32 bmsize; + + fh=fopen(bmpfn, "rb"); + + if(fh != NULL) { + fseek(fh, 0, SEEK_END); + bmsize=ftell(fh); + fseek(fh, 0, SEEK_SET); + bmdata = (u8*)malloc(bmsize); + + fread(bmdata, 1, bmsize, fh); + fclose(fh); + } + + if(bmdata==NULL)return(false); + + TBMPHeader BMPHeader; + + if(!GetBMPHeader(bmdata,&BMPHeader)) { + free(bmdata); bmdata=NULL; + return(false); + } + + if((BMPHeader.biWidth==1)&&(BMPHeader.biHeight==1)) { + free(bmdata); + bmdata=NULL; + return false; + } + + if(BMPHeader.biBitCount==32) { + free(bmdata); + bmdata = NULL; + return false; + } + + if((BMPHeader.biWidth>3; \ + if((c&(~0x1f))!=0) c=(c<0) ? 0x00 : 0x1f; \ +} + + for(u32 y=0;y