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.
This commit is contained in:
ApacheThunder 2017-02-12 14:57:36 -06:00
parent 5aeb65240c
commit 1e2dfed554
192 changed files with 3914 additions and 3215 deletions

11
.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
*.cia
*.nds
*.o
*.arm7
Thumbs.db
*.arm9
*.elf
*.d
*.map
arm9/data/load.bin
BootLoader/load.bin

View File

@ -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
View 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
View 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

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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
View 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,
};

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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
View File

View File

@ -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
View 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
View 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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

3
PatchSRL.cmd Normal file
View 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
View File

@ -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.

View File

@ -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
View 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
View 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
View 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

View 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();
}
}

View 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

View File

@ -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();
}
}

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot01.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot02.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot03.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot04.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot05.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot06.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot07.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot08.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot09.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Bot10.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi00.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi01.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi02.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi03.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi04.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi05.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi06.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi07.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi08.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi09.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi10.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/BotDSi11.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi01.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi02.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi03.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi04.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi05.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi06.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi07.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi08.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi09.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi10.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi11.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi12.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi13.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi14.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi15.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi16.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi17.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi18.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi19.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi20.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi21.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi22.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi23.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi24.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi25.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi26.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi27.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi28.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi29.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi30.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi31.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi32.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi33.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi34.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/DSi35.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Top00.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Top01.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Top02.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Top03.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
arm9/graphics/Top04.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Some files were not shown because too many files have changed in this diff Show More