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,447
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,447
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,447
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,447
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,447
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,905
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,447
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,447
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,447
Country
Canada

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,447
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
  • NinStar @ NinStar:
    nes remix 1 had the bad one, nes remix 2 had the good one
  • SylverReZ @ SylverReZ:
    @genistopitauniverfrocrami, What drugs is this dude on?
    +1
  • NinStar @ NinStar:
    CRAZY HAMBURGER
  • The Real Jdbye @ The Real Jdbye:
    @NinStar both nes remix 1 and 2 had some stinkers in there
    +1
  • The Real Jdbye @ The Real Jdbye:
    but at least 2 doesn't have sports games
  • The Real Jdbye @ The Real Jdbye:
    loved nes remix, but hated having to play Baseball, Tennis and Golf in order to progress
    +1
  • The Real Jdbye @ The Real Jdbye:
    or fucking Clu Clu Land for that matter
  • Psionic Roshambo @ Psionic Roshambo:
    Not a big fan of NES kid Icarus either... I know it was popular but I didn't care for it.
  • Psionic Roshambo @ Psionic Roshambo:
    Yesterday I learned my BD Burner drive can burn CD's at 56X lol
  • cearp @ cearp:
    What stuff were you burning?
    I used to burn tons of dvds (data files) many years ago, but haven't burnt a disk in ages.
  • Psionic Roshambo @ Psionic Roshambo:
    My car actually reads MP3 CD's lol
  • Psionic Roshambo @ Psionic Roshambo:
    So mix CDs for myselt :)
  • Psionic Roshambo @ Psionic Roshambo:
    Pantera, Metallica, Hollywood Undead, Five Finger Death Punch, some others lol
  • Psionic Roshambo @ Psionic Roshambo:
    I can put like 90 songs on a CD lol
  • The Real Jdbye @ The Real Jdbye:
    if only it could read dvds then you would just need 1 disc
    +1
  • BakerMan @ BakerMan:
    i tell ya what, i could go for a fuckin gyro right about now
    +1
  • cearp @ cearp:
    I hope your brother is doing ok Mr BakerMan
    +1
  • cearp @ cearp:
    and Psi - I had a cd player / radio that played mp3 cds once, very cool
    +1
  • Psionic Roshambo @ Psionic Roshambo:
    BakerMan yeah me too.... maybe that's gonna be dinner for me there is this place near me I have been dying to try and they have them lol
  • K3Nv2 @ K3Nv2:
    I miss usb mp3 players they were shit but at the time a go to
  • Psionic Roshambo @ Psionic Roshambo:
    @The Real Jdbye, I thought about that and I have blank DVD's and Blurays but honestly after like 90 songs I just listen to it a couple of hundred times toss it out and burn something else or have like 2-3 CD's. Florida here the heat in the car tends to ruin the CD's after like a few months even commercial pressed ones don't last too long.
  • The Real Jdbye @ The Real Jdbye:
    my music collection is just too big, i require variety
    The Real Jdbye @ The Real Jdbye: my music collection is just too big, i require variety