diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pokemon/pokemon_storage_system.c | 149 |
1 files changed, 22 insertions, 127 deletions
diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 80081c963..c02fdfb3a 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -177,7 +177,27 @@ void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src } } -#ifdef NONMATCHING +#define MAX_DMA_BLOCK_SIZE 0x1000 +#define Dma3FillLarge_(value, dest, size, bit) \ +{ \ + void *_dest = dest; \ + u32 _size = size; \ + while (1) \ + { \ + if (_size <= MAX_DMA_BLOCK_SIZE) \ + { \ + DmaFill##bit(3, value, _dest, _size); \ + break; \ + } \ + DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ + _dest += MAX_DMA_BLOCK_SIZE; \ + _size -= MAX_DMA_BLOCK_SIZE; \ + } \ +} + +#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) +#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) + void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) { u16 i; @@ -185,133 +205,8 @@ void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 he dest += dest_top * 0x20 + dest_left; width *= 2; for (i = 0; i < height; dest += 0x20, i++) - { - void *_dest = dest; - size_t _size = width; - if (_size <= 0x1000) - { - DmaFill16(3, 0, _dest, _size); - } - else - { - while (1) - { - DmaFill16(3, 0, _dest, 0x1000); - _dest += 0x1000; - _size -= 0x1000; - if (_size <= 0x1000) - { - DmaFill16(3, 0, _dest, _size); - break; - } - } - } - } -} -#else -__attribute__((naked)) void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x8\n" - "\tadds r4, r0, 0\n" - "\tldr r0, [sp, 0x28]\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tlsls r2, 16\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r10, r0\n" - "\tlsrs r2, 11\n" - "\tadds r2, r1\n" - "\tlsls r2, 1\n" - "\tadds r4, r2\n" - "\tlsls r3, 17\n" - "\tlsrs r0, r3, 16\n" - "\tstr r0, [sp, 0x4]\n" - "\tmovs r0, 0\n" - "\tcmp r0, r10\n" - "\tbcs _08095DB2\n" - "\tmovs r6, 0x80\n" - "\tlsls r6, 5\n" - "\tmov r5, sp\n" - "\tldr r7, _08095D74 @ =0x040000d4\n" - "\tlsrs r3, 17\n" - "\tmov r9, r3\n" - "\tmov r1, r9\n" - "\tmovs r2, 0x81\n" - "\tlsls r2, 24\n" - "\torrs r1, r2\n" - "\tmov r9, r1\n" - "_08095D4E:\n" - "\tadds r3, r4, 0\n" - "\tldr r2, [sp, 0x4]\n" - "\tmovs r1, 0x40\n" - "\tadds r1, r4\n" - "\tmov r8, r1\n" - "\tadds r0, 0x1\n" - "\tmov r12, r0\n" - "\tcmp r2, r6\n" - "\tbhi _08095D78\n" - "\tmovs r0, 0\n" - "\tstrh r0, [r5]\n" - "\tmov r2, sp\n" - "\tstr r2, [r7]\n" - "\tstr r4, [r7, 0x4]\n" - "\tmov r0, r9\n" - "\tstr r0, [r7, 0x8]\n" - "\tldr r0, [r7, 0x8]\n" - "\tb _08095DA6\n" - "\t.align 2, 0\n" - "_08095D74: .4byte 0x040000d4\n" - "_08095D78:\n" - "\tmovs r4, 0\n" - "\tstrh r4, [r5]\n" - "\tldr r1, _08095DC4 @ =0x040000d4\n" - "\tmov r0, sp\n" - "\tstr r0, [r1]\n" - "\tstr r3, [r1, 0x4]\n" - "\tldr r0, _08095DC8 @ =0x81000800\n" - "\tstr r0, [r1, 0x8]\n" - "\tldr r0, [r1, 0x8]\n" - "\tadds r3, r6\n" - "\tsubs r2, r6\n" - "\tcmp r2, r6\n" - "\tbhi _08095D78\n" - "\tstrh r4, [r5]\n" - "\tmov r0, sp\n" - "\tstr r0, [r1]\n" - "\tstr r3, [r1, 0x4]\n" - "\tlsrs r0, r2, 1\n" - "\tmovs r2, 0x81\n" - "\tlsls r2, 24\n" - "\torrs r0, r2\n" - "\tstr r0, [r1, 0x8]\n" - "\tldr r0, [r1, 0x8]\n" - "_08095DA6:\n" - "\tmov r4, r8\n" - "\tmov r1, r12\n" - "\tlsls r0, r1, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, r10\n" - "\tbcc _08095D4E\n" - "_08095DB2:\n" - "\tadd sp, 0x8\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08095DC4: .4byte 0x040000d4\n" - "_08095DC8: .4byte 0x81000800"); + Dma3FillLarge16_(0, dest, width); } -#endif s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) { |