Rebase from NitroHax official source
This is the version 1.9.6 build rebased from Chishm's official github of NitroHax which is the project this is based off of.
11
.gitignore
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
*.cia
|
||||
*.nds
|
||||
*.o
|
||||
*.arm7
|
||||
Thumbs.db
|
||||
*.arm9
|
||||
*.elf
|
||||
*.d
|
||||
*.map
|
||||
arm9/data/load.bin
|
||||
BootLoader/load.bin
|
@ -26,7 +26,6 @@ ARCH := -mthumb-interwork
|
||||
CFLAGS := -g -Wall -O2\
|
||||
-mcpu=arm7tdmi -mtune=arm7tdmi -fomit-frame-pointer\
|
||||
-ffast-math \
|
||||
-Wall -Wextra -Werror \
|
||||
$(ARCH)
|
||||
|
||||
CFLAGS += $(INCLUDE) -DARM7
|
||||
|
43
BootLoader/source/bios7.s
Normal file
@ -0,0 +1,43 @@
|
||||
/*---------------------------------------------------------------------------------
|
||||
|
||||
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 swiSoftResetarm7
|
||||
.type swiSoftResetarm7 STT_FUNC
|
||||
@---------------------------------------------------------------------------------
|
||||
swiSoftResetarm7:
|
||||
@---------------------------------------------------------------------------------
|
||||
REG_IME = 0;
|
||||
|
||||
ldr r0,=0x2FFFE34
|
||||
|
||||
|
||||
ldr r0,[r0]
|
||||
bx r0
|
||||
|
||||
.pool
|
56
BootLoader/source/bios9.s
Normal file
@ -0,0 +1,56 @@
|
||||
/*---------------------------------------------------------------------------------
|
||||
|
||||
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 swiSoftResetarm9
|
||||
.type swiSoftResetarm9 STT_FUNC
|
||||
@---------------------------------------------------------------------------------
|
||||
swiSoftResetarm9:
|
||||
@---------------------------------------------------------------------------------
|
||||
REG_IME = 0;
|
||||
|
||||
|
||||
.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
|
||||
|
||||
|
||||
ldr r0,[r0]
|
||||
bx r0
|
||||
|
||||
.pool
|
@ -1,148 +0,0 @@
|
||||
/*
|
||||
NitroHax -- Cheat tool for the Nintendo DS
|
||||
Copyright (C) 2008 Michael "Chishm" Chisholm
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "cheat.h"
|
||||
#include "common.h"
|
||||
|
||||
extern unsigned long cheat_engine_size;
|
||||
extern unsigned long intr_orig_return_offset;
|
||||
|
||||
extern const u8 cheat_engine_start[];
|
||||
#define CHEAT_CODE_END 0xCF000000
|
||||
#define CHEAT_ENGINE_RELOCATE 0xCF000001
|
||||
#define CHEAT_ENGINE_HOOK 0xCF000002
|
||||
|
||||
static const u32 handlerStartSig[5] = {
|
||||
0xe92d4000, // push {lr}
|
||||
0xe3a0c301, // mov ip, #0x4000000
|
||||
0xe28cce21, // add ip, ip, #0x210
|
||||
0xe51c1008, // ldr r1, [ip, #-8]
|
||||
0xe3510000 // cmp r1, #0
|
||||
};
|
||||
|
||||
static const u32 handlerEndSig[4] = {
|
||||
0xe59f1008, // ldr r1, [pc, #8] (IRQ Vector table address)
|
||||
0xe7910100, // ldr r0, [r1, r0, lsl #2]
|
||||
0xe59fe004, // ldr lr, [pc, #4] (IRQ return address)
|
||||
0xe12fff10 // bx r0
|
||||
};
|
||||
|
||||
static const int MAX_HANDLER_SIZE = 50;
|
||||
|
||||
static u32* hookInterruptHandler (u32* addr, size_t size) {
|
||||
u32* end = addr + size/sizeof(u32);
|
||||
int i;
|
||||
|
||||
// Find the start of the handler
|
||||
while (addr < end) {
|
||||
if ((addr[0] == handlerStartSig[0]) &&
|
||||
(addr[1] == handlerStartSig[1]) &&
|
||||
(addr[2] == handlerStartSig[2]) &&
|
||||
(addr[3] == handlerStartSig[3]) &&
|
||||
(addr[4] == handlerStartSig[4]))
|
||||
{
|
||||
break;
|
||||
}
|
||||
addr++;
|
||||
}
|
||||
|
||||
if (addr >= end) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Find the end of the handler
|
||||
for (i = 0; i < MAX_HANDLER_SIZE; i++) {
|
||||
if ((addr[i+0] == handlerEndSig[0]) &&
|
||||
(addr[i+1] == handlerEndSig[1]) &&
|
||||
(addr[i+2] == handlerEndSig[2]) &&
|
||||
(addr[i+3] == handlerEndSig[3]))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i >= MAX_HANDLER_SIZE) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Now find the IRQ vector table
|
||||
// Make addr point to the vector table address pointer within the IRQ handler
|
||||
addr = addr + i + sizeof(handlerEndSig)/sizeof(handlerEndSig[0]);
|
||||
|
||||
// Use relative and absolute addresses to find the location of the table in RAM
|
||||
u32 tableAddr = addr[0];
|
||||
u32 returnAddr = addr[1];
|
||||
u32* actualReturnAddr = addr + 2;
|
||||
u32* actualTableAddr = actualReturnAddr + (tableAddr - returnAddr)/sizeof(u32);
|
||||
|
||||
// The first entry in the table is for the Vblank handler, which is what we want
|
||||
return actualTableAddr;
|
||||
}
|
||||
|
||||
int arm7_hookGame (const tNDSHeader* ndsHeader, const u32* cheatData, u32* cheatEngineLocation) {
|
||||
u32 oldReturn;
|
||||
u32 cheatWord1, cheatWord2;
|
||||
u32* cheatDest;
|
||||
u32* hookLocation = NULL;
|
||||
|
||||
if (cheatData[0] == CHEAT_CODE_END) {
|
||||
return ERR_NOCHEAT;
|
||||
}
|
||||
|
||||
if (cheatData[0] == CHEAT_ENGINE_RELOCATE) {
|
||||
cheatWord1 = *cheatData++;
|
||||
cheatWord2 = *cheatData++;
|
||||
cheatEngineLocation = (u32*)cheatWord2;
|
||||
}
|
||||
|
||||
if (cheatData[0] == CHEAT_ENGINE_HOOK) {
|
||||
cheatWord1 = *cheatData++;
|
||||
cheatWord2 = *cheatData++;
|
||||
hookLocation = (u32*)cheatWord2;
|
||||
}
|
||||
|
||||
if (!hookLocation) {
|
||||
hookLocation = hookInterruptHandler ((u32*)ndsHeader->arm7destination, ndsHeader->arm7binarySize);
|
||||
}
|
||||
|
||||
if (!hookLocation) {
|
||||
return ERR_HOOK;
|
||||
}
|
||||
|
||||
oldReturn = *hookLocation;
|
||||
|
||||
*hookLocation = (u32)cheatEngineLocation;
|
||||
|
||||
copyLoop (cheatEngineLocation, (u32*)cheat_engine_start, cheat_engine_size);
|
||||
|
||||
cheatEngineLocation [intr_orig_return_offset/sizeof(u32)] = oldReturn;
|
||||
|
||||
cheatDest = cheatEngineLocation + (cheat_engine_size/sizeof(u32));
|
||||
|
||||
// Copy cheat data across
|
||||
do {
|
||||
cheatWord1 = *cheatData++;
|
||||
cheatWord2 = *cheatData++;
|
||||
*cheatDest++ = cheatWord1;
|
||||
*cheatDest++ = cheatWord2;
|
||||
} while (cheatWord1 != CHEAT_CODE_END);
|
||||
|
||||
return ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -1,484 +0,0 @@
|
||||
@ NitroHax -- Cheat tool for the Nintendo DS
|
||||
@ Copyright (C) 2008 Michael "Chishm" Chisholm
|
||||
@
|
||||
@ This program is free software: you can redistribute it and/or modify
|
||||
@ it under the terms of the GNU General Public License as published by
|
||||
@ the Free Software Foundation, either version 3 of the License, or
|
||||
@ (at your option) any later version.
|
||||
@
|
||||
@ This program is distributed in the hope that it will be useful,
|
||||
@ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
@ GNU General Public License for more details.
|
||||
@
|
||||
@ You should have received a copy of the GNU General Public License
|
||||
@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
.arm
|
||||
|
||||
.global cheat_engine_start
|
||||
.global cheat_engine_end
|
||||
.global intr_orig_return_offset
|
||||
.global cheat_engine_size
|
||||
|
||||
|
||||
cheat_engine_size:
|
||||
.word cheat_engine_end - cheat_engine_start
|
||||
|
||||
intr_orig_return_offset:
|
||||
.word intr_orig_return - cheat_engine_start
|
||||
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
cheat_engine_start:
|
||||
@ Hook the return address, then go back to the original function
|
||||
stmdb sp!, {lr}
|
||||
adr lr, code_handler_start
|
||||
ldr r0, intr_orig_return
|
||||
bx r0
|
||||
|
||||
code_handler_start:
|
||||
stmdb sp!, {r0-r12}
|
||||
mov r9, #0x00000000 @ offset register
|
||||
mov r8, #0x00000000 @ execution status. bit0: 1 = no exec, 0 = exec. allows nested ifs 32 deep
|
||||
mov r7, #0x00000000 @ Dx loop start
|
||||
mov r6, #0x00000000 @ Dx repeat ammount
|
||||
mov r5, #0x00000000 @ DX data
|
||||
mov r4, #0x00000000 @ Dx execution status
|
||||
|
||||
@ increment counter
|
||||
ldrh r0, counter_value
|
||||
add r0, r0, #1
|
||||
strh r0, counter_value
|
||||
|
||||
@ r0-r3 are generic registers for the code processor to use
|
||||
@ 0xCF000000 0x00000000 indicates the end of the code list
|
||||
@ r12 points to the next code to load
|
||||
|
||||
adr r12, cheat_data
|
||||
|
||||
main_loop:
|
||||
ldmia r12!, {r10, r11} @ load a code
|
||||
cmp r10, #0xCF000000
|
||||
beq exit
|
||||
|
||||
mov r0, r10, lsr #28
|
||||
cmp r0, #0xE
|
||||
beq patch_code
|
||||
cmp r0, #0xD
|
||||
beq dx_codes
|
||||
cmp r0, #0xC
|
||||
beq type_c
|
||||
|
||||
@ check execution status
|
||||
tst r8, #0x00000001
|
||||
bne main_loop
|
||||
|
||||
@ check code group
|
||||
cmp r0, #0x3
|
||||
blt raw_write
|
||||
cmp r0, #0x6
|
||||
ble if_32bit
|
||||
cmp r0, #0xB
|
||||
blt if_16bit_mask
|
||||
beq offset_load
|
||||
b mem_copy_code
|
||||
|
||||
|
||||
counter_value:
|
||||
.word 0x00000000
|
||||
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
@ type 0-2
|
||||
|
||||
raw_write:
|
||||
cmp r0, #0x1
|
||||
bic r10, r10, #0xf0000000
|
||||
strlt r11, [r10, r9] @ type 0
|
||||
streqh r11, [r10, r9] @ type 1
|
||||
strgtb r11, [r10, r9] @ type 2
|
||||
b main_loop
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
@ type 3-6
|
||||
@ r0 still contains the code type
|
||||
|
||||
if_32bit:
|
||||
bic r1, r10, #0xf0000001
|
||||
tst r10, #0x00000001
|
||||
addne r1, r1, r9 @ add offset to the address if the lowest bit is set
|
||||
cmp r1, #0x00000000
|
||||
moveq r1, r9 @ if address is 0, set address to offset
|
||||
ldr r1, [r1] @ load word from [0XXXXXXX]
|
||||
mov r8, r8, lsl #1 @ push execution status
|
||||
cmp r0, #0x3
|
||||
beq if_32bit_bhi
|
||||
cmp r0, #0x5
|
||||
blt if_32bit_bcc
|
||||
beq if_32bit_beq
|
||||
@ fall through to if_32bit_bne
|
||||
|
||||
@ type 6
|
||||
if_32bit_bne:
|
||||
cmp r11, r1
|
||||
orreq r8, r8, #0x00000001
|
||||
b main_loop
|
||||
|
||||
@ type 3
|
||||
if_32bit_bhi:
|
||||
cmp r11, r1
|
||||
orrls r8, r8, #0x00000001
|
||||
b main_loop
|
||||
|
||||
@ type 4
|
||||
if_32bit_bcc:
|
||||
cmp r11, r1
|
||||
orrcs r8, r8, #0x00000001
|
||||
b main_loop
|
||||
|
||||
@ type 5
|
||||
if_32bit_beq:
|
||||
cmp r11, r1
|
||||
orrne r8, r8, #0x00000001
|
||||
b main_loop
|
||||
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
@ type 7-A
|
||||
@ r0 still contains the code type
|
||||
|
||||
if_16bit_mask:
|
||||
bic r1, r10, #0xf0000001
|
||||
tst r10, #0x00000001
|
||||
addne r1, r1, r9 @ add offset to the address if the lowest bit is set
|
||||
cmp r1, #0x00000000
|
||||
moveq r1, r9 @ if address is 0, set address to offset
|
||||
ldrh r1, [r1] @ load halfword from [0XXXXXXX]
|
||||
mov r2, r11, lsr #16 @ bit mask
|
||||
mov r3, r11, lsl #16 @ compare data
|
||||
mov r3, r3, lsr #16
|
||||
bic r1, r1, r2 @ clear any bit that is set in the mask
|
||||
|
||||
mov r8, r8, lsl #1 @ push execution status
|
||||
cmp r0, #0x7
|
||||
beq if_16bit_bhi
|
||||
cmp r0, #0x9
|
||||
blt if_16bit_bcc
|
||||
beq if_16bit_beq
|
||||
@ fall through to if_16bit_bne
|
||||
|
||||
@ type A
|
||||
if_16bit_bne:
|
||||
cmp r3, r1
|
||||
orreq r8, r8, #0x00000001
|
||||
b main_loop
|
||||
|
||||
@ type 7
|
||||
if_16bit_bhi:
|
||||
cmp r3, r1
|
||||
orrls r8, r8, #0x00000001
|
||||
b main_loop
|
||||
|
||||
@ type 8
|
||||
if_16bit_bcc:
|
||||
cmp r3, r1
|
||||
orrcs r8, r8, #0x00000001
|
||||
b main_loop
|
||||
|
||||
@ type 9
|
||||
if_16bit_beq:
|
||||
cmp r3, r1
|
||||
orrne r8, r8, #0x00000001
|
||||
b main_loop
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
@ type B
|
||||
|
||||
offset_load:
|
||||
bic r10, r10, #0xf0000000
|
||||
ldr r9, [r10, r9]
|
||||
b main_loop
|
||||
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
@ type C
|
||||
|
||||
type_c:
|
||||
mov r0, r10, lsr #24
|
||||
cmp r0, #0xC1
|
||||
beq exec_remote_function
|
||||
cmp r0, #0xC2
|
||||
beq exec_custom_function
|
||||
|
||||
tst r8, #0x00000001 @ make sure execution is enabled
|
||||
bne main_loop
|
||||
|
||||
cmp r0, #0xC0
|
||||
beq loop_start
|
||||
cmp r0, #0xC5
|
||||
beq execution_counter @ type C5
|
||||
|
||||
offset_data_store: @ type C4
|
||||
sublt r9, r12, #0x08 @ Offset = Two words back from current code pointer (ie, word at C4000000 code)
|
||||
|
||||
save_offset: @ type C6
|
||||
strgt r9, [r11] @ Save offset to [XXXXXXXX] in C6000000 XXXXXXXX
|
||||
b main_loop
|
||||
|
||||
loop_start:
|
||||
mov r4, r8 @ execution status
|
||||
mov r6, r11 @ loop repeat amount
|
||||
mov r7, r12 @ loop start
|
||||
b main_loop
|
||||
|
||||
exec_remote_function:
|
||||
ldmia r12, {r0, r1, r2, r3} @ load arguments
|
||||
and r10, r10, #0x00000007
|
||||
add r12, r12, r10 @ move code pointer to where it should be
|
||||
tst r8, #0x00000001
|
||||
bne align_cheat_list @ execution disabled
|
||||
stmdb sp!, {r12}
|
||||
adr lr, exec_function_return
|
||||
bx r11
|
||||
|
||||
exec_custom_function:
|
||||
and r0, r10, #0x00000001 @ thumb mode?
|
||||
add r0, r0, r12 @ custom function location
|
||||
add r12, r12, r11
|
||||
tst r8, #0x00000001
|
||||
bne align_cheat_list @ execution disabled
|
||||
stmdb sp!, {r12}
|
||||
adr lr, exec_function_return
|
||||
bx r0
|
||||
|
||||
exec_function_return:
|
||||
ldmia sp!, {r12}
|
||||
b align_cheat_list
|
||||
|
||||
|
||||
execution_counter:
|
||||
ldr r0, counter_value @ we only need the low 16 bits but counter_value is out of immediate range for ldrh
|
||||
mov r1, r11, lsl #16
|
||||
and r0, r0, r1, lsr #16 @ mask off counter
|
||||
mov r8, r8, lsl #1 @ push execution status
|
||||
cmp r0, r11, lsr #16 @ Compare against compare value component of code
|
||||
orrne r8, r8, #0x00000001 @ set execution to false
|
||||
b main_loop
|
||||
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
@ type D
|
||||
|
||||
dx_codes:
|
||||
mov r0, r10, lsr #24
|
||||
cmp r0, #0xD3
|
||||
bcs dx_conditional_exec
|
||||
|
||||
cmp r0, #0xD1
|
||||
bgt end_loop_clear
|
||||
beq end_loop_no_clear
|
||||
@ fall through to end_if
|
||||
|
||||
@ type D0
|
||||
end_if:
|
||||
mov r8, r8, lsr #1 @ pop exec status
|
||||
b main_loop
|
||||
|
||||
@ type D2
|
||||
end_loop_clear:
|
||||
mov r8, r4 @ restore the old execution status
|
||||
cmp r6, #0 @ end of a loop?
|
||||
@ no
|
||||
subgt r6, r6, #1
|
||||
movgt r12, r7 @ load the Dx loop start
|
||||
bgt main_loop
|
||||
@ yes
|
||||
mov r5, #0 @ clear Dx data register
|
||||
mov r8, #0 @ clear execution status
|
||||
mov r9, #0 @ clear offset
|
||||
b main_loop
|
||||
|
||||
@ type D1
|
||||
end_loop_no_clear:
|
||||
mov r8, r4 @ restore the old execution status
|
||||
cmp r6, #0 @ end of a loop?
|
||||
@ no
|
||||
subgt r6, r6, #1
|
||||
movgt r12, r7 @ load the Dx loop start
|
||||
@ yes
|
||||
b main_loop
|
||||
|
||||
dx_conditional_exec:
|
||||
tst r8, #0x00000001
|
||||
bne main_loop
|
||||
|
||||
cmp r0, #0xD6
|
||||
bcs dx_write
|
||||
|
||||
cmp r0, #0xD4
|
||||
@ type D3 - Offset Set
|
||||
movlt r9, r11
|
||||
beq dx_data_op
|
||||
@ type D5 - Dx Data set
|
||||
movgt r5, r11
|
||||
b main_loop
|
||||
|
||||
dx_write:
|
||||
cmp r0, #0xD9
|
||||
bcs dx_load
|
||||
|
||||
cmp r0, #0xD7
|
||||
@ type D6 - Dx Data write 32 bits
|
||||
strlt r5, [r11, r9]
|
||||
addlt r9, r9, #4
|
||||
@ type D7 - Dx Data write 16 bits
|
||||
streqh r5, [r11, r9]
|
||||
addeq r9, r9, #2
|
||||
@ type D8 - Dx Data write 8 bits
|
||||
strgtb r5, [r11, r9]
|
||||
addgt r9, r9, #1
|
||||
b main_loop
|
||||
|
||||
dx_load:
|
||||
cmp r0, #0xDC
|
||||
bcs dx_offset_add_addr
|
||||
|
||||
cmp r0, #0xDA
|
||||
@ type D9 - Dx Data load 32 bits
|
||||
ldrlt r5, [r11, r9]
|
||||
@ type DA - Dx Data load 16 bits
|
||||
ldreqh r5, [r11, r9]
|
||||
@ type DB - Dx Data load 8 bits
|
||||
ldrgtb r5, [r11, r9]
|
||||
b main_loop
|
||||
|
||||
@ type DC
|
||||
dx_offset_add_addr:
|
||||
add r9, r9, r11
|
||||
b main_loop
|
||||
|
||||
@ type D4
|
||||
dx_data_op:
|
||||
and r0, r10, #0x000000ff
|
||||
cmp r0, #0x01
|
||||
@ type D4000000 - add, use negative values for sub
|
||||
addlt r5, r5, r11
|
||||
@ type D4000001 - or
|
||||
orreq r5, r5, r11
|
||||
ble main_loop
|
||||
|
||||
cmp r0, #0x03
|
||||
@ type D4000002 - and
|
||||
andlt r5, r5, r11
|
||||
@ type D4000003 - xor
|
||||
eoreq r5, r5, r11
|
||||
ble main_loop
|
||||
|
||||
cmp r0, #0x05
|
||||
@ type D4000004 - lsl
|
||||
movlt r5, r5, lsl r11
|
||||
@ type D4000005 - lsr
|
||||
moveq r5, r5, lsr r11
|
||||
ble main_loop
|
||||
|
||||
cmp r0, #0x07
|
||||
@ type D4000006 - ror
|
||||
movlt r5, r5, ror r11
|
||||
@ type D4000007 - asr
|
||||
moveq r5, r5, asr r11
|
||||
ble main_loop
|
||||
|
||||
cmp r0, #0x09
|
||||
@ type D4000008 - mul
|
||||
mullt r5, r11, r5
|
||||
|
||||
b main_loop
|
||||
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
@ type E
|
||||
|
||||
patch_code:
|
||||
@ check execution status
|
||||
tst r8, #0x00000001
|
||||
addne r12, r12, r11 @ skip the data section
|
||||
bne align_cheat_list
|
||||
|
||||
bic r10, r10, #0xf0000000 @ destination address
|
||||
add r10, r10, r9 @ add offset to dest
|
||||
@ r11 is bytes remaining
|
||||
@ r12 is source
|
||||
|
||||
patch_code_word_loop:
|
||||
cmp r11, #4
|
||||
blt patch_code_byte_loop
|
||||
ldr r1, [r12], #4
|
||||
str r1, [r10], #4
|
||||
sub r11, r11, #4
|
||||
b patch_code_word_loop
|
||||
|
||||
patch_code_byte_loop:
|
||||
cmp r11, #1
|
||||
blt align_cheat_list @ patch_code_end
|
||||
ldrb r1, [r12], #1
|
||||
strb r1, [r10], #1
|
||||
sub r11, r11, #1
|
||||
b patch_code_byte_loop
|
||||
|
||||
align_cheat_list:
|
||||
add r12, r12, #0x7
|
||||
bic r12, r12, #0x00000007 @ round up to nearest multiple of 8
|
||||
b main_loop
|
||||
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
@ type F
|
||||
|
||||
mem_copy_code:
|
||||
bic r10, r10, #0xf0000000 @ destination address
|
||||
@ r11 is bytes remaining
|
||||
mov r2, r9 @ source address
|
||||
|
||||
mem_copy_code_word_loop:
|
||||
cmp r11, #4
|
||||
blt mem_copy_code_byte_loop
|
||||
ldr r1, [r2], #4
|
||||
str r1, [r10], #4
|
||||
sub r11, r11, #4
|
||||
b mem_copy_code_word_loop
|
||||
|
||||
mem_copy_code_byte_loop:
|
||||
cmp r11, #1
|
||||
blt main_loop @ mem_copy_code_end
|
||||
ldrb r1, [r2], #1
|
||||
strb r1, [r10], #1
|
||||
sub r11, r11, #1
|
||||
b mem_copy_code_byte_loop
|
||||
|
||||
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
exit:
|
||||
ldmia sp!, {r0-r12}
|
||||
ldmia sp!, {lr}
|
||||
bx lr
|
||||
|
||||
intr_orig_return:
|
||||
.word 0x00000000
|
||||
|
||||
.pool
|
||||
|
||||
cheat_data:
|
||||
|
||||
cheat_engine_end:
|
||||
|
||||
@ Cheat data goes here
|
||||
|
||||
.word 0xCF000000, 0x00000000
|
||||
.word 0x00000000, 0x00000000
|
||||
.word 0x00000000, 0x00000000
|
||||
.word 0x00000000, 0x00000000
|
||||
|
||||
|
@ -32,9 +32,9 @@ arm7_clearmem:
|
||||
mov r8, #0
|
||||
mov r9, #0
|
||||
|
||||
clearmem_loop:
|
||||
stmia r0!, {r2-r9}
cmp r0, r1
|
||||
blt clearmem_loop
|
||||
clearmem_loop:
|
||||
stmia r0!, {r2-r9}
cmp r0, r1
|
||||
blt clearmem_loop
|
||||
|
||||
ldmfd sp!, {r4-r9}
|
||||
bx lr
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <string.h>
|
||||
#include "encryption.h"
|
||||
#include "read_bios.h"
|
||||
#include "key1.h"
|
||||
|
||||
#define KEYSIZE 0x1048
|
||||
|
||||
@ -97,7 +98,7 @@ void apply_keycode (u32 modulo) {
|
||||
}
|
||||
|
||||
void init_keycode (u32 idcode, u32 level, u32 modulo) {
|
||||
readBios ((u8*)keybuf, 0x30, KEYSIZE);
|
||||
memcpy ((u8*)keybuf, gEncrData, KEYSIZE);
|
||||
keycode[0] = idcode;
|
||||
keycode[1] = idcode/2;
|
||||
keycode[2] = idcode*2;
|
||||
|
264
BootLoader/source/key1.h
Normal file
@ -0,0 +1,264 @@
|
||||
const unsigned char gEncrData[] =
|
||||
{
|
||||
0x99,0xD5,0x20,0x5F,0x57,0x44,0xF5,0xB9,0x6E,0x19,0xA4,0xD9,0x9E,0x6A,0x5A,0x94,
|
||||
0xD8,0xAE,0xF1,0xEB,0x41,0x75,0xE2,0x3A,0x93,0x82,0xD0,0x32,0x33,0xEE,0x31,0xD5,
|
||||
0xCC,0x57,0x61,0x9A,0x37,0x06,0xA2,0x1B,0x79,0x39,0x72,0xF5,0x55,0xAE,0xF6,0xBE,
|
||||
0x5F,0x1B,0x69,0xFB,0xE5,0x9D,0xF1,0xE9,0xCE,0x2C,0xD9,0xA1,0x5E,0x32,0x05,0xE6,
|
||||
0xFE,0xD3,0xFE,0xCF,0xD4,0x62,0x04,0x0D,0x8B,0xF5,0xEC,0xB7,0x2B,0x60,0x79,0xBB,
|
||||
0x12,0x95,0x31,0x0D,0x6E,0x3F,0xDA,0x2B,0x88,0x84,0xF0,0xF1,0x3D,0x12,0x7E,0x25,
|
||||
0x45,0x22,0xF1,0xBB,0x24,0x06,0x1A,0x06,0x11,0xAD,0xDF,0x28,0x8B,0x64,0x81,0x34,
|
||||
0x2B,0xEB,0x33,0x29,0x99,0xAA,0xF2,0xBD,0x9C,0x14,0x95,0x9D,0x9F,0xF7,0xF5,0x8C,
|
||||
0x72,0x97,0xA1,0x29,0x9D,0xD1,0x5F,0xCF,0x66,0x4D,0x07,0x1A,0xDE,0xD3,0x4A,0x4B,
|
||||
0x85,0xC9,0xA7,0xA3,0x17,0x95,0x05,0x3A,0x3D,0x49,0x0A,0xBF,0x0A,0x89,0x8B,0xA2,
|
||||
0x4A,0x82,0x49,0xDD,0x27,0x90,0xF1,0x0B,0xE9,0xEB,0x1C,0x6A,0x83,0x76,0x45,0x05,
|
||||
0xBA,0x81,0x70,0x61,0x17,0x3F,0x4B,0xDE,0xAE,0xCF,0xAB,0x39,0x57,0xF2,0x3A,0x56,
|
||||
0x48,0x11,0xAD,0x8A,0x40,0xE1,0x45,0x3F,0xFA,0x9B,0x02,0x54,0xCA,0xA6,0x93,0xFB,
|
||||
0xEF,0x4D,0xFE,0x6F,0xA3,0xD8,0x87,0x9C,0x08,0xBA,0xD5,0x48,0x6A,0x8D,0x2D,0xFD,
|
||||
0x6E,0x15,0xF8,0x74,0xBD,0xBE,0x52,0x8B,0x18,0x22,0x8A,0x9E,0xFB,0x74,0x37,0x07,
|
||||
0x1B,0x36,0x6C,0x4A,0x19,0xBA,0x42,0x62,0xB9,0x79,0x91,0x10,0x7B,0x67,0x65,0x96,
|
||||
0xFE,0x02,0x23,0xE8,0xEE,0x99,0x8C,0x77,0x3E,0x5C,0x86,0x64,0x4D,0x6D,0x78,0x86,
|
||||
0xA5,0x4F,0x65,0xE2,0x1E,0xB2,0xDF,0x5A,0x0A,0xD0,0x7E,0x08,0x14,0xB0,0x71,0xAC,
|
||||
0xBD,0xDB,0x83,0x1C,0xB9,0xD7,0xA1,0x62,0xCD,0xC6,0x63,0x7C,0x52,0x69,0xC3,0xE6,
|
||||
0xBF,0x75,0xCE,0x12,0x44,0x5D,0x21,0x04,0xFA,0xFB,0xD3,0x3C,0x38,0x11,0x63,0xD4,
|
||||
0x95,0x85,0x41,0x49,0x46,0x09,0xF2,0x08,0x43,0x11,0xDC,0x1F,0x76,0xC0,0x15,0x6D,
|
||||
0x1F,0x3C,0x63,0x70,0xEA,0x87,0x80,0x6C,0xC3,0xBD,0x63,0x8B,0xC2,0x37,0x21,0x37,
|
||||
0xDC,0xEE,0x09,0x23,0x2E,0x37,0x6A,0x4D,0x73,0x90,0xF7,0x50,0x30,0xAC,0x1C,0x92,
|
||||
0x04,0x10,0x23,0x91,0x4F,0xD2,0x07,0xAA,0x68,0x3E,0x4F,0x9A,0xC9,0x64,0x60,0x6A,
|
||||
0xC8,0x14,0x21,0xF3,0xD6,0x22,0x41,0x12,0x44,0x24,0xCF,0xE6,0x8A,0x56,0xDD,0x0D,
|
||||
0x53,0x4D,0xE1,0x85,0x1E,0x8C,0x52,0x5A,0x9C,0x19,0x84,0xC2,0x03,0x57,0xF1,0x6F,
|
||||
0xE3,0x00,0xBE,0x58,0xF6,0x4C,0xED,0xD5,0x21,0x64,0x9C,0x1F,0xBE,0x55,0x03,0x3C,
|
||||
0x4A,0xDC,0xFF,0xAA,0xC9,0xDA,0xE0,0x5D,0x5E,0xBF,0xE6,0xDE,0xF5,0xD8,0xB1,0xF8,
|
||||
0xFF,0x36,0xB3,0xB9,0x62,0x67,0x95,0xDB,0x31,0x5F,0x37,0xED,0x4C,0x70,0x67,0x99,
|
||||
0x90,0xB5,0x18,0x31,0x6C,0x3D,0x99,0x99,0xE4,0x42,0xDA,0xD3,0x25,0x42,0x13,0xA0,
|
||||
0xAE,0xD7,0x70,0x6C,0xB1,0x55,0xCF,0xC7,0xD7,0x46,0xD5,0x43,0x61,0x17,0x3D,0x44,
|
||||
0x28,0xE9,0x33,0x85,0xD5,0xD0,0xA2,0x93,0xAA,0x25,0x12,0x1F,0xFB,0xC5,0x0B,0x46,
|
||||
0xF5,0x97,0x76,0x56,0x45,0xA6,0xBE,0x87,0xB1,0x94,0x6B,0xE8,0xB1,0xFE,0x33,0x99,
|
||||
0xAE,0x1F,0x3E,0x6C,0x39,0x71,0x1D,0x09,0x00,0x90,0x37,0xE4,0x10,0x3E,0x75,0x74,
|
||||
0xFF,0x8C,0x83,0x3B,0xB0,0xF1,0xB0,0xF9,0x01,0x05,0x47,0x42,0x95,0xF1,0xD6,0xAC,
|
||||
0x7E,0x38,0xE6,0x9E,0x95,0x74,0x26,0x3F,0xB4,0x68,0x50,0x18,0xD0,0x43,0x30,0xB4,
|
||||
0x4C,0x4B,0xE3,0x68,0xBF,0xE5,0x4D,0xB6,0x95,0x8B,0x0A,0xA0,0x74,0x25,0x32,0x77,
|
||||
0xCF,0xA1,0xF7,0x2C,0xD8,0x71,0x13,0x5A,0xAB,0xEA,0xC9,0x51,0xE8,0x0D,0xEE,0xEF,
|
||||
0xE9,0x93,0x7E,0x19,0xA7,0x1E,0x43,0x38,0x81,0x16,0x2C,0xA1,0x48,0xE3,0x73,0xCC,
|
||||
0x29,0x21,0x6C,0xD3,0x5D,0xCE,0xA0,0xD9,0x61,0x71,0x43,0xA0,0x15,0x13,0xB5,0x64,
|
||||
0x92,0xCF,0x2A,0x19,0xDC,0xAD,0xB7,0xA5,0x9F,0x86,0x65,0xF8,0x1A,0x9F,0xE7,0xFB,
|
||||
0xF7,0xFD,0xB8,0x13,0x6C,0x27,0xDB,0x6F,0xDF,0x35,0x1C,0xF7,0x8D,0x2C,0x5B,0x9B,
|
||||
0x12,0xAB,0x38,0x64,0x06,0xCC,0xDE,0x31,0xE8,0x4E,0x75,0x11,0x64,0xE3,0xFA,0xEA,
|
||||
0xEB,0x34,0x54,0xC2,0xAD,0x3F,0x34,0xEB,0x93,0x2C,0x7D,0x26,0x36,0x9D,0x56,0xF3,
|
||||
0x5A,0xE1,0xF6,0xB3,0x98,0x63,0x4A,0x9E,0x32,0x83,0xE4,0x9A,0x84,0x60,0x7D,0x90,
|
||||
0x2E,0x13,0x0E,0xEE,0x93,0x4B,0x36,0xA2,0x85,0xEC,0x16,0x38,0xE8,0x88,0x06,0x02,
|
||||
0xBF,0xF0,0xA0,0x3A,0xED,0xD7,0x6A,0x9A,0x73,0xE1,0x57,0xCF,0xF8,0x44,0xB8,0xDC,
|
||||
0x2E,0x23,0x59,0xD1,0xDF,0x95,0x52,0x71,0x99,0x61,0xA0,0x4B,0xD5,0x7F,0x6E,0x78,
|
||||
0xBA,0xA9,0xC5,0x30,0xD3,0x40,0x86,0x32,0x9D,0x32,0x0C,0x9C,0x37,0xB7,0x02,0x2F,
|
||||
0xBA,0x54,0x98,0xA9,0xC4,0x13,0x04,0xC9,0x8D,0xBE,0xC8,0xE7,0x5D,0x97,0x50,0x2E,
|
||||
0x93,0xD6,0x22,0x59,0x0C,0x27,0xBC,0x22,0x92,0xE0,0xA7,0x20,0x0F,0x93,0x6F,0x7F,
|
||||
0x4C,0x9F,0xD3,0xB5,0xA6,0x2A,0x0B,0x74,0x67,0x49,0x7D,0x10,0x26,0xCB,0xD1,0xC5,
|
||||
0x86,0x71,0xE7,0x8C,0xA0,0x9C,0xE9,0x5B,0xB2,0x1A,0xF6,0x01,0xEE,0x8C,0x9E,0x5E,
|
||||
0x83,0xF2,0x1A,0xDB,0xE6,0xE5,0xEA,0x84,0x59,0x76,0xD2,0x7C,0xF6,0x8D,0xA5,0x49,
|
||||
0x36,0x48,0xC2,0x16,0x52,0xBB,0x83,0xA3,0x74,0xB9,0x07,0x0C,0x3B,0xFF,0x61,0x28,
|
||||
0xE1,0x61,0xE9,0xE4,0xEF,0x6E,0x15,0xAA,0x4E,0xBA,0xE8,0x5D,0x05,0x96,0xBB,0x32,
|
||||
0x56,0xB0,0xFB,0x72,0x52,0x0F,0x0E,0xC8,0x42,0x25,0x65,0x76,0x89,0xAF,0xF2,0xDE,
|
||||
0x10,0x27,0xF0,0x01,0x4B,0x74,0xA7,0x97,0x07,0xD5,0x26,0x54,0x54,0x09,0x1F,0x82,
|
||||
0x0A,0x86,0x7D,0x30,0x39,0x0E,0xB3,0x26,0x9B,0x0B,0x57,0xBB,0x36,0x06,0x31,0xAF,
|
||||
0xFD,0x79,0xFC,0xD9,0x30,0x10,0x2B,0x0C,0xB3,0xE1,0x9B,0xD7,0x7B,0xDC,0x5F,0xEF,
|
||||
0xD2,0xF8,0x13,0x45,0x4D,0x47,0x75,0xBD,0x46,0x96,0x3C,0x7E,0x75,0xF3,0x3E,0xB5,
|
||||
0x67,0xC5,0x9A,0x3B,0xB0,0x5B,0x29,0x6B,0xDE,0x80,0x5B,0xC8,0x15,0x05,0xB1,0x31,
|
||||
0xB6,0xCE,0x49,0xDD,0xAD,0x84,0xB5,0xAE,0x60,0xDC,0x67,0x31,0x34,0x30,0xFE,0x4E,
|
||||
0xBD,0x80,0x2F,0xA6,0xBF,0x63,0x39,0x21,0x86,0xD9,0x35,0x7F,0x16,0x68,0x22,0x05,
|
||||
0x54,0xE9,0x90,0x26,0x8C,0x07,0x6C,0x51,0xA4,0x31,0x55,0xD7,0x09,0x07,0xA8,0x3E,
|
||||
0x2E,0x53,0x66,0xC1,0xF8,0xF2,0x7B,0xC4,0xF2,0x58,0xCF,0xF1,0x87,0xC5,0xA2,0xE7,
|
||||
0x27,0x8F,0x30,0x87,0x58,0xA0,0x64,0x62,0x23,0x18,0xB9,0x88,0x7C,0xFA,0xCE,0xC4,
|
||||
0x98,0xAE,0xAD,0x17,0xCC,0x4A,0x5B,0xF3,0xE9,0x48,0xD5,0x56,0xD3,0x0D,0xF2,0xC8,
|
||||
0x92,0x73,0x8C,0xDB,0xD7,0x2F,0x56,0xAC,0x81,0xF9,0x92,0x69,0x4D,0xC6,0x32,0xF6,
|
||||
0xE6,0xC0,0x8D,0x21,0xE2,0x76,0x80,0x61,0x11,0xBC,0xDC,0x6C,0x93,0xAF,0x19,0x69,
|
||||
0x9B,0xD0,0xBF,0xB9,0x31,0x9F,0x02,0x67,0xA3,0x51,0xEE,0x83,0x06,0x22,0x7B,0x0C,
|
||||
0xAB,0x49,0x42,0x40,0xB8,0xD5,0x01,0x7D,0xCE,0x5E,0xF7,0x55,0x53,0x39,0xC5,0x99,
|
||||
0x46,0xD8,0x87,0x9F,0xBA,0xF7,0x64,0xB4,0xE3,0x9A,0xFA,0xA1,0x6D,0x90,0x68,0x10,
|
||||
0x30,0xCA,0x8A,0x54,0xA7,0x9F,0x60,0xC3,0x19,0xF5,0x6B,0x0D,0x7A,0x51,0x98,0xE6,
|
||||
0x98,0x43,0x51,0xB4,0xD6,0x35,0xE9,0x4F,0xC3,0xDF,0x0F,0x7B,0xD6,0x2F,0x5C,0xBD,
|
||||
0x3A,0x15,0x61,0x19,0xF1,0x4B,0xCB,0xAA,0xDC,0x6D,0x64,0xC9,0xD3,0xC6,0x1E,0x56,
|
||||
0xEF,0x38,0x4C,0x50,0x71,0x86,0x75,0xCC,0x0D,0x0D,0x4E,0xE9,0x28,0xF6,0x06,0x5D,
|
||||
0x70,0x1B,0xAA,0xD3,0x45,0xCF,0xA8,0x39,0xAC,0x95,0xA6,0x2E,0xB4,0xE4,0x22,0xD4,
|
||||
0x74,0xA8,0x37,0x5F,0x48,0x7A,0x04,0xCC,0xA5,0x4C,0x40,0xD8,0x28,0xB4,0x28,0x08,
|
||||
0x0D,0x1C,0x72,0x52,0x41,0xF0,0x7D,0x47,0x19,0x3A,0x53,0x4E,0x58,0x84,0x62,0x6B,
|
||||
0x93,0xB5,0x8A,0x81,0x21,0x4E,0x0D,0xDC,0xB4,0x3F,0xA2,0xC6,0xFC,0xC9,0x2B,0x40,
|
||||
0xDA,0x38,0x04,0xE9,0x5E,0x5A,0x86,0x6B,0x0C,0x22,0x25,0x85,0x68,0x11,0x8D,0x7C,
|
||||
0x92,0x1D,0x95,0x55,0x4D,0xAB,0x8E,0xBB,0xDA,0xA6,0xE6,0xB7,0x51,0xB6,0x32,0x5A,
|
||||
0x05,0x41,0xDD,0x05,0x2A,0x0A,0x56,0x50,0x91,0x17,0x47,0xCC,0xC9,0xE6,0x7E,0xB5,
|
||||
0x61,0x4A,0xDB,0x73,0x67,0x51,0xC8,0x33,0xF5,0xDA,0x6E,0x74,0x2E,0x54,0xC3,0x37,
|
||||
0x0D,0x6D,0xAF,0x08,0xE8,0x15,0x8A,0x5F,0xE2,0x59,0x21,0xCD,0xA8,0xDE,0x0C,0x06,
|
||||
0x5A,0x77,0x6B,0x5F,0xDB,0x18,0x65,0x3E,0xC8,0x50,0xDE,0x78,0xE0,0xB8,0x82,0xB3,
|
||||
0x5D,0x4E,0x72,0x32,0x07,0x4F,0xC1,0x34,0x23,0xBA,0x96,0xB7,0x67,0x4E,0xA4,0x28,
|
||||
0x1E,0x34,0x62,0xEB,0x2D,0x6A,0x70,0xE9,0x2F,0x42,0xC4,0x70,0x4E,0x5A,0x31,0x9C,
|
||||
0xF9,0x5B,0x47,0x28,0xAA,0xDA,0x71,0x6F,0x38,0x1F,0xB3,0x78,0xC4,0x92,0x6B,0x1C,
|
||||
0x9E,0xF6,0x35,0x9A,0xB7,0x4D,0x0E,0xBF,0xCC,0x18,0x29,0x41,0x03,0x48,0x35,0x5D,
|
||||
0x55,0xD0,0x2B,0xC6,0x29,0xAF,0x5C,0x60,0x74,0x69,0x8E,0x5E,0x9B,0x7C,0xD4,0xBD,
|
||||
0x7B,0x44,0x64,0x7D,0x3F,0x92,0x5D,0x69,0xB6,0x1F,0x00,0x4B,0xD4,0x83,0x35,0xCF,
|
||||
0x7E,0x64,0x4E,0x17,0xAE,0x8D,0xD5,0x2E,0x9A,0x28,0x12,0x4E,0x2E,0x2B,0x49,0x08,
|
||||
0x5C,0xAE,0xC6,0x46,0x85,0xAE,0x41,0x61,0x1E,0x6F,0x82,0xD2,0x51,0x37,0x16,0x1F,
|
||||
0x0B,0xF6,0x59,0xA4,0x9A,0xCA,0x5A,0xAF,0x0D,0xD4,0x33,0x8B,0x20,0x63,0xF1,0x84,
|
||||
0x80,0x5C,0xCB,0xCF,0x08,0xB4,0xB9,0xD3,0x16,0x05,0xBD,0x62,0x83,0x31,0x9B,0x56,
|
||||
0x51,0x98,0x9F,0xBA,0xB2,0x5B,0xAA,0xB2,0x22,0x6B,0x2C,0xB5,0xD4,0x48,0xFA,0x63,
|
||||
0x2B,0x5F,0x58,0xFA,0x61,0xFA,0x64,0x09,0xBB,0x38,0xE0,0xB8,0x9D,0x92,0x60,0xA8,
|
||||
0x0D,0x67,0x6F,0x0E,0x37,0xF5,0x0D,0x01,0x9F,0xC2,0x77,0xD4,0xFE,0xEC,0xF1,0x73,
|
||||
0x30,0x39,0xE0,0x7D,0xF5,0x61,0x98,0xE4,0x2C,0x28,0x55,0x04,0x56,0x55,0xDB,0x2F,
|
||||
0x6B,0xEC,0xE5,0x58,0x06,0xB6,0x64,0x80,0x6A,0x2A,0x1A,0x4E,0x5B,0x0F,0xD8,0xC4,
|
||||
0x0A,0x2E,0x52,0x19,0xD9,0x62,0xF5,0x30,0x48,0xBE,0x8C,0x7B,0x4F,0x38,0x9B,0xA2,
|
||||
0xC3,0xAF,0xC9,0xD3,0xC7,0xC1,0x62,0x41,0x86,0xB9,0x61,0x21,0x57,0x6F,0x99,0x4F,
|
||||
0xC1,0xBA,0xCE,0x7B,0xB5,0x3B,0x4D,0x5E,0x8A,0x8B,0x44,0x57,0x5F,0x13,0x5F,0x70,
|
||||
0x6D,0x5B,0x29,0x47,0xDC,0x38,0xE2,0xEC,0x04,0x55,0x65,0x12,0x2A,0xE8,0x17,0x43,
|
||||
0xE1,0x8E,0xDD,0x2A,0xB3,0xE2,0x94,0xF7,0x09,0x6E,0x5C,0xE6,0xEB,0x8A,0xF8,0x6D,
|
||||
0x89,0x49,0x54,0x48,0xF5,0x2F,0xAD,0xBF,0xEA,0x94,0x4B,0xCA,0xFC,0x39,0x87,0x82,
|
||||
0x5F,0x8A,0x01,0xF2,0x75,0xF2,0xE6,0x71,0xD6,0xD8,0x42,0xDE,0xF1,0x2D,0x1D,0x28,
|
||||
0xA6,0x88,0x7E,0xA3,0xA0,0x47,0x1D,0x30,0xD9,0xA3,0x71,0xDF,0x49,0x1C,0xCB,0x01,
|
||||
0xF8,0x36,0xB1,0xF2,0xF0,0x22,0x58,0x5D,0x45,0x6B,0xBD,0xA0,0xBB,0xB2,0x88,0x42,
|
||||
0xC7,0x8C,0x28,0xCE,0x93,0xE8,0x90,0x63,0x08,0x90,0x7C,0x89,0x3C,0xF5,0x7D,0xB7,
|
||||
0x04,0x2D,0x4F,0x55,0x51,0x16,0xFD,0x7E,0x79,0xE8,0xBE,0xC1,0xF2,0x12,0xD4,0xF8,
|
||||
0xB4,0x84,0x05,0x23,0xA0,0xCC,0xD2,0x2B,0xFD,0xE1,0xAB,0xAD,0x0D,0xD1,0x55,0x6C,
|
||||
0x23,0x41,0x94,0x4D,0x77,0x37,0x4F,0x05,0x28,0x0C,0xBF,0x17,0xB3,0x12,0x67,0x6C,
|
||||
0x8C,0xC3,0x5A,0xF7,0x41,0x84,0x2A,0x6D,0xD0,0x94,0x12,0x27,0x2C,0xB4,0xED,0x9C,
|
||||
0x4D,0xEC,0x47,0x82,0x97,0xD5,0x67,0xB9,0x1B,0x9D,0xC0,0x55,0x07,0x7E,0xE5,0x8E,
|
||||
0xE2,0xA8,0xE7,0x3E,0x12,0xE4,0x0E,0x3A,0x2A,0x45,0x55,0x34,0xA2,0xF9,0x2D,0x5A,
|
||||
0x1B,0xAB,0x52,0x7C,0x83,0x10,0x5F,0x55,0xD2,0xF1,0x5A,0x43,0x2B,0xC6,0xA7,0xA4,
|
||||
0x89,0x15,0x95,0xE8,0xB4,0x4B,0x9D,0xF8,0x75,0xE3,0x9F,0x60,0x78,0x5B,0xD6,0xE6,
|
||||
0x0D,0x44,0xE6,0x21,0x06,0xBD,0x47,0x22,0x53,0xA4,0x00,0xAD,0x8D,0x43,0x13,0x85,
|
||||
0x39,0xF7,0xAA,0xFC,0x38,0xAF,0x7B,0xED,0xFC,0xE4,0x2B,0x54,0x50,0x98,0x4C,0xFC,
|
||||
0x85,0x80,0xF7,0xDF,0x3C,0x80,0x22,0xE1,0x94,0xDA,0xDE,0x24,0xC6,0xB0,0x7A,0x39,
|
||||
0x38,0xDC,0x0F,0xA1,0xA7,0xF4,0xF9,0x6F,0x63,0x18,0x57,0x8B,0x84,0x41,0x2A,0x2E,
|
||||
0xD4,0x53,0xF2,0xD9,0x00,0x0F,0xD0,0xDD,0x99,0x6E,0x19,0xA6,0x0A,0xD0,0xEC,0x5B,
|
||||
0x58,0x24,0xAB,0xC0,0xCB,0x06,0x65,0xEC,0x1A,0x13,0x38,0x94,0x0A,0x67,0x03,0x2F,
|
||||
0x3F,0xF7,0xE3,0x77,0x44,0x77,0x33,0xC6,0x14,0x39,0xD0,0xE3,0xC0,0xA2,0x08,0x79,
|
||||
0xBB,0x40,0x99,0x57,0x41,0x0B,0x01,0x90,0xCD,0xE1,0xCC,0x48,0x67,0xDB,0xB3,0xAF,
|
||||
0x88,0x74,0xF3,0x4C,0x82,0x8F,0x72,0xB1,0xB5,0x23,0x29,0xC4,0x12,0x6C,0x19,0xFC,
|
||||
0x8E,0x46,0xA4,0x9C,0xC4,0x25,0x65,0x87,0xD3,0x6D,0xBE,0x8A,0x93,0x11,0x03,0x38,
|
||||
0xED,0x83,0x2B,0xF3,0x46,0xA4,0x93,0xEA,0x3B,0x53,0x85,0x1D,0xCE,0xD4,0xF1,0x08,
|
||||
0x83,0x27,0xED,0xFC,0x9B,0x1A,0x18,0xBC,0xF9,0x8B,0xAE,0xDC,0x24,0xAB,0x50,0x38,
|
||||
0xE9,0x72,0x4B,0x10,0x22,0x17,0x7B,0x46,0x5D,0xAB,0x59,0x64,0xF3,0x40,0xAE,0xF8,
|
||||
0xBB,0xE5,0xC8,0xF9,0x26,0x03,0x4E,0x55,0x7D,0xEB,0xEB,0xFE,0xF7,0x39,0xE6,0xE0,
|
||||
0x0A,0x11,0xBE,0x2E,0x28,0xFF,0x98,0xED,0xC0,0xC9,0x42,0x56,0x42,0xC3,0xFD,0x00,
|
||||
0xF6,0xAF,0x87,0xA2,0x5B,0x01,0x3F,0x32,0x92,0x47,0x95,0x9A,0x72,0xA5,0x32,0x3D,
|
||||
0xAE,0x6B,0xD0,0x9B,0x07,0xD2,0x49,0x92,0xE3,0x78,0x4A,0xFA,0xA1,0x06,0x7D,0xF2,
|
||||
0x41,0xCF,0x77,0x74,0x04,0x14,0xB2,0x0C,0x86,0x84,0x64,0x16,0xD5,0xBB,0x51,0xA1,
|
||||
0xE5,0x6F,0xF1,0xD1,0xF2,0xE2,0xF7,0x5F,0x58,0x20,0x4D,0xB8,0x57,0xC7,0xCF,0xDD,
|
||||
0xC5,0xD8,0xBE,0x76,0x3D,0xF6,0x5F,0x7E,0xE7,0x2A,0x8B,0x88,0x24,0x1B,0x38,0x3F,
|
||||
0x0E,0x41,0x23,0x77,0xF5,0xF0,0x4B,0xD4,0x0C,0x1F,0xFA,0xA4,0x0B,0x80,0x5F,0xCF,
|
||||
0x45,0xF6,0xE0,0xDA,0x2F,0x34,0x59,0x53,0xFB,0x20,0x3C,0x52,0x62,0x5E,0x35,0xB5,
|
||||
0x62,0xFE,0x8B,0x60,0x63,0xE3,0x86,0x5A,0x15,0x1A,0x6E,0xD1,0x47,0x45,0xBC,0x32,
|
||||
0xB4,0xEB,0x67,0x38,0xAB,0xE4,0x6E,0x33,0x3A,0xB5,0xED,0xA3,0xAD,0x67,0xE0,0x4E,
|
||||
0x41,0x95,0xEE,0x62,0x62,0x71,0x26,0x1D,0x31,0xEF,0x62,0x30,0xAF,0xD7,0x82,0xAC,
|
||||
0xC2,0xDC,0x05,0x04,0xF5,0x97,0x07,0xBF,0x11,0x59,0x23,0x07,0xC0,0x64,0x02,0xE8,
|
||||
0x97,0xE5,0x3E,0xAF,0x18,0xAC,0x59,0xA6,0x8B,0x4A,0x33,0x90,0x1C,0x6E,0x7C,0x9C,
|
||||
0x20,0x7E,0x4C,0x3C,0x3E,0x61,0x64,0xBB,0xC5,0x6B,0x7C,0x7E,0x3E,0x9F,0xC5,0x4C,
|
||||
0x9F,0xEA,0x73,0xF5,0xD7,0x89,0xC0,0x4C,0xF4,0xFB,0xF4,0x2D,0xEC,0x14,0x1B,0x51,
|
||||
0xD5,0xC1,0x12,0xC8,0x10,0xDF,0x0B,0x4A,0x8B,0x9C,0xBC,0x93,0x45,0x6A,0x3E,0x3E,
|
||||
0x7D,0xC1,0xA9,0xBA,0xCD,0xC1,0xB4,0x07,0xE4,0xE1,0x68,0x86,0x43,0xB2,0x6D,0x38,
|
||||
0xF3,0xFB,0x0C,0x5C,0x66,0x37,0x71,0xDE,0x56,0xEF,0x6E,0xA0,0x10,0x40,0x65,0xA7,
|
||||
0x98,0xF7,0xD0,0xBE,0x0E,0xC8,0x37,0x36,0xEC,0x10,0xCA,0x7C,0x9C,0xAB,0x84,0x1E,
|
||||
0x05,0x17,0x76,0x02,0x1C,0x4F,0x52,0xAA,0x5F,0xC1,0xC6,0xA0,0x56,0xB9,0xD8,0x04,
|
||||
0x84,0x44,0x4D,0xA7,0x59,0xD8,0xDE,0x60,0xE6,0x38,0x0E,0x05,0x8F,0x03,0xE1,0x3B,
|
||||
0x6D,0x81,0x04,0x33,0x6F,0x30,0x0B,0xCE,0x69,0x05,0x21,0x33,0xFB,0x26,0xBB,0x89,
|
||||
0x7D,0xB6,0xAE,0x87,0x7E,0x51,0x07,0xE0,0xAC,0xF7,0x96,0x0A,0x6B,0xF9,0xC4,0x5C,
|
||||
0x1D,0xE4,0x44,0x47,0xB8,0x5E,0xFA,0xE3,0x78,0x84,0x55,0x42,0x4B,0x48,0x5E,0xF7,
|
||||
0x7D,0x47,0x35,0x86,0x1D,0x2B,0x43,0x05,0x03,0xEC,0x8A,0xB8,0x1E,0x06,0x3C,0x76,
|
||||
0x0C,0x48,0x1A,0x43,0xA7,0xB7,0x8A,0xED,0x1E,0x13,0xC6,0x43,0xEE,0x10,0xEF,0xDB,
|
||||
0xEC,0xFB,0x3C,0x83,0xB2,0x95,0x44,0xEF,0xD8,0x54,0x51,0x4E,0x2D,0x11,0x44,0x1D,
|
||||
0xFB,0x36,0x59,0x1E,0x7A,0x34,0xC1,0xC3,0xCA,0x57,0x00,0x61,0xEA,0x67,0xA5,0x16,
|
||||
0x9B,0x55,0xD0,0x55,0xE1,0x7F,0xD9,0x36,0xD2,0x40,0x76,0xAE,0xDC,0x01,0xCE,0xB0,
|
||||
0x7A,0x83,0xD5,0xCB,0x20,0x98,0xEC,0x6B,0xC1,0x72,0x92,0x34,0xF3,0x82,0x57,0x37,
|
||||
0x62,0x8A,0x32,0x36,0x0C,0x90,0x43,0xAE,0xAE,0x5C,0x9B,0x78,0x8E,0x13,0x65,0x02,
|
||||
0xFD,0x68,0x71,0xC1,0xFE,0xB0,0x31,0xA0,0x24,0x82,0xB0,0xC3,0xB1,0x79,0x69,0xA7,
|
||||
0xF5,0xD2,0xEB,0xD0,0x82,0xC0,0x32,0xDC,0x9E,0xC7,0x26,0x3C,0x6D,0x8D,0x98,0xC1,
|
||||
0xBB,0x22,0xD4,0xD0,0x0F,0x33,0xEC,0x3E,0xB9,0xCC,0xE1,0xDC,0x6A,0x4C,0x77,0x36,
|
||||
0x14,0x1C,0xF9,0xBF,0x81,0x9F,0x28,0x5F,0x71,0x85,0x32,0x29,0x90,0x75,0x48,0xC4,
|
||||
0xB3,0x4A,0xCE,0xD8,0x44,0x8F,0x14,0x2F,0xFD,0x40,0x57,0xEF,0xAA,0x08,0x75,0xD9,
|
||||
0x46,0xD1,0xD6,0x6E,0x32,0x55,0x1F,0xC3,0x18,0xFE,0x84,0x1F,0xFC,0x84,0xD5,0xFF,
|
||||
0x71,0x5E,0x1B,0x48,0xC3,0x86,0x95,0x0E,0x28,0x08,0x27,0xD3,0x38,0x83,0x71,0x7B,
|
||||
0x4C,0x80,0x63,0x54,0x9A,0x56,0xB0,0xAC,0xCF,0x80,0xCA,0x31,0x09,0xEF,0xFE,0xF3,
|
||||
0xBE,0xAF,0x24,0x7E,0xA6,0xFE,0x53,0x3F,0xC2,0x8D,0x4A,0x33,0x68,0xD1,0x22,0xA6,
|
||||
0x66,0xAD,0x7B,0xEA,0xDE,0xB6,0x43,0xB0,0xA1,0x25,0x95,0x00,0xA3,0x3F,0x75,0x46,
|
||||
0x14,0x11,0x44,0xEC,0xD7,0x95,0xBC,0x92,0xF0,0x4F,0xA9,0x16,0x53,0x62,0x97,0x60,
|
||||
0x2A,0x0F,0x41,0xF1,0x71,0x24,0xBE,0xEE,0x94,0x7F,0x08,0xCD,0x60,0x93,0xB3,0x85,
|
||||
0x5B,0x07,0x00,0x3F,0xD8,0x0F,0x28,0x83,0x9A,0xD1,0x69,0x9F,0xD1,0xDA,0x2E,0xC3,
|
||||
0x90,0x01,0xA2,0xB9,0x6B,0x4E,0x2A,0x66,0x9D,0xDA,0xAE,0xA6,0xEA,0x2A,0xD3,0x68,
|
||||
0x2F,0x0C,0x0C,0x9C,0xD2,0x8C,0x4A,0xED,0xE2,0x9E,0x57,0x65,0x9D,0x09,0x87,0xA3,
|
||||
0xB4,0xC4,0x32,0x5D,0xC9,0xD4,0x32,0x2B,0xB1,0xE0,0x71,0x1E,0x64,0x4D,0xE6,0x90,
|
||||
0x71,0xE3,0x1E,0x40,0xED,0x7D,0xF3,0x84,0x0E,0xED,0xC8,0x78,0x76,0xAE,0xC0,0x71,
|
||||
0x27,0x72,0xBB,0x05,0xEA,0x02,0x64,0xFB,0xF3,0x48,0x6B,0xB5,0x42,0x93,0x3F,0xED,
|
||||
0x9F,0x13,0x53,0xD2,0xF7,0xFE,0x2A,0xEC,0x1D,0x47,0x25,0xDB,0x3C,0x91,0x86,0xC6,
|
||||
0x8E,0xF0,0x11,0xFD,0x23,0x74,0x36,0xF7,0xA4,0xF5,0x9E,0x7A,0x7E,0x53,0x50,0x44,
|
||||
0xD4,0x47,0xCA,0xD3,0xEB,0x38,0x6D,0xE6,0xD9,0x71,0x94,0x7F,0x4A,0xC6,0x69,0x4B,
|
||||
0x11,0xF4,0x52,0xEA,0x22,0xFE,0x8A,0xB0,0x36,0x67,0x8B,0x59,0xE8,0xE6,0x80,0x2A,
|
||||
0xEB,0x65,0x04,0x13,0xEE,0xEC,0xDC,0x9E,0x5F,0xB1,0xEC,0x05,0x6A,0x59,0xE6,0x9F,
|
||||
0x5E,0x59,0x6B,0x89,0xBF,0xF7,0x1A,0xCA,0x44,0xF9,0x5B,0x6A,0x71,0x85,0x03,0xE4,
|
||||
0x29,0x62,0xE0,0x70,0x6F,0x41,0xC4,0xCF,0xB2,0xB1,0xCC,0xE3,0x7E,0xA6,0x07,0xA8,
|
||||
0x87,0xE7,0x7F,0x84,0x93,0xDB,0x52,0x4B,0x6C,0xEC,0x7E,0xDD,0xD4,0x24,0x48,0x10,
|
||||
0x69,0x9F,0x04,0x60,0x74,0xE6,0x48,0x18,0xF3,0xE4,0x2C,0xB9,0x4F,0x2E,0x50,0x7A,
|
||||
0xDF,0xD4,0x54,0x69,0x2B,0x8B,0xA7,0xF3,0xCE,0xFF,0x1F,0xF3,0x3E,0x26,0x01,0x39,
|
||||
0x17,0x95,0x84,0x89,0xB0,0xF0,0x4C,0x4B,0x82,0x91,0x9F,0xC4,0x4B,0xAC,0x9D,0xA5,
|
||||
0x74,0xAF,0x17,0x25,0xC9,0xCA,0x32,0xD3,0xBC,0x89,0x8A,0x84,0x89,0xCC,0x0D,0xAE,
|
||||
0x7C,0xA2,0xDB,0x9C,0x6A,0x78,0x91,0xEE,0xEA,0x76,0x5D,0x4E,0x87,0x60,0xF5,0x69,
|
||||
0x15,0x67,0xD4,0x02,0xCF,0xAF,0x48,0x36,0x07,0xEA,0xBF,0x6F,0x66,0x2D,0x06,0x8F,
|
||||
0xC4,0x9A,0xFE,0xF9,0xF6,0x90,0x87,0x75,0xB8,0xF7,0xAD,0x0F,0x76,0x10,0x5A,0x3D,
|
||||
0x59,0xB0,0x2E,0xB3,0xC7,0x35,0x2C,0xCC,0x70,0x56,0x2B,0xCB,0xE3,0x37,0x96,0xC5,
|
||||
0x2F,0x46,0x1B,0x8A,0x22,0x46,0xC7,0x88,0xA7,0x26,0x32,0x98,0x61,0xDF,0x86,0x22,
|
||||
0x8A,0xF4,0x1C,0x2F,0x87,0xA1,0x09,0xAA,0xCC,0xA9,0xAE,0xD3,0xBD,0x00,0x45,0x1C,
|
||||
0x9A,0x54,0x87,0x86,0x52,0x87,0xEF,0xFF,0x1E,0x8F,0xA1,0x8F,0xC1,0x89,0x5C,0x35,
|
||||
0x1B,0xDA,0x2D,0x3A,0x2C,0x16,0xB2,0xC2,0xF1,0x56,0xE2,0x78,0xC1,0x6B,0x63,0x97,
|
||||
0xC5,0x56,0x8F,0xC9,0x32,0x7F,0x2C,0xAA,0xAF,0xA6,0xA8,0xAC,0x20,0x91,0x22,0x88,
|
||||
0xDE,0xE4,0x60,0x8B,0xF9,0x4B,0x42,0x25,0x1A,0xE3,0x7F,0x9C,0x2C,0x19,0x89,0x3A,
|
||||
0x7E,0x05,0xD4,0x36,0xCC,0x69,0x58,0xC2,0xC1,0x32,0x8B,0x2F,0x90,0x85,0xEB,0x7A,
|
||||
0x39,0x50,0xA5,0xA1,0x27,0x92,0xC5,0x66,0xB0,0x20,0x4F,0x58,0x7E,0x55,0x83,0x43,
|
||||
0x2B,0x45,0xE2,0x9C,0xE4,0xD8,0x12,0x90,0x2C,0x16,0x83,0x56,0x16,0x79,0x03,0xB3,
|
||||
0xAD,0x2D,0x61,0x18,0x1A,0x13,0x1F,0x37,0xE2,0xE1,0x9C,0x73,0x7B,0x80,0xD5,0xFD,
|
||||
0x2D,0x51,0x87,0xFC,0x7B,0xAA,0xD7,0x1F,0x2C,0x7A,0x8E,0xAF,0xF4,0x8D,0xBB,0xCD,
|
||||
0x95,0x11,0x7C,0x72,0x0B,0xEE,0x6F,0xE2,0xB9,0xAF,0xDE,0x37,0x83,0xDE,0x8C,0x8D,
|
||||
0x62,0x05,0x67,0xB7,0x96,0xC6,0x8D,0x56,0xB6,0x0D,0xD7,0x62,0xBA,0xD6,0x46,0x36,
|
||||
0xBD,0x8E,0xC8,0xE6,0xEA,0x2A,0x6C,0x10,0x14,0xFF,0x6B,0x5B,0xFA,0x82,0x3C,0x46,
|
||||
0xB1,0x30,0x43,0x46,0x51,0x8A,0x7D,0x9B,0x92,0x3E,0x83,0x79,0x5B,0x55,0x5D,0xB2,
|
||||
0x6C,0x5E,0xCE,0x90,0x62,0x8E,0x53,0x98,0xC9,0x0D,0x6D,0xE5,0x2D,0x57,0xCD,0xC5,
|
||||
0x81,0x57,0xBA,0xE1,0xE8,0xB8,0x8F,0x72,0xE5,0x4F,0x13,0xDC,0xEA,0x9D,0x71,0x15,
|
||||
0x10,0xB2,0x11,0x88,0xD5,0x09,0xD4,0x7F,0x5B,0x65,0x7F,0x2C,0x3B,0x38,0x4C,0x11,
|
||||
0x68,0x50,0x8D,0xFB,0x9E,0xB0,0x59,0xBF,0x94,0x80,0x89,0x4A,0xC5,0x1A,0x18,0x12,
|
||||
0x89,0x53,0xD1,0x4A,0x10,0x29,0xE8,0x8C,0x1C,0xEC,0xB6,0xEA,0x46,0xC7,0x17,0x8B,
|
||||
0x25,0x15,0x31,0xA8,0xA2,0x6B,0x43,0xB1,0x9D,0xE2,0xDB,0x0B,0x87,0x9B,0xB0,0x11,
|
||||
0x04,0x0E,0x71,0xD2,0x29,0x77,0x89,0x82,0x0A,0x66,0x41,0x7F,0x1D,0x0B,0x48,0xFF,
|
||||
0x72,0xBB,0x24,0xFD,0xC2,0x48,0xA1,0x9B,0xFE,0x7B,0x7F,0xCE,0x88,0xDB,0x86,0xD9,
|
||||
0x85,0x3B,0x1C,0xB0,0xDC,0xA8,0x33,0x07,0xBF,0x51,0x2E,0xE3,0x0E,0x9A,0x00,0x97,
|
||||
0x1E,0x06,0xC0,0x97,0x43,0x9D,0xD8,0xB6,0x45,0xC4,0x86,0x67,0x5F,0x00,0xF8,0x88,
|
||||
0x9A,0xA4,0x52,0x9E,0xC7,0xAA,0x8A,0x83,0x75,0xEC,0xC5,0x18,0xAE,0xCE,0xC3,0x2F,
|
||||
0x1A,0x2B,0xF9,0x18,0xFF,0xAE,0x1A,0xF5,0x53,0x0B,0xB5,0x33,0x51,0xA7,0xFD,0xE8,
|
||||
0xA8,0xE1,0xA2,0x64,0xB6,0x22,0x17,0x43,0x80,0xCC,0x0A,0xD8,0xAE,0x3B,0xBA,0x40,
|
||||
0xD7,0xD9,0x92,0x4A,0x89,0xDF,0x04,0x10,0xEE,0x9B,0x18,0x2B,0x6A,0x77,0x69,0x8A,
|
||||
0x68,0xF4,0xF9,0xB9,0xA2,0x21,0x15,0x6E,0xE6,0x1E,0x3B,0x03,0x62,0x30,0x9B,0x60,
|
||||
0x41,0x7E,0x25,0x9B,0x9E,0x8F,0xC5,0x52,0x10,0x08,0xF8,0xC2,0x69,0xA1,0x21,0x11,
|
||||
0x88,0x37,0x5E,0x79,0x35,0x66,0xFF,0x10,0x42,0x18,0x6E,0xED,0x97,0xB6,0x6B,0x1C,
|
||||
0x4E,0x36,0xE5,0x6D,0x7D,0xB4,0xE4,0xBF,0x20,0xB9,0xE0,0x05,0x3A,0x69,0xD5,0xB8,
|
||||
0xE3,0xD5,0xDC,0xE0,0xB9,0xAC,0x53,0x3E,0x07,0xA4,0x57,0xAD,0x77,0xFF,0x48,0x18,
|
||||
0x76,0x2A,0xAC,0x49,0x2A,0x8E,0x47,0x75,0x6D,0x9F,0x67,0x63,0x30,0x35,0x8C,0x39,
|
||||
0x05,0x39,0xD5,0x6F,0x64,0x3A,0x5B,0xAD,0xCA,0x0B,0xBB,0x82,0x52,0x99,0x45,0xB1,
|
||||
0x93,0x36,0x36,0x99,0xAF,0x13,0x20,0x44,0x36,0xD8,0x02,0x44,0x09,0x39,0x92,0x85,
|
||||
0xFF,0x4A,0x4A,0x97,0x87,0xA6,0x63,0xD7,0xC7,0xB5,0xB5,0x24,0xED,0x0F,0xB4,0x6F,
|
||||
0x0C,0x58,0x52,0x14,0xD9,0xA6,0x7B,0xD3,0x79,0xBC,0x38,0x58,0xA1,0xBD,0x3B,0x84,
|
||||
0x06,0xD8,0x1A,0x06,0xFD,0x6B,0xA8,0xEA,0x4B,0x69,0x28,0x04,0x37,0xAD,0x82,0x99,
|
||||
0xFB,0x0E,0x1B,0x85,0xBD,0xA8,0x5D,0x73,0xCD,0xDC,0x58,0x75,0x0A,0xBE,0x63,0x6C,
|
||||
0x48,0xE7,0x4C,0xE4,0x30,0x2B,0x04,0x60,0xB9,0x15,0xD8,0xDA,0x86,0x81,0x75,0x8F,
|
||||
0x96,0xD4,0x8D,0x1C,0x5D,0x70,0x85,0x7C,0x1C,0x67,0x7B,0xD5,0x08,0x67,0xA6,0xCE,
|
||||
0x4B,0x0A,0x66,0x70,0xB7,0xE5,0x63,0xD4,0x5B,0x8A,0x82,0xEA,0x10,0x67,0xCA,0xE2,
|
||||
0xF4,0xEF,0x17,0x85,0x2F,0x2A,0x5F,0x8A,0x97,0x82,0xF8,0x6A,0xD6,0x34,0x10,0xEA,
|
||||
0xEB,0xC9,0x5C,0x3C,0xE1,0x49,0xF8,0x46,0xEB,0xDE,0xBD,0xF6,0xA9,0x92,0xF1,0xAA,
|
||||
0xA6,0xA0,0x18,0xB0,0x3A,0xD3,0x0F,0x1F,0xF3,0x6F,0xFF,0x31,0x45,0x43,0x44,0xD3,
|
||||
0x50,0x9A,0xF7,0x88,0x09,0x96,0xC1,0xCE,0x76,0xCC,0xF2,0x2C,0x2C,0xBA,0xAD,0x82,
|
||||
0x77,0x8F,0x18,0x84,0xC0,0xD2,0x07,0x9C,0x36,0x90,0x83,0x4E,0x0B,0xA5,0x4F,0x43,
|
||||
0x3E,0x04,0xAB,0x78,0x4F,0xD6,0xFB,0x09,0x01,0x24,0x90,0xDA,0x6F,0x3C,0x3A,0x61,
|
||||
0x0D,0x7F,0x69,0x4A,0xEB,0x2B,0x30,0x02,0xB4,0xDB,0xE0,0x84,0xA9,0xEC,0xD7,0x35,
|
||||
0xBF,0x37,0x7D,0x85,0x58,0xCE,0xA9,0x4E,0xE4,0x80,0xC7,0xA8,0xD3,0x30,0x67,0x48,
|
||||
0xEB,0x29,0xAF,0x2F,0x74,0x6A,0xB4,0xA7,0x3F,0x0F,0x3F,0x92,0xAF,0xF3,0xCA,0xAC,
|
||||
0xAF,0x4B,0xD9,0x94,0xC0,0x43,0xCA,0x81,0x0D,0x2F,0x48,0xA1,0xB0,0x27,0xD5,0xD2,
|
||||
0xEF,0x4B,0x05,0x85,0xA3,0xDE,0x4D,0x93,0x30,0x3C,0xF0,0xBB,0x4A,0x8F,0x30,0x27,
|
||||
0x4C,0xEB,0xE3,0x3E,0x64,0xED,0x9A,0x2F,0x3B,0xF1,0x82,0xF0,0xBA,0xF4,0xCF,0x7F,
|
||||
0x40,0xCB,0xB0,0xE1,0x7F,0xBC,0xAA,0x57,0xD3,0xC9,0x74,0xF2,0xFA,0x43,0x0D,0x22,
|
||||
0xD0,0xF4,0x77,0x4E,0x93,0xD7,0x85,0x70,0x1F,0x99,0xBF,0xB6,0xDE,0x35,0xF1,0x30,
|
||||
0xA7,0x5E,0x71,0xF0,0x6B,0x01,0x2D,0x7B,0x64,0xF0,0x33,0x53,0x0A,0x39,0x88,0xF3,
|
||||
0x6B,0x3A,0xA6,0x6B,0x35,0xD2,0x2F,0x43,0xCD,0x02,0xFD,0xB5,0xE9,0xBC,0x5B,0xAA,
|
||||
0xD8,0xA4,0x19,0x7E,0x0E,0x5D,0x94,0x81,0x9E,0x6F,0x77,0xAD,0xD6,0x0E,0x74,0x93,
|
||||
0x96,0xE7,0xC4,0x18,0x5F,0xAD,0xF5,0x19,
|
||||
};
|
@ -1,14 +1,14 @@
|
||||
/*
|
||||
main.arm7.c
|
||||
|
||||
By Michael Chisholm (Chishm)
|
||||
|
||||
All resetMemory and startBinary functions are based
|
||||
on the MultiNDS loader by Darkain.
|
||||
Original source available at:
|
||||
http://cvs.sourceforge.net/viewcvs.py/ndslib/ndslib/examples/loader/boot/main.cpp
|
||||
|
||||
License:
|
||||
/*
|
||||
main.arm7.c
|
||||
|
||||
By Michael Chisholm (Chishm)
|
||||
|
||||
All resetMemory and startBinary functions are based
|
||||
on the MultiNDS loader by Darkain.
|
||||
Original source available at:
|
||||
http://cvs.sourceforge.net/viewcvs.py/ndslib/ndslib/examples/loader/boot/main.cpp
|
||||
|
||||
License:
|
||||
NitroHax -- Cheat tool for the Nintendo DS
|
||||
Copyright (C) 2008 Michael "Chishm" Chisholm
|
||||
|
||||
@ -23,53 +23,55 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef ARM7
|
||||
# define ARM7
|
||||
#endif
|
||||
#include <nds/ndstypes.h>
|
||||
#include <nds/system.h>
|
||||
#include <nds/interrupts.h>
|
||||
#include <nds/timers.h>
|
||||
#include <nds/dma.h>
|
||||
#endif
|
||||
#include <nds/ndstypes.h>
|
||||
#include <nds/system.h>
|
||||
#include <nds/interrupts.h>
|
||||
#include <nds/timers.h>
|
||||
#include <nds/dma.h>
|
||||
#include <nds/arm7/audio.h>
|
||||
#include <nds/ipc.h>
|
||||
#include <nds/ipc.h>
|
||||
#include <nds/registers_alt.h>
|
||||
#include <nds/memory.h>
|
||||
#include <nds/card.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#include "common.h"
|
||||
#include "common.h"
|
||||
#include "read_card.h"
|
||||
#include "cheat.h"
|
||||
|
||||
void arm7_clearmem (void* loc, size_t len);
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// Important things
|
||||
#define NDS_HEAD 0x027FFE00
|
||||
tNDSHeader* ndsHeader = (tNDSHeader*)NDS_HEAD;
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// Important things
|
||||
#define NDS_HEAD 0x027FFE00
|
||||
tNDSHeader* ndsHeader = (tNDSHeader*)NDS_HEAD;
|
||||
|
||||
#define CHEAT_ENGINE_LOCATION 0x027FE000
|
||||
#define CHEAT_DATA_LOCATION 0x06010000
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// Used for debugging purposes
|
||||
static void errorOutput (u32 code) {
|
||||
// Wait until the ARM9 is ready
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// Used for debugging purposes
|
||||
/* Disabled for now. Re-enable to debug problems
|
||||
static void errorOutput (u32 code) {
|
||||
// Wait until the ARM9 is ready
|
||||
while (arm9_stateFlag != ARM9_READY);
|
||||
// Set the error code, then tell ARM9 to display it
|
||||
arm9_errorCode = code;
|
||||
arm9_errorClearBG = true;
|
||||
arm9_stateFlag = ARM9_DISPERR;
|
||||
// Stop
|
||||
while(1);
|
||||
}
|
||||
while(1);
|
||||
}
|
||||
*/
|
||||
|
||||
static void debugOutput (u32 code) {
|
||||
// Wait until the ARM9 is ready
|
||||
static void debugOutput (u32 code) {
|
||||
// Wait until the ARM9 is ready
|
||||
while (arm9_stateFlag != ARM9_READY);
|
||||
// Set the error code, then tell ARM9 to display it
|
||||
arm9_errorCode = code;
|
||||
@ -78,184 +80,189 @@ static void debugOutput (u32 code) {
|
||||
// Wait for completion
|
||||
while (arm9_stateFlag != ARM9_READY);
|
||||
}
|
||||
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// Firmware stuff
|
||||
|
||||
#define FW_READ 0x03
|
||||
|
||||
void arm7_readFirmware (uint32 address, uint8 * buffer, uint32 size) {
|
||||
uint32 index;
|
||||
|
||||
// Read command
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
REG_SPICNT = SPI_ENABLE | SPI_CONTINUOUS | SPI_DEVICE_NVRAM;
|
||||
REG_SPIDATA = FW_READ;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
|
||||
// Set the address
|
||||
REG_SPIDATA = (address>>16) & 0xFF;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
REG_SPIDATA = (address>>8) & 0xFF;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
REG_SPIDATA = (address) & 0xFF;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
|
||||
for (index = 0; index < size; index++) {
|
||||
REG_SPIDATA = 0;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
buffer[index] = REG_SPIDATA & 0xFF;
|
||||
}
|
||||
REG_SPICNT = 0;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
arm7_resetMemory
|
||||
Clears all of the NDS's RAM that is visible to the ARM7
|
||||
Written by Darkain.
|
||||
Modified by Chishm:
|
||||
* Added STMIA clear mem loop
|
||||
--------------------------------------------------------------------------*/
|
||||
void arm7_resetMemory (void) {
|
||||
int i;
|
||||
u8 settings1, settings2;
|
||||
|
||||
REG_IME = 0;
|
||||
|
||||
for (i=0; i<16; i++) {
|
||||
SCHANNEL_CR(i) = 0;
|
||||
SCHANNEL_TIMER(i) = 0;
|
||||
SCHANNEL_SOURCE(i) = 0;
|
||||
SCHANNEL_LENGTH(i) = 0;
|
||||
}
|
||||
REG_SOUNDCNT = 0;
|
||||
|
||||
// Clear out ARM7 DMA channels and timers
|
||||
for (i=0; i<4; i++) {
|
||||
DMA_CR(i) = 0;
|
||||
DMA_SRC(i) = 0;
|
||||
DMA_DEST(i) = 0;
|
||||
TIMER_CR(i) = 0;
|
||||
TIMER_DATA(i) = 0;
|
||||
}
|
||||
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// Firmware stuff
|
||||
|
||||
#define FW_READ 0x03
|
||||
|
||||
void arm7_readFirmware (uint32 address, uint8 * buffer, uint32 size) {
|
||||
uint32 index;
|
||||
|
||||
// Read command
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
REG_SPICNT = SPI_ENABLE | SPI_CONTINUOUS | SPI_DEVICE_NVRAM;
|
||||
REG_SPIDATA = FW_READ;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
|
||||
// Set the address
|
||||
REG_SPIDATA = (address>>16) & 0xFF;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
REG_SPIDATA = (address>>8) & 0xFF;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
REG_SPIDATA = (address) & 0xFF;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
|
||||
for (index = 0; index < size; index++) {
|
||||
REG_SPIDATA = 0;
|
||||
while (REG_SPICNT & SPI_BUSY);
|
||||
buffer[index] = REG_SPIDATA & 0xFF;
|
||||
}
|
||||
REG_SPICNT = 0;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
arm7_resetMemory
|
||||
Clears all of the NDS's RAM that is visible to the ARM7
|
||||
Written by Darkain.
|
||||
Modified by Chishm:
|
||||
* Added STMIA clear mem loop
|
||||
--------------------------------------------------------------------------*/
|
||||
void arm7_resetMemory (void) {
|
||||
int i;
|
||||
u8 settings1, settings2;
|
||||
|
||||
REG_IME = 0;
|
||||
|
||||
for (i=0; i<16; i++) {
|
||||
SCHANNEL_CR(i) = 0;
|
||||
SCHANNEL_TIMER(i) = 0;
|
||||
SCHANNEL_SOURCE(i) = 0;
|
||||
SCHANNEL_LENGTH(i) = 0;
|
||||
}
|
||||
SOUND_CR = 0;
|
||||
|
||||
// Clear out ARM7 DMA channels and timers
|
||||
for (i=0; i<4; i++) {
|
||||
DMA_CR(i) = 0;
|
||||
DMA_SRC(i) = 0;
|
||||
DMA_DEST(i) = 0;
|
||||
TIMER_CR(i) = 0;
|
||||
TIMER_DATA(i) = 0;
|
||||
}
|
||||
|
||||
// Clear out FIFO
|
||||
REG_IPC_SYNC = 0;
|
||||
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR;
|
||||
REG_IPC_FIFO_CR = 0;
|
||||
|
||||
// clear IWRAM - 037F:8000 to 0380:FFFF, total 96KiB
|
||||
// clear IWRAM - 037F:8000 to 0380:FFFF, total 96KiB
|
||||
arm7_clearmem ((void*)0x037F8000, 96*1024);
|
||||
|
||||
// clear most of EXRAM - except after 0x023FD800, which has the ARM9 code
|
||||
|
||||
// clear most of EXRAM - except after 0x023FD800, which has the ARM9 code
|
||||
arm7_clearmem ((void*)0x02000000, 0x003FD800);
|
||||
|
||||
// clear last part of EXRAM, skipping the ARM9's section
|
||||
// clear last part of EXRAM, skipping the ARM9's section
|
||||
arm7_clearmem ((void*)0x023FE000, 0x2000);
|
||||
|
||||
REG_IE = 0;
|
||||
REG_IF = ~0;
|
||||
(*(vu32*)(0x04000000-4)) = 0; //IRQ_HANDLER ARM7 version
|
||||
(*(vu32*)(0x04000000-8)) = ~0; //VBLANK_INTR_WAIT_FLAGS, ARM7 version
|
||||
REG_POWERCNT = 1; //turn off power to stuffs
|
||||
|
||||
// Reload DS Firmware settings
|
||||
arm7_readFirmware((u32)0x03FE70, &settings1, 0x1);
|
||||
arm7_readFirmware((u32)0x03FF70, &settings2, 0x1);
|
||||
|
||||
if (settings1 > settings2) {
|
||||
arm7_readFirmware((u32)0x03FE00, (u8*)0x027FFC80, 0x70);
|
||||
arm7_readFirmware((u32)0x03FF00, (u8*)0x027FFD80, 0x70);
|
||||
} else {
|
||||
arm7_readFirmware((u32)0x03FF00, (u8*)0x027FFC80, 0x70);
|
||||
arm7_readFirmware((u32)0x03FE00, (u8*)0x027FFD80, 0x70);
|
||||
}
|
||||
|
||||
// Load FW header
|
||||
arm7_readFirmware((u32)0x000000, (u8*)0x027FF830, 0x20);
|
||||
}
|
||||
|
||||
|
||||
int arm7_loadBinary (void) {
|
||||
REG_IE = 0;
|
||||
REG_IF = ~0;
|
||||
(*(vu32*)(0x04000000-4)) = 0; //IRQ_HANDLER ARM7 version
|
||||
(*(vu32*)(0x04000000-8)) = ~0; //VBLANK_INTR_WAIT_FLAGS, ARM7 version
|
||||
REG_POWERCNT = 1; //turn off power to stuffs
|
||||
|
||||
// Reload DS Firmware settings
|
||||
arm7_readFirmware((u32)0x03FE70, &settings1, 0x1);
|
||||
arm7_readFirmware((u32)0x03FF70, &settings2, 0x1);
|
||||
|
||||
if (settings1 > settings2) {
|
||||
arm7_readFirmware((u32)0x03FE00, (u8*)0x027FFC80, 0x70);
|
||||
arm7_readFirmware((u32)0x03FF00, (u8*)0x027FFD80, 0x70);
|
||||
} else {
|
||||
arm7_readFirmware((u32)0x03FF00, (u8*)0x027FFC80, 0x70);
|
||||
arm7_readFirmware((u32)0x03FE00, (u8*)0x027FFD80, 0x70);
|
||||
}
|
||||
|
||||
// Load FW header
|
||||
arm7_readFirmware((u32)0x000000, (u8*)0x027FF830, 0x20);
|
||||
}
|
||||
|
||||
int arm7_loadBinary (void) {
|
||||
u32 chipID;
|
||||
u32 errorCode;
|
||||
|
||||
// Init card
|
||||
|
||||
// Init card
|
||||
errorCode = cardInit(ndsHeader, &chipID);
|
||||
if (errorCode) {
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
// Set memory values expected by loaded NDS
|
||||
*((u32*)0x027ff800) = chipID; // CurrentCardID
|
||||
*((u32*)0x027ff804) = chipID; // Command10CardID
|
||||
*((u16*)0x027ff808) = ndsHeader->headerCRC16; // Header Checksum, CRC-16 of [000h-15Dh]
|
||||
*((u16*)0x027ff80a) = ndsHeader->secureCRC16; // Secure Area Checksum, CRC-16 of [ [20h]..7FFFh]
|
||||
// Set memory values expected by loaded NDS
|
||||
*((u32*)0x027ff800) = chipID; // CurrentCardID
|
||||
*((u32*)0x027ff804) = chipID; // Command10CardID
|
||||
*((u16*)0x027ff808) = ndsHeader->headerCRC16; // Header Checksum, CRC-16 of [000h-15Dh]
|
||||
*((u16*)0x027ff80a) = ndsHeader->secureCRC16; // Secure Area Checksum, CRC-16 of [ [20h]..7FFFh]
|
||||
*((u16*)0x027ffc40) = 0x1; // Booted from card -- EXTREMELY IMPORTANT!!! Thanks to cReDiAr
|
||||
|
||||
cardRead(ndsHeader->arm9romOffset, (u32*)ndsHeader->arm9destination, ndsHeader->arm9binarySize);
|
||||
cardRead(ndsHeader->arm7romOffset, (u32*)ndsHeader->arm7destination, ndsHeader->arm7binarySize);
|
||||
|
||||
cardRead(ndsHeader->arm9romOffset, (u32*)ndsHeader->arm9destination, ndsHeader->arm9binarySize);
cardRead(ndsHeader->arm7romOffset, (u32*)ndsHeader->arm7destination, ndsHeader->arm7binarySize);
|
||||
return ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
arm7_startBinary
|
||||
Jumps to the ARM7 NDS binary in sync with the display and ARM9
|
||||
Written by Darkain, modified by Chishm.
|
||||
--------------------------------------------------------------------------*/
|
||||
void arm7_startBinary (void)
|
||||
{
|
||||
// Wait until the ARM9 is ready
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
arm7_startBinary
|
||||
Jumps to the ARM7 NDS binary in sync with the display and ARM9
|
||||
Written by Darkain, modified by Chishm.
|
||||
--------------------------------------------------------------------------*/
|
||||
void arm7_startBinary (void)
|
||||
{
|
||||
// Wait until the ARM9 is ready
|
||||
while (arm9_stateFlag != ARM9_READY);
|
||||
|
||||
while(REG_VCOUNT!=191);
|
||||
while(REG_VCOUNT==191);
|
||||
|
||||
// Get the ARM9 to boot
|
||||
arm9_stateFlag = ARM9_BOOTBIN;
|
||||
|
||||
while(REG_VCOUNT!=191);
|
||||
while(REG_VCOUNT==191);
|
||||
// Start ARM7
|
||||
resetCpu();
|
||||
}
|
||||
|
||||
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// Main function
|
||||
|
||||
void arm7_main (void) {
|
||||
while(REG_VCOUNT!=191);
|
||||
while(REG_VCOUNT==191);
|
||||
|
||||
// Get the ARM9 to boot
|
||||
arm9_stateFlag = ARM9_BOOTBIN;
|
||||
|
||||
while(REG_VCOUNT!=191);
|
||||
while(REG_VCOUNT==191);
|
||||
// Start ARM7
|
||||
|
||||
void (*foo)() = *(u32*)(0x27FFE34);
|
||||
|
||||
foo();
|
||||
}
|
||||
|
||||
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// Main function
|
||||
|
||||
void arm7_main (void) {
|
||||
|
||||
// No longer set here.
|
||||
// volatile u32* SCFG_ROM = (volatile u32*)0x4004000;
|
||||
// volatile u32* SCFG_CLK = (volatile u32*)0x4004004;
|
||||
// volatile u32* SCFG_EXT = (volatile u32*)0x4004008;
|
||||
|
||||
|
||||
// REG_SCFG_ROM = 0x703;
|
||||
// REG_SCFG_CLK = 0x180;
|
||||
// REG_SCFG_EXT = 0x80000000;
|
||||
// REG_SCFG_EXT=0x12A00000;
|
||||
|
||||
int errorCode;
|
||||
|
||||
|
||||
// Wait for ARM9 to at least start
|
||||
while (arm9_stateFlag < ARM9_START);
|
||||
|
||||
debugOutput (ERR_STS_CLR_MEM);
|
||||
|
||||
// Get ARM7 to clear RAM
|
||||
arm7_resetMemory();
|
||||
|
||||
// Get ARM7 to clear RAM
|
||||
arm7_resetMemory();
|
||||
|
||||
debugOutput (ERR_STS_LOAD_BIN);
|
||||
|
||||
// Load the NDS file
|
||||
// Load the NDS file
|
||||
errorCode = arm7_loadBinary();
|
||||
if (errorCode) {
|
||||
errorOutput(errorCode);
|
||||
}
|
||||
|
||||
debugOutput(errorCode);
|
||||
}
|
||||
|
||||
debugOutput (ERR_STS_HOOK_BIN);
|
||||
|
||||
// Load the cheat engine and hook it into the ARM7 binary
|
||||
errorCode = arm7_hookGame(ndsHeader, (const u32*)CHEAT_DATA_LOCATION, (u32*)CHEAT_ENGINE_LOCATION);
|
||||
if (errorCode != ERR_NONE && errorCode != ERR_NOCHEAT) {
|
||||
errorOutput(errorCode);
|
||||
}
|
||||
|
||||
debugOutput (ERR_STS_START);
|
||||
|
||||
arm7_startBinary();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
arm7_startBinary();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
main.arm9.c
|
||||
|
||||
|
||||
By Michael Chisholm (Chishm)
|
||||
|
||||
All resetMemory and startBinary functions are based
|
||||
|
||||
All resetMemory and startBinary functions are based
|
||||
on the MultiNDS loader by Darkain.
|
||||
Original source available at:
|
||||
http://cvs.sourceforge.net/viewcvs.py/ndslib/ndslib/examples/loader/boot/main.cpp
|
||||
@ -54,23 +54,24 @@ arm9_errorOutput
|
||||
Displays an error code on screen.
|
||||
Written by Chishm
|
||||
--------------------------------------------------------------------------*/
|
||||
/* Re-enable for debug purposes
|
||||
static void arm9_errorOutput (u32 code, bool clearBG) {
|
||||
int i, j, k;
|
||||
u16 colour;
|
||||
|
||||
REG_POWERCNT = (u16)(POWER_LCD | POWER_2D_A);
|
||||
|
||||
REG_POWERCNT = POWER_LCD | POWER_2D_A;
|
||||
REG_DISPCNT = MODE_FB0;
|
||||
VRAM_A_CR = VRAM_ENABLE;
|
||||
|
||||
|
||||
if (clearBG) {
|
||||
// Clear display
|
||||
for (i = 0; i < 256*192; i++) {
|
||||
VRAM_A[i] = 0x0000;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Draw boxes of colour, signifying error codes
|
||||
|
||||
|
||||
if ((code >> 16) != 0) {
|
||||
// high 16 bits
|
||||
for (i = 0; i < 8; i++) { // Pair of bits to use
|
||||
@ -127,8 +128,9 @@ static void arm9_errorOutput (u32 code, bool clearBG) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
arm9_main
|
||||
@ -138,14 +140,18 @@ Jumps to the ARM9 NDS binary in sync with the display and ARM7
|
||||
Written by Darkain, modified by Chishm
|
||||
--------------------------------------------------------------------------*/
|
||||
void arm9_main (void) {
|
||||
register int i;
|
||||
|
||||
// volatile u32* SCFG_EXT = (volatile u32*)0x4004008;
|
||||
// volatile u32* SCFG_CLK = (volatile u32*)0x4004004;
|
||||
|
||||
register int i;
|
||||
|
||||
//set shared ram to ARM7
|
||||
WRAM_CR = 0x03;
|
||||
REG_EXMEMCNT = 0xE880;
|
||||
|
||||
arm9_stateFlag = ARM9_START;
|
||||
|
||||
|
||||
REG_IME = 0;
|
||||
REG_IE = 0;
|
||||
REG_IF = ~0;
|
||||
@ -156,7 +162,7 @@ void arm9_main (void) {
|
||||
(*(vu32*)(i+0x00000000)) = 0x00000000; //clear ITCM
|
||||
(*(vu32*)(i+0x00800000)) = 0x00000000; //clear DTCM
|
||||
}
|
||||
|
||||
|
||||
for (i=16*1024; i<32*1024; i+=4) { //second 16KB
|
||||
(*(vu32*)(i+0x00000000)) = 0x00000000; //clear ITCM
|
||||
}
|
||||
@ -174,7 +180,7 @@ void arm9_main (void) {
|
||||
TIMER_CR(i) = 0;
|
||||
TIMER_DATA(i) = 0;
|
||||
}
|
||||
|
||||
|
||||
// Clear out FIFO
|
||||
REG_IPC_SYNC = 0;
|
||||
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR;
|
||||
@ -217,16 +223,23 @@ void arm9_main (void) {
|
||||
arm9_stateFlag = ARM9_READY;
|
||||
while ( arm9_stateFlag != ARM9_BOOTBIN ) {
|
||||
if (arm9_stateFlag == ARM9_DISPERR) {
|
||||
arm9_errorOutput (arm9_errorCode, arm9_errorClearBG);
|
||||
// arm9_errorOutput (arm9_errorCode, arm9_errorClearBG);
|
||||
if ( arm9_stateFlag == ARM9_DISPERR) {
|
||||
arm9_stateFlag = ARM9_READY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// wait for vblank then boot
|
||||
while(REG_VCOUNT!=191);
|
||||
while(REG_VCOUNT==191);
|
||||
resetCpu();
|
||||
|
||||
u32 first = *(u32*)(0x27FFE34);
|
||||
|
||||
// arm9_errorOutput (*(u32*)(first), true);
|
||||
|
||||
void (*newReset)() = *(u32*)(0x27FFE24);
|
||||
|
||||
newReset();
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,6 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <nds/ndstypes.h>
|
||||
|
||||
void readBios (u8* dest, u32 src, u32 size);
|
||||
#include <nds/ndstypes.h>
|
||||
|
||||
void readBios (u8* dest, u32 src, u32 size);
|
||||
|
@ -27,12 +27,6 @@
|
||||
#include "encryption.h"
|
||||
#include "common.h"
|
||||
|
||||
typedef union
|
||||
{
|
||||
char title[4];
|
||||
u32 key;
|
||||
} GameCode;
|
||||
|
||||
static u32 portFlags = 0;
|
||||
static u32 secureAreaData[CARD_SECURE_AREA_SIZE/sizeof(u32)];
|
||||
|
||||
@ -43,15 +37,15 @@ static u32 getRandomNumber(void) {
|
||||
// guaranteed to be random.
|
||||
}
|
||||
|
||||
static void decryptSecureArea (u32 gameCode, u32* secureArea)
|
||||
static void decryptSecureArea (u32 gameCode, u32* secureArea)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
init_keycode (gameCode, 2, 8);
|
||||
crypt_64bit_down (secureArea);
|
||||
|
||||
|
||||
init_keycode (gameCode, 3, 8);
|
||||
|
||||
|
||||
for (i = 0; i < 0x200; i+= 2) {
|
||||
crypt_64bit_down (secureArea + i);
|
||||
}
|
||||
@ -65,16 +59,16 @@ static struct {
|
||||
unsigned int mmm;
|
||||
unsigned int nnn;
|
||||
} key1data;
|
||||
|
||||
|
||||
|
||||
static void initKey1Encryption (u8* cmdData) {
|
||||
key1data.iii = getRandomNumber() & 0x00000fff;
|
||||
key1data.jjj = getRandomNumber() & 0x00000fff;
|
||||
key1data.iii = getRandomNumber() & 0x00000fff;
|
||||
key1data.jjj = getRandomNumber() & 0x00000fff;
|
||||
key1data.kkkkk = getRandomNumber() & 0x000fffff;
|
||||
key1data.llll = getRandomNumber() & 0x0000ffff;
|
||||
key1data.mmm = getRandomNumber() & 0x00000fff;
|
||||
key1data.nnn = getRandomNumber() & 0x00000fff;
|
||||
|
||||
key1data.mmm = getRandomNumber() & 0x00000fff;
|
||||
key1data.nnn = getRandomNumber() & 0x00000fff;
|
||||
|
||||
cmdData[7] = CARD_CMD_ACTIVATE_BF;
|
||||
cmdData[6] = (u8) (key1data.iii >> 4);
|
||||
cmdData[5] = (u8) ((key1data.iii << 4) | (key1data.jjj >> 8));
|
||||
@ -88,12 +82,12 @@ static void initKey1Encryption (u8* cmdData) {
|
||||
// Note: cmdData must be aligned on a word boundary
|
||||
static void createEncryptedCommand (u8 command, u8* cmdData, u32 block)
|
||||
{
|
||||
unsigned long iii, jjj;
|
||||
|
||||
unsigned long iii, jjj;
|
||||
|
||||
if (command != CARD_CMD_SECURE_READ) {
|
||||
block = key1data.llll;
|
||||
}
|
||||
|
||||
|
||||
if (command == CARD_CMD_ACTIVATE_SEC) {
|
||||
iii = key1data.mmm;
|
||||
jjj = key1data.nnn;
|
||||
@ -101,7 +95,7 @@ static void createEncryptedCommand (u8 command, u8* cmdData, u32 block)
|
||||
iii = key1data.iii;
|
||||
jjj = key1data.jjj;
|
||||
}
|
||||
|
||||
|
||||
cmdData[7] = (u8) (command | (block >> 12));
|
||||
cmdData[6] = (u8) (block >> 4);
|
||||
cmdData[5] = (u8) ((block << 4) | (iii >> 8));
|
||||
@ -121,18 +115,18 @@ static void cardDelay (u16 readTimeout) {
|
||||
so we have to wait until one before overflow.
|
||||
This also requires an extra 1 for the timer data.
|
||||
See GBATek for the normal formula used for card timeout.
|
||||
*/
|
||||
*/
|
||||
TIMER_DATA(0) = 0 - (((readTimeout & 0x3FFF) + 3));
|
||||
TIMER_CR(0) = TIMER_DIV_256 | TIMER_ENABLE;
|
||||
while (TIMER_DATA(0) != 0xFFFF);
|
||||
|
||||
|
||||
// Clear out the timer registers
|
||||
TIMER_CR(0) = 0;
|
||||
TIMER_DATA(0) = 0;
|
||||
}
|
||||
|
||||
|
||||
int cardInit (tNDSHeader* ndsHeader, u32* chipID)
|
||||
int cardInit (tNDSHeader* ndsHeader, u32* chipID)
|
||||
{
|
||||
u32 portFlagsKey1, portFlagsSecRead;
|
||||
bool normalChip; // As defined by GBAtek, normal chip secure area is accessed in blocks of 0x200, other chip in blocks of 0x1000
|
||||
@ -140,56 +134,56 @@ int cardInit (tNDSHeader* ndsHeader, u32* chipID)
|
||||
int secureBlockNumber;
|
||||
int i;
|
||||
u8 cmdData[8] __attribute__ ((aligned));
|
||||
GameCode* gameCode;
|
||||
|
||||
|
||||
// Dummy command sent after card reset
|
||||
cardParamCommand (CARD_CMD_DUMMY, 0,
|
||||
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
|
||||
cardParamCommand (CARD_CMD_DUMMY, 0,
|
||||
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
|
||||
NULL, 0);
|
||||
|
||||
// Read the header
|
||||
cardParamCommand (CARD_CMD_HEADER_READ, 0,
|
||||
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
|
||||
cardParamCommand (CARD_CMD_HEADER_READ, 0,
|
||||
CARD_ACTIVATE | CARD_nRESET | CARD_CLK_SLOW | CARD_BLK_SIZE(1) | CARD_DELAY1(0x1FFF) | CARD_DELAY2(0x3F),
|
||||
(uint32*)ndsHeader, sizeof(tNDSHeader));
|
||||
|
||||
|
||||
// Check header CRC
|
||||
if (ndsHeader->headerCRC16 != swiCRC16(0xFFFF, (void*)ndsHeader, 0x15E)) {
|
||||
if (ndsHeader->headerCRC16 != swiCRC16(0xFFFF, ndsHeader, 0x15E)) {
|
||||
return ERR_HEAD_CRC;
|
||||
}
|
||||
|
||||
|
||||
// Check logo CRC
|
||||
/*
|
||||
if (ndsHeader->logoCRC16 != 0xCF56) {
|
||||
return ERR_LOGO_CRC;
|
||||
}
|
||||
*/
|
||||
|
||||
// Initialise blowfish encryption for KEY1 commands and decrypting the secure area
|
||||
gameCode = (GameCode*)ndsHeader->gameCode;
|
||||
init_keycode (gameCode->key, 2, 8);
|
||||
|
||||
init_keycode (*((u32*)&ndsHeader->gameCode), 2, 8);
|
||||
|
||||
// Port 40001A4h setting for normal reads (command B7)
|
||||
portFlags = ndsHeader->cardControl13 & ~CARD_BLK_SIZE(7);
|
||||
portFlags = ndsHeader->cardControl13 & ~CARD_BLK_SIZE(7);
|
||||
// Port 40001A4h setting for KEY1 commands (usually 001808F8h)
|
||||
portFlagsKey1 = CARD_ACTIVATE | CARD_nRESET | (ndsHeader->cardControl13 & (CARD_WR|CARD_CLK_SLOW)) |
|
||||
((ndsHeader->cardControlBF & (CARD_CLK_SLOW|CARD_DELAY1(0x1FFF))) + ((ndsHeader->cardControlBF & CARD_DELAY2(0x3F)) >> 16));
|
||||
|
||||
// 1st Get ROM Chip ID
|
||||
cardParamCommand (CARD_CMD_HEADER_CHIPID, 0,
|
||||
(ndsHeader->cardControl13 & (CARD_WR|CARD_nRESET|CARD_CLK_SLOW)) | CARD_ACTIVATE | CARD_BLK_SIZE(7),
|
||||
chipID, sizeof(u32));
|
||||
((ndsHeader->cardControlBF & (CARD_CLK_SLOW|CARD_DELAY1(0x1FFF))) + ((ndsHeader->cardControlBF & CARD_DELAY2(0x3F)) >> 16));
|
||||
|
||||
// 1st Get ROM Chip ID
|
||||
cardParamCommand (CARD_CMD_HEADER_CHIPID, 0,
|
||||
(ndsHeader->cardControl13 & (CARD_WR|CARD_nRESET|CARD_CLK_SLOW)) | CARD_ACTIVATE | CARD_BLK_SIZE(7),
|
||||
chipID, sizeof(u32));
|
||||
|
||||
// Adjust card transfer method depending on the most significant bit of the chip ID
|
||||
normalChip = ((*chipID) & 0x80000000) != 0; // ROM chip ID MSB
|
||||
if (!normalChip) {
|
||||
portFlagsKey1 |= CARD_SEC_LARGE;
|
||||
}
|
||||
|
||||
|
||||
// 3Ciiijjj xkkkkkxx - Activate KEY1 Encryption Mode
|
||||
initKey1Encryption (cmdData);
|
||||
cardPolledTransfer((ndsHeader->cardControl13 & (CARD_WR|CARD_nRESET|CARD_CLK_SLOW)) | CARD_ACTIVATE, NULL, 0, cmdData);
|
||||
|
||||
|
||||
// 4llllmmm nnnkkkkk - Activate KEY2 Encryption Mode
|
||||
createEncryptedCommand (CARD_CMD_ACTIVATE_SEC, cmdData, 0);
|
||||
|
||||
|
||||
if (normalChip) {
|
||||
cardPolledTransfer(portFlagsKey1, NULL, 0, cmdData);
|
||||
cardDelay(ndsHeader->readTimeout);
|
||||
@ -197,7 +191,7 @@ int cardInit (tNDSHeader* ndsHeader, u32* chipID)
|
||||
} else {
|
||||
cardPolledTransfer(portFlagsKey1, NULL, 0, cmdData);
|
||||
}
|
||||
|
||||
|
||||
// Set the KEY2 encryption registers
|
||||
REG_ROMCTRL = 0;
|
||||
CARD_1B0 = cardSeedBytes[ndsHeader->deviceType & 0x07] | (key1data.nnn << 15) | (key1data.mmm << 27) | 0x6000;
|
||||
@ -205,13 +199,13 @@ int cardInit (tNDSHeader* ndsHeader, u32* chipID)
|
||||
CARD_1B8 = key1data.mmm >> 5;
|
||||
CARD_1BA = 0x5c;
|
||||
REG_ROMCTRL = CARD_nRESET | CARD_SEC_SEED | CARD_SEC_EN | CARD_SEC_DAT;
|
||||
|
||||
|
||||
// Update the DS card flags to suit KEY2 encryption
|
||||
portFlagsKey1 |= CARD_SEC_EN | CARD_SEC_DAT;
|
||||
|
||||
|
||||
// 1lllliii jjjkkkkk - 2nd Get ROM Chip ID / Get KEY2 Stream
|
||||
createEncryptedCommand (CARD_CMD_SECURE_CHIPID, cmdData, 0);
|
||||
|
||||
|
||||
if (normalChip) {
|
||||
cardPolledTransfer(portFlagsKey1, NULL, 0, cmdData);
|
||||
cardDelay(ndsHeader->readTimeout);
|
||||
@ -219,15 +213,15 @@ int cardInit (tNDSHeader* ndsHeader, u32* chipID)
|
||||
} else {
|
||||
cardPolledTransfer(portFlagsKey1 | CARD_BLK_SIZE(7), NULL, 0, cmdData);
|
||||
}
|
||||
|
||||
|
||||
// 2bbbbiii jjjkkkkk - Get Secure Area Block
|
||||
secureArea = secureAreaData;
|
||||
portFlagsSecRead = (ndsHeader->cardControlBF & (CARD_CLK_SLOW|CARD_DELAY1(0x1FFF)|CARD_DELAY2(0x3F)))
|
||||
| CARD_ACTIVATE | CARD_nRESET | CARD_SEC_EN | CARD_SEC_DAT;
|
||||
|
||||
|
||||
for (secureBlockNumber = 4; secureBlockNumber < 8; secureBlockNumber++) {
|
||||
createEncryptedCommand (CARD_CMD_SECURE_READ, cmdData, secureBlockNumber);
|
||||
|
||||
|
||||
if (normalChip) {
|
||||
cardPolledTransfer(portFlagsSecRead, NULL, 0, cmdData);
|
||||
cardDelay(ndsHeader->readTimeout);
|
||||
@ -243,17 +237,17 @@ int cardInit (tNDSHeader* ndsHeader, u32* chipID)
|
||||
|
||||
// Alllliii jjjkkkkk - Enter Main Data Mode
|
||||
createEncryptedCommand (CARD_CMD_DATA_MODE, cmdData, 0);
|
||||
|
||||
|
||||
if (normalChip) {
|
||||
cardPolledTransfer(portFlagsKey1, NULL, 0, cmdData);
|
||||
cardDelay(ndsHeader->readTimeout);
|
||||
cardPolledTransfer(portFlagsKey1, NULL, 0, cmdData);
|
||||
} else {
|
||||
} else {
|
||||
cardPolledTransfer(portFlagsKey1, NULL, 0, cmdData);
|
||||
}
|
||||
|
||||
|
||||
// Now deal with secure area decryption and verification
|
||||
decryptSecureArea (gameCode->key, secureAreaData);
|
||||
decryptSecureArea (*((u32*)&ndsHeader->gameCode), secureAreaData);
|
||||
|
||||
secureArea = secureAreaData;
|
||||
if (secureArea[0] == 0x72636e65 /*'encr'*/ && secureArea[1] == 0x6a624f79 /*'yObj'*/) {
|
||||
@ -265,33 +259,35 @@ int cardInit (tNDSHeader* ndsHeader, u32* chipID)
|
||||
for (i = 0; i < 0x200; i ++) {
|
||||
*secureArea++ = 0xe7ffdeff;
|
||||
}
|
||||
return normalChip ? ERR_SEC_NORM : ERR_SEC_OTHR;
|
||||
// Disabled error checks on secure area. This was able to boot a DS-Xtreme. May increase flashcart compatiblity drastically.
|
||||
// return normalChip ? ERR_SEC_NORM : ERR_SEC_OTHR;
|
||||
return normalChip ? ERR_NONE : ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
return ERR_NONE;
|
||||
}
|
||||
|
||||
void cardRead (u32 src, u32* dest, size_t size)
|
||||
|
||||
void cardRead (u32 src, u32* dest, size_t size)
|
||||
{
|
||||
size_t readSize;
|
||||
|
||||
if (src < CARD_SECURE_AREA_OFFSET) {
|
||||
|
||||
if (src < CARD_SECURE_AREA_OFFSET) {
|
||||
return;
|
||||
} else if (src < CARD_DATA_OFFSET) {
|
||||
// Read data from secure area
|
||||
readSize = src + size < CARD_DATA_OFFSET ? size : CARD_DATA_OFFSET - src;
|
||||
memcpy (dest, (u8*)secureAreaData + src - CARD_SECURE_AREA_OFFSET, readSize);
|
||||
src += readSize;
|
||||
src += readSize;
|
||||
dest += readSize/sizeof(*dest);
|
||||
size -= readSize;
|
||||
}
|
||||
|
||||
|
||||
while (size > 0) {
|
||||
readSize = size < CARD_DATA_BLOCK_SIZE ? size : CARD_DATA_BLOCK_SIZE;
|
||||
cardParamCommand (CARD_CMD_DATA_READ, src,
|
||||
cardParamCommand (CARD_CMD_DATA_READ, src,
|
||||
(portFlags &~CARD_BLK_SIZE(7)) | CARD_ACTIVATE | CARD_nRESET | CARD_BLK_SIZE(1),
|
||||
dest, readSize);
|
||||
src += readSize;
|
||||
src += readSize;
|
||||
dest += readSize/sizeof(*dest);
|
||||
size -= readSize;
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
|
||||
int cardInit (tNDSHeader* ndsHeader, u32* chipID);
|
||||
|
||||
void cardRead (u32 src, u32* dest, size_t size);
|
||||
void cardRead (u32 src, u32* dest, size_t size);
|
||||
|
||||
#endif // READ_CARD_H
|
||||
|
||||
|
0
LICENSE → License.txt
Executable file → Normal file
45
Makefile
@ -7,33 +7,41 @@ endif
|
||||
|
||||
include $(DEVKITARM)/ds_rules
|
||||
|
||||
export TARGET := NitroHax
|
||||
export TARGET := NTR_Launcher
|
||||
export TOPDIR := $(CURDIR)
|
||||
|
||||
export VERSION_MAJOR := 0
|
||||
export VERSION_MINOR := 93
|
||||
export VERSION_MAJOR := 1
|
||||
export VERSION_MINOR := 96
|
||||
export VERSTRING := $(VERSION_MAJOR).$(VERSION_MINOR)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# path to tools - this can be deleted if you set the path in windows
|
||||
#---------------------------------------------------------------------------------
|
||||
export PATH := $(DEVKITARM)/bin:$(PATH)
|
||||
|
||||
.PHONY: arm7/$(TARGET).elf arm9/$(TARGET).elf
|
||||
.PHONY: $(TARGET).arm7 $(TARGET).arm9
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# main targets
|
||||
#---------------------------------------------------------------------------------
|
||||
all: $(TARGET).nds
|
||||
|
||||
$(TARGET).nds : arm7/$(TARGET).elf arm9/$(TARGET).elf
|
||||
ndstool -c $(TARGET).nds -7 arm7/$(TARGET).elf -9 arm9/$(TARGET).elf \
|
||||
-b $(CURDIR)/icon.bmp "Nitro Hax;DS Game Cheat Tool;Created by Chishm"
|
||||
$(TARGET).nds : $(TARGET).arm7 $(TARGET).arm9
|
||||
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"
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Create boot loader and link raw binary into ARM9 ELF
|
||||
$(TARGET).arm7 : arm7/$(TARGET).elf
|
||||
$(TARGET).arm9 : arm9/$(TARGET).elf
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
BootLoader/load.bin : BootLoader/source/*
|
||||
$(MAKE) -C BootLoader
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
arm9/data/load.bin : BootLoader/load.bin
|
||||
mkdir -p $(@D)
|
||||
rm -Rf arm9/data
|
||||
mkdir arm9/data
|
||||
cp $< $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
@ -54,17 +62,25 @@ arm9/$(TARGET).elf : arm9/data/load.bin arm9/source/version.h
|
||||
$(MAKE) -C arm9
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
dist-bin : $(TARGET).nds README.md LICENSE
|
||||
zip -X -9 $(TARGET)_v$(VERSTRING).zip $^
|
||||
dist-bin : $(TARGET).txt $(TARGET).nds License.txt
|
||||
zip -X -9 $(TARGET)_v$(VERSTRING).zip $(TARGET).txt $(TARGET).nds License.txt
|
||||
|
||||
dist-src :
|
||||
tar --exclude=*~ -cvjf $(TARGET)_src_v$(VERSTRING).tar.bz2 \
|
||||
--transform 's,^,$(TARGET)/,' \
|
||||
Makefile icon.bmp LICENSE README.md \
|
||||
--transform 's,^,/'$(TARGET)'/,' \
|
||||
Makefile icon.bmp License.txt Launcher.txt \
|
||||
arm7/Makefile arm7/source \
|
||||
arm9/Makefile arm9/source arm9/graphics \
|
||||
arm9/Makefile arm9/source arm9/data arm9/graphics \
|
||||
BootLoader/Makefile BootLoader/load.ld BootLoader/source
|
||||
|
||||
dist-legal : BootLoader/load.bin
|
||||
tar --exclude=*~ --exclude=read_card.c -cvjf $(TARGET)_src_v$(VERSTRING).tar.bz2 \
|
||||
--transform 's,^,/'$(TARGET)'/,' \
|
||||
Makefile icon.bmp License.txt Launcher.txt \
|
||||
arm7/Makefile arm7/source \
|
||||
arm9/Makefile arm9/source arm9/data arm9/graphics \
|
||||
BootLoader/Makefile BootLoader/source BootLoader/load.bin
|
||||
|
||||
dist : dist-bin dist-src
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
@ -73,4 +89,5 @@ clean:
|
||||
$(MAKE) -C arm7 clean
|
||||
$(MAKE) -C BootLoader clean
|
||||
rm -f arm9/data/load.bin
|
||||
rm -f arm9/source/version.h
|
||||
rm -f $(TARGET).ds.gba $(TARGET).nds $(TARGET).arm7 $(TARGET).arm9
|
||||
|
1
NTR_Launcher.pnproj
Normal file
@ -0,0 +1 @@
|
||||
<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>
|
1
NTR_Launcher.pnps
Normal file
@ -0,0 +1 @@
|
||||
<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>
|
Before Width: | Height: | Size: 46 KiB |
3
PatchSRL.cmd
Normal file
@ -0,0 +1,3 @@
|
||||
@Echo off
|
||||
patch_ndsheader_dsiware.py NTR_Launcher.nds --mode dsi --maker 01 --code KKGP --title "TWL LAUNCHER" --out NTR_Launcher_Release.nds
|
||||
pause
|
136
README.md
@ -1,134 +1,8 @@
|
||||
Nitro Hax
|
||||
=========
|
||||
NTR Launcher (alternate build) - Apache Thunder - Original code from NitroHax but with cheat engine/menu stripped out.
|
||||
|
||||
By Chishm
|
||||
Launcher side of NitroHax without the cheat engine. Nothing much else to say about it. :P
|
||||
|
||||
Nitro Hax is a cheat tool for the Nintendo DS.
|
||||
It works with original games only.
|
||||
The source to "Launch DS Cart" on FileTrip was never released. I rebuilt it after ahezard ported NitroHax to latest devkitarm. This project is GNU licensed so that original DS Launcher on File Trip should have included source anyways.
|
||||
That has been corrected here. :D
|
||||
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
1. Patch NitroHax.nds with a DLDI file if you need to.
|
||||
2. Copy the NitroHax.nds file to your media device.
|
||||
3. Place an Action Replay XML file on your media device.
|
||||
4. Start NitroHax.nds from your media device
|
||||
1. One of the following will be loaded automatically if it is found (in order of preference):
|
||||
* "cheats.xml" in the current directory
|
||||
* "/NitroHax/cheats.xml"
|
||||
* "/data/NitroHax/cheats.xml"
|
||||
* "/cheats.xml"
|
||||
2. If no file is found, browse for and select a file to open.
|
||||
5. Remove your media device if you want to.
|
||||
6. Remove any card that is in Slot-1
|
||||
7. Insert the DS game into Slot-1
|
||||
8. Choose the cheats you want to enable.
|
||||
1. Some cheats are enabled by default and others may be always on. This is specified in the XML file.
|
||||
2. The keys are:
|
||||
* **A**: Open a folder or toggle a cheat enabled
|
||||
* **B**: Go up a folder or exit the cheat menu if at the top level
|
||||
* **X**: Enable all cheats in current folder
|
||||
* **Y**: Disable all cheats in current folder
|
||||
* **L**: Move up half a screen
|
||||
* **R**: Move down half a screen
|
||||
* **Up**: Move up one line
|
||||
* **Down**: Move down one line
|
||||
* **Start**: Start the game
|
||||
9. When you are done, exit the cheat menu.
|
||||
10. The game will then start with cheats running.
|
||||
|
||||
|
||||
Copyright
|
||||
=========
|
||||
|
||||
Copyright (C) 2008 Michael "Chishm" Chisholm
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
Acknowledgements
|
||||
================
|
||||
|
||||
Thanks to (in no particular order):
|
||||
* Pink-Lightning - Original skin (v0.5-0.82)
|
||||
* bLAStY - Memory dumps
|
||||
* cReDiAr - Last crucial step for running DS Cards
|
||||
* Parasyte - Tips for hooking the game automagically
|
||||
* kenobi - Action Replay code document
|
||||
* Darkain - Memory and cache clearing code
|
||||
* Martin Korth - GBAtek
|
||||
* Deathwind / WinterMute - File menu code (v0.2 - v0.4)
|
||||
* Everyone else who helped me along the way
|
||||
|
||||
Big thanks to Datel (CodeJunkies) for creating the original Action Replay and its cheats
|
||||
|
||||
|
||||
Custom Code Types
|
||||
=================
|
||||
|
||||
```
|
||||
CF000000 00000000 - End of code list
|
||||
CF000001 xxxxxxxx - Relocate cheat engine to xxxxxxxx
|
||||
CF000002 xxxxxxxx - Change hook address to xxxxxxxx
|
||||
|
||||
C100000x yyyyyyyy - Call function with arguments
|
||||
x - number of arguments (0 - 4)
|
||||
yyyyyyyy - Address of function
|
||||
The argument list follows this code. To call a function at 0x02049A48,
|
||||
with the arguments r0 = 0x00000010, r1 = 0x134CBA9C, r2 = 0x12345678,
|
||||
you would use:
|
||||
C1000003 02049A48
|
||||
00000010 134CBA9C
|
||||
12345678 00000000
|
||||
|
||||
C200000x yyyyyyyy - Run code from cheat list
|
||||
x - 0 = ARM mode, 1 = THUMB mode
|
||||
yyyyyyyy - length of function in bytes
|
||||
EG:
|
||||
C2000000 00000010
|
||||
AAAAAAAA BBBBBBBB
|
||||
CCCCCCCC E12FFF1E
|
||||
This will run the code AAAAAAAA BBBBBBBB CCCCCCCC in ARM mode.
|
||||
The E12FFF1E (bx lr) is needed at the end to return to the cheat engine.
|
||||
(These instructions are based on those written by kenobi.)
|
||||
|
||||
C4000000 xxxxxxxx - Safe data store (Based on Trainer Toolkit code)
|
||||
Sets the offset register to point to the first word of this code.
|
||||
Storing data at [offset+4] will save over the top of xxxxxxxx.
|
||||
|
||||
C5000000 xxxxyyyy - Counter (Based on Trainer Toolkit code)
|
||||
Each time the cheat engine is executed, the counter is incremented by 1.
|
||||
If (counter & yyyy) == xxxx then execution status is set to true.
|
||||
Else it is set to false.
|
||||
|
||||
C6000000 xxxxxxxx - Store offset (Based on Trainer Toolkit code)
|
||||
Stores the offset register to [xxxxxxxx].
|
||||
|
||||
D400000x yyyyyyyy - Dx Data operation
|
||||
Performs the operation Data = Data ? yyyyyyyy where ? is determined by x as follows:
|
||||
0 - add
|
||||
1 - or
|
||||
2 - and
|
||||
3 - xor
|
||||
4 - logical shift left
|
||||
5 - logical shift right
|
||||
6 - rotate right
|
||||
7 - arithmetic shift right
|
||||
8 - multiply
|
||||
|
||||
If type codes
|
||||
Adds offset to the address if the lowest bit of the address is set.
|
||||
Sets the address equal to offset if the original address is 0x00000000.
|
||||
```
|
||||
Credits go to Chism for NitroHax which this source is based from.
|
@ -27,7 +27,6 @@ ARCH := -mthumb-interwork
|
||||
CFLAGS := -g -Wall -O2\
|
||||
-mcpu=arm7tdmi -mtune=arm7tdmi -fomit-frame-pointer\
|
||||
-ffast-math \
|
||||
-Wall -Wextra -Werror \
|
||||
$(ARCH)
|
||||
|
||||
CFLAGS += $(INCLUDE) -DARM7
|
||||
@ -35,9 +34,9 @@ CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -fno-rtti
|
||||
|
||||
|
||||
ASFLAGS := -g $(ARCH)
|
||||
LDFLAGS = -specs=ds_arm7.specs -g $(ARCH) -Wl,-Map,$(notdir $*).map
|
||||
LDFLAGS = -specs=../ds_arm7_ram.specs -g $(ARCH) -Wl,-Map,$(notdir $*).map
|
||||
|
||||
LIBS := -lnds7
|
||||
LIBS := -lmm7 -lnds7
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
@ -53,7 +52,8 @@ LIBDIRS := $(LIBNDS)
|
||||
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
export ARM7ELF := $(CURDIR)/$(TARGET).elf
|
||||
export ARM7BIN := $(TOPDIR)/$(TARGET).arm7
|
||||
export ARM7ELF := $(CURDIR)/$(TARGET).arm7.elf
|
||||
export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||
|
||||
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir))
|
||||
@ -107,6 +107,11 @@ DEPENDS := $(OFILES:.o=.d)
|
||||
#---------------------------------------------------------------------------------
|
||||
# main targets
|
||||
#---------------------------------------------------------------------------------
|
||||
$(ARM7BIN) : $(ARM7ELF)
|
||||
@$(OBJCOPY) -O binary $< $@
|
||||
@echo built ... $(notdir $@)
|
||||
|
||||
|
||||
$(ARM7ELF) : $(OFILES)
|
||||
@echo linking $(notdir $@)
|
||||
@$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@
|
||||
|
176
arm7/ds_arm7_ram.ld
Normal file
@ -0,0 +1,176 @@
|
||||
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 . */
|
||||
}
|
8
arm7/ds_arm7_ram.specs
Normal file
@ -0,0 +1,8 @@
|
||||
%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
|
||||
|
61
arm7/source/bios.s
Normal file
@ -0,0 +1,61 @@
|
||||
#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
|
44
arm7/source/launch_engine_arm7.c
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
NitroHax -- Cheat tool for the Nintendo DS
|
||||
Copyright (C) 2008 Michael "Chishm" Chisholm
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <nds.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 runLaunchEngineCheck (void)
|
||||
{
|
||||
|
||||
if(*((vu32*)0x027FFE24) == (u32)0x027FFE04)
|
||||
{
|
||||
if(fifoCheckValue32(FIFO_USER_04)) {
|
||||
if(fifoCheckValue32(FIFO_USER_05)) { REG_SCFG_CLK = 0x0181; } else { REG_SCFG_CLK = 0x0180; }
|
||||
}
|
||||
if(fifoCheckValue32(FIFO_USER_06)) { /*Do Nothing*/ } else { REG_SCFG_ROM = 0x703; }
|
||||
if(fifoCheckValue32(FIFO_USER_05)) { REG_SCFG_EXT = 0x93A50000; } else { REG_SCFG_EXT = 0x12A00000; }
|
||||
|
||||
irqDisable (IRQ_ALL);
|
||||
*((vu32*)0x027FFE34) = (u32)0x06000000;
|
||||
|
||||
swiSoftReset();
|
||||
}
|
||||
}
|
||||
|
11
arm7/source/cheat_engine_arm7.h → arm7/source/launch_engine_arm7.h
Executable file → Normal file
@ -16,20 +16,19 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CHEAT_ENGINE_ARM7_H
|
||||
#define CHEAT_ENGINE_ARM7_H
|
||||
#ifndef LAUNCH_ENGINE_ARM7_H
|
||||
#define LAUNCH_ENGINE_ARM7_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
void runCheatEngineCheck (void);
|
||||
|
||||
void runLaunchEngineCheck (void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // CHEAT_ENGINE_ARM7_H
|
||||
#endif // LAUNCH_ENGINE_ARM7_H
|
||||
|
@ -20,8 +20,15 @@
|
||||
#include <nds/arm7/input.h>
|
||||
#include <nds/system.h>
|
||||
|
||||
#include "cheat_engine_arm7.h"
|
||||
#include <maxmod7.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() {
|
||||
inputGetAndSend();
|
||||
@ -30,10 +37,41 @@ void VcountHandler() {
|
||||
void VblankHandler(void) {
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
int main(void) {
|
||||
//---------------------------------------------------------------------------------
|
||||
void PowerOnSlot() {
|
||||
// Power On Slot
|
||||
while(REG_SCFG_MC&0x0C != 0x0C); // wait until state<>3
|
||||
if(REG_SCFG_MC&0x0C != 0x00) return; // exit if state<>0
|
||||
|
||||
REG_SCFG_MC = 0x04; // wait 1ms, then set state=1
|
||||
while(REG_SCFG_MC&0x0C != 0x04);
|
||||
|
||||
REG_SCFG_MC = 0x08; // wait 10ms, then set state=2
|
||||
while(REG_SCFG_MC&0x0C != 0x08);
|
||||
|
||||
REG_ROMCTRL = 0x20000000; // wait 27ms, then set ROMCTRL=20000000h
|
||||
|
||||
while(REG_ROMCTRL&0x8000000 != 0x8000000);
|
||||
|
||||
}
|
||||
|
||||
void PowerOffSlot() {
|
||||
while(REG_SCFG_MC&0x0C != 0x0C); // wait until state<>3
|
||||
if(REG_SCFG_MC&0x0C != 0x08) return 1; // exit if state<>2
|
||||
|
||||
REG_SCFG_MC = 0x0C; // set state=3
|
||||
while(REG_SCFG_MC&0x0C != 0x00); // wait until state=0
|
||||
}
|
||||
|
||||
void TWL_ResetSlot1() {
|
||||
PowerOffSlot();
|
||||
for (int i = 0; i < 30; i++) { swiWaitForVBlank(); }
|
||||
PowerOnSlot();
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
|
||||
REG_SCFG_CLK = 0x0187;
|
||||
|
||||
irqInit();
|
||||
fifoInit();
|
||||
|
||||
@ -42,21 +80,30 @@ int main(void) {
|
||||
|
||||
// Start the RTC tracking IRQ
|
||||
initClockIRQ();
|
||||
|
||||
mmInstall(FIFO_MAXMOD);
|
||||
|
||||
SetYtrigger(80);
|
||||
|
||||
installSoundFIFO();
|
||||
installSystemFIFO();
|
||||
|
||||
|
||||
irqSet(IRQ_VCOUNT, VcountHandler);
|
||||
irqSet(IRQ_VBLANK, VblankHandler);
|
||||
|
||||
irqEnable( IRQ_VBLANK | IRQ_VCOUNT);
|
||||
|
||||
// Keep the ARM7 mostly idle
|
||||
|
||||
// Make sure Arm9 had a chance to check slot status
|
||||
fifoWaitValue32(FIFO_USER_01);
|
||||
// If Arm9 reported slot is powered off, have Arm7 wait for Arm9 to be ready before card reset. This makes sure arm7 doesn't try card reset too early.
|
||||
if(fifoCheckValue32(FIFO_USER_02)) {
|
||||
if(fifoCheckValue32(FIFO_USER_07)) { TWL_ResetSlot1(); } else { PowerOnSlot(); }
|
||||
}
|
||||
fifoSendValue32(FIFO_USER_03, 1);
|
||||
|
||||
while (1) {
|
||||
runCheatEngineCheck();
|
||||
runLaunchEngineCheck();
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
414
arm9/Makefile
@ -19,6 +19,7 @@ IMAGES := graphics
|
||||
SOURCES := source $(IMG_DATA)
|
||||
INCLUDES := include
|
||||
DATA := data
|
||||
MUSIC := music
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# options for code generation
|
||||
@ -28,10 +29,9 @@ ARCH := -mthumb -mthumb-interwork
|
||||
CFLAGS := -g -Wall -O2\
|
||||
-march=armv5te -mtune=arm946e-s -fomit-frame-pointer\
|
||||
-ffast-math \
|
||||
-Wall -Wextra -Werror \
|
||||
$(ARCH)
|
||||
|
||||
CFLAGS += $(INCLUDE) -DARM9
|
||||
CFLAGS += $(INCLUDE) -DARM9 -fno-strict-aliasing
|
||||
CXXFLAGS := $(CFLAGS)
|
||||
|
||||
ASFLAGS := -g $(ARCH) -march=armv5te -mtune=arm946e-s
|
||||
@ -41,7 +41,7 @@ LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||
#---------------------------------------------------------------------------------
|
||||
# any extra libraries we wish to link with the project
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBS := -lfat -lnds9
|
||||
LIBS := -lfat -lmm9 -lnds9
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
@ -56,16 +56,19 @@ LIBDIRS := $(LIBNDS)
|
||||
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
export ARM9ELF := $(CURDIR)/$(TARGET).elf
|
||||
export ARM9BIN := $(TOPDIR)/$(TARGET).arm9
|
||||
export ARM9ELF := $(CURDIR)/$(TARGET).arm9.elf
|
||||
export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||
|
||||
export AUDIOFILES := $(foreach dir,$(notdir $(wildcard $(MUSIC)/*.*)),$(CURDIR)/$(MUSIC)/$(dir))
|
||||
|
||||
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
|
||||
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
|
||||
|
||||
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
|
||||
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
|
||||
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
|
||||
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) soundbank.bin
|
||||
|
||||
BMPFILES := $(foreach dir,$(IMAGES),$(notdir $(wildcard $(dir)/*.bmp)))
|
||||
|
||||
@ -106,7 +109,9 @@ clean:
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
else
|
||||
|
||||
|
||||
DEPENDS := $(OFILES:.o=.d)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# main targets
|
||||
#---------------------------------------------------------------------------------
|
||||
@ -122,39 +127,390 @@ $(ARM9ELF) : $(OFILES)
|
||||
#---------------------------------------------------------------------------------
|
||||
# graphics
|
||||
#---------------------------------------------------------------------------------
|
||||
bgtop.s : ../$(IMAGES)/bgtop.bmp
|
||||
grit $< -gB4 -gzl -fts -o $@ -q
|
||||
#Cartridge Wait Prompt (bottom screen)
|
||||
CartPrompt01.s : ../$(IMAGES)/CartPrompt01.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
CartPrompt02.s : ../$(IMAGES)/CartPrompt02.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
CartPrompt03.s : ../$(IMAGES)/CartPrompt03.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
CartPrompt04.s : ../$(IMAGES)/CartPrompt04.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
#DSi Cartridge Wait Prompt (bottom screen)
|
||||
DSiCartPrompt01.s : ../$(IMAGES)/DSiCartPrompt01.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSiCartPrompt02.s : ../$(IMAGES)/DSiCartPrompt02.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSiCartPrompt03.s : ../$(IMAGES)/DSiCartPrompt03.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSiCartPrompt04.s : ../$(IMAGES)/DSiCartPrompt04.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
# generic fade from white to black
|
||||
|
||||
fade00.s : ../$(IMAGES)/fade00.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
fade01.s : ../$(IMAGES)/fade01.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
fade02.s : ../$(IMAGES)/fade02.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
fade03.s : ../$(IMAGES)/fade03.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
fade04.s : ../$(IMAGES)/fade04.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
# generic bottom screen error message
|
||||
suberror00.s : ../$(IMAGES)/suberror00.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
bgsub.s : ../$(IMAGES)/bgsub.bmp
|
||||
grit $< -gB4 -gzl -fts -o $@ -q
|
||||
suberror01.s : ../$(IMAGES)/suberror01.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
cursor.s : ../$(IMAGES)/cursor.bmp
|
||||
grit $< -gB4 -fts -Mw8 -Mh4 -o $@ -q
|
||||
suberror02.s : ../$(IMAGES)/suberror02.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
font.s : ../$(IMAGES)/font.bmp
|
||||
grit $< -gB4 -gzl -fts -o font.s -q
|
||||
suberror03.s : ../$(IMAGES)/suberror03.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
button_go.s : ../$(IMAGES)/button_go.bmp
|
||||
grit $< -gB4 -fts -Mw16 -Mh4 -o $@ -q
|
||||
suberror04.s : ../$(IMAGES)/suberror04.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
button_on.s : ../$(IMAGES)/button_on.bmp
|
||||
grit $< -gB4 -fts -Mw30 -Mh2 -o $@ -q
|
||||
suberror05.s : ../$(IMAGES)/suberror05.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
button_off.s : ../$(IMAGES)/button_off.bmp
|
||||
grit $< -gB4 -fts -Mw30 -Mh2 -o $@ -q
|
||||
suberror06.s : ../$(IMAGES)/suberror06.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
button_folder.s : ../$(IMAGES)/button_folder.bmp
|
||||
grit $< -gB4 -fts -Mw30 -Mh2 -o $@ -q
|
||||
# No Cartridge Error
|
||||
toperror2_00.s : ../$(IMAGES)/toperror2_00.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
button_file.s : ../$(IMAGES)/button_file.bmp
|
||||
grit $< -gB4 -fts -Mw30 -Mh2 -o $@ -q
|
||||
toperror2_01.s : ../$(IMAGES)/toperror2_01.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
scrollbar.s : ../$(IMAGES)/scrollbar.bmp
|
||||
grit $< -gB4 -Mw2 -Mh2 -fts -o scrollbar.s -q
|
||||
toperror2_02.s : ../$(IMAGES)/toperror2_02.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
textbox.s : ../$(IMAGES)/textbox.bmp
|
||||
grit $< -gB4 -fts -o textbox.s -q
|
||||
toperror2_03.s : ../$(IMAGES)/toperror2_03.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
toperror2_04.s : ../$(IMAGES)/toperror2_04.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
toperror2_05.s : ../$(IMAGES)/toperror2_05.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
toperror2_06.s : ../$(IMAGES)/toperror2_06.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
# Main Boot Splash sequence
|
||||
Bot00.s : ../$(IMAGES)/Bot00.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot01.s : ../$(IMAGES)/Bot01.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot02.s : ../$(IMAGES)/Bot02.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot03.s : ../$(IMAGES)/Bot03.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot04.s : ../$(IMAGES)/Bot04.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot05.s : ../$(IMAGES)/Bot05.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot06.s : ../$(IMAGES)/Bot06.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot07.s : ../$(IMAGES)/Bot07.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot08.s : ../$(IMAGES)/Bot08.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot09.s : ../$(IMAGES)/Bot09.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Bot10.s : ../$(IMAGES)/Bot10.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top00.s : ../$(IMAGES)/Top00.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top01.s : ../$(IMAGES)/Top01.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top02.s : ../$(IMAGES)/Top02.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top03.s : ../$(IMAGES)/Top03.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top04.s : ../$(IMAGES)/Top04.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top05.s : ../$(IMAGES)/Top05.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top06.s : ../$(IMAGES)/Top06.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top07.s : ../$(IMAGES)/Top07.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top08.s : ../$(IMAGES)/Top08.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top09.s : ../$(IMAGES)/Top09.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top10.s : ../$(IMAGES)/Top10.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top11.s : ../$(IMAGES)/Top11.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top12.s : ../$(IMAGES)/Top12.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top13.s : ../$(IMAGES)/Top13.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top14.s : ../$(IMAGES)/Top14.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top15.s : ../$(IMAGES)/Top15.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top16.s : ../$(IMAGES)/Top16.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top17.s : ../$(IMAGES)/Top17.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top18.s : ../$(IMAGES)/Top18.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top19.s : ../$(IMAGES)/Top19.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top20.s : ../$(IMAGES)/Top20.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top21.s : ../$(IMAGES)/Top21.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top22.s : ../$(IMAGES)/Top22.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top23.s : ../$(IMAGES)/Top23.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top24.s : ../$(IMAGES)/Top24.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top25.s : ../$(IMAGES)/Top25.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top26.s : ../$(IMAGES)/Top26.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top27.s : ../$(IMAGES)/Top27.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top28.s : ../$(IMAGES)/Top28.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top29.s : ../$(IMAGES)/Top29.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top30.s : ../$(IMAGES)/Top30.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top31.s : ../$(IMAGES)/Top31.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top32.s : ../$(IMAGES)/Top32.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top33.s : ../$(IMAGES)/Top33.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top34.s : ../$(IMAGES)/Top34.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top35.s : ../$(IMAGES)/Top35.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top36.s : ../$(IMAGES)/Top36.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
Top37.s : ../$(IMAGES)/Top37.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
# DSi BootSplash. Used if TWL mode detected
|
||||
DSi01.s : ../$(IMAGES)/DSi01.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi02.s : ../$(IMAGES)/DSi02.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi03.s : ../$(IMAGES)/DSi03.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi04.s : ../$(IMAGES)/DSi04.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi05.s : ../$(IMAGES)/DSi05.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi06.s : ../$(IMAGES)/DSi06.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi07.s : ../$(IMAGES)/DSi07.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi08.s : ../$(IMAGES)/DSi08.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi09.s : ../$(IMAGES)/DSi09.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi10.s : ../$(IMAGES)/DSi10.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi11.s : ../$(IMAGES)/DSi11.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi12.s : ../$(IMAGES)/DSi12.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi13.s : ../$(IMAGES)/DSi13.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi14.s : ../$(IMAGES)/DSi14.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi15.s : ../$(IMAGES)/DSi15.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi16.s : ../$(IMAGES)/DSi16.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi17.s : ../$(IMAGES)/DSi17.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi18.s : ../$(IMAGES)/DSi18.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi19.s : ../$(IMAGES)/DSi19.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi20.s : ../$(IMAGES)/DSi20.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi21.s : ../$(IMAGES)/DSi21.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi22.s : ../$(IMAGES)/DSi22.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi23.s : ../$(IMAGES)/DSi23.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi24.s : ../$(IMAGES)/DSi24.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi25.s : ../$(IMAGES)/DSi25.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi26.s : ../$(IMAGES)/DSi26.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi27.s : ../$(IMAGES)/DSi27.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi28.s : ../$(IMAGES)/DSi28.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi29.s : ../$(IMAGES)/DSi29.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi30.s : ../$(IMAGES)/DSi30.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi31.s : ../$(IMAGES)/DSi31.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi32.s : ../$(IMAGES)/DSi32.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi33.s : ../$(IMAGES)/DSi33.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi34.s : ../$(IMAGES)/DSi34.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
DSi35.s : ../$(IMAGES)/DSi35.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
#DSi version of bottom screen
|
||||
BotDSi00.s : ../$(IMAGES)/BotDSi00.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi01.s : ../$(IMAGES)/BotDSi01.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi02.s : ../$(IMAGES)/BotDSi02.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi03.s : ../$(IMAGES)/BotDSi03.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi04.s : ../$(IMAGES)/BotDSi04.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi05.s : ../$(IMAGES)/BotDSi05.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi06.s : ../$(IMAGES)/BotDSi06.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi07.s : ../$(IMAGES)/BotDSi07.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi08.s : ../$(IMAGES)/BotDSi08.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi09.s : ../$(IMAGES)/BotDSi09.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi10.s : ../$(IMAGES)/BotDSi10.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
BotDSi11.s : ../$(IMAGES)/BotDSi11.bmp
|
||||
grit $< -gB8 -gzl -fts -gTff00ff -o $@ -q
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# rule to build soundbank from music files
|
||||
#---------------------------------------------------------------------------------
|
||||
soundbank.bin : $(AUDIOFILES)
|
||||
#---------------------------------------------------------------------------------
|
||||
@mmutil $^ -d -osoundbank.bin -hsoundbank.h
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# you need a rule like this for each extension you use as binary data
|
||||
@ -164,7 +520,7 @@ textbox.s : ../$(IMAGES)/textbox.bmp
|
||||
@echo $(notdir $<)
|
||||
@$(bin2o)
|
||||
|
||||
-include $(DEPSDIR)/*.d
|
||||
-include $(DEPENDS)
|
||||
|
||||
#---------------------------------------------------------------------------------------
|
||||
endif
|
||||
|
BIN
arm9/graphics/Bot00.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot01.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot02.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot03.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot04.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot05.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot06.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot07.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot08.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot09.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Bot10.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi00.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi01.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi02.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi03.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi04.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi05.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi06.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi07.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi08.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi09.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi10.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/BotDSi11.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/CartPrompt01.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/CartPrompt02.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/CartPrompt03.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/CartPrompt04.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi01.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi02.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi03.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi04.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi05.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi06.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi07.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi08.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi09.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi10.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi11.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi12.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi13.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi14.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi15.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi16.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi17.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi18.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi19.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi20.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi21.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi22.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi23.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi24.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi25.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi26.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi27.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi28.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi29.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi30.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi31.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi32.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi33.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi34.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSi35.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSiCartPrompt01.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSiCartPrompt02.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSiCartPrompt03.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/DSiCartPrompt04.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Top00.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Top01.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Top02.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Top03.bmp
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
arm9/graphics/Top04.bmp
Normal file
After Width: | Height: | Size: 49 KiB |