diff options
-rw-r--r-- | arm9/asm/MI_dma_card.s | 44 | ||||
-rw-r--r-- | arm9/asm/MI_dma_hblank.s | 70 | ||||
-rw-r--r-- | arm9/lib/include/MI_dma.h | 6 | ||||
-rw-r--r-- | arm9/lib/include/MI_dma_card.h | 8 | ||||
-rw-r--r-- | arm9/lib/include/MI_dma_hblank.h | 9 | ||||
-rw-r--r-- | arm9/lib/src/MI_dma.c | 4 | ||||
-rw-r--r-- | arm9/lib/src/MI_dma_card.c | 24 | ||||
-rw-r--r-- | arm9/lib/src/MI_dma_hblank.c | 31 | ||||
-rw-r--r-- | arm9/lib/src/MI_init.c | 1 |
9 files changed, 81 insertions, 116 deletions
diff --git a/arm9/asm/MI_dma_card.s b/arm9/asm/MI_dma_card.s deleted file mode 100644 index 75d15a1f..00000000 --- a/arm9/asm/MI_dma_card.s +++ /dev/null @@ -1,44 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start MIi_CardDmaCopy32 -MIi_CardDmaCopy32: ; 0x020CE5BC - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r5, r1 - mov r6, r0 - mov r7, r3 - mvn r1, #0x0 - mov r4, r2 - bl MIi_CheckAnotherAutoDMA - mov r0, r6 - mov r1, r5 - mov r2, r7 - mov r3, #0x1000000 - bl MIi_CheckDma0SourceAddress -_020CE5F0: - cmp r7, #0x0 - addeq sp, sp, #0x4 - ldmeqia sp!, {r4-r7, lr} - bxeq lr - mov r0, #0x3 - mul r1, r6, r0 - ldr r0, _020CE640 - add r1, r1, #0x2 - add r1, r0, r1, lsl #0x2 -_020CE614: - ldr r0, [r1] - ands r0, r0, #0x80000000 - bne _020CE614 - ldr r3, _020CE644 - mov r0, r6 - mov r1, r5 - mov r2, r4 - bl MIi_DmaSetParams - add sp, sp, #0x4 - ldmia sp!, {r4-r7, lr} - bx lr -_020CE640: .word 0x040000B0 -_020CE644: .word 0xAf000001 diff --git a/arm9/asm/MI_dma_hblank.s b/arm9/asm/MI_dma_hblank.s deleted file mode 100644 index 7c149ef3..00000000 --- a/arm9/asm/MI_dma_hblank.s +++ /dev/null @@ -1,70 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start MI_HBlankDmaCopy16 -MI_HBlankDmaCopy16: ; 0x020CDD90 - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r6, r1 - mov r7, r0 - mov r4, r3 - mov r1, #0x10000000 - mov r5, r2 - bl MIi_CheckAnotherAutoDMA - mov r0, r7 - mov r1, r6 - mov r2, r4 - mov r3, #0x0 - bl MIi_CheckDma0SourceAddress -_020CDDC4: - cmp r4, #0x0 - addeq sp, sp, #0x4 - ldmeqia sp!, {r4-r7, lr} - bxeq lr - mov r0, r7 - bl MI_WaitDma - ldr r3, _020CDE00 - mov r0, r7 - mov r1, r6 - mov r2, r5 - orr r3, r3, r4, lsr #0x1 - bl MIi_DmaSetParams - add sp, sp, #0x4 - ldmia sp!, {r4-r7,lr} - bx lr -_020CDE00: .word 0x92600000 - - arm_func_start MI_HBlankDmaCopy32 -MI_HBlankDmaCopy32: ; 0x020CDE04 - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r6, r1 - mov r7, r0 - mov r4, r3 - mov r1, #0x10000000 - mov r5, r2 - bl MIi_CheckAnotherAutoDMA - mov r0, r7 - mov r1, r6 - mov r2, r4 - mov r3, #0x0 - bl MIi_CheckDma0SourceAddress -_020CDE38: - cmp r4, #0x0 - addeq sp, sp, #0x4 - ldmeqia sp!, {r4-r7,lr} - bxeq lr - mov r0, r7 - bl MI_WaitDma - ldr r3, _020CDE74 - mov r0, r7 - mov r1, r6 - mov r2, r5 - orr r3, r3, r4, lsr #0x2 - bl MIi_DmaSetParams - add sp, sp, #0x4 - ldmia sp!, {r4-r7,lr} - bx lr -_020CDE74: .word 0x96600000 diff --git a/arm9/lib/include/MI_dma.h b/arm9/lib/include/MI_dma.h index e8938ef9..aafc798b 100644 --- a/arm9/lib/include/MI_dma.h +++ b/arm9/lib/include/MI_dma.h @@ -16,6 +16,12 @@ typedef void (*MIDmaCallback)(void *); #define MI_CNT_COPY32_IF(size) (0xc4000000 | ((size)/4)) #define MI_CNT_COPY16(size) (0x80000000 | ((size)/2)) +#define MI_DMA_SRC_FIX (2UL << 23) +#define MI_DMA_SRC_INC (0UL << 23) + +#define MIi_DMA_TIMING_ANY (u32)(~0) +#define MI_DMA_TIMING_H_BLANK (2UL << 27) + typedef union { u32 b32; diff --git a/arm9/lib/include/MI_dma_card.h b/arm9/lib/include/MI_dma_card.h new file mode 100644 index 00000000..efd70ba6 --- /dev/null +++ b/arm9/lib/include/MI_dma_card.h @@ -0,0 +1,8 @@ +#ifndef POKEDIAMOND_MI_DMA_CARD_H +#define POKEDIAMOND_MI_DMA_CARD_H + +#include "nitro/types.h" + +void MIi_CardDmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size); + +#endif //POKEDIAMOND_MI_DMA_CARD_H diff --git a/arm9/lib/include/MI_dma_hblank.h b/arm9/lib/include/MI_dma_hblank.h new file mode 100644 index 00000000..1c83ef3e --- /dev/null +++ b/arm9/lib/include/MI_dma_hblank.h @@ -0,0 +1,9 @@ +#ifndef POKEDIAMOND_MI_DMA_HBLANK_H +#define POKEDIAMOND_MI_DMA_HBLANK_H + +#include "nitro/types.h" + +void MI_HBlankDmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size); +void MI_HBlankDmaCopy16(u32 dmaNo, const void *src, void *dest, u32 size); + +#endif //POKEDIAMOND_MI_DMA_HBLANK_H diff --git a/arm9/lib/src/MI_dma.c b/arm9/lib/src/MI_dma.c index 565b1ef6..f322f87f 100644 --- a/arm9/lib/src/MI_dma.c +++ b/arm9/lib/src/MI_dma.c @@ -258,8 +258,8 @@ ARM_FUNC void MIi_CheckAnotherAutoDMA(u32 dmaNo, u32 dmaType) timing = dmaCnt & 0x38000000; if (timing == dmaType - || (timing == 0x8000000 && dmaType == 0x10000000) - || (timing == 0x10000000 && dmaType == 0x8000000)) + || (timing == 0x8000000 && dmaType == MI_DMA_TIMING_H_BLANK) + || (timing == MI_DMA_TIMING_H_BLANK && dmaType == 0x8000000)) { continue; } diff --git a/arm9/lib/src/MI_dma_card.c b/arm9/lib/src/MI_dma_card.c new file mode 100644 index 00000000..c3b8b897 --- /dev/null +++ b/arm9/lib/src/MI_dma_card.c @@ -0,0 +1,24 @@ +#include "MI_dma_card.h" +#include "MI_dma.h" +#include "function_target.h" + +ARM_FUNC void MIi_CardDmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size) +{ + MIi_CheckAnotherAutoDMA(dmaNo, MIi_DMA_TIMING_ANY); + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_FIX); + + if (size == 0) + { + return; + } + + vu32 *dmaCntp; + + do + { + dmaCntp = &((vu32 *)REG_ADDR_DMA0SAD)[dmaNo * 3 + 2]; + while (*dmaCntp & 0x80000000) {} + } while(0); + + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, (u32)(0xaf000001)); +} diff --git a/arm9/lib/src/MI_dma_hblank.c b/arm9/lib/src/MI_dma_hblank.c new file mode 100644 index 00000000..67e579fe --- /dev/null +++ b/arm9/lib/src/MI_dma_hblank.c @@ -0,0 +1,31 @@ +#include "MI_dma_hblank.h" +#include "MI_dma.h" +#include "function_target.h" + +ARM_FUNC void MI_HBlankDmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size) +{ + MIi_CheckAnotherAutoDMA(dmaNo, MI_DMA_TIMING_H_BLANK); + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); + + if (size == 0) + { + return; + } + + MI_WaitDma(dmaNo); + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, (u32)(0x96600000 | (size / 4))); +} + +ARM_FUNC void MI_HBlankDmaCopy16(u32 dmaNo, const void *src, void *dest, u32 size) +{ + MIi_CheckAnotherAutoDMA(dmaNo, MI_DMA_TIMING_H_BLANK); + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); + + if (size == 0) + { + return; + } + + MI_WaitDma(dmaNo); + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, (u32)(0x92600000 | (size / 2))); +} diff --git a/arm9/lib/src/MI_init.c b/arm9/lib/src/MI_init.c index 4556e95a..4c861286 100644 --- a/arm9/lib/src/MI_init.c +++ b/arm9/lib/src/MI_init.c @@ -1,3 +1,4 @@ +#include "MI_init.h" #include "nitro/types.h" #include "function_target.h" #include "MI_dma.h" |