Homebrew [release] HomeMenuHax

  • Thread starter Thread starter spinal_cord
  • Start date Start date
  • Views Views 181,374
  • Replies Replies 753
  • Likes Likes 13
I am partial to the basic black theme. But I have no experience with the compile thing and am tired of the white theme that themehax makes you use.

So my request is this: Can somebody make this with the basic black theme please?
 
As I only managed to get it to work on linux (windows has python instead of python3 and I was too lazy to rename it everywhere)
I can only try to explain how to setup a linux build environment. I won't explain though how to setup a linux operating system itself
but its not too hard (I used VMWare Player 12 and Ubuntu Gnome 15 64bit). I guess you'll find many tutorials on that one on Youtube etc.

Anyways, once you got linux booted up, you can do the following steps to setup your development environment:
1. Open a terminal, and paste the whole block of commands you can find here and press return.
2. After that, enter the following command (without quotation marks) and press return: "sudo ln -s /devkitARM /opt/devkitpro/devkitARM" (You have to enter your password there)
3. Go to the desktop via "cd Desktop" and make a folder with "mkdir 3DS" (or whatever you wanna call it)
4. Switch into that folder via "cd 3DS"
5. Download a copy of homemenuhax via "git clone https://github.com/yellows8/3ds_homemenuhax.git"
6. Switch into the folder via "cd 3ds_homemenuhax" (should be the name of the new folder)
7. Issue the command found on the homemenuhax github website (and change it to your liking).
The default is "make clean && time make LOADSDPAYLOAD=1 USE_PADCHECK=0x200 ENABLE_LOADROPBIN=1 ENABLE_HBLAUNCHER=1 LOADSDCFG_PADCHECK=1 MENUROP_PATH=menurop_prebuilt"
8. After pressing return, it should compile. When it's done, you'll see that <username>@ubuntu:<directory>$ prompt again. Should take around a minute with the default settings.
If its finished very quickly, you might wanna check if there is an error in the output and post that.
9. If everythings alright, you might need to compile the 3dsx file itself, which you can do by switching into the themehax-installer subfolder via "cd themehax_installer" and issue the "make" command there as well. Just type "make" and press return.
10. Now you should have the themehax_installer.3dsx and smdh files in that subfolder and all the themefiles in the themepayload subfolder. That's pretty much all you need.

Note: if you want to embed a custom theme, you have to append a "THEMEDATA_PATH=<relative path to an uncompressed body_LZ.bin file> to the command at point 7. You will notice that it takes a WHOLE lot longer (took me an hour on a fast PC) because it embeds the theme into all the files in the themepayload folder, which are something like 64 different files..

Hope I didn't forget something

//Note: To prevent any problems, look at the file size of the uncompressed body_LZ.bin file (if you plan to use a custom theme). If that number is dividable by 4, you shouldn't have any problems. If not, read here to solve that.
 
Last edited by AnukWolf,
Thanks for the, info been trying to figure this out! I'll try this later tonight, it'll be a good excuse to use my Linux partition :p
I remember reading somewhere that this method doesn't enable sound for custom themes, does anyone know if this is true?
 
Thanks for the, info been trying to figure this out! I'll try this later tonight, it'll be a good excuse to use my Linux partition :p
I remember reading somewhere that this method doesn't enable sound for custom themes, does anyone know if this is true?

With the above steps, it doesn't, yet. You can however do that if you write down the menuhax***.lz filename that is used by the themehax_installer (it'll tell you during installation),
copy that one (renamed to body_LZ.bin) and the bgm.bcstm (the sound file for the theme) into /3ds/CHMM2/Themes (of course you need to have that one installed), start CHMM2 and install the theme.
Worked for me that way and HBL was still accessible.

@Razorzeto I think it should work the same way it did for me. Just make sure that the make tool, python3 etc is installed (which it was by default in Ubuntu 15, not sure about Elementary)
 
Anyone having issues with themehax compiled with a custom theme, make sure that your decompressed theme size is a multiple of 4-bytes, otherwise it won't work (if its size isn't a multiple of 4-bytes just add 00s at the end of the file with an hex editor).
 
now it works on apps, but when i press home while playing on my cartidge and push another button it freeze again, maybe its for apps only?
 
