Skip to content

Commit

Permalink
Implement card pullout handler patching + arenalo signature
Browse files Browse the repository at this point in the history
  • Loading branch information
ahezard committed Dec 22, 2016
1 parent 799f82a commit 6dfa5ee
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 20 deletions.
47 changes: 33 additions & 14 deletions bootloader/source/card_patcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ u32 cacheMagStartSignature2[4] = {0xE0811000,0xE3C0001F,0xEE070F36,0xE2800020};
// cache management sdk > 4 version
u32 cacheMagStartSignature4[4] = {0xE3A0C000,0xE0811000,0xE3C0001F,0xEE07CF9A};

u32 arenaLowSignature[4] = {0xE1A00100,0xE2800627,0xE2800AFF,0xE5900DA0};

//
// Look in @data for @find and return the position of it.
//
Expand Down Expand Up @@ -166,7 +168,7 @@ u32 patchCardNds (const tNDSHeader* ndsHeader, u32* cardEngineLocation, module_p

// Find the card read
u32 cardReadEndOffset =
getOffsetA9((u32*)ndsHeader->arm9destination, 0x00400000,//ndsHeader->arm9binarySize,
getOffsetA9((u32*)ndsHeader->arm9destination, 0x00300000,//ndsHeader->arm9binarySize,
(u32*)a9cardReadSignature, 2, 1);
if (!cardReadEndOffset) {
nocashMessage("Card read end not found\n");
Expand All @@ -183,24 +185,24 @@ u32 patchCardNds (const tNDSHeader* ndsHeader, u32* cardEngineLocation, module_p
debug[0] = cardReadStartOffset;
nocashMessage("Card read found\n");

u32 cardPullOutOffset =
getOffsetA9((u32*)ndsHeader->arm9destination, 0x00400000,//, ndsHeader->arm9binarySize,
u32 cardCheckPullOutOffset =
getOffsetA9((u32*)ndsHeader->arm9destination, 0x00300000,//, ndsHeader->arm9binarySize,
(u32*)cardCheckPullOutSignature, 4, 1);
if (!cardPullOutOffset) {
nocashMessage("Card pull out not found\n");
if (!cardCheckPullOutOffset) {
nocashMessage("Card check pull out not found\n");
//return 0;
}
debug[0] = cardPullOutOffset;
nocashMessage("Card pull out found\n");
debug[0] = cardCheckPullOutOffset;
nocashMessage("Card check pull out found\n");

u32 cardInitPullOutOffset =
u32 cardIrqEnableOffset =
getOffsetA9((u32*)ndsHeader->arm7destination, 0x00400000,//, ndsHeader->arm9binarySize,
(u32*)irqEnableStartSignature, 4, 1);
if (!cardInitPullOutOffset) {
if (!cardIrqEnableOffset) {
nocashMessage("irq enable not found\n");
return 0;
}
debug[0] = cardInitPullOutOffset;
debug[0] = cardIrqEnableOffset;
nocashMessage("irq enable found\n");

u32 cacheMagOffset =
Expand All @@ -212,6 +214,16 @@ u32 patchCardNds (const tNDSHeader* ndsHeader, u32* cardEngineLocation, module_p
debug[0] = cacheMagOffset;
nocashMessage("cache management found\n");
}

u32 cardPullOutOffset =
getOffsetA9((u32*)ndsHeader->arm9destination, 0x00300000,//, ndsHeader->arm9binarySize,
(u32*)cardPullOutSignature, 4, 1);
if (!cardPullOutOffset) {
nocashMessage("Card pull out handler not found\n");
return 0;
}
debug[0] = cardPullOutOffset;
nocashMessage("Card pull out handler found\n");



Expand Down Expand Up @@ -255,9 +267,11 @@ u32 patchCardNds (const tNDSHeader* ndsHeader, u32* cardEngineLocation, module_p

u32* cardReadPatch = (u32*) patches[0];

u32* cardPullOutPatch = (u32*) patches[1];
u32* cardCheckPullOutPatch = (u32*) patches[1];

u32* cardInitPullOutPatch = (u32*) patches[2];
u32* cardIrqEnablePatch = (u32*) patches[2];

u32* cardPullOutPatch = patches[10];

debug[5] = patches;

Expand Down Expand Up @@ -289,16 +303,21 @@ u32 patchCardNds (const tNDSHeader* ndsHeader, u32* cardEngineLocation, module_p

*((u32*)patches[6]) = cacheMagOffset;

*((u32*)patches[11]) = cardPullOutOffset+1;

if(moduleParams->sdk_version > 0x4000000) {
copyLoop ((u32*)patches[7], (u32*)patches[9], 16);
}

copyLoop ((u32*)cardReadStartOffset, cardReadPatch, 0xF0);

if(cardPullOutOffset>0)
copyLoop ((u32*)cardPullOutOffset, cardPullOutPatch, 0x4);
copyLoop ((u32*)cardCheckPullOutOffset, cardCheckPullOutPatch, 0x4);

if(cardPullOutOffset>0)
copyLoop ((u32*)cardPullOutOffset, cardPullOutPatch, 0xA0);

copyLoop ((u32*)cardInitPullOutOffset, cardInitPullOutPatch, 0x30);
copyLoop ((u32*)cardIrqEnableOffset, cardIrqEnablePatch, 0x30);

nocashMessage("ERR_NONE");
return 0;
Expand Down
13 changes: 7 additions & 6 deletions cardengine/source/card_engine_header.s
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ card_engine_end:
patches:
.word card_read_arm9
.word card_pull_out_arm9
.word card_init_pull_arm7
.word card_irq_enable_arm7
.word vblankHandler
.word fifoHandler
.word cardStructArm9
Expand All @@ -95,6 +95,7 @@ patches:
.word card_read_arm9_cmd2_v2alt
.word card_read_arm9_cmd2_v4
.word card_pull
.word cacheFlushRef

@---------------------------------------------------------------------------------
card_read_arm9:
Expand All @@ -116,8 +117,8 @@ card_read_arm9:
cmd2:
sub r7, r8, #(0x027FFB08 - 0x025FFB08) @cmd2 marker
@r0 dst, r1 len
@ldr r9, cacheManagRef
@blx r9 @ dc flush range
ldr r9, cacheFlushRef
blx r9 @ cache flush code
b partial_cmd2

check_partial:
Expand Down Expand Up @@ -179,7 +180,7 @@ exitfunc:

cardStructArm9:
.word 0x00000000
cacheManagRef:
cacheFlushRef:
.word 0x00000000
.pool
@---------------------------------------------------------------------------------
Expand Down Expand Up @@ -211,7 +212,7 @@ card_pull_out_arm9:
@---------------------------------------------------------------------------------

@---------------------------------------------------------------------------------
card_init_pull_arm7:
card_irq_enable_arm7:
@---------------------------------------------------------------------------------
push {lr}
push {r1-r12}
Expand All @@ -229,7 +230,7 @@ _blx_r3_stub2:
card_pull:
@---------------------------------------------------------------------------------
bx lr
cacheManag:
cacheFlush:
stmfd sp!, {r0-r11,lr}
ldr r9, cachemag
blx r9 @ dc flush range
Expand Down

0 comments on commit 6dfa5ee

Please sign in to comment.