Now compiles on devkitarm r46 and libnds 1.6.2

It runs and appears to play the boot animation correctly, however it
hangs after loading the game binaries. (from what I can tell after
re-enabling the debug display box code stuff. It displays 3 red boxes
then a blue, then the screen is cleared. I assume this means it didn't
detect an error and attempted to launch the game)

Seems like something in new libnds/devkitarm is breaking something.
Someone will need to debug this and find out why. This issue isn't
something I can resolve alone sadly. Until this is fixed the previous
build will remain until this is resolved.
This commit is contained in:
ApacheThunder 2017-02-12 20:55:16 -06:00
parent db78e8260e
commit 89c74797d9
18 changed files with 10 additions and 1076 deletions

View File

@ -141,9 +141,6 @@ Written by Darkain, modified by Chishm
--------------------------------------------------------------------------*/ --------------------------------------------------------------------------*/
void arm9_main (void) { void arm9_main (void) {
// volatile u32* SCFG_EXT = (volatile u32*)0x4004008;
// volatile u32* SCFG_CLK = (volatile u32*)0x4004004;
register int i; register int i;
//set shared ram to ARM7 //set shared ram to ARM7

View File

@ -11,7 +11,7 @@ export TARGET := NTR_Launcher
export TOPDIR := $(CURDIR) export TOPDIR := $(CURDIR)
export VERSION_MAJOR := 1 export VERSION_MAJOR := 1
export VERSION_MINOR := 96 export VERSION_MINOR := 97
export VERSTRING := $(VERSION_MAJOR).$(VERSION_MINOR) export VERSTRING := $(VERSION_MAJOR).$(VERSION_MINOR)
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
@ -28,7 +28,8 @@ all: $(TARGET).nds
$(TARGET).nds : $(TARGET).arm7 $(TARGET).arm9 $(TARGET).nds : $(TARGET).arm7 $(TARGET).arm9
ndstool -c $(TARGET).nds -7 arm7/$(TARGET).arm7.elf -9 arm9/$(TARGET).arm9.elf \ ndstool -c $(TARGET).nds -7 arm7/$(TARGET).arm7.elf -9 arm9/$(TARGET).arm9.elf \
-b $(CURDIR)/icon.bmp "NTR Launcher;NitroHax provided by Chishm;Modified by Apache Thunder" -b $(CURDIR)/icon.bmp "NTR Launcher;NitroHax provided by Chishm;Modified by Apache Thunder" \
-g KKGP 01 "TWL LAUNCHER" -z 80040000 -u 00030004
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
$(TARGET).arm7 : arm7/$(TARGET).elf $(TARGET).arm7 : arm7/$(TARGET).elf

View File

@ -1 +0,0 @@
<Project name="NTR_Launcher"><Folder name="arm9"><Folder name="source"><File path="arm9\source\crc.c"></File><File path="arm9\source\crc.h"></File><File path="arm9\source\main.cpp"></File><File path="arm9\source\nds_card.c"></File><File path="arm9\source\nds_card.h"></File><File path="arm9\source\ui.cpp"></File><File path="arm9\source\ui.h"></File><File path="arm9\source\version.h"></File><File path="arm9\source\bios_decompress_callback.c"></File><File path="arm9\source\bios_decompress_callback.h"></File><File path="arm9\source\launch_engine.c"></File><File path="arm9\source\launch_engine.h"></File></Folder><File path="arm9\Makefile"></File></Folder><Folder name="arm7"><Folder name="source"><File path="arm7\source\cheat_engine_arm7.c"></File><File path="arm7\source\cheat_engine_arm7.h"></File><File path="arm7\source\main.c"></File></Folder><File path="arm7\Makefile"></File></Folder><Folder name="BootLoader"><Folder name="source"><File path="BootLoader\source\cheat.c"></File><File path="BootLoader\source\cheat.h"></File><File path="BootLoader\source\cheat_engine.s"></File><File path="BootLoader\source\clear_cache.arm9.s"></File><File path="BootLoader\source\clear_mem.s"></File><File path="BootLoader\source\common.h"></File><File path="BootLoader\source\crt0.arm9.s"></File><File path="BootLoader\source\encryption.c"></File><File path="BootLoader\source\encryption.h"></File><File path="BootLoader\source\launch_ds_crt0.s"></File><File path="BootLoader\source\main.arm7.c"></File><File path="BootLoader\source\main.arm9.c"></File><File path="BootLoader\source\read_bios.h"></File><File path="BootLoader\source\read_bios.s"></File><File path="BootLoader\source\read_card.h"></File><File path="BootLoader\source\read_card.c"></File></Folder><File path="BootLoader\Makefile"></File></Folder><File path="icon.bmp"></File><File path="Makefile"></File><File path="patch_ndsheader_dsiware.py"></File><File path="build_cia.sh"></File></Project>

View File

@ -1 +0,0 @@
<pd><ViewState><e p="NTR_Launcher\BootLoader" x="true"></e><e p="NTR_Launcher\BootLoader\source" x="true"></e><e p="NTR_Launcher\arm7" x="true"></e><e p="NTR_Launcher\arm9" x="true"></e><e p="NTR_Launcher" x="true"></e><e p="NTR_Launcher\arm7\source" x="true"></e><e p="NTR_Launcher\arm9\source" x="true"></e></ViewState></pd>

View File

@ -1,3 +0,0 @@
@Echo off
patch_ndsheader_dsiware.py NTR_Launcher.nds --mode dsi --maker 01 --code KKGP --title "TWL LAUNCHER" --out NTR_Launcher_Release.nds
pause

View File

@ -34,7 +34,7 @@ CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -fno-rtti
ASFLAGS := -g $(ARCH) ASFLAGS := -g $(ARCH)
LDFLAGS = -specs=../ds_arm7_ram.specs -g $(ARCH) -Wl,-Map,$(notdir $*).map LDFLAGS = -specs=ds_arm7.specs -g $(ARCH) -Wl,-Map,$(notdir $*).map
LIBS := -lmm7 -lnds7 LIBS := -lmm7 -lnds7

View File

@ -1,176 +0,0 @@
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
MEMORY {
rom : ORIGIN = 0x08000000, LENGTH = 32M
ram : ORIGIN = 0x2380000, LENGTH = 128K
iwram : ORIGIN = 0x037f8000, LENGTH = 96K
}
__iwram_start = ORIGIN(iwram);
__iwram_top = ORIGIN(iwram)+ LENGTH(iwram);
__sp_irq = __iwram_top - 0x100;
__sp_svc = __sp_irq - 0x100;
__sp_usr = __sp_svc - 0x100;
__irq_flags = 0x04000000 - 8;
__irq_flagsaux = 0x04000000 - 0x40;
__irq_vector = 0x04000000 - 4;
SECTIONS
{
.init :
{
__text_start = . ;
KEEP (*(.init))
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.plt : { *(.plt) } >ram = 0xff
.text : /* ALIGN (4): */
{
*(.text .stub .text.* .gnu.linkonce.t.*)
KEEP (*(.text.*personality*))
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
*(.glue_7t) *(.glue_7) *(.vfp11_veneer)
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.fini :
{
KEEP (*(.fini))
} >ram =0xff
__text_end = . ;
.rodata :
{
*(.rodata)
*all.rodata*(*)
*(.roda)
*(.rodata.*)
*(.gnu.linkonce.r*)
SORT(CONSTRUCTORS)
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >ram
__exidx_start = .;
.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >ram
__exidx_end = .;
/* Ensure the __preinit_array_start label is properly aligned. We
could instead move the label definition inside the section, but
the linker would then create the section even if it turns out to
be empty, which isn't pretty. */
. = ALIGN(32 / 8);
PROVIDE (__preinit_array_start = .);
.preinit_array : { KEEP (*(.preinit_array)) } >ram = 0xff
PROVIDE (__preinit_array_end = .);
PROVIDE (__init_array_start = .);
.init_array : { KEEP (*(.init_array)) } >ram = 0xff
PROVIDE (__init_array_end = .);
PROVIDE (__fini_array_start = .);
.fini_array : { KEEP (*(.fini_array)) } >ram = 0xff
PROVIDE (__fini_array_end = .);
.ctors :
{
/* gcc uses crtbegin.o to find the start of the constructors, so
we make sure it is first. Because this is a wildcard, it
doesn't matter if the user does not actually link against
crtbegin.o; the linker won't look for a file to match a
wildcard. The wildcard also means that it doesn't matter which
directory crtbegin.o is in. */
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.dtors :
{
KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.eh_frame :
{
KEEP (*(.eh_frame))
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.gcc_except_table :
{
*(.gcc_except_table)
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.jcr : { KEEP (*(.jcr)) } >ram = 0
.got : { *(.got.plt) *(.got) } >ram = 0
.data ALIGN(4) : {
__data_start = ABSOLUTE(.);
*(.data)
*(.data.*)
*(.gnu.linkonce.d*)
CONSTRUCTORS
. = ALIGN(4);
__data_end = ABSOLUTE(.) ;
} >ram = 0xff
.bss ALIGN(4) :
{
__bss_start = ABSOLUTE(.);
__bss_start__ = ABSOLUTE(.);
*(.dynbss)
*(.gnu.linkonce.b*)
*(.bss*)
*(COMMON)
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
__bss_end__ = ABSOLUTE(.);
__end__ = ABSOLUTE(.);
} >ram
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
.stack 0x80000 : { _stack = .; *(.stack) }
/* These must appear regardless of . */
}

View File

@ -1,8 +0,0 @@
%rename link old_link
*link:
%(old_link) -T ../ds_arm7_ram.ld%s --gc-sections
*startfile:
ds_arm7_crt0%O%s crti%O%s crtbegin%O%s

View File

@ -1,61 +0,0 @@
#define ARM7
/*---------------------------------------------------------------------------------
Copyright (C) 2009
Dave Murphy (WinterMute)
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you
must not claim that you wrote the original software. If you use
this software in a product, an acknowledgment in the product
documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
---------------------------------------------------------------------------------*/
.text
.align 4
.arm
@---------------------------------------------------------------------------------
.global swiSoftReset2
.type swiSoftReset2 STT_FUNC
@---------------------------------------------------------------------------------
swiSoftReset2:
@---------------------------------------------------------------------------------
REG_IME = 0;
#ifdef ARM7
ldr r0,=0x2FFFE34
#endif
#ifdef ARM9
.arch armv5te
.cpu arm946e-s
ldr r1, =0x00002078 @ disable TCM and protection unit
mcr p15, 0, r1, c1, c0
@ Disable cache
mov r0, #0
mcr p15, 0, r0, c7, c5, 0 @ Instruction cache
mcr p15, 0, r0, c7, c6, 0 @ Data cache
@ Wait for write buffer to empty
mcr p15, 0, r0, c7, c10, 4
ldr r0,=0x2FFFE24
#endif
ldr r0,[r0]
bx r0
.pool

View File

@ -19,9 +19,9 @@
#include <nds.h> #include <nds.h>
// #define REG_ROMCTRL (*(vu32*)0x40001A4) // #define REG_ROMCTRL (*(vu32*)0x40001A4)
#define REG_SCFG_ROM (*(vu32*)0x4004000) // #define REG_SCFG_ROM (*(vu32*)0x4004000)
#define REG_SCFG_CLK (*(vu32*)0x4004004) // #define REG_SCFG_CLK (*(vu32*)0x4004004)
#define REG_SCFG_EXT (*(vu32*)0x4004008) // #define REG_SCFG_EXT (*(vu32*)0x4004008)
// #define REG_SCFG_MC (*(vu32*)0x4004010) // #define REG_SCFG_MC (*(vu32*)0x4004010)
void runLaunchEngineCheck (void) void runLaunchEngineCheck (void)

View File

@ -24,12 +24,6 @@
#include "launch_engine_arm7.h" #include "launch_engine_arm7.h"
#define REG_ROMCTRL (*(vu32*)0x40001A4)
#define REG_SCFG_ROM (*(vu32*)0x4004000)
#define REG_SCFG_CLK (*(vu32*)0x4004004)
#define REG_SCFG_EXT (*(vu32*)0x4004008)
#define REG_SCFG_MC (*(vu32*)0x4004010)
void VcountHandler() { void VcountHandler() {
inputGetAndSend(); inputGetAndSend();
} }

View File

@ -1,61 +0,0 @@
#define ARM9
/*---------------------------------------------------------------------------------
Copyright (C) 2009
Dave Murphy (WinterMute)
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you
must not claim that you wrote the original software. If you use
this software in a product, an acknowledgment in the product
documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
---------------------------------------------------------------------------------*/
.text
.align 4
.arm
@---------------------------------------------------------------------------------
.global swiSoftReset2
.type swiSoftReset2 STT_FUNC
@---------------------------------------------------------------------------------
swiSoftReset2:
@---------------------------------------------------------------------------------
REG_IME = 0;
#ifdef ARM7
ldr r0,=0x2FFFE34
#endif
#ifdef ARM9
.arch armv5te
.cpu arm946e-s
ldr r1, =0x00002078 @ disable TCM and protection unit
mcr p15, 0, r1, c1, c0
@ Disable cache
mov r0, #0
mcr p15, 0, r0, c7, c5, 0 @ Instruction cache
mcr p15, 0, r0, c7, c6, 0 @ Data cache
@ Wait for write buffer to empty
mcr p15, 0, r0, c7, c10, 4
ldr r0,=0x2FFFE24
#endif
ldr r0,[r0]
bx r0
.pool

View File

@ -141,8 +141,6 @@
#define CONSOLE_SCREEN_WIDTH 32 #define CONSOLE_SCREEN_WIDTH 32
#define CONSOLE_SCREEN_HEIGHT 24 #define CONSOLE_SCREEN_HEIGHT 24
#define REG_SCFG_MC (*(vu32*)0x4004010)
void vramcpy_ui (void* dest, const void* src, int size) void vramcpy_ui (void* dest, const void* src, int size)
{ {
u16* destination = (u16*)dest; u16* destination = (u16*)dest;

View File

@ -24,8 +24,6 @@
#define LCDC_BANK_C (u16*)0x06840000 #define LCDC_BANK_C (u16*)0x06840000
#define REG_SCFG_EXT (*(vu32*)0x4004008)
void vramcpy (void* dst, const void* src, int len) void vramcpy (void* dst, const void* src, int len)
{ {
u16* dst16 = (u16*)dst; u16* dst16 = (u16*)dst;

View File

@ -34,18 +34,13 @@
// #define REG_ROMCTRL (*(vu32*)0x40001A4) // #define REG_ROMCTRL (*(vu32*)0x40001A4)
// #define REG_SCFG_ROM (*(vu32*)0x4004000) // #define REG_SCFG_ROM (*(vu32*)0x4004000)
#define REG_SCFG_CLK (*(vu32*)0x4004004) // #define REG_SCFG_CLK (*(vu32*)0x4004004)
#define REG_SCFG_EXT (*(vu32*)0x4004008) // #define REG_SCFG_EXT (*(vu32*)0x4004008)
#define REG_SCFG_MC (*(vu32*)0x4004010) // #define REG_SCFG_MC (*(vu32*)0x4004010)
int main(int argc, const char* argv[]) { int main(int argc, const char* argv[]) {
// volatile u32* REG_SCFG_EXT = (volatile u32*)0x4004008;
// volatile u32* REG_SCFG_CLK = (volatile u32*)0x4004004;
// volatile u32* REG_SCFG_MC = (volatile u32*)0x4004010;
// volatile u32* REG_SCFG_ROM = (volatile u32*)0x4004000;
// REG_SCFG_EXT = 0x8307F100; // REG_SCFG_EXT = 0x8307F100;
// NTR Mode/Splash used by default // NTR Mode/Splash used by default

View File

@ -1,176 +0,0 @@
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
MEMORY {
rom : ORIGIN = 0x08000000, LENGTH = 32M
ram : ORIGIN = 0x2380000, LENGTH = 96K
iwram : ORIGIN = 0x037f8000, LENGTH = 96K
}
__iwram_start = ORIGIN(iwram);
__iwram_top = ORIGIN(iwram)+ LENGTH(iwram);
__sp_irq = __iwram_top - 0x100;
__sp_svc = __sp_irq - 0x100;
__sp_usr = __sp_svc - 0x100;
__irq_flags = 0x04000000 - 8;
__irq_flagsaux = 0x04000000 - 0x40;
__irq_vector = 0x04000000 - 4;
SECTIONS
{
.init :
{
__text_start = . ;
KEEP (*(.init))
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.plt : { *(.plt) } >ram = 0xff
.text : /* ALIGN (4): */
{
*(.text .stub .text.* .gnu.linkonce.t.*)
KEEP (*(.text.*personality*))
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
*(.glue_7t) *(.glue_7) *(.vfp11_veneer)
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.fini :
{
KEEP (*(.fini))
} >ram =0xff
__text_end = . ;
.rodata :
{
*(.rodata)
*all.rodata*(*)
*(.roda)
*(.rodata.*)
*(.gnu.linkonce.r*)
SORT(CONSTRUCTORS)
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >ram
__exidx_start = .;
.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >ram
__exidx_end = .;
/* Ensure the __preinit_array_start label is properly aligned. We
could instead move the label definition inside the section, but
the linker would then create the section even if it turns out to
be empty, which isn't pretty. */
. = ALIGN(32 / 8);
PROVIDE (__preinit_array_start = .);
.preinit_array : { KEEP (*(.preinit_array)) } >ram = 0xff
PROVIDE (__preinit_array_end = .);
PROVIDE (__init_array_start = .);
.init_array : { KEEP (*(.init_array)) } >ram = 0xff
PROVIDE (__init_array_end = .);
PROVIDE (__fini_array_start = .);
.fini_array : { KEEP (*(.fini_array)) } >ram = 0xff
PROVIDE (__fini_array_end = .);
.ctors :
{
/* gcc uses crtbegin.o to find the start of the constructors, so
we make sure it is first. Because this is a wildcard, it
doesn't matter if the user does not actually link against
crtbegin.o; the linker won't look for a file to match a
wildcard. The wildcard also means that it doesn't matter which
directory crtbegin.o is in. */
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.dtors :
{
KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.eh_frame :
{
KEEP (*(.eh_frame))
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.gcc_except_table :
{
*(.gcc_except_table)
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
} >ram = 0xff
.jcr : { KEEP (*(.jcr)) } >ram = 0
.got : { *(.got.plt) *(.got) } >ram = 0
.data ALIGN(4) : {
__data_start = ABSOLUTE(.);
*(.data)
*(.data.*)
*(.gnu.linkonce.d*)
CONSTRUCTORS
. = ALIGN(4);
__data_end = ABSOLUTE(.) ;
} >ram = 0xff
.bss ALIGN(4) :
{
__bss_start = ABSOLUTE(.);
__bss_start__ = ABSOLUTE(.);
*(.dynbss)
*(.gnu.linkonce.b*)
*(.bss*)
*(COMMON)
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
__bss_end__ = ABSOLUTE(.);
__end__ = ABSOLUTE(.);
} >ram
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
.stack 0x80000 : { _stack = .; *(.stack) }
/* These must appear regardless of . */
}

View File

@ -1,8 +0,0 @@
%rename link old_link
*link:
%(old_link) -T ../../ds_arm7_ram.ld%s --gc-sections
*startfile:
ds_arm7_crt0%O%s crti%O%s crtbegin%O%s

View File

@ -1,554 +0,0 @@
# -*- coding: utf8 -*-
# Patch an .nds (works with homebrew and ds demo only) to make it ready for make_cia
#
# 2016-02-28, Ahezard
#
# inspired by
# Apache Thunder .nds edited files and comments
# https://github.com/Relys/Project_CTR/blob/master/makerom/srl.h
# https://dsibrew.org/wiki/DSi_Cartridge_Header
# if the header size of the input nds file is 0x200 (homebrew)
# the header size of the output nds file will be patched to 0x4000 (normal ds/dsi header), 0x3E00 offset
from struct import *
from collections import namedtuple
from collections import OrderedDict
from pprint import pprint
import os, sys
import binascii
import argparse
parser = argparse.ArgumentParser(description='Patch an nds in order to be ready cia conversion via make_cia --srl=.')
parser.add_argument('file', metavar='file.nds', type=file, help='nds file to patch')
parser.add_argument('--verbose', help='verbose mode', action="store_true")
parser.add_argument('--out', help='output file [optionnal]')
parser.add_argument('--read', help='print only the header content, do not patch', action="store_true")
parser.add_argument('--extract', help='extract the content of the rom : header.bin,arm9.bin,arm7.bin,icon.bin,arm9i.bin,arm7i.bin, do not patch', action="store_true") #Not yet implemented
parser.add_argument('--title', help='Game title')
parser.add_argument('--code', help='Game code')
parser.add_argument('--maker', help='Maker code')
parser.add_argument('--mode', help='target mode, default mode is ds [ds|dsi|dsinogba]')
parser.add_argument('--arm7', type=file, help='swap the ds arm7 binary by the one provided')
parser.add_argument('--arm7EntryAddress', help='arm7 ram address of the binary provided')
parser.add_argument('--arm9i', type=file, help='add a dsi arm9i binary to the file, not needed for homebrew so far')
parser.add_argument('--arm7i', type=file, help='add a dsi arm7i binary to the file, not needed for homebrew so far')
parser.add_argument('--digest-block', type=file, help='dsi digest block table') #Not yet implemented
parser.add_argument('--digest-sector', type=file, help='dsi digest sector table') #Not yet implemented
args = parser.parse_args()
if args.mode is None:
args.mode = "ds"
#
# CRC16 MODULE
#
# includes CRC16 and CRC16 MODBUS
#
from ctypes import c_ushort
# from https://github.com/cristianav/PyCRC/blob/master/demo.py
class CRC16(object):
crc16_tab = []
# The CRC's are computed using polynomials. Here is the most used
# coefficient for CRC16
crc16_constant = 0xA001 # 40961
def __init__(self, modbus_flag=False):
# initialize the precalculated tables
if not len(self.crc16_tab):
self.init_crc16()
self.mdflag = bool(modbus_flag)
def calculate(self, input_data=None):
try:
is_string = isinstance(input_data, str)
is_bytes = isinstance(input_data, (bytes, bytearray))
if not is_string and not is_bytes:
raise Exception("Please provide a string or a byte sequence "
"as argument for calculation.")
crc_value = 0x0000 if not self.mdflag else 0xffff
for c in input_data:
d = ord(c) if is_string else c
tmp = crc_value ^ d
rotated = crc_value >> 8
crc_value = rotated ^ self.crc16_tab[(tmp & 0x00ff)]
return crc_value
except Exception as e:
print("EXCEPTION(calculate): {}".format(e))
def init_crc16(self):
"""The algorithm uses tables with precalculated values"""
for i in range(0, 256):
crc = c_ushort(i).value
for j in range(0, 8):
if crc & 0x0001:
crc = c_ushort(crc >> 1).value ^ self.crc16_constant
else:
crc = c_ushort(crc >> 1).value
self.crc16_tab.append(crc)
def getSize(fileobject):
current = fileobject.tell()
fileobject.seek(0,2) # move the cursor to the end of the file
size = fileobject.tell()
fileobject.seek(current,0)
return size
def skipUntilAddress(f_in,f_out, caddr, taddr):
chunk = f_in.read(taddr-caddr)
f_out.write(chunk)
def writeBlankuntilAddress(f_out, caddr, taddr):
f_out.write("\x00"*(taddr-caddr))
fname=args.file.name
args.file.close()
if not args.read:
print "Patching file : "+fname
else:
print "Reading header of file : "+fname
#offset of 0x4600 created
# File size compute
file = open(fname, 'rb')
fsize=getSize(file)
file.close()
#CRC header compute "CRC-16 (Modbus)"
file = open(fname, 'rb')
#0x15E from https://github.com/devkitPro/ndstool/ ... source/header.cpp
hdr = file.read(0x15E)
hdrCrc=CRC16(modbus_flag=True).calculate(hdr)
if args.verbose:
print("{:10s} {:20X}".format('HDR CRC-16 ModBus', hdrCrc))
#print "origin header cr c"+hdr[0x15E:0x15F]
#filew = open(fname+".hdr", "wb")
#filew.write(hdr);
#filew.close()
file.close()
if args.arm7 is not None:
arm7Fname=args.arm7.name
args.arm7.close()
arm7File = open(arm7Fname, 'rb')
arm7FileSize=getSize(arm7File)
dataArm7=arm7File.read(arm7FileSize)
arm7File.close()
filer = open(fname, 'rb')
data = filer.read(0x180)
caddr=0x180
#DS Data 180 bytes
SrlHeader = namedtuple('SrlHeader',
"gameTitle "
"gameCode "
"makerCode "
"unitCode "
"encryptionSeedSelect "
"deviceCapacity "
"reserved0 "
"dsiflags "
"romVersion "
"internalFlag "
"arm9RomOffset "
"arm9EntryAddress "
"arm9RamAddress "
"arm9Size "
"arm7RomOffset "
"arm7EntryAddress "
"arm7RamAddress "
"arm7Size "
"fntOffset "
"fntSize "
"fatOffset "
"fatSize "
"arm9OverlayOffset "
"arm9OverlaySize "
"arm7OverlayOffset "
"arm7OverlaySize "
"normalCardControlRegSettings "
"secureCardControlRegSettings "
"icon_bannerOffset "
"secureAreaCrc "
"secure_transfer_timeout "
"arm9Autoload "
"arm7Autoload "
"secureDisable "
"ntrRomSize "
"headerSize "
"reserved1 "
"nintendoLogo "
"nintendoLogoCrc "
"headerCrc "
"debugReserved ")
srlHeaderFormat='<12s4s2scbb7s2sbcIIIIIIIIIIIIIIIIIIIHHII8sII56s156s2sH32s'
srlHeader=SrlHeader._make(unpack_from(srlHeaderFormat, data))
if args.verbose:
print "origin header crc "+hex(srlHeader.headerCrc)
print "origin secure crc "+hex(srlHeader.secureAreaCrc)
#SecureArea CRC compute "CRC-16 (Modbus)"
file = open(fname, 'rb')
#0x15E from https://github.com/devkitPro/ndstool/ ... source/header.cpp
file.read(0x200)
sec = file.read(0x4000)
secCrc=CRC16(modbus_flag=True).calculate(sec)
if args.verbose:
print("{:10s} {:20X}".format('SEC CRC-16 ModBus', secCrc))
file.close()
if srlHeader.arm7EntryAddress>0x2400000 and not args.read and args.arm7 is None:
print "WARNING: .nds arm7EntryAddress greater than 0x2400000 will not boot as cia"
print "you need to recompile or swap the arm7 binary with a precompiled one with --arm7 and --arm7EntryAddress"
# Fix srlHeader
srlHeaderPatched=srlHeader._replace(
secureCardControlRegSettings= 1575160,
normalCardControlRegSettings= 5791744,
internalFlag= '\x00',
arm9RomOffset= srlHeader.arm9RomOffset+0x3E00,
arm7RomOffset= srlHeader.arm7RomOffset+0x3E00,
fntOffset= srlHeader.fntOffset+0x4640,
fatOffset= srlHeader.fatOffset+0x444C,
icon_bannerOffset= srlHeader.icon_bannerOffset+0x3E00-0x200,
ntrRomSize= srlHeader.ntrRomSize+0x3E00-0x200,
headerSize= 0x4000,
nintendoLogo= "$\xff\xaeQi\x9a\xa2!=\x84\x82\n\x84\xe4\t\xad\x11$\x8b\x98\xc0\x81\x7f!\xa3R\xbe\x19\x93\t\xce \x10FJJ\xf8'1\xecX\xc7\xe83\x82\xe3\xce\xbf\x85\xf4\xdf\x94\xceK\t\xc1\x94V\x8a\xc0\x13r\xa7\xfc\x9f\x84Ms\xa3\xca\x9aaX\x97\xa3'\xfc\x03\x98v#\x1d\xc7a\x03\x04\xaeV\xbf8\x84\x00@\xa7\x0e\xfd\xffR\xfe\x03o\x950\xf1\x97\xfb\xc0\x85`\xd6\x80%\xa9c\xbe\x03\x01N8\xe2\xf9\xa24\xff\xbb>\x03Dx\x00\x90\xcb\x88\x11:\x94e\xc0|c\x87\xf0<\xaf\xd6%\xe4\x8b8\n\xacr!\xd4\xf8\x07",
nintendoLogoCrc= 'V\xcf',
secureAreaCrc= secCrc,
reserved1= '\x00'*156,
# better to recompile or swap the arm7 binary if this is needed
#arm7EntryAddress= 0x2380000,
#arm7RamAddress= 0x2380000,
#arm7Autoload= 0x2380118,
#arm9EntryAddress= 0x2000000,
#arm9RamAddress= 0x2000000,
#arm9Autoload= 0x2000A60,
)
if args.arm7 is not None:
if args.arm7EntryAddress is None:
print "WARNING : you may need to provide the ARM7 binary entry address via --arm7EntryAddress, default value 0x2380000 used"
args.arm7EntryAddress="0x2380000"
srlHeaderPatched=srlHeaderPatched._replace(
arm7RamAddress= int(args.arm7EntryAddress, 0),
arm7EntryAddress= int(args.arm7EntryAddress, 0),
arm7Size= arm7FileSize,
ntrRomSize= srlHeaderPatched.ntrRomSize-srlHeader.arm7Size+arm7FileSize,
fntOffset= srlHeaderPatched.fntOffset-srlHeader.arm7Size+arm7FileSize,
fatOffset= srlHeaderPatched.fatOffset-srlHeader.arm7Size+arm7FileSize,
icon_bannerOffset= srlHeaderPatched.icon_bannerOffset-srlHeader.arm7Size+arm7FileSize,
deviceCapacity= srlHeader.deviceCapacity+1
)
if "dsi" in args.mode :
srlHeaderPatched=srlHeaderPatched._replace(
deviceCapacity= srlHeaderPatched.deviceCapacity+2,
dsiflags= '\x01\x00', #disable modcrypt but enable twl
unitCode= '\x03',
#arm7Autoload= 0,
#arm9Autoload= 0,
)
if args.title is not None:
srlHeaderPatched=srlHeaderPatched._replace(gameTitle=args.title)
if args.code is not None:
srlHeaderPatched=srlHeaderPatched._replace(gameCode=args.code)
if args.maker is not None:
srlHeaderPatched=srlHeaderPatched._replace(makerCode=args.maker)
data1=pack(*[srlHeaderFormat]+srlHeaderPatched._asdict().values())
newHdrCrc=CRC16(modbus_flag=True).calculate(data1[0:0x15E])
srlHeaderPatched=srlHeaderPatched._replace(headerCrc=newHdrCrc)
if args.verbose:
print "new header crc "+hex(newHdrCrc)
if not args.read :
if args.verbose:
pprint(dict(srlHeaderPatched._asdict()))
else:
pprint(dict(srlHeader._asdict()))
data1=pack(*[srlHeaderFormat]+srlHeaderPatched._asdict().values())
arm9isize=0
arm7isize=0
#TWL Only Data 384 bytes
SrlTwlExtHeader = namedtuple('SrlTwlExtHeader',
"MBK_1_5_Settings "
"MBK_6_8_Settings_ARM9 "
"MBK_6_8_Settings_ARM7 "
"global_MBK_9_Setting "
"regionFlags "
"accessControl "
"arm7ScfgExtMask "
"reserved_flags "
"arm9iRomOffset "
"reserved2 "
"arm9iLoadAddress "
"arm9iSize "
"arm7iRomOffset "
"struct_param_baseAddress "
"arm7iLoadAddress "
"arm7iSize "
"digest_ntrRegionOffset "
"digest_ntrRegionSize "
"digest_twlRegionOffset "
"digest_twlRegionSize "
"digestSectorHashtableOffset "
"digestSectorHashtableSize "
"digest_blockHashtableOffset "
"digest_blockHashtableSize "
"digestSectorSize "
"digest_blockSectorcount "
"iconSize " #usually 0x23C0 or 2112 in homebrew
"unknown1 "
"twlRomSize "
"unknown2 "
"modcryptArea1Offset "
"modcryptArea1Size "
"modcryptArea2Offset "
"modcryptArea2Size "
"title_id "
"pubSaveDataSize "
"privSaveDataSize "
"reserved4 "
"parentalControl ")
srlTwlExtHeaderFormat="<20s12s12s4s4sIIII4sIIIIIIIIIIIIIIIII4sI12sIIII8sII176s16s"
if srlHeader.headerSize<0x300:
#homebrew
srlTwlExtHeader=SrlTwlExtHeader._make(unpack_from(srlTwlExtHeaderFormat, "\x00" * (0x300-0x180)))
else:
data = filer.read(0x300-0x180)
srlTwlExtHeader=SrlTwlExtHeader._make(unpack_from(srlTwlExtHeaderFormat, data))
caddr=0x300
#pprint(dict(srlTwlExtHeader._asdict()))
if not args.read:
# Fix srlTwlExtHeader
srlTwlExtHeader=srlTwlExtHeader._replace(
title_id= srlHeaderPatched.gameCode[::-1]+"\x04\x00\x03\x00",
regionFlags= '\xff\xff\xff\xff',
iconSize= 2112,
unknown1= '\x00\x00\x01\x00',
reserved_flags= 0x01000000
)
if "dsi" in args.mode:
arm7iRomOffset=srlHeaderPatched.arm7RomOffset
arm9iRomOffset=srlHeaderPatched.arm9RomOffset
arm7isize=srlHeaderPatched.arm7Size
arm9isize=srlHeaderPatched.arm9Size
totaldsisize=0
arm7iname = None
arm9iname = None
if args.arm9i is not None:
arm9iname = args.arm9i.name
arm9isize = getSize(args.arm9i)
arm9iRomOffset=srlHeaderPatched.ntrRomSize
if args.verbose:
print "arm9isize : "+hex(arm9isize)
print "arm9ioffset : "+hex(srlHeaderPatched.ntrRomSize)
args.arm9i.close()
totaldsisize=arm9isize
if args.arm7i is not None:
arm7iname = args.arm7i.name
arm7isize = getSize(args.arm7i)
arm7iRomOffset=srlHeaderPatched.ntrRomSize+arm9isize
if args.verbose:
print "arm7isize : "+hex(arm7isize)
print "arm9ioffset : "+hex(srlHeaderPatched.ntrRomSize+arm9isize)
args.arm7i.close()
totaldsisize=arm9isize+arm7isize
srlTwlExtHeader=srlTwlExtHeader._replace(
MBK_1_5_Settings= '\x81\x85\x89\x8d\x80\x84\x88\x8c\x90\x94\x98\x9c\x80\x84\x88\x8c\x90\x94\x98\x9c',
MBK_6_8_Settings_ARM7= '\xc07\x00\x08@7\xc0\x07\x007@\x07',
MBK_6_8_Settings_ARM9= '\x00\x00\x00\x00@7\xc0\x07\x007@\x07',
accessControl= 0x00000038,
arm7ScfgExtMask= 0x80040000,
reserved_flags= 0x00000000,
arm7iLoadAddress= 0x2E80000,
arm7iRomOffset= arm7iRomOffset,
arm7iSize= arm7isize,
arm9iLoadAddress= 0x2400000,
arm9iRomOffset= arm9iRomOffset,
arm9iSize= arm9isize,
global_MBK_9_Setting= '\x0f\x00\x00\x03',
iconSize= 2112,
pubSaveDataSize= 00000,
regionFlags= '\xff\xff\xff\xff',
title_id= srlHeaderPatched.gameCode[::-1]+"\x04\x00\x03\x00",
twlRomSize= srlHeaderPatched.ntrRomSize+totaldsisize,
unknown1= '\x00\x00\x01\x00',
unknown2= '\x00\x00\x00\x00|\x0f\x00\x00 \x05\x00\x00',
parentalControl= '\x80'*16
)
if "dsinogba" in args.mode :
# Fix for no$gba 2.8d
srlTwlExtHeader=srlTwlExtHeader._replace(
arm7iLoadAddress= srlHeaderPatched.arm7EntryAddress,
arm9iLoadAddress= srlHeaderPatched.arm9EntryAddress
)
if args.verbose or args.read:
pprint(dict(srlTwlExtHeader._asdict()))
data2=pack(*[srlTwlExtHeaderFormat]+srlTwlExtHeader._asdict().values())
#TWL and Signed NTR 3328 bytes
SrlSignedHeader = namedtuple('SrlSignedHeader',
"arm9WithSecAreaSha1Hmac "
"arm7Sha1Hmac "
"digestMasterSha1Hmac "
"bannerSha1Hmac "
"arm9iSha1Hmac "
"arm7iSha1Hmac "
"reserved5 "
"arm9Sha1Hmac "
"reserved6 "
"reserved7 "
"signature "
)
srlSignedHeaderFormat="<20s20s20s20s20s20s40s20s2636s384s128s"
if srlHeader.headerSize<0x1100:
#homebrew
srlSignedHeader=SrlSignedHeader._make(unpack_from(srlSignedHeaderFormat, "\x00" * (3328)))
else:
data = filer.read(3328)
srlSignedHeader=SrlSignedHeader._make(unpack_from(srlSignedHeaderFormat, data))
caddr=0x300+3328
#pprint(dict(srlSignedHeader._asdict()))
# Fix srlSignedHeader
if not args.read:
srlSignedHeader=srlSignedHeader._replace(
arm7Sha1Hmac= '\xff'*20,
arm9WithSecAreaSha1Hmac= '\xff'*20,
bannerSha1Hmac= '\xff'*20,
signature= '\xff'*128
)
if "dsi" in args.mode :
srlSignedHeader=srlSignedHeader._replace(
arm7Sha1Hmac= '\xff'*20,
arm7iSha1Hmac= '\xff'*20,
arm9Sha1Hmac= '\xff'*20,
arm9WithSecAreaSha1Hmac= '\xff'*20,
arm9iSha1Hmac= '\xff'*20,
bannerSha1Hmac= '\xff'*20,
digestMasterSha1Hmac= '\xff'*20,
signature= '\xff'*128
)
if args.verbose or args.read:
pprint(dict(srlSignedHeader._asdict()))
data3=pack(*[srlSignedHeaderFormat]+srlSignedHeader._asdict().values())
# ARM9 footer
# from https://github.com/devkitPro/ndstool/ ... source/header.cpp
# ARM9 footer size = 3*4
ARM9Footer = namedtuple('ARM9Footer',
"nitrocode " #0xDEC00621
"versionInfo "
"reserved "
)
ARM9FooterFormat="<III"
file = open(fname, 'rb')
arm9FooterAddr=srlHeader.arm9RomOffset + srlHeader.arm9Size
file.read(arm9FooterAddr)
data=file.read(12)
arm9Footer=ARM9Footer._make(unpack_from(ARM9FooterFormat, data))
if args.verbose:
print "footer addr "+hex(arm9FooterAddr)
if arm9Footer.nitrocode == 0xDEC00621:
if args.verbose or args.read:
print "ARM9 footer found."
print "no patch needed"
print "nitrocode "+hex(arm9Footer.nitrocode)
print "versionInfo "+hex(arm9Footer.versionInfo)
print "reserved "+hex(arm9Footer.reserved)
print "\n"
else:
if args.verbose or args.read:
print "ARM9 footer not found.\n"
arm9FooterPatched=arm9Footer._replace(
nitrocode= 0xDEC00621,
versionInfo= 0xad8,
reserved= 0
)
data4=pack(*[ARM9FooterFormat]+arm9FooterPatched._asdict().values())
file.close()
if not args.read:
# write the file
if args.out is not None:
filew = open(args.out, "wb")
else:
filew = open(fname+".tmp", "wb")
filew.write(data1)
filew.write(data2)
filew.write(data3[0:0xC80])
filew.write('\xff'*16*8)
writeBlankuntilAddress(filew,0x1080,0x4000)
if arm9Footer.nitrocode != 0xDEC00621:
# patch ARM9 footer
skipUntilAddress(filer,filew,caddr,arm9FooterAddr)
filew.write(data4)
filer.read(12)
caddr=arm9FooterAddr+12
if args.arm7 is not None:
skipUntilAddress(filer,filew,caddr,srlHeader.arm7RomOffset)
filew.write(dataArm7)
filer.read(srlHeader.arm7Size)
caddr = srlHeader.arm7RomOffset+srlHeader.arm7Size
skipUntilAddress(filer,filew,caddr,srlHeader.icon_bannerOffset-0x200)
filer.read(0x200)
caddr=srlHeader.icon_bannerOffset
skipUntilAddress(filer,filew,caddr,srlHeader.ntrRomSize)
if "dsi" in args.mode:
# add dsi specific data
# dixit apache : Digest Table offset first, then sector table, then Arm9i, then arm7i.
# digest block/sector table are not needed for homebrew
# Not needed for homebrew so far
if arm9iname is not None :
arm9ifile = open(arm9iname, "rb")
skipUntilAddress(arm9ifile,filew,0,arm9isize)
arm9ifile.close()
if arm7iname is not None :
arm7ifile = open(arm7iname, "rb")
skipUntilAddress(arm7ifile,filew,0,arm7isize)
arm7ifile.close()
filew.close()
filer.close()
if args.out is None:
if os.path.exists(fname+".orig.nds"):
os.remove(fname+".orig.nds")
os.rename(fname,fname+".orig.nds")
os.rename(fname+".tmp",fname)
print "file patched"