Homebrew [QUESTION] How I can make CIA from Homebrew Apps?

KytuzuEX

Recreate your Re:Creators by Recreating.
OP
Member
Joined
Apr 21, 2014
Messages
755
Trophies
0
Age
24
XP
676
Country
Puerto Rico
I'm interested to make some. (and for help if necessary)

I know about the UniqueIDs.
 
Last edited by KytuzuEX,

Ryccardo

watching Thames TV from London
Member
Joined
Feb 13, 2015
Messages
7,403
Trophies
0
Age
27
Location
Imola
XP
6,392
Country
Italy
You need to start from the homebrew compiled as ELF (or convert the homebrew from a .3ds, but those are less common than cias lol), then you also need a banner and icon (there's a python tool to create basic static, 2d ones that just fly up a little when you blow in the mic), and you need to know what services the app uses, as they must be specified into the banner.

Anyhing released as 3dsx only that uses "choose a base game" feature of the launcher can't be ported this way (with any reasonable functionality). Not that you can readily convert 3dsx to cia anyway!
 
  • Like
Reactions: KytuzuEX

Luglige

hiatus
Member
Joined
Jan 24, 2016
Messages
1,414
Trophies
1
Location
under your bed
XP
872
Country
Antarctica
You need to start from the homebrew compiled as ELF (or convert the homebrew from a .3ds, but those are less common than cias lol), then you also need a banner and icon (there's a python tool to create basic static, 2d ones that just fly up a little when you blow in the mic), and you need to know what services the app uses, as they must be specified into the banner.

Anyhing released as 3dsx only that uses "choose a base game" feature of the launcher can't be ported this way (with any reasonable functionality). Not that you can readily convert 3dsx to cia anyway!
Ok that's cool, but could there be a possibility of a CIA Packager though. We could make one. That would be cool to.
 

Ryccardo

watching Thames TV from London
Member
Joined
Feb 13, 2015
Messages
7,403
Trophies
0
Age
27
Location
Imola
XP
6,392
Country
Italy
Yeah, you should ask the developer (or someone who is willing to do it for you, and is already skilled in compiling homebrew from source!)
 

Luglige

hiatus
Member
Joined
Jan 24, 2016
Messages
1,414
Trophies
1
Location
under your bed
XP
872
Country
Antarctica
Here you go make rom and this

--------------------- MERGED ---------------------------

oh cant for get this

--------------------- MERGED ---------------------------

Dang found this golden quote
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.
 
  • Like
Reactions: Ryccardo
General chit-chat
Help Users
    K3N1 @ K3N1: Their mouth feels better than a pi