summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/MI_dma_card.s44
-rw-r--r--arm9/asm/MI_dma_hblank.s70
-rw-r--r--arm9/lib/include/MI_dma.h6
-rw-r--r--arm9/lib/include/MI_dma_card.h8
-rw-r--r--arm9/lib/include/MI_dma_hblank.h9
-rw-r--r--arm9/lib/src/MI_dma.c4
-rw-r--r--arm9/lib/src/MI_dma_card.c24
-rw-r--r--arm9/lib/src/MI_dma_hblank.c31
-rw-r--r--arm9/lib/src/MI_init.c1
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"