Would be awesomeIf nobody beats me to it, I'll write up a mini-tutorial later (probably leaving soon for the night, so I can't do it now). It's not really difficult, just a bit tedious.
He knows that, but "use makerom" is easier said than done. There's a lot of stuff to consider (like rsf files) and a lot that can go wrong.You have to use a banner tool to create banner and icon and makerom to create the final cia.
But you can still google itHe knows that, but "use makerom" is easier said than done. There's a lot of stuff to consider (like rsf files) and a lot that can go wrong.
bannertool.exe makebanner -i nameofyourpngfile.png -a nameofyourwavfile.wav -o banner.bnr
bannertool.exe makesmdh -s "Your Game Name Here" -l "Your Game Name Here" -p "Author Name Here" -i nameofyouricon.png -o icon.icn
BasicInfo:
Title : "Your Game Name Here"
ProductCode : "CTR-P-EDIT" # You can make this whatever you want, it doesn't have to follow the Nintendo standard
Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem
#RomFs:
# Specifies the root path of the read only file system to include in the ROM.
# RootPath : $(APP_ROMFS)
TitleInfo:
Category : Application
UniqueId : 0x1337 #Something like 0x1337, but you can make it whatever you want, as long as it's a hexadecimal number (probably best to make it something actually unique though!)
Option:
UseOnSD : true # true if App is to be installed to SD
FreeProductCode : true # Removes limitations on ProductCode
MediaFootPadding : false # If true CCI files are created with padding
EnableCrypt : $(APP_ENCRYPTED) # Enables encryption for NCCH and CIA
EnableCompress : true # Compresses where applicable (currently only exefs:/.code)
AccessControlInfo:
CoreVersion : 2
# Exheader Format Version
DescVersion : 2
# Minimum Required Kernel Version (below is for 4.5.0)
ReleaseKernelMajor : "02"
ReleaseKernelMinor : "33"
# ExtData
UseExtSaveData : false # enables ExtData
#ExtSaveDataId : 0x300 # only set this when the ID is different to the UniqueId
# FS:USER Archive Access Permissions
# Uncomment as required
FileSystemAccess:
#- CategorySystemApplication
#- CategoryHardwareCheck
- CategoryFileSystemTool
#- Debug
#- TwlCardBackup
#- TwlNandData
#- Boss
- DirectSdmc
#- Core
#- CtrNandRo
#- CtrNandRw
#- CtrNandRoWrite
#- CategorySystemSettings
#- CardBoard
#- ExportImportIvs
#- DirectSdmcWrite
#- SwitchCleanup
#- SaveDataMove
#- Shop
#- Shell
#- CategoryHomeMenu
# Process Settings
MemoryType : Application # Application/System/Base
SystemMode : 64MB # 64MB(Default)/96MB/80MB/72MB/32MB
IdealProcessor : 0
AffinityMask : 1
Priority : 16
MaxCpu : 0x9E # Default
HandleTableSize : 0x200
DisableDebug : false
EnableForceDebug : false
CanWriteSharedPage : true
CanUsePrivilegedPriority : false
CanUseNonAlphabetAndNumber : true
PermitMainFunctionArgument : true
CanShareDeviceMemory : true
RunnableOnSleep : false
SpecialMemoryArrange : true
# New3DS Exclusive Process Settings
SystemModeExt : Legacy # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode
CpuSpeed : 256MHz # 256MHz(Default)/804MHz
EnableL2Cache : true # false(default)/true
CanAccessCore2 : true
# Virtual Address Mappings
IORegisterMapping:
- 1ff00000-1ff7ffff # DSP memory
MemoryMapping:
- 1f000000-1f5fffff:r # VRAM
# Accessible SVCs, <Name>:<ID>
SystemCallAccess:
ArbitrateAddress: 34
Backdoor: 123
Break: 60
CancelTimer: 28
ClearEvent: 25
ClearTimer: 29
CloseHandle: 35
ConnectToPort: 45
ControlMemory: 1
ControlProcessMemory: 112
CreateAddressArbiter: 33
CreateEvent: 23
CreateMemoryBlock: 30
CreateMutex: 19
CreateSemaphore: 21
CreateThread: 8
CreateTimer: 26
DuplicateHandle: 39
ExitProcess: 3
ExitThread: 9
GetCurrentProcessorNumber: 17
GetHandleInfo: 41
GetProcessId: 53
GetProcessIdOfThread: 54
GetProcessIdealProcessor: 6
GetProcessInfo: 43
GetResourceLimit: 56
GetResourceLimitCurrentValues: 58
GetResourceLimitLimitValues: 57
GetSystemInfo: 42
GetSystemTick: 40
GetThreadContext: 59
GetThreadId: 55
GetThreadIdealProcessor: 15
GetThreadInfo: 44
GetThreadPriority: 11
MapMemoryBlock: 31
OutputDebugString: 61
QueryMemory: 2
ReleaseMutex: 20
ReleaseSemaphore: 22
SendSyncRequest1: 46
SendSyncRequest2: 47
SendSyncRequest3: 48
SendSyncRequest4: 49
SendSyncRequest: 50
SetThreadPriority: 12
SetTimer: 27
SignalEvent: 24
SleepThread: 10
UnmapMemoryBlock: 32
WaitSynchronization1: 36
WaitSynchronizationN: 37
# Service List
# Maximum 34 services (32 if firmware is prior to 9.6.0)
ServiceAccessControl:
- APT:U
- ac:u
- am:net
- boss:U
- cam:u
- cecd:u
- cfg:nor
- cfg:u
- csnd:SND
- dsp::DSP
- frd:u
- fs:USER
- gsp::Gpu
- hid:USER
- http:C
- ir:rst
- ir:u
- ir:USER
- mic:u
- ndm:u
- news:u
- nwm::UDS
- ptm:u
- pxi:dev
- soc:U
- ssl:C
- y2r:u
SystemControlInfo:
SaveDataSize: 0KB # Change if the app uses savedata
RemasterVersion: 2
StackSize: 0x40000
# Modules that run services listed above should be included below
# Maximum 48 dependencies
# <module name>:<module titleid>
Dependency:
ac: 0x0004013000002402
#act: 0x0004013000003802
am: 0x0004013000001502
boss: 0x0004013000003402
camera: 0x0004013000001602
cecd: 0x0004013000002602
cfg: 0x0004013000001702
codec: 0x0004013000001802
csnd: 0x0004013000002702
dlp: 0x0004013000002802
dsp: 0x0004013000001a02
friends: 0x0004013000003202
gpio: 0x0004013000001b02
gsp: 0x0004013000001c02
hid: 0x0004013000001d02
http: 0x0004013000002902
i2c: 0x0004013000001e02
ir: 0x0004013000003302
mcu: 0x0004013000001f02
mic: 0x0004013000002002
ndm: 0x0004013000002b02
news: 0x0004013000003502
#nfc: 0x0004013000004002
nim: 0x0004013000002c02
nwm: 0x0004013000002d02
pdn: 0x0004013000002102
ps: 0x0004013000003102
ptm: 0x0004013000002202
#qtm: 0x0004013020004202
ro: 0x0004013000003702
socket: 0x0004013000002e02
spi: 0x0004013000002302
ssl: 0x0004013000002f02
makerom -f cia -o install-me.cia -DAPP_ENCRYPTED=false -rsf rsffilename.rsf -target t -exefslogo -elf yourelffilename.elf -icon icon.icn -banner banner.bnr
makerom -f cci -o runme.3ds -DAPP_ENCRYPTED=true -rsf rsffilename.rsf -target t -exefslogo -elf yourelffilename.elf -icon icon.icn -banner banner.bnr
THANK YOU!Note: this post assumes you use a very recent version of makerom (makerom 0.14 should suffice: https://github.com/profi200/Project_CTR/releases). Do not copy and paste the commands you see here, read what this post says, and substitute in your own named files.
To make your own banner (only a 2D one will be covered here), make or get a PNG file that's 256x128 in dimensions, and make or get a WAV file that's 3 seconds in length, or less, if you want a banner with sound. Then you'll want to get bannertool (https://github.com/Steveice10/bannertool, or grab the binary from https://github.com/Steveice10/citrus/tree/master/tools), and run it as follows:
Code:bannertool.exe makebanner -i nameofyourpngfile.png -a nameofyourwavfile.wav -o banner.bnr
If you don't want sound, I believe you can omit the -a argument (need to verify this though).
To make your own icon, it's pretty much the same process: get a PNG file that's 48x48 in dimensions, then just run bannertool again:
Code:bannertool.exe makesmdh -s "Your Game Name Here" -l "Your Game Name Here" -p "Author Name Here" -i nameofyouricon.png -o icon.icn
Then to combine it all into a CIA, you need to use makerom. You'll need an RSF file, which tells the 3DS what sort of services the program can access, what to name the game, and things like that. Here's an example one that will probably work for most homebrew programs (if the program you're trying to make a cia for already has an rsf, you might want to use that instead; it might require services that this example doesn't provide, though you could just edit this example too).
Code:BasicInfo: Title : "Your Game Name Here" ProductCode : "CTR-P-EDIT" # You can make this whatever you want, it doesn't have to follow the Nintendo standard Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem #RomFs: # Specifies the root path of the read only file system to include in the ROM. # RootPath : $(APP_ROMFS) TitleInfo: Category : Application UniqueId : 0x1337 #Something like 0x1337, but you can make it whatever you want, as long as it's a hexadecimal number (probably best to make it something actually unique though!) Option: UseOnSD : true # true if App is to be installed to SD FreeProductCode : true # Removes limitations on ProductCode MediaFootPadding : false # If true CCI files are created with padding EnableCrypt : $(APP_ENCRYPTED) # Enables encryption for NCCH and CIA EnableCompress : true # Compresses where applicable (currently only exefs:/.code) AccessControlInfo: CoreVersion : 2 # Exheader Format Version DescVersion : 2 # Minimum Required Kernel Version (below is for 4.5.0) ReleaseKernelMajor : "02" ReleaseKernelMinor : "33" # ExtData UseExtSaveData : false # enables ExtData #ExtSaveDataId : 0x300 # only set this when the ID is different to the UniqueId # FS:USER Archive Access Permissions # Uncomment as required FileSystemAccess: #- CategorySystemApplication #- CategoryHardwareCheck - CategoryFileSystemTool #- Debug #- TwlCardBackup #- TwlNandData #- Boss - DirectSdmc #- Core #- CtrNandRo #- CtrNandRw #- CtrNandRoWrite #- CategorySystemSettings #- CardBoard #- ExportImportIvs #- DirectSdmcWrite #- SwitchCleanup #- SaveDataMove #- Shop #- Shell #- CategoryHomeMenu # Process Settings MemoryType : Application # Application/System/Base SystemMode : 64MB # 64MB(Default)/96MB/80MB/72MB/32MB IdealProcessor : 0 AffinityMask : 1 Priority : 16 MaxCpu : 0x9E # Default HandleTableSize : 0x200 DisableDebug : false EnableForceDebug : false CanWriteSharedPage : true CanUsePrivilegedPriority : false CanUseNonAlphabetAndNumber : true PermitMainFunctionArgument : true CanShareDeviceMemory : true RunnableOnSleep : false SpecialMemoryArrange : true # New3DS Exclusive Process Settings SystemModeExt : Legacy # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode CpuSpeed : 256MHz # 256MHz(Default)/804MHz EnableL2Cache : true # false(default)/true CanAccessCore2 : true # Virtual Address Mappings IORegisterMapping: - 1ff00000-1ff7ffff # DSP memory MemoryMapping: - 1f000000-1f5fffff:r # VRAM # Accessible SVCs, <Name>:<ID> SystemCallAccess: ArbitrateAddress: 34 Backdoor: 123 Break: 60 CancelTimer: 28 ClearEvent: 25 ClearTimer: 29 CloseHandle: 35 ConnectToPort: 45 ControlMemory: 1 ControlProcessMemory: 112 CreateAddressArbiter: 33 CreateEvent: 23 CreateMemoryBlock: 30 CreateMutex: 19 CreateSemaphore: 21 CreateThread: 8 CreateTimer: 26 DuplicateHandle: 39 ExitProcess: 3 ExitThread: 9 GetCurrentProcessorNumber: 17 GetHandleInfo: 41 GetProcessId: 53 GetProcessIdOfThread: 54 GetProcessIdealProcessor: 6 GetProcessInfo: 43 GetResourceLimit: 56 GetResourceLimitCurrentValues: 58 GetResourceLimitLimitValues: 57 GetSystemInfo: 42 GetSystemTick: 40 GetThreadContext: 59 GetThreadId: 55 GetThreadIdealProcessor: 15 GetThreadInfo: 44 GetThreadPriority: 11 MapMemoryBlock: 31 OutputDebugString: 61 QueryMemory: 2 ReleaseMutex: 20 ReleaseSemaphore: 22 SendSyncRequest1: 46 SendSyncRequest2: 47 SendSyncRequest3: 48 SendSyncRequest4: 49 SendSyncRequest: 50 SetThreadPriority: 12 SetTimer: 27 SignalEvent: 24 SleepThread: 10 UnmapMemoryBlock: 32 WaitSynchronization1: 36 WaitSynchronizationN: 37 # Service List # Maximum 34 services (32 if firmware is prior to 9.6.0) ServiceAccessControl: - APT:U - ac:u - am:net - boss:U - cam:u - cecd:u - cfg:nor - cfg:u - csnd:SND - dsp::DSP - frd:u - fs:USER - gsp::Gpu - hid:USER - http:C - ir:rst - ir:u - ir:USER - mic:u - ndm:u - news:u - nwm::UDS - ptm:u - pxi:dev - soc:U - ssl:C - y2r:u SystemControlInfo: SaveDataSize: 0KB # Change if the app uses savedata RemasterVersion: 2 StackSize: 0x40000 # Modules that run services listed above should be included below # Maximum 48 dependencies # <module name>:<module titleid> Dependency: ac: 0x0004013000002402 #act: 0x0004013000003802 am: 0x0004013000001502 boss: 0x0004013000003402 camera: 0x0004013000001602 cecd: 0x0004013000002602 cfg: 0x0004013000001702 codec: 0x0004013000001802 csnd: 0x0004013000002702 dlp: 0x0004013000002802 dsp: 0x0004013000001a02 friends: 0x0004013000003202 gpio: 0x0004013000001b02 gsp: 0x0004013000001c02 hid: 0x0004013000001d02 http: 0x0004013000002902 i2c: 0x0004013000001e02 ir: 0x0004013000003302 mcu: 0x0004013000001f02 mic: 0x0004013000002002 ndm: 0x0004013000002b02 news: 0x0004013000003502 #nfc: 0x0004013000004002 nim: 0x0004013000002c02 nwm: 0x0004013000002d02 pdn: 0x0004013000002102 ps: 0x0004013000003102 ptm: 0x0004013000002202 #qtm: 0x0004013020004202 ro: 0x0004013000003702 socket: 0x0004013000002e02 spi: 0x0004013000002302 ssl: 0x0004013000002f02
Anyway, now you're ready to build the cia. Use makerom:
Code:makerom -f cia -o install-me.cia -DAPP_ENCRYPTED=false -rsf rsffilename.rsf -target t -exefslogo -elf yourelffilename.elf -icon icon.icn -banner banner.bnr
If you want to spit out a .3ds file instead, it's more or less the same:
Code:makerom -f cci -o runme.3ds -DAPP_ENCRYPTED=true -rsf rsffilename.rsf -target t -exefslogo -elf yourelffilename.elf -icon icon.icn -banner banner.bnr
That's about it.
It worked very well Thank you againYou're welcome. I hope it helps.
Not an expert, but that seems like a really high bitrate for a 3ds. That wav file is enourmous.Okay, got a little problem.
Tried to use a sound for my built cia (.wav file, size: 380kb, length: 3sec, bitrate: 1024kbit/s).
But I only hear a few beeps when using it.
here's the wav I use: http://www.xup.in/dl,13612937/audio.wav/
is it possible to get it to work?
I constantly get:Note: this post assumes you use a very recent version of makerom (makerom 0.14 should suffice: https://github.com/profi200/Project_CTR/releases). Do not copy and paste the commands you see here, read what this post says, and substitute in your own named files.
To make your own banner (only a 2D one will be covered here), make or get a PNG file that's 256x128 in dimensions, and make or get a WAV file that's 3 seconds in length, or less, if you want a banner with sound. Then you'll want to get bannertool (https://github.com/Steveice10/bannertool, or grab the binary from https://github.com/Steveice10/citrus/tree/master/tools), and run it as follows:
Code:bannertool.exe makebanner -i nameofyourpngfile.png -a nameofyourwavfile.wav -o banner.bnr
If you don't want sound, I believe you can omit the -a argument (need to verify this though).
To make your own icon, it's pretty much the same process: get a PNG file that's 48x48 in dimensions, then just run bannertool again:
Code:bannertool.exe makesmdh -s "Your Game Name Here" -l "Your Game Name Here" -p "Author Name Here" -i nameofyouricon.png -o icon.icn
Then to combine it all into a CIA, you need to use makerom. You'll need an RSF file, which tells the 3DS what sort of services the program can access, what to name the game, and things like that. Here's an example one that will probably work for most homebrew programs (if the program you're trying to make a cia for already has an rsf, you might want to use that instead; it might require services that this example doesn't provide, though you could just edit this example too).
Code:BasicInfo: Title : "Your Game Name Here" ProductCode : "CTR-P-EDIT" # You can make this whatever you want, it doesn't have to follow the Nintendo standard Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem #RomFs: # Specifies the root path of the read only file system to include in the ROM. # RootPath : $(APP_ROMFS) TitleInfo: Category : Application UniqueId : 0x1337 #Something like 0x1337, but you can make it whatever you want, as long as it's a hexadecimal number (probably best to make it something actually unique though!) Option: UseOnSD : true # true if App is to be installed to SD FreeProductCode : true # Removes limitations on ProductCode MediaFootPadding : false # If true CCI files are created with padding EnableCrypt : $(APP_ENCRYPTED) # Enables encryption for NCCH and CIA EnableCompress : true # Compresses where applicable (currently only exefs:/.code) AccessControlInfo: CoreVersion : 2 # Exheader Format Version DescVersion : 2 # Minimum Required Kernel Version (below is for 4.5.0) ReleaseKernelMajor : "02" ReleaseKernelMinor : "33" # ExtData UseExtSaveData : false # enables ExtData #ExtSaveDataId : 0x300 # only set this when the ID is different to the UniqueId # FS:USER Archive Access Permissions # Uncomment as required FileSystemAccess: #- CategorySystemApplication #- CategoryHardwareCheck - CategoryFileSystemTool #- Debug #- TwlCardBackup #- TwlNandData #- Boss - DirectSdmc #- Core #- CtrNandRo #- CtrNandRw #- CtrNandRoWrite #- CategorySystemSettings #- CardBoard #- ExportImportIvs #- DirectSdmcWrite #- SwitchCleanup #- SaveDataMove #- Shop #- Shell #- CategoryHomeMenu # Process Settings MemoryType : Application # Application/System/Base SystemMode : 64MB # 64MB(Default)/96MB/80MB/72MB/32MB IdealProcessor : 0 AffinityMask : 1 Priority : 16 MaxCpu : 0x9E # Default HandleTableSize : 0x200 DisableDebug : false EnableForceDebug : false CanWriteSharedPage : true CanUsePrivilegedPriority : false CanUseNonAlphabetAndNumber : true PermitMainFunctionArgument : true CanShareDeviceMemory : true RunnableOnSleep : false SpecialMemoryArrange : true # New3DS Exclusive Process Settings SystemModeExt : Legacy # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode CpuSpeed : 256MHz # 256MHz(Default)/804MHz EnableL2Cache : true # false(default)/true CanAccessCore2 : true # Virtual Address Mappings IORegisterMapping: - 1ff00000-1ff7ffff # DSP memory MemoryMapping: - 1f000000-1f5fffff:r # VRAM # Accessible SVCs, <Name>:<ID> SystemCallAccess: ArbitrateAddress: 34 Backdoor: 123 Break: 60 CancelTimer: 28 ClearEvent: 25 ClearTimer: 29 CloseHandle: 35 ConnectToPort: 45 ControlMemory: 1 ControlProcessMemory: 112 CreateAddressArbiter: 33 CreateEvent: 23 CreateMemoryBlock: 30 CreateMutex: 19 CreateSemaphore: 21 CreateThread: 8 CreateTimer: 26 DuplicateHandle: 39 ExitProcess: 3 ExitThread: 9 GetCurrentProcessorNumber: 17 GetHandleInfo: 41 GetProcessId: 53 GetProcessIdOfThread: 54 GetProcessIdealProcessor: 6 GetProcessInfo: 43 GetResourceLimit: 56 GetResourceLimitCurrentValues: 58 GetResourceLimitLimitValues: 57 GetSystemInfo: 42 GetSystemTick: 40 GetThreadContext: 59 GetThreadId: 55 GetThreadIdealProcessor: 15 GetThreadInfo: 44 GetThreadPriority: 11 MapMemoryBlock: 31 OutputDebugString: 61 QueryMemory: 2 ReleaseMutex: 20 ReleaseSemaphore: 22 SendSyncRequest1: 46 SendSyncRequest2: 47 SendSyncRequest3: 48 SendSyncRequest4: 49 SendSyncRequest: 50 SetThreadPriority: 12 SetTimer: 27 SignalEvent: 24 SleepThread: 10 UnmapMemoryBlock: 32 WaitSynchronization1: 36 WaitSynchronizationN: 37 # Service List # Maximum 34 services (32 if firmware is prior to 9.6.0) ServiceAccessControl: - APT:U - ac:u - am:net - boss:U - cam:u - cecd:u - cfg:nor - cfg:u - csnd:SND - dsp::DSP - frd:u - fs:USER - gsp::Gpu - hid:USER - http:C - ir:rst - ir:u - ir:USER - mic:u - ndm:u - news:u - nwm::UDS - ptm:u - pxi:dev - soc:U - ssl:C - y2r:u SystemControlInfo: SaveDataSize: 0KB # Change if the app uses savedata RemasterVersion: 2 StackSize: 0x40000 # Modules that run services listed above should be included below # Maximum 48 dependencies # <module name>:<module titleid> Dependency: ac: 0x0004013000002402 #act: 0x0004013000003802 am: 0x0004013000001502 boss: 0x0004013000003402 camera: 0x0004013000001602 cecd: 0x0004013000002602 cfg: 0x0004013000001702 codec: 0x0004013000001802 csnd: 0x0004013000002702 dlp: 0x0004013000002802 dsp: 0x0004013000001a02 friends: 0x0004013000003202 gpio: 0x0004013000001b02 gsp: 0x0004013000001c02 hid: 0x0004013000001d02 http: 0x0004013000002902 i2c: 0x0004013000001e02 ir: 0x0004013000003302 mcu: 0x0004013000001f02 mic: 0x0004013000002002 ndm: 0x0004013000002b02 news: 0x0004013000003502 #nfc: 0x0004013000004002 nim: 0x0004013000002c02 nwm: 0x0004013000002d02 pdn: 0x0004013000002102 ps: 0x0004013000003102 ptm: 0x0004013000002202 #qtm: 0x0004013020004202 ro: 0x0004013000003702 socket: 0x0004013000002e02 spi: 0x0004013000002302 ssl: 0x0004013000002f02
Anyway, now you're ready to build the cia. Use makerom:
Code:makerom -f cia -o install-me.cia -DAPP_ENCRYPTED=false -rsf rsffilename.rsf -target t -exefslogo -elf yourelffilename.elf -icon icon.icn -banner banner.bnr
If you want to spit out a .3ds file instead, it's more or less the same:
Code:makerom -f cci -o runme.3ds -DAPP_ENCRYPTED=true -rsf rsffilename.rsf -target t -exefslogo -elf yourelffilename.elf -icon icon.icn -banner banner.bnr
That's about it.
I constantly get:
[EXHEADER ERROR] Invalid cpu speed: 0x256MHz
[EXHEADER ERROR] Failed to create ExHeader
[NCCH ERROR] NCCH Build Process Failed
[RESULT] Failed to build outfile
Any fix?
but how are you supposed to change it to something other than a hexadecimal numberShould be 268Mhz now, if you're using the latest makerom, and no need for the "0x" part, it's not a hexadecimal number.