Okay, I just compiled some themes for another user, tested one of them myself and it seems to work, even with bgm.
Also followed your saying @Garcia98 , that may probably be the reason why my own theme didn't work. Thanks for that^^

So if anyone wants a custom theme enabled themehax install to be compiled, send me a PM,
I guess I can make a few over the next days (it takes an hour per theme + extra work, so please don't spam me xD)
 
Okay, I just compiled some themes for another user, tested one of them myself and it seems to work, even with bgm.
Also followed your saying @Garcia98 , that may probably be the reason why my own theme didn't work. Thanks for that^^

So if anyone wants a custom theme enabled themehax install to be compiled, send me a PM,
I guess I can make a few over the next days (it takes an hour per theme + extra work, so please don't spam me xD)

Why don't you just compile the payload that you need (excluding in the Makefile the rest)?
 
  • Like
Reactions: AnukWolf
That works? Darn, I already wondered if there is a way to only compile the one I want. Thanks again^^
 
If you guys are not interested in sharing, you can make only one that belongs to your firmware.

Edit makefile like this

Code:
all:   
    @mkdir -p themepayload
    @mkdir -p binpayload
    @mkdir -p build
    #@if [ ! -d "$(MENUROP_PATH)/JPN" ]; then $$(error "The $(MENUROP_PATH)/JPN directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/USA" ]; then $$(error "The $(MENUROP_PATH)/USA directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    @if [ ! -d "$(MENUROP_PATH)/EUR" ]; then $$(error "The $(MENUROP_PATH)/EUR directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/CHN" ]; then $$(error "The $(MENUROP_PATH)/CHN directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/KOR" ]; then $$(error "The $(MENUROP_PATH)/KOR directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/TWN" ]; then $$(error "The $(MENUROP_PATH)/TWN directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi

    #@for path in $(MENUROP_PATH)/JPN/*; do make -f Makefile buildtheme --no-print-directory REGION=JPN REGIONVAL=0 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/USA/*; do make -f Makefile buildtheme --no-print-directory REGION=USA REGIONVAL=1 MENUVERSION=$$(basename "$$path"); done
    @for path in $(MENUROP_PATH)/EUR/*; do make -f Makefile buildtheme --no-print-directory REGION=EUR REGIONVAL=2 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/CHN/*; do make -f Makefile buildtheme --no-print-directory REGION=CHN REGIONVAL=3 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/KOR/*; do make -f Makefile buildtheme --no-print-directory REGION=KOR REGIONVAL=4 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/TWN/*; do make -f Makefile buildtheme --no-print-directory REGION=TWN REGIONVAL=5 MENUVERSION=$$(basename "$$path"); done

ropbins:   
    @mkdir -p binpayload
    @mkdir -p build
    #@if [ ! -d "$(MENUROP_PATH)/JPN" ]; then $$(error "The $(MENUROP_PATH)/JPN directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/USA" ]; then $$(error "The $(MENUROP_PATH)/USA directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    @if [ ! -d "$(MENUROP_PATH)/EUR" ]; then $$(error "The $(MENUROP_PATH)/EUR directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/CHN" ]; then $$(error "The $(MENUROP_PATH)/CHN directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/KOR" ]; then $$(error "The $(MENUROP_PATH)/KOR directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/TWN" ]; then $$(error "The $(MENUROP_PATH)/TWN directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi

    #@for path in $(MENUROP_PATH)/JPN/*; do make -f Makefile buildropbin --no-print-directory REGION=JPN REGIONVAL=0 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/USA/*; do make -f Makefile buildropbin --no-print-directory REGION=USA REGIONVAL=1 MENUVERSION=$$(basename "$$path"); done
    @for path in $(MENUROP_PATH)/EUR/*; do make -f Makefile buildropbin --no-print-directory REGION=EUR REGIONVAL=2 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/CHN/*; do make -f Makefile buildropbin --no-print-directory REGION=CHN REGIONVAL=3 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/KOR/*; do make -f Makefile buildropbin --no-print-directory REGION=KOR REGIONVAL=4 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/TWN/*; do make -f Makefile buildropbin --no-print-directory REGION=TWN REGIONVAL=5 MENUVERSION=$$(basename "$$path"); done

bins:   
    @mkdir -p binpayload
    @mkdir -p build
    #@if [ ! -d "$(MENUROP_PATH)/JPN" ]; then $$(error "The $(MENUROP_PATH)/JPN directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/USA" ]; then $$(error "The $(MENUROP_PATH)/USA directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    @if [ ! -d "$(MENUROP_PATH)/EUR" ]; then $$(error "The $(MENUROP_PATH)/EUR directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/CHN" ]; then $$(error "The $(MENUROP_PATH)/CHN directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/KOR" ]; then $$(error "The $(MENUROP_PATH)/KOR directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi
    #@if [ ! -d "$(MENUROP_PATH)/TWN" ]; then $$(error "The $(MENUROP_PATH)/TWN directory doesn't exist, please run the generate_menurop_addrs.sh script."); fi

    #@for path in $(MENUROP_PATH)/JPN/*; do make -f Makefile buildbin --no-print-directory REGION=JPN REGIONVAL=0 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/USA/*; do make -f Makefile buildbin --no-print-directory REGION=USA REGIONVAL=1 MENUVERSION=$$(basename "$$path"); done
    @for path in $(MENUROP_PATH)/EUR/*; do make -f Makefile buildbin --no-print-directory REGION=EUR REGIONVAL=2 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/CHN/*; do make -f Makefile buildbin --no-print-directory REGION=CHN REGIONVAL=3 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/KOR/*; do make -f Makefile buildbin --no-print-directory REGION=KOR REGIONVAL=4 MENUVERSION=$$(basename "$$path"); done
    #@for path in $(MENUROP_PATH)/TWN/*; do make -f Makefile buildbin --no-print-directory REGION=TWN REGIONVAL=5 MENUVERSION=$$(basename "$$path"); done

clean:
    @rm -R -f themepayload
    @rm -R -f binpayload
    @rm -R -f build

buildtheme:
    @make -f Makefile themepayload/$(BUILDPREFIX)$(REGION)$(MENUVERSION)_old3ds.lz --no-print-directory BUILDPREFIX=$(BUILDPREFIX)$(REGION)$(MENUVERSION)_old3ds MENUVERSION=$(MENUVERSION) HEAPBUF_OBJADDR=$(HEAPBUF_OBJADDR_OLD3DS) HEAPBUF=$(HEAPBUF_HAX_OLD3DS) ROPBIN_BUFADR=$(HEAPBUF_ROPBIN_OLD3DS) NEW3DS=0 $(PARAMS)
    #@make -f Makefile themepayload/$(BUILDPREFIX)$(REGION)$(MENUVERSION)_new3ds.lz --no-print-directory BUILDPREFIX=$(BUILDPREFIX)$(REGION)$(MENUVERSION)_new3ds MENUVERSION=$(MENUVERSION) HEAPBUF_OBJADDR=$(HEAPBUF_OBJADDR_NEW3DS) HEAPBUF=$(HEAPBUF_HAX_NEW3DS) ROPBIN_BUFADR=$(HEAPBUF_ROPBIN_NEW3DS) NEW3DS=1 $(PARAMS)

buildropbin:
    @make -f Makefile binpayload/$(BUILDPREFIX)$(REGION)$(MENUVERSION)_old3ds.bin --no-print-directory BUILDPREFIX=$(BUILDPREFIX)$(REGION)$(MENUVERSION)_old3ds MENUVERSION=$(MENUVERSION) HEAPBUF_OBJADDR=$(HEAPBUF_OBJADDR_OLD3DS) HEAPBUF=$(HEAPBUF_ROPBIN_OLD3DS) NEW3DS=0 BUILDROPBIN=1 $(PARAMS)
    #@make -f Makefile binpayload/$(BUILDPREFIX)$(REGION)$(MENUVERSION)_new3ds.bin --no-print-directory BUILDPREFIX=$(BUILDPREFIX)$(REGION)$(MENUVERSION)_new3ds MENUVERSION=$(MENUVERSION) HEAPBUF_OBJADDR=$(HEAPBUF_OBJADDR_NEW3DS) HEAPBUF=$(HEAPBUF_ROPBIN_NEW3DS) NEW3DS=1 BUILDROPBIN=1 $(PARAMS)

buildbin:
    @make -f Makefile binpayload/$(BUILDPREFIX)$(REGION)$(MENUVERSION)_old3ds.bin --no-print-directory BUILDPREFIX=$(BUILDPREFIX)$(REGION)$(MENUVERSION)_old3ds MENUVERSION=$(MENUVERSION) HEAPBUF_OBJADDR=$(HEAPBUF_OBJADDR_OLD3DS) HEAPBUF=$(HEAPBUF_HAX_OLD3DS) ROPBIN_BUFADR=$(HEAPBUF_ROPBIN_OLD3DS) NEW3DS=0 $(PARAMS)
    #@make -f Makefile binpayload/$(BUILDPREFIX)$(REGION)$(MENUVERSION)_new3ds.bin --no-print-directory BUILDPREFIX=$(BUILDPREFIX)$(REGION)$(MENUVERSION)_new3ds MENUVERSION=$(MENUVERSION) HEAPBUF_OBJADDR=$(HEAPBUF_OBJADDR_NEW3DS) HEAPBUF=$(HEAPBUF_HAX_NEW3DS) ROPBIN_BUFADR=$(HEAPBUF_ROPBIN_NEW3DS) NEW3DS=1 $(PARAMS)

This builds for O3DS EUR only.

Just put # in front of what you don't want to build. And delete /menurop_prebuilt/{region}/{unwanted versions} to make it faster.
 
  • Like
Reactions: kiwiis
now it works on apps, but when i press home while playing on my cartidge and push another button it freeze again, maybe its for apps only?
IDK... For me it's working with my game cartridge. On the other hand, just use the method that another person (I forgot who was) gave to you in before posts, if you want to reload HBL automatically or you don't need to go to HOME Menu. I think, after all, this one is better than I said!
 
Last edited by fmkid,
@AnukWolf Sorry for the noob question but what do I put in the THEMEDATA_PATH for it to work?

I put "make clean && time make LOADSDPAYLOAD=1 USE_PADCHECK=0x200 ENABLE_LOADROPBIN=1 ENABLE_HBLAUNCHER=1 LOADSDCFG_PADCHECK=1 MENUROP_PATH=menurop_prebuilt THEMEDATA_PATH=<Desktop/dec_body_LZ.bin> but it always gives me a "bash: syntax error near unexpected token `newline'"

I know I'm doing something silly but I don't know much about linux.
 
@AnukWolf Sorry for the noob question but what do I put in the THEMEDATA_PATH for it to work?

I put "make clean && time make LOADSDPAYLOAD=1 USE_PADCHECK=0x200 ENABLE_LOADROPBIN=1 ENABLE_HBLAUNCHER=1 LOADSDCFG_PADCHECK=1 MENUROP_PATH=menurop_prebuilt THEMEDATA_PATH=<Desktop/dec_body_LZ.bin> but it always gives me a "bash: syntax error near unexpected token `newline'"

I know I'm doing something silly but I don't know much about linux.
THEMEDATA_PATH="C:/theme/body_LZ.bin"
 
@AnukWolf Sorry for the noob question but what do I put in the THEMEDATA_PATH for it to work?

I put "make clean && time make LOADSDPAYLOAD=1 USE_PADCHECK=0x200 ENABLE_LOADROPBIN=1 ENABLE_HBLAUNCHER=1 LOADSDCFG_PADCHECK=1 MENUROP_PATH=menurop_prebuilt THEMEDATA_PATH=<Desktop/dec_body_LZ.bin> but it always gives me a "bash: syntax error near unexpected token `newline'"

I know I'm doing something silly but I don't know much about linux.
The < and > where just part of the comment I made there ;) Just write THEMEDATA_PATH=Desktop/dec_body_LZ.bin and it should work. (assuming you are in your home folder)
 
can you relink me its post, yea im also confused why it's not working on game cartridge..thanks
 
Does BlargSNES work with this because on both Browserhax and Themehax, it crashes whenever I try to load a ROM. It worked fine on Ninjhax and Tubehax, however.
 

Site & Scene News

Popular threads in this forum