diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pokemon.c | 387 |
1 files changed, 387 insertions, 0 deletions
diff --git a/src/pokemon.c b/src/pokemon.c index 39ccbc2d3..9b8df60a6 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5848,6 +5848,7 @@ void OakSpeechNidoranFSetupTemplateDummy(struct OakSpeechNidoranFStruct *structP } } +#ifdef NONMATCHING struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable) { s32 size; @@ -5952,3 +5953,389 @@ struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 } return sOakSpeechNidoranResources; } +#else +NAKED +struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + movs r0, 0\n\ + mov r8, r0\n\ + ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\ + ldr r1, [r4]\n\ + cmp r1, 0\n\ + beq _08044B1E\n\ + ldrb r0, [r1, 0x2]\n\ + cmp r0, 0xA3\n\ + beq _08044B2E\n\ + adds r0, r1, 0\n\ + movs r1, 0\n\ + movs r2, 0x18\n\ + bl memset\n\ + mov r1, r8\n\ + str r1, [r4]\n\ + _08044B1E:\n\ + ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\ + movs r0, 0x18\n\ + bl AllocZeroed\n\ + adds r2, r0, 0\n\ + str r2, [r4]\n\ + cmp r2, 0\n\ + bne _08044B38\n\ + _08044B2E:\n\ + movs r0, 0\n\ + b _08044D70\n\ + .align 2, 0\n\ + _08044B34: .4byte sOakSpeechNidoranResources\n\ + _08044B38:\n\ + cmp r5, 0\n\ + beq _08044B94\n\ + cmp r5, 0x1\n\ + bne _08044B94\n\ + cmp r6, 0x4\n\ + bne _08044B5E\n\ + ldrb r1, [r2]\n\ + movs r0, 0x10\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, [r4]\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + movs r1, 0x40\n\ + b _08044B7C\n\ + _08044B5E:\n\ + cmp r6, 0x4\n\ + bls _08044B64\n\ + movs r6, 0\n\ + _08044B64:\n\ + ldrb r1, [r2]\n\ + movs r0, 0x10\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, [r4]\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + movs r1, 0x10\n\ + _08044B7C:\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + ldr r2, _08044B90 @ =sOakSpeechNidoranResources\n\ + ldr r1, [r2]\n\ + movs r0, 0x4\n\ + strb r0, [r1, 0x1]\n\ + ldr r1, [r2]\n\ + movs r0, 0x1\n\ + strb r0, [r1, 0x3]\n\ + b _08044BD0\n\ + .align 2, 0\n\ + _08044B90: .4byte sOakSpeechNidoranResources\n\ + _08044B94:\n\ + cmp r6, 0\n\ + bne _08044B9A\n\ + movs r6, 0x1\n\ + _08044B9A:\n\ + cmp r6, 0x8\n\ + bls _08044BA0\n\ + movs r6, 0x8\n\ + _08044BA0:\n\ + ldr r4, _08044C10 @ =sOakSpeechNidoranResources\n\ + ldr r3, [r4]\n\ + movs r0, 0xF\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + ldrb r2, [r3]\n\ + movs r0, 0x10\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r3]\n\ + ldr r2, [r4]\n\ + lsls r3, r6, 4\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + orrs r0, r3\n\ + strb r0, [r2]\n\ + ldr r1, [r4]\n\ + movs r2, 0\n\ + movs r0, 0x4\n\ + strb r0, [r1, 0x1]\n\ + ldr r0, [r4]\n\ + strb r2, [r0, 0x3]\n\ + _08044BD0:\n\ + ldr r5, _08044C10 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r5]\n\ + ldrb r1, [r0, 0x1]\n\ + lsls r1, 11\n\ + str r1, [r0, 0x4]\n\ + ldrb r0, [r0]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + muls r0, r1\n\ + bl AllocZeroed\n\ + ldr r1, [r5]\n\ + str r0, [r1, 0x8]\n\ + ldrb r0, [r1]\n\ + lsls r0, 28\n\ + lsrs r0, 23\n\ + bl AllocZeroed\n\ + adds r2, r0, 0\n\ + ldr r1, [r5]\n\ + str r2, [r1, 0xC]\n\ + ldr r0, [r1, 0x8]\n\ + cmp r0, 0\n\ + beq _08044C04\n\ + cmp r2, 0\n\ + bne _08044C14\n\ + _08044C04:\n\ + movs r0, 0x1\n\ + mov r1, r8\n\ + orrs r1, r0\n\ + mov r8, r1\n\ + b _08044C44\n\ + .align 2, 0\n\ + _08044C10: .4byte sOakSpeechNidoranResources\n\ + _08044C14:\n\ + ldrb r0, [r1]\n\ + lsls r0, 28\n\ + movs r4, 0\n\ + adds r3, r5, 0\n\ + cmp r0, 0\n\ + beq _08044C44\n\ + _08044C20:\n\ + ldr r3, [r5]\n\ + ldr r0, [r3, 0xC]\n\ + lsls r1, r4, 2\n\ + adds r1, r0\n\ + ldr r0, [r3, 0x4]\n\ + adds r2, r0, 0\n\ + muls r2, r4\n\ + ldr r0, [r3, 0x8]\n\ + adds r0, r2\n\ + str r0, [r1]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldrb r0, [r3]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + cmp r4, r0\n\ + blt _08044C20\n\ + _08044C44:\n\ + ldr r5, _08044C8C @ =sOakSpeechNidoranResources\n\ + ldr r0, [r5]\n\ + ldrb r1, [r0]\n\ + lsls r1, 28\n\ + lsrs r1, 28\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + bl AllocZeroed\n\ + ldr r2, [r5]\n\ + str r0, [r2, 0x10]\n\ + ldrb r1, [r2]\n\ + lsls r1, 28\n\ + lsrs r1, 28\n\ + ldrb r0, [r2, 0x1]\n\ + lsls r0, 3\n\ + muls r0, r1\n\ + bl AllocZeroed\n\ + adds r2, r0, 0\n\ + ldr r1, [r5]\n\ + str r2, [r1, 0x14]\n\ + ldr r0, [r1, 0x10]\n\ + cmp r0, 0\n\ + beq _08044C7C\n\ + cmp r2, 0\n\ + bne _08044C90\n\ + _08044C7C:\n\ + movs r0, 0x2\n\ + mov r1, r8\n\ + orrs r1, r0\n\ + lsls r0, r1, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + b _08044CE2\n\ + .align 2, 0\n\ + _08044C8C: .4byte sOakSpeechNidoranResources\n\ + _08044C90:\n\ + movs r4, 0\n\ + ldrb r0, [r1, 0x1]\n\ + ldrb r1, [r1]\n\ + lsls r1, 28\n\ + lsrs r1, 28\n\ + muls r0, r1\n\ + adds r3, r5, 0\n\ + cmp r4, r0\n\ + bge _08044CC6\n\ + adds r7, r3, 0\n\ + movs r5, 0x80\n\ + lsls r5, 4\n\ + _08044CA8:\n\ + ldr r2, [r7]\n\ + ldr r1, [r2, 0x14]\n\ + lsls r0, r4, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x4]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldrb r1, [r2, 0x1]\n\ + ldrb r0, [r2]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + muls r0, r1\n\ + cmp r4, r0\n\ + blt _08044CA8\n\ + _08044CC6:\n\ + ldr r0, [r3]\n\ + ldrb r4, [r0, 0x3]\n\ + cmp r4, 0\n\ + beq _08044CDA\n\ + cmp r4, 0x1\n\ + bne _08044CDA\n\ + adds r1, r6, 0\n\ + bl OakSpeechNidoranFSetupTemplate\n\ + b _08044CE2\n\ + _08044CDA:\n\ + ldr r0, _08044D60 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r0]\n\ + bl OakSpeechNidoranFSetupTemplateDummy\n\ + _08044CE2:\n\ + movs r0, 0x2\n\ + mov r1, r8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08044D12\n\ + ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x14]\n\ + cmp r0, 0\n\ + beq _08044D00\n\ + bl Free\n\ + ldr r1, [r4]\n\ + movs r0, 0\n\ + str r0, [r1, 0x14]\n\ + _08044D00:\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x10]\n\ + cmp r0, 0\n\ + beq _08044D12\n\ + bl Free\n\ + ldr r1, [r4]\n\ + movs r0, 0\n\ + str r0, [r1, 0x10]\n\ + _08044D12:\n\ + movs r0, 0x1\n\ + mov r1, r8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08044D42\n\ + ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0xC]\n\ + cmp r0, 0\n\ + beq _08044D30\n\ + bl Free\n\ + ldr r1, [r4]\n\ + movs r0, 0\n\ + str r0, [r1, 0xC]\n\ + _08044D30:\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x8]\n\ + cmp r0, 0\n\ + beq _08044D42\n\ + bl Free\n\ + ldr r1, [r4]\n\ + movs r0, 0\n\ + str r0, [r1, 0x8]\n\ + _08044D42:\n\ + mov r0, r8\n\ + cmp r0, 0\n\ + beq _08044D64\n\ + ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\ + ldr r0, [r4]\n\ + movs r1, 0\n\ + movs r2, 0x18\n\ + bl memset\n\ + ldr r0, [r4]\n\ + bl Free\n\ + movs r0, 0\n\ + str r0, [r4]\n\ + b _08044D6C\n\ + .align 2, 0\n\ + _08044D60: .4byte sOakSpeechNidoranResources\n\ + _08044D64:\n\ + ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\ + ldr r1, [r0]\n\ + movs r0, 0xA3\n\ + strb r0, [r1, 0x2]\n\ + _08044D6C:\n\ + ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\ + ldr r0, [r0]\n\ + _08044D70:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ + _08044D7C: .4byte sOakSpeechNidoranResources\n\ + "); +} +#endif + +void OakSpeechNidoranFFreeResources(void) +{ + if (sOakSpeechNidoranResources != NULL) + { + if (sOakSpeechNidoranResources->enable != 0xA3) + { + memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct)); + sOakSpeechNidoranResources = NULL; + } + else + { + if (sOakSpeechNidoranResources->frameImages != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->frameImages); + if (sOakSpeechNidoranResources->templates != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->templates); + if (sOakSpeechNidoranResources->bufferPtrs != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->bufferPtrs); + if (sOakSpeechNidoranResources->dataBuffer != NULL) + FREE_AND_SET_NULL(sOakSpeechNidoranResources->dataBuffer); + memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct)); + Free(sOakSpeechNidoranResources); + sOakSpeechNidoranResources = NULL; + } + + } +} + +void *OakSpeechNidoranFGetBuffer(u8 bufferId) +{ + if (sOakSpeechNidoranResources->enable != 0xA3) + { + return NULL; + } + else + { + if (bufferId >= (s8)sOakSpeechNidoranResources->spriteCount) + bufferId = 0; + return sOakSpeechNidoranResources->bufferPtrs[bufferId]; + } +} |