From 10ca9911506fe6fe73328c8d5d638f59a090ee00 Mon Sep 17 00:00:00 2001 From: Robz8 Date: Wed, 3 Oct 2018 18:47:47 -0600 Subject: [PATCH] Try to load DLDI driver from arm9 binary --- Makefile | 2 +- arm9/source/driveMenu.cpp | 17 ++++- arm9/source/driveOperations.cpp | 119 ++++++++++++++++++++++++++++++++ arm9/source/driveOperations.h | 9 +++ arm9/source/main.cpp | 2 +- dldi/ak2_sd.bin | Bin 0 -> 2292 bytes dldi/r4idsn_sd.bin | Bin 0 -> 2884 bytes 7 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 arm9/source/driveOperations.cpp create mode 100644 arm9/source/driveOperations.h create mode 100644 dldi/ak2_sd.bin create mode 100644 dldi/r4idsn_sd.bin diff --git a/Makefile b/Makefile index 4433dbe..147e609 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ TARGET := GodMode9i BUILD := build SOURCES := source INCLUDES := include source -DATA := data +DATA := data dldi GRAPHICS := gfx #--------------------------------------------------------------------------------- diff --git a/arm9/source/driveMenu.cpp b/arm9/source/driveMenu.cpp index 9f7adfa..d4aa415 100644 --- a/arm9/source/driveMenu.cpp +++ b/arm9/source/driveMenu.cpp @@ -24,6 +24,7 @@ #include "main.h" #include "date.h" +#include "driveOperations.h" #define SCREEN_COLS 32 #define ENTRIES_PER_SCREEN 22 @@ -86,8 +87,20 @@ void driveMenu (void) { if (dmCursorPosition > 1) dmCursorPosition = 0; // Wrap around to top of list if (pressed & KEY_A) { - screenMode = 1; - break; + if (dmCursorPosition == 0 && isDSiMode()) { + chdir("sd:/"); + screenMode = 1; + break; + } else { + if (isDSiMode()) { + flashcardMount(); + } + if (flashcardFound()) { + chdir("fat:/"); + screenMode = 1; + break; + } + } } } } diff --git a/arm9/source/driveOperations.cpp b/arm9/source/driveOperations.cpp new file mode 100644 index 0000000..8e5de25 --- /dev/null +++ b/arm9/source/driveOperations.cpp @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include + +#include "r4idsn_sd_bin.h" +#include "ak2_sd_bin.h" + +static sNDSHeader nds; + +bool sdFound(void) { + if (access("sd:/", F_OK) == 0) { + return true; + } else { + return false; + } +} + +bool flashcardFound(void) { + if (access("fat:/", F_OK) == 0) { + return true; + } else { + return false; + } +} + +bool bothSDandFlashcard(void) { + if ((access("sd:/", F_OK) == 0) && (access("fat:/", F_OK) == 0)) { + return true; + } else { + return false; + } +} + +DLDI_INTERFACE* dldiLoadFromBin (void* dldiAddr, u16 size) { + DLDI_INTERFACE* device; + + if ((device = (DLDI_INTERFACE*)malloc (sizeof(DLDI_INTERFACE))) == NULL) { + return NULL; + } + + // Load entire DLDI + memcpy(device, dldiAddr, size); + + // Check that it is a valid DLDI + if (!dldiIsValid (device)) { + free (device); + return NULL; + } + + dldiFixDriverAddresses (device); + + if (device->ioInterface.features & FEATURE_SLOT_GBA) { + sysSetCartOwner(BUS_OWNER_ARM9); + } + if (device->ioInterface.features & FEATURE_SLOT_NDS) { + sysSetCardOwner(BUS_OWNER_ARM9); + } + + return device; +} + +bool UpdateCardInfo(sNDSHeader* nds, char* gameid, char* gamename) { + cardReadHeader((uint8*)nds); + memcpy(gameid, nds->gameCode, 4); + gameid[4] = 0x00; + memcpy(gamename, nds->gameTitle, 12); + gamename[12] = 0x00; + return true; +} + +void ShowGameInfo(const char gameid[], const char gamename[]) { + iprintf("Game id: %s\nName: %s", gameid, gamename); +} + +void flashcardMount(void) { + if (!flashcardFound() && REG_SCFG_MC != 0x11) { + // Reset Slot-1 to allow reading title name and ID + sysSetCardOwner (BUS_OWNER_ARM9); + disableSlot1(); + for(int i = 0; i < 25; i++) { swiWaitForVBlank(); } + enableSlot1(); + for(int i = 0; i < 15; i++) { swiWaitForVBlank(); } + + nds.gameCode[0] = 0; + nds.gameTitle[0] = 0; + char gamename[13]; + char gameid[5]; + + /*fifoSendValue32(FIFO_USER_04, 1); + for (int i = 0; i < 10; i++) { + swiWaitForVBlank(); + } + memcpy(&nds, (void*)0x02000000, sizeof(nds));*/ + UpdateCardInfo(&nds, &gameid[0], &gamename[0]); + + /*SetBrightness(0, 0); + SetBrightness(1, 0); + consoleDemoInit(); + iprintf("REG_SCFG_MC: %x\n", REG_SCFG_MC); + ShowGameInfo(gameid, gamename); + + for (int i = 0; i < 60*5; i++) { + swiWaitForVBlank(); + }*/ + + sysSetCardOwner (BUS_OWNER_ARM7); // 3DS fix + + // Read a DLDI driver specific to the cart + if (!memcmp(gamename, "R4DSULTRA", 9)) { + io_dldi_data = dldiLoadFromBin((void*)r4idsn_sd_bin, r4idsn_sd_bin_size); + fatMountSimple("fat", &io_dldi_data->ioInterface); + } else if (!memcmp(gameid, "YCEP", 4) || !memcmp(gameid, "AHZH", 4)) { + io_dldi_data = dldiLoadFromBin((void*)ak2_sd_bin, ak2_sd_bin_size); + fatMountSimple("fat", &io_dldi_data->ioInterface); + } + } +} \ No newline at end of file diff --git a/arm9/source/driveOperations.h b/arm9/source/driveOperations.h new file mode 100644 index 0000000..9884d10 --- /dev/null +++ b/arm9/source/driveOperations.h @@ -0,0 +1,9 @@ +#ifndef FLASHCARD_H +#define FLASHCARD_H + +bool sdFound(void); +bool flashcardFound(void); +bool bothSDandFlashcard(void); +void flashcardMount(void); + +#endif //FLASHCARD_H diff --git a/arm9/source/main.cpp b/arm9/source/main.cpp index a65be89..bc2c9a7 100644 --- a/arm9/source/main.cpp +++ b/arm9/source/main.cpp @@ -34,7 +34,7 @@ //#include "iconTitle.h" -char titleName[32]; +char titleName[32] = {" "}; int screenMode = 0; diff --git a/dldi/ak2_sd.bin b/dldi/ak2_sd.bin new file mode 100644 index 0000000000000000000000000000000000000000..d94261a5414ad4191bd615827d4a83b44bab2700 GIT binary patch literal 2292 zcma)7e@q+q6@Opf**N?N*rbawm(=z-fNhjGxcRXVHO6PY7+)a-q?80@ISNg#N;cif zHreU^IMzf9YbODgHhxSkX}gM)B=yvwrV~?W+NkQPP3Kln=flWz=O=1H8O#SJ9 zL%n|2s$N%N4WHw)F*a}?(b>_`#iOSYeC|bDM*IqK5%C)Y*_*qqw9M1h+2iyuZKF}T zdNuaM{I=)Q+mxG$qQ|x==Mn^MbHSPm_GZ$UIajdF1pP*TE)@nN zC-F{+>iq@%GizFc+IJ{;LowK9mO^b?Ilr(;cy{YgnxHmKS!sfjpI&QbHKz8_a3Ydu zBE!Bmf4l1S%i!{|S1I^yx6Vh(KlaO>$UW^OeOx9l!w#?ZBxU#flClTFAFx62f4Ml= zT&AfWXRDnpksVJ|M*gX}U3&IK9e7@PMC7H)c%=-1`-@C^|J*Pgr?1c%x;jVZpap8L zHQ(0u6mM0ID|Yn0jDUCmyt0@ZENq5kiSq*mn@$xD$^)Nf}4a@kkv%k*;bDD_CZ z;S;sPj<++!wXXl(oN3OA`aeZoh8{y3YI^-fIe?+d&}W?mcZUafJ^Mx8T8P&?Rc43N zr)U`mHK%FNUFRX88b#0E%5RryUH$~{?>c)Ae^@>qE*9(-60&c!2L6$;?)58VS5e*H zG8Jj%fuGgcbLn{=JmgZfg&8HOrz8uXYz@MhPVz4mwKkwGF6L~C>?V-gLRzqEb_; zjsyObq-VdcpKQGswOk@28#x-~Ip(*_doIq$>Di?IRJ>0frKX86{ls}R($&-vWt4BU zs;FzxeC*&5)&Qi;OFc1iK+i_=u*0Lp=n?9YdZjfF-8#=TaLlin_ad}2TA6?VqYcO~ z#t3~6RSDB_=|R;lYwRfegQ^H;e0|?Ye0)LaR$Vqg`q^ zUdCcKmTQTR&I#>q*>^R@8zVBQuKOu^^F@)=XO z?u^}3A$*ZkVbo?4NJCuc5_*a$Jscg70-_}~aNfrm-usZj-Mp(XW9(JU8Z#?-GG4+7 zQ4d!UVm@MS_%N?}b}7H*!MbYJV5Mh&mzNV^>xMMDSBP{st=H#jp*~4~Xu!X}95{2p z;|#AP?Ix!%gSJv2p-IyXdrwuP!! z8^z6BWBj>jDL3vgb7#}BgpY$d$UI}(9V1uB@V6yWFKUyH9+@(ZpUf$^W;CzzlR$Rq4zho``L7vX3`xKbNI{Od zsArGoq27{V(=2wPwVK|=?c?e=f>r#cUifnVw>aH_r#rK3T@rEZBivC@sWcz3;z}ep=kbk!f~VrhAGB7nH8x4l(hZHa#7^Z@s-GDnGcrtiR?6sF%%>#Mt>>?xc|GklK=PtS0Vlz!nYQYuz{<@ZAKoy;Z7Tf1p3Z&hGf zn8DtB5%C6M8gU6>^k<`QUq)O(82=?Bw+=8b!0a{tTpH_i+Nd5uVp6P|nE|X&%Y9~y z5zXm&hjH4BKfvRwx^A7-vwzVs^De;ihW#XGT|0d)rNwyHhxN8LGf$22A0HYMV-4<$ R+`xx-P<6229qIqu^)E{#8F>Hz literal 0 HcmV?d00001 diff --git a/dldi/r4idsn_sd.bin b/dldi/r4idsn_sd.bin new file mode 100644 index 0000000000000000000000000000000000000000..9bb350be94c7aa8c0b1140001ab776c8b811baa3 GIT binary patch literal 2884 zcmb_eTWl0n82-=9?1j3(lwEYG6{eI3CRV26g$EO+(%8fsD=lhb6YDLO1d}y9_+oTv zw?$(%G!zXQagSj!1qxJNOo)aScrrZHOO2N_*_q>s+a<=Dcp>pJe*bohmj~m6oBa7^ z&iT)G{`>5=M+#@1t^GT9_di1-v5dCgva_@Me!@@s|4njdJFm)}&C!Bv#xuXO+zSC; zS1Z`28**p!ka>uO^$IWz6qE^m3&Rgrha3Ipr;2*Mt8H$JS5|L(7q#h4>oK4KJPH)R zV?Y8P2gZQoz$owpFakUYv}jtJ_DAXz;mo8If~1HOHCXh3;`f*(O$+ZvV&PqUD3bzf z!UT3pMV?fpjv+no6}9CJAP#xIB!)C)x&x7sNunLf?2~>ZD}@0blah+EIGY7WE1%u3 z5j$l_>30lE)kst=b-baCNJ=e(zU>^u{zJ-ghEq$3nwT$!^|c2ObLYGkBj@$ngVJAn zqx20tn^?2l!N8(ifOtViwhBjXDs5a*u7qJz0&5L8FE-)smQmcZLW!+X{St-^EwJNA z7+xY5d+mAM>=rfSqAt;P^=lZOneY0b!Z{#87WH|OD5EZKYnu~&(!3SitJ#OgUIq8n z%48qh*L4GR`&M>u5aD;+^9tWX52_!)hjR*PuM$u!c}Q{mOYM9uQ_>f3+96=$(K_NUo?kPaUsGwZ%oPxED0yue$I&hUcS@W02#JamWeC zNysTk>DeJ&dKUs;J_*CBpzDLn+y3VJJLi_ea*ly5RorWv%Q*1CmHvaUHSR6wx>)a= zzAvDRRGwQ1yv!4*Pw5Nf$;G)1ICD4qmdWe&u2fgS2QfMO&G>ogHyb%$I0Hc(u@`nn z5E2DHBad-+YY>C)f;u(FSkR|mn>N>kRNukY&gnwn*6)82_j69o7O4_$K_{p%hgkbo zrVu2&LSVrL3pPgxHaXH?4_gxMtd1gQtp5}4d$G=CgG<5}2|xHQ=`8rN0XDKfFM;ct zdY*Vc?&NjCg;2h-_kZ$D!Z*8ak4d(&yf$q#=Ypl^59uJ^sBM}Y(PLAC+5(OPOD%&s zj-Dt@jiP3HYc<3Df%h;2a|k9$}OzC2lsr{ zK8rcmtuPnQG#f>I@b~bN$UPjee^JDe?YP{ISc(8KkU%v_KV=YB}2KO3HzI@s}=TG3>+${Y?4%nt`XTg`{ zsNJobCVZZ^0(P!JU0^m;qxP(hII|jYQKl_|bFI>EY#s0$GP8PlCK4ofAWo>`2Jue#@R(Kkko2%A=4YJ%~TJ=jD;R z1C_tlgOB|K|8o8d?5~22htc4E5X1el_%fV=3+?*c3;u;tm97 ztXx4~2M$3}t(z_c^YyuSF+zko2oo5K_Ije*Nz4qOC=8$pSptbcmO_ZcRM^or=OHde zpY-qGoVxqUhBH_e&d2Ce%sfx}8ybr`w@wPwQKO(9h1x;h3v;j`!1!%~-Tqs!#R5J8 zd=I^2!QSL%%pbNJ>qaxyFpr|J{kz}7OBvW*1#U#{E?{OD?qJ!^a26)EdXDz<)HH~>A+)ohWZk4n6e-HlOc