Homebrew [NDS] Yet Another nds-bootstrap Forwarder: more than 40 forwarders are now possible

v1.0.0

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,449
Country
Canada
YANBF (Yet Another nds-bootstrap Forwarder) is a forwarder structure for nds-bootstrap.

Features:
  • "forwarders" are referred to placeholder icons that will shortcut to a particular application (in this case, [nds-bootstrap](https://github.com/DS-Homebrew/nds-bootstrap))
    • Skip the [second menu](https://github.com/DS-Homebrew/TWiLightMenu) and just directly launch
  • Launches from 3DS-mode.
    • The other implementation by @RocketRobz and @Olmectron, https://gbatemp.net/threads/426174/, is DSiWare, which means you are limited to only 40 titles. This works great on the DSi, it does not work great on the 3DS.
    • This means you can now install as many icons as you want until you max out the HOME menu icon space!
How it works:
  • A pre-existing forwarder template exists: https://gbatemp.net/threads/426174/
    • This uses a DSiWare template, copies the icon and title and the ROM path, and then installed as a CIA. The CIA, when launched, will boot `sdcard.nds` which will do all the nds-bootstrap setup.
    • I instead opted to create an `sdcard.nds` bootloader, and then a 3DS-mode app that launches said bootloader
      • you can't launch `.nds` files from 3DS-mode. So a bootloader is required.
      • the bootloader does the same thing as the DSiWare template, in actuality.
How to use:
  1. Go to https://github.com/YANBForwarder/YANBF/releases, and download the appropriate zip file for your PC OS
  2. Go to https://github.com/RocketRobz/NTR_Forwarder/releases, and download the zip file that is not the source code
  3. Extract the zip files
  4. From the DS Game Forwarder Pack, copy everything in the for SD card root folder to your SD card root
  5. From YANBF, copy bootstrap.cia to the `sd:/cias` folder
    • If this folder doesn't exist, make one
  6. Download the latest TWiLight Menu++ version [here](https://github.com/DS-Homebrew/TWiLightMenu/releases). Only get the `3DS.7z` file
  7. In the 7z file, go to `_nds`, `TWiLightMenu`, and `extras`
  8. Drag the `apfix.pck` and `widescreen.pck` file to `sd:/_nds/ntr-forwarder/`
  • Using the command-line program
    1. Open a terminal or command prompt and cd inside the generator folder
    2. Run `generator <path to ROM on your SD card>`
      • Make sure to replace `<path to ROM on your SD card>` with the full path to your ROM
      • If you do not have your SD card inserted in your computer, you must provide a custom ROM path using -p <ROM path on SD>
        • This ROM path must follow POSIX standards
          • i.e. if your ROM on SD card is at "sd:/ROMs/ROM.nds", pass -p "/ROMs/ROM.nds"
    3. The resulting CIA will be generated in this same folder. Copy this to the sd:/cias folder
    4. Boot your 3DS and install both CIAs using FBI
  • Using the graphical user interface
    1. Open the `generator` folder, then:
      • Windows: Open YANBF-GUI.exe
      • macOS:
        1. Open YANBF-GUI.dmg
        2. Install YANBFGenerator app
      • Linux: Open YANBF-GUI.AppImage
    2. Set the generator directory to the path of your `generator` folder. A file browser icon next to the input can help with this
    3. Drag and drop as many ROMs as you need on your SD card to the app.
      • If you do not have your SD card inserted in your computer, you must provide a custom ROM path in the drop-down options
        • This ROM path must follow POSIX standards
          • i.e. if your ROM on SD card is at "sd:/ROMs/ROM.nds", write "/ROMs/ROM.nds"
    4. Click the Download button to start the generation process
    5. The resulting CIA will be generated in this same folder. Copy this to the sd:/cias folder
    6. Boot your 3DS and install all CIAs using FBI
Updating files:
Creating your own banners:
  • For a quick tutorial, refer to @Yrouel's post here: https://gbatemp.net/threads/609242/
  • Technical definitions (for those who know their stuff):
    • Image must be in PNG format. It must be 256x128. You can center your image accordingly, but the resulting file must be that size or it will fail to generate.
    • Sound must be in WAV format, 16-bit, and shorter than 3 seconds. Otherwise, the 3DS will fail to render the banner entirely.
  • Want to share? See https://github.com/YANBForwarder/assets#contribution-guidelines
    • Images are mandatory. Sound is optional.
Credits:
  • devkitPro for their toolchain
  • @RocketRobz for the TWLNAND bootstrap code
  • @Pk11 for bannergif.py and testing
  • @Olmectron for the initial GUI wrapper
  • @spitzeqc for continued support on the GUI wrapper
Have an issue? Please post in this thread, or open an issue on https://github.com/YANBForwarder/YANBF/issues
 
Last edited by lifehackerhansol,

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,449
Country
Canada
Screenshots: (thanks @Pk11!)

mrg_1906-12-20_21-31-04.170.bmp.png
mrg_1906-12-20_21-31-13.738.bmp.png
 

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,449
Country
Canada
Can you truely max out the installs or are this ones going against the 300 limit of 3ds mode?
This goes against the 300 title limit of 3DS mode, which is known to be the max for HOME menu. I guess I didn't exactly make that clear, my bad.

EDIT: wait, I did. I said "max out the HOME menu icon space".
 

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,449
Country
Canada
I still prefer https://github.com/MechanicalDragon0687/NDSForwarder which doesn't require a PC, but options are always welcomed.
Fun fact, the NDSForwarder generator was created 5 years after Forwarder3-DS was released. (I was one of the internal testers of NDSForwarder.) Before that it always needed a PC. Let's hope this doesn't take 5 years as well lol

An on-console generation is probably possible, but there is currently no implementation of makerom that runs on the console at this time. Only time will tell.
 
  • Like
Reactions: champsblinder02

Olmectron

Well-Known Member
Member
Joined
Dec 31, 2012
Messages
2,657
Trophies
2
Age
31
Location
A game
XP
3,855
Country
Mexico
Code:
PS C:\Users\olmec\Downloads\YANBF-Windows> py -3 generator.py "H:\roms\nds\Chrono_Trigger.nds"
Extracting icon...
Resizing icon...
Extracting game metadata...
Creating SMDH...
Traceback (most recent call last):
  File "C:\Users\olmec\Downloads\YANBF-Windows\generator.py", line 130, in <module>
    bannertoolarg += f'-scs "{chn_title[0]}" -scl "{chn_title[0]}" -scp "{chn_title[1]}" '
IndexError: list index out of range

I'm getting this error with some files. Mainly already modded romhacks. I'm guessing it doesn't find the cover?

Edit:

Fixed it by adding an exception handler:


Code:
try:
        if len(jpn_title) == 3:
            haspublisher = True
        if haspublisher:
            bannertoolarg += f'-s "{eng_title[0]} {eng_title[1]}" -js "{jpn_title[0]} {jpn_title[1]}" -fs "{fra_title[0]} {fra_title[1]}" -gs "{fra_title[0]} {ger_title[1]}" -is "{ita_title[0]} {ita_title[1]}" -ss "{spa_title[0]} {spa_title[1]}" '
            bannertoolarg += f'-l "{eng_title[0]} {eng_title[1]}" -jl "{jpn_title[0]} {jpn_title[1]}" -fl "{fra_title[0]} {fra_title[1]}" -gl "{fra_title[0]} {ger_title[1]}" -il "{ita_title[0]} {ita_title[1]}" -sl "{spa_title[0]} {spa_title[1]}" '
            bannertoolarg += f'-p "{eng_title[2]}" -jp "{jpn_title[2]}" -fp "{fra_title[2]}" -gp "{ger_title[2]}" -ip "{ita_title[2]}" -sp "{spa_title[2]}" '
        else:
            bannertoolarg += f'-s "{eng_title[0]}" -js "{jpn_title[0]}" -fs "{fra_title[0]}" -gs "{fra_title[0]}" -is "{ita_title[0]}" -ss "{spa_title[0]}" '
            bannertoolarg += f'-l "{eng_title[0]}" -jl "{jpn_title[0]}" -fl "{fra_title[0]}" -gl "{ger_title[0]}" -il "{ita_title[0]}" -sl "{spa_title[0]}" '
            bannertoolarg += f'-p "{eng_title[1]}" -jp "{jpn_title[1]}" -fp "{fra_title[1]}" -gp "{ger_title[1]}" -ip "{ita_title[1]}" -sp "{spa_title[1]}" '
        if chn_title is not None:
            if haspublisher:
                bannertoolarg += f'-scs "{chn_title[0]} {chn_title[1]}" '
                bannertoolarg += f'-scl "{chn_title[0]} {chn_title[1]}" '
                bannertoolarg += f'-scp "{chn_title[2]}" '
            else:
                bannertoolarg += f'-scs "{chn_title[0]}" -scl "{chn_title[0]}" -scp "{chn_title[1]}" '
        if kor_title is not None:
            if haspublisher:
                bannertoolarg += f'-ks "{kor_title[0]} {kor_title[1]}" '
                bannertoolarg += f'-kl "{kor_title[0]} {kor_title[1]}" '
                bannertoolarg += f'-kp "{kor_title[2]}" '
            else:
                bannertoolarg += f'-ks "{kor_title[0]}" -kl "{kor_title[0]}" -kp "{kor_title[1]}" '
    except:
        print("Error bannertoolarg catched")

I thought the banner would be missing or something, but it shows alright, and launches alright. I repeat, the issue was with modhacks that probably overwrote (erroneously) some bytes that were being taken as the chn_title.
 
Last edited by Olmectron,

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,449
Country
Canada
Code:
PS C:\Users\olmec\Downloads\YANBF-Windows> py -3 generator.py "H:\roms\nds\Chrono_Trigger.nds"
Extracting icon...
Resizing icon...
Extracting game metadata...
Creating SMDH...
Traceback (most recent call last):
  File "C:\Users\olmec\Downloads\YANBF-Windows\generator.py", line 130, in <module>
    bannertoolarg += f'-scs "{chn_title[0]}" -scl "{chn_title[0]}" -scp "{chn_title[1]}" '
IndexError: list index out of range

I'm getting this error with some files. Mainly already modded romhacks. I'm guessing it doesn't find the cover?

Edit:

Fixed it by adding an exception handler:


Code:
try:
        if len(jpn_title) == 3:
            haspublisher = True
        if haspublisher:
            bannertoolarg += f'-s "{eng_title[0]} {eng_title[1]}" -js "{jpn_title[0]} {jpn_title[1]}" -fs "{fra_title[0]} {fra_title[1]}" -gs "{fra_title[0]} {ger_title[1]}" -is "{ita_title[0]} {ita_title[1]}" -ss "{spa_title[0]} {spa_title[1]}" '
            bannertoolarg += f'-l "{eng_title[0]} {eng_title[1]}" -jl "{jpn_title[0]} {jpn_title[1]}" -fl "{fra_title[0]} {fra_title[1]}" -gl "{fra_title[0]} {ger_title[1]}" -il "{ita_title[0]} {ita_title[1]}" -sl "{spa_title[0]} {spa_title[1]}" '
            bannertoolarg += f'-p "{eng_title[2]}" -jp "{jpn_title[2]}" -fp "{fra_title[2]}" -gp "{ger_title[2]}" -ip "{ita_title[2]}" -sp "{spa_title[2]}" '
        else:
            bannertoolarg += f'-s "{eng_title[0]}" -js "{jpn_title[0]}" -fs "{fra_title[0]}" -gs "{fra_title[0]}" -is "{ita_title[0]}" -ss "{spa_title[0]}" '
            bannertoolarg += f'-l "{eng_title[0]}" -jl "{jpn_title[0]}" -fl "{fra_title[0]}" -gl "{ger_title[0]}" -il "{ita_title[0]}" -sl "{spa_title[0]}" '
            bannertoolarg += f'-p "{eng_title[1]}" -jp "{jpn_title[1]}" -fp "{fra_title[1]}" -gp "{ger_title[1]}" -ip "{ita_title[1]}" -sp "{spa_title[1]}" '
        if chn_title is not None:
            if haspublisher:
                bannertoolarg += f'-scs "{chn_title[0]} {chn_title[1]}" '
                bannertoolarg += f'-scl "{chn_title[0]} {chn_title[1]}" '
                bannertoolarg += f'-scp "{chn_title[2]}" '
            else:
                bannertoolarg += f'-scs "{chn_title[0]}" -scl "{chn_title[0]}" -scp "{chn_title[1]}" '
        if kor_title is not None:
            if haspublisher:
                bannertoolarg += f'-ks "{kor_title[0]} {kor_title[1]}" '
                bannertoolarg += f'-kl "{kor_title[0]} {kor_title[1]}" '
                bannertoolarg += f'-kp "{kor_title[2]}" '
            else:
                bannertoolarg += f'-ks "{kor_title[0]}" -kl "{kor_title[0]}" -kp "{kor_title[1]}" '
    except:
        print("Error bannertoolarg catched")

I thought the banner would be missing or something, but it shows alright, and launches alright. I repeat, the issue was with modhacks that probably overwrote (erroneously) some bytes that were being taken as the chn_title.
It actually seems like I overlooked the "version number" defined in the banner. http://problemkaputt.de/gbatek.htm#dscartridgeicontitle

chn_title and kor_title doesn't appear on every title, so some games not working like this would make sense. I'll implement the banner version handling which should potentially fix this.

Though I should make an error handler for this section, yeah. Thanks for pointing it out.
 

Pk11

A catgirl with a DSi
Member
Joined
Jun 26, 2019
Messages
1,285
Trophies
1
Age
22
Location
米国
Website
xn--rck9c.xn--tckwe
XP
3,908
Country
United States
Oh, I get that crash too using Pokémon Blaze Black 2, a lot of ROM hacks have corrupted chinese and korean titles since ndstool doesn't support them.

It actually seems like I overlooked the "version number" defined in the banner. http://problemkaputt.de/gbatek.htm#dscartridgeicontitle

chn_title and kor_title doesn't appear on every title, so some games not working like this would make sense. I'll implement the banner version handling which should potentially fix this.

Though I should make an error handler for this section, yeah. Thanks for pointing it out.
You can't rely on the version number because of ROM hacks like Blaze Black 2 that identify as 0x0103 (DSi, has Chinese and Korean titles) but actually... don't.

If you want to do it properly you'd probably want to check the version and then also check the CRC16s on the titles to make sure they're correct, however for a simple solution could probably just change at line 98 to:
Python:
    if len(chn_title) == 1 or chn_title[0][0] == "\uffff":
        chn_title = None
    if len(kor_title) == 1 or kor_title[0][0] == "\uffff":
        kor_title = None
(check the len of the titles instead of specifically that they're [""], ex. Blaze Black has['ĸ'] for the Chinese title and ['о'] for the Korean title)
 
v1.0.1

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,449
Country
Canada
YANBF v1.0.1

https://github.com/lifehackerhansol/YANBF/releases/tag/v1.0.1

Bug fixes:
  • Proper checking of the banner version and CRC-16 is now implemented to avoid issues with poorly created banners, common in some ROM hacks.
  • requirements.txt has been added.
Enhancements:
  • Better error handling for bannertool and makerom has been added to allow for proper debugging if things break
 

Olmectron

Well-Known Member
Member
Joined
Dec 31, 2012
Messages
2,657
Trophies
2
Age
31
Location
A game
XP
3,855
Country
Mexico
YANBF v1.0.1

https://github.com/lifehackerhansol/YANBF/releases/tag/v1.0.1

Bug fixes:
  • Proper checking of the banner version and CRC-16 is now implemented to avoid issues with poorly created banners, common in some ROM hacks.
  • requirements.txt has been added.
Enhancements:
  • Better error handling for bannertool and makerom has been added to allow for proper debugging if things break
Good!

Now just update the OP's pip install in step 8 with -r requirements.txt or add libscrc in there.
 
  • Like
Reactions: lifehackerhansol

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,449
Country
Canada
Good!

Now just update the OP's pip install in step 8 with -r requirements.txt or add libscrc in there.
Right, I forgot I put instructions on this thread. oops

Also, GitHub Actions died on me so the builds don't actually exist. Please wait while I mess with this thing.
EDIT: should be fixed.
 
Last edited by lifehackerhansol,
  • Like
Reactions: Olmectron
v1.1.0

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,449
Country
Canada

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,449
Country
Canada
can you add the widescreen patch support?
There's 4 steps to the forwarder:
1. The HOME menu icon
2. The DSi-mode target
3. The SD card template app that handles extra parameters such as clock speed etc
4. and finally nds-bootstrap

To add widescreen support, the app in step 3 needs to be updated with it, which is maintained by @RocketRobz and not me. You will need to ask here: https://gbatemp.net/threads/nds-forwarder-cias-for-your-home-menu.426174/

(This would also allow widescreen for existing Forwarder3-DS users.)
 
  • Like
Reactions: champsblinder02

Inno

Member
Newcomer
Joined
Nov 24, 2019
Messages
8
Trophies
0
Age
27
XP
175
Country
United States
After following the directions to the letter, I tried using the GUI application to convert the files to .cia and get this:

Code:
Running makerom...

[SETTING ERROR] "-o" takes one parameter
[RESULT] Invalid arguments, see 'makerom -help'

I'm a total know-nothing at this and have no clue where to go from here.
 

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
  • BakerMan
    I rather enjoy a life of taking it easy. I haven't reached that life yet though.
  • K3Nv2 @ K3Nv2:
    No real point since movies are 30fps
  • BigOnYa @ BigOnYa:
    Not a big movie buff, more of a gamer tbh. And Series X is 120hz 8k ready, but yea only 120hz 4k games out right now, but thinking of in the future.
  • K3Nv2 @ K3Nv2:
    Mostly why you never see TV manufacturers going post 60hz
  • BigOnYa @ BigOnYa:
    I only watch tv when i goto bed, it puts me to sleep, and I have a nas drive filled w my fav shows so i can watch them in order, commercial free. I usually watch Married w Children, or South Park
  • K3Nv2 @ K3Nv2:
    Stremio ruined my need for nas
  • BigOnYa @ BigOnYa:
    I stream from Nas to firestick, one on every tv, and use Kodi. I'm happy w it, plays everything. (I pirate/torrent shows/movies on pc, and put on nas)
  • K3Nv2 @ K3Nv2:
    Kodi repost are still pretty popular
  • BigOnYa @ BigOnYa:
    What the hell is Kodi reposts? what do you mean, or "Wut?" -xdqwerty
  • K3Nv2 @ K3Nv2:
    Google them basically web crawlers to movie sites
  • BigOnYa @ BigOnYa:
    oh you mean the 3rd party apps on Kodi, yea i know what you mean, yea there are still a few cool ones, in fact watched the new planet of the apes movie other night w wifey thru one, was good pic surprisingly, not a cam
  • BigOnYa @ BigOnYa:
    Damn, only $2.06 and free shipping. Gotta cost more for them to ship than $2.06
    +1
  • BigOnYa @ BigOnYa:
    I got my Dad a firestick for Xmas and showed him those 3rd party sites on Kodi, he loves it, all he watches anymore. He said he has got 3 letters from AT&T already about pirating, but he says f them, let them shut my internet off (He wants out of his AT&T contract anyways)
  • K3Nv2 @ K3Nv2:
    That's where stremio comes to play never got a letter about it
  • BigOnYa @ BigOnYa:
    I just use a VPN, even give him my login and password so can use it also, and he refuses, he's funny.
  • BigOnYa @ BigOnYa:
    I had to find and get him an old style flip phone even without text, cause thats what he wanted. No text, no internet, only phone calls. Old, old school.
  • Psionic Roshambo @ Psionic Roshambo:
    @BigOnYa, Lol I bought a new USB card reader thing on AliExpress last month for I think like 87 cents. Free shipping from China... It arrived it works and honestly I don't understand how it was so cheap.
    +1
  • BakerMan @ BakerMan:
    fellas
  • BakerMan @ BakerMan:
    would you rather have a 9-5 desk job with poor pay or work for an intergalactic space militia with no guarantee of being paid?
  • BakerMan @ BakerMan:
    basically, normal boring job or halo and/or helldivers irl
  • SylverReZ @ SylverReZ:
    Lol. Have you heard about this?
  • SylverReZ @ SylverReZ:
    I wish the people who make these emulators know the basic primer course on copyright and trademarks.
    SylverReZ @ SylverReZ: I wish the people who make these emulators know the basic primer course on copyright and trademarks.