summaryrefslogtreecommitdiff
path: root/arm9/asm/MI_dma_gxcommand.s
blob: ac7bd04f36904684f466e530117aba98349ad91e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
    .include "asm/macros.inc"
    .include "global.inc"

    .text

	arm_func_start MIi_DMAFastCallback
MIi_DMAFastCallback: ; 0x020CDE78
	stmdb sp!, {lr}
	sub sp, sp, #0x4
	ldr r0, _020CDEB4 ; =0x021D37FC
	mov r2, #0x0
	ldr r1, [r0, #0x10]
	str r2, [r0, #0x0]
	cmp r1, #0x0
	addeq sp, sp, #0x4
	ldr r0, [r0, #0x14]
	ldmeqia sp!, {lr}
	bxeq lr
	blx r1
	add sp, sp, #0x4
	ldmia sp!, {lr}
	bx lr
	.balign 4
_020CDEB4: .word 0x021D37FC

	arm_func_start MI_SendGXCommandAsyncFast
MI_SendGXCommandAsyncFast: ; 0x020CDEB8
	stmdb sp!, {r4-r6,lr}
	movs r4, r2
	mov r6, r0
	mov r5, r1
	bne _020CDEE8
	cmp r3, #0x0
	ldmeqia sp!, {r4-r6,lr}
	bxeq lr
	ldr r0, [sp, #0x10]
	blx r3
	ldmia sp!, {r4-r6,lr}
	bx lr
_020CDEE8:
	ldr r2, _020CDF6C ; =0x021D37FC
	ldr r0, [r2, #0x0]
	cmp r0, #0x0
	bne _020CDEE8
	ldr r12, [sp, #0x10]
	mov lr, #0x1
	mov r0, r6
	mov r1, #0x38000000
	str lr, [r2, #0x0]
	str r6, [r2, #0x4]
	str r3, [r2, #0x10]
	str r12, [r2, #0x14]
	bl MIi_CheckAnotherAutoDMA
	mov r0, r6
	mov r1, r5
	mov r2, r4
	mov r3, #0x0
	bl MIi_CheckDma0SourceAddress
	mov r0, r6
	bl MI_WaitDma
	mov r0, r6
	ldr r1, _020CDF70 ; =MIi_DMAFastCallback
	mov r2, #0x0
	bl OSi_EnterDmaCallback
	mov r0, r6
	mov r1, r5
	ldr r2, _020CDF74 ; =0x04000400
	mov r3, #0x3c00000
	rsb r3, r3, #0x0
	orr r3, r3, r4, lsr #0x2
	bl MIi_DmaSetParams
	ldmia sp!, {r4-r6,lr}
	bx lr
	.balign 4
_020CDF6C: .word 0x021D37FC
_020CDF70: .word MIi_DMAFastCallback
_020CDF74: .word 0x04000400

	arm_func_start MIi_DMACallback
MIi_DMACallback: ; 0x020CDF78
	stmdb sp!, {lr}
	sub sp, sp, #0x4
	mov r0, #0x200000
	bl OS_DisableIrqMask
	ldr r2, _020CDFE4 ; =0x04000600
	ldr r0, _020CDFE8 ; =0x021D37FC
	ldr r1, [r2, #0x0]
	ldr r3, [r0, #0x18]
	bic r1, r1, #0xc0000000
	orr r1, r1, r3, lsl #0x1e
	str r1, [r2, #0x0]
	ldr r1, [r0, #0x1c]
	mov r0, #0x200000
	bl OS_SetIrqFunction
	ldr r0, _020CDFE8 ; =0x021D37FC
	mov r2, #0x0
	ldr r1, [r0, #0x10]
	str r2, [r0, #0x0]
	cmp r1, #0x0
	addeq sp, sp, #0x4
	ldr r0, [r0, #0x14]
	ldmeqia sp!, {lr}
	bxeq lr
	blx r1
	add sp, sp, #0x4
	ldmia sp!, {lr}
	bx lr
	.balign 4
_020CDFE4: .word 0x04000600
_020CDFE8: .word 0x021D37FC

	arm_func_start MIi_FIFOCallback
MIi_FIFOCallback: ; 0x020CDFEC
	stmdb sp!, {r4-r5,lr}
	sub sp, sp, #0x4
	ldr r0, _020CE0A4 ; =0x021D37FC
	ldr r4, [r0, #0xc]
	cmp r4, #0x0
	addeq sp, sp, #0x4
	ldmeqia sp!, {r4-r5,lr}
	bxeq lr
	ldr r0, _020CE0A4 ; =0x021D37FC
	cmp r4, #0x1d8
	ldr r5, [r0, #0x8]
	movcs r4, #0x1d8
	ldr r2, [r0, #0xc]
	add r1, r5, r4
	subs r2, r2, r4
	str r2, [r0, #0xc]
	str r1, [r0, #0x8]
	bne _020CE078
	ldr r0, [r0, #0x4]
	ldr r1, _020CE0A8 ; =MIi_DMACallback
	mov r2, #0x0
	bl OSi_EnterDmaCallback
	mov r0, #0x3bc00000
	rsb r3, r0, #0x0
	ldr r1, _020CE0A4 ; =0x021D37FC
	ldr r2, _020CE0AC ; =0x04000400
	ldr r0, [r1, #0x4]
	mov r1, r5
	orr r3, r3, r4, lsr #0x2
	bl MIi_DmaSetParams
	mov r0, #0x200000
	bl OS_ResetRequestIrqMask
	add sp, sp, #0x4
	ldmia sp!, {r4-r5,lr}
	bx lr
_020CE078:
	ldr r3, _020CE0B0 ; =0x84400000
	ldr r0, [r0, #0x4]
	ldr r2, _020CE0AC ; =0x04000400
	mov r1, r5
	orr r3, r3, r4, lsr #0x2
	bl MIi_DmaSetParams
	mov r0, #0x200000
	bl OS_ResetRequestIrqMask
	add sp, sp, #0x4
	ldmia sp!, {r4-r5,lr}
	bx lr
	.balign 4
_020CE0A4: .word 0x021D37FC
_020CE0A8: .word MIi_DMACallback
_020CE0AC: .word 0x04000400
_020CE0B0: .word 0x84400000

	arm_func_start MI_SendGXCommandAsync
MI_SendGXCommandAsync: ; 0x020CE0B4
	stmdb sp!, {r4-r5,lr}
	sub sp, sp, #0x4
	mov r4, r0
	cmp r2, #0x0
	bne _020CE0EC
	cmp r3, #0x0
	addeq sp, sp, #0x4
	ldmeqia sp!, {r4-r5,lr}
	bxeq lr
	ldr r0, [sp, #0x10]
	blx r3
	add sp, sp, #0x4
	ldmia sp!, {r4-r5,lr}
	bx lr
_020CE0EC:
	ldr r0, _020CE1BC ; =0x021D37FC
	ldr r0, [r0, #0x0]
	cmp r0, #0x0
	bne _020CE0EC
	ldr r5, _020CE1C0 ; =0x04000600
_020CE100:
	ldr r0, [r5, #0x0]
	and r0, r0, #0x7000000
	mov r0, r0, lsr #0x18
	ands r0, r0, #0x2
	beq _020CE100
	ldr ip, _020CE1BC ; =0x021D37FC
	ldr lr, [sp, #0x10]
	str r3, [r12, #0x10]
	mov r5, #0x1
	mov r0, r4
	mov r3, #0x0
	str r5, [r12, #0x0]
	str r4, [r12, #0x4]
	str r1, [r12, #0x8]
	str r2, [r12, #0xc]
	str lr, [r12, #0x14]
	bl MIi_CheckDma0SourceAddress
	mov r0, r4
	bl MI_WaitDma
	bl OS_DisableInterrupts
	ldr r1, _020CE1C0 ; =0x04000600
	mov r4, r0
	ldr r0, [r1, #0x0]
	ldr r1, _020CE1BC ; =0x021D37FC
	and r0, r0, #0xc0000000
	mov r2, r0, lsr #0x1e
	mov r0, #0x200000
	str r2, [r1, #0x18]
	bl OS_GetIrqFunction
	ldr r1, _020CE1BC ; =0x021D37FC
	ldr r2, _020CE1C0 ; =0x04000600
	str r0, [r1, #0x1c]
	ldr r0, [r2, #0x0]
	ldr r1, _020CE1C4 ; =MIi_FIFOCallback
	bic r0, r0, #0xc0000000
	orr r3, r0, #0x40000000
	mov r0, #0x200000
	str r3, [r2, #0x0]
	bl OS_SetIrqFunction
	mov r0, #0x200000
	bl OS_EnableIrqMask
	bl MIi_FIFOCallback
	mov r0, r4
	bl OS_RestoreInterrupts
	add sp, sp, #0x4
	ldmia sp!, {r4-r5,lr}
	bx lr
	.balign 4
_020CE1BC: .word 0x021D37FC
_020CE1C0: .word 0x04000600
_020CE1C4: .word MIi_FIFOCallback