summaryrefslogtreecommitdiff
path: root/arm7/asm/CTRDG.s
blob: 633cbdd368b0e6f98c1484d91269d4db3c4fa014 (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
241
242
243
244
245
246
247
248
	.include "asm/macros.inc"
	.include "global.inc"

    .section .bss

	.global CTRDGi_Work
CTRDGi_Work: ;0x03809FB8
	.space 0x03809FBC - 0x03809FB8

    .section .text

	arm_func_start CTRDGi_SendtoPxi
CTRDGi_SendtoPxi: ;@ 0x038038C0
	stmdb	sp!, {r4, r5, r6, r7, lr}
	sub	sp, sp, #4
	mov	r7, r0
	mov	r6, #1
	mov	r5, #13
	mov	r4, #0
	b	_038038E4
_038038DC:
	mov	r0, r6
	bl	FUN_037F8CB4
_038038E4:
	mov	r0, r5
	mov	r1, r7
	mov	r2, r4
	bl	PXI_SendWordByFifo
	cmp	r0, #0
	bne	_038038DC
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, lr}
	bx	lr

	arm_func_start CTRDGi_UnlockByProcessor
CTRDGi_UnlockByProcessor: ;@ 0x03803908
	stmdb	sp!, {r4, lr}
	mov	r4, r1
	ldr	r1, [r4]
	cmp	r1, #0
	bne	_03803920
	bl	OS_UnLockCartridge
_03803920:
	ldr	r0, [r4, #4]
	bl	OS_RestoreInterrupts
	ldmia	sp!, {r4, lr}
	bx	lr

	arm_func_start CTRDGi_LockByProcessor
CTRDGi_LockByProcessor: ;@ 0x03803930
	stmdb	sp!, {r4, r5, lr}
	sub	sp, sp, #4
	mov	r5, r0
	mov	r4, r1
	bl	OS_DisableInterrupts
	str	r0, [r4, #4]
	ldr	r0, _0380398C	;@ =0x027FFFE8
	bl	OS_ReadOwnerOfLockWord
	and	r0, r0, #128	;@ 0x80
	str	r0, [r4]
	ldr	r0, [r4]
	cmp	r0, #0
	bne	_03803974
	mov	r0, r5
	bl	OS_TryLockCartridge
	cmp	r0, #0
	bne	_0380397C
_03803974:
	mov	r0, #1
	b	_03803980
_0380397C:
	mov	r0, #0
_03803980:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, lr}
	bx	lr
_0380398C:	.word	0x027FFFE8

	arm_func_start CTRDGi_RestoreAccessCycle
CTRDGi_RestoreAccessCycle: ;@ 0x03803990
	ldr	r3, [r0]
	ldr	r2, _038039C0	;@ =0x04000204
	ldrh	r1, [r2]
	bic	r1, r1, #12
	orr	r1, r1, r3, lsl #2
	strh	r1, [r2]
	ldr	r1, [r0, #4]
	ldrh	r0, [r2]
	bic	r0, r0, #16
	orr	r0, r0, r1, lsl #4
	strh	r0, [r2]
	bx	lr
_038039C0:	.word	0x04000204

	arm_func_start CTRDGi_ChangeLatestAccessCycle
CTRDGi_ChangeLatestAccessCycle: ;@ 0x038039C4
	ldr	r2, _03803A08	;@ =0x04000204
	ldrh	r1, [r2]
	and	r1, r1, #12
	mov	r1, r1, asr #2
	str	r1, [r0]
	ldrh	r1, [r2]
	and	r1, r1, #16
	mov	r1, r1, asr #4
	str	r1, [r0, #4]
	ldrh	r0, [r2]
	bic	r0, r0, #12
	orr	r0, r0, #12
	strh	r0, [r2]
	ldrh	r0, [r2]
	bic	r0, r0, #16
	strh	r0, [r2]
	bx	lr
_03803A08:	.word	0x04000204

	arm_func_start CTRDG_IsExisting
CTRDG_IsExisting: ;@ 0x03803A0C
	stmdb	sp!, {r4, lr}
	sub	sp, sp, #16
	mov	r4, #1
	ldr	r2, _03803B20	;@ =0x027FFC30
	ldrh	r1, [r2]
	ldr	r0, _03803B24	;@ =0x0000FFFF
	cmp	r1, r0
	moveq	r0, #0
	beq	_03803B14
	ldrb	r0, [r2, #5]
	mov	r0, r0, lsl #30
	mov	r0, r0, lsr #31
	cmp	r0, #1
	moveq	r0, #0
	beq	_03803B14
	ldr	r0, _03803B28	;@ =CTRDGi_Work
	ldrh	r0, [r0, #2]
	add	r1, sp, #0
	bl	CTRDGi_LockByProcessor
	cmp	r0, #0
	bne	_03803A70
	ldr	r0, [sp, #4]
	bl	OS_RestoreInterrupts
	mov	r0, r4
	b	_03803B14
_03803A70:
	add	r0, sp, #8
	bl	CTRDGi_ChangeLatestAccessCycle
	mov	r2, #134217728	;@ 0x8000000
	ldrb	r3, [r2, #178]	;@ 0xb2
	cmp	r3, #150	;@ 0x96
	bne	_03803A9C
	ldr	r0, _03803B20	;@ =0x027FFC30
	ldrh	r1, [r0]
	ldrh	r0, [r2, #190]	;@ 0xbe
	cmp	r1, r0
	bne	_03803AE4
_03803A9C:
	cmp	r3, #150	;@ 0x96
	beq	_03803ABC
	ldr	r0, _03803B20	;@ =0x027FFC30
	ldrh	r1, [r0]
	ldr	r0, _03803B2C	;@ =0x0801FFFE
	ldrh	r0, [r0]
	cmp	r1, r0
	bne	_03803AE4
_03803ABC:
	ldr	r2, _03803B20	;@ =0x027FFC30
	ldr	r1, [r2, #8]
	mov	r0, #134217728	;@ 0x8000000
	ldr	r0, [r0, #172]	;@ 0xac
	cmp	r1, r0
	beq	_03803AF8
	ldrb	r0, [r2, #5]
	mov	r0, r0, lsl #31
	movs	r0, r0, lsr #31
	beq	_03803AF8
_03803AE4:
	ldr	r1, _03803B20	;@ =0x027FFC30
	ldrb	r0, [r1, #5]
	orr	r0, r0, #2
	strb	r0, [r1, #5]
	mov	r4, #0
_03803AF8:
	add	r0, sp, #8
	bl	CTRDGi_RestoreAccessCycle
	ldr	r0, _03803B28	;@ =CTRDGi_Work
	ldrh	r0, [r0, #2]
	add	r1, sp, #0
	bl	CTRDGi_UnlockByProcessor
	mov	r0, r4
_03803B14:
	add	sp, sp, #16
	ldmia	sp!, {r4, lr}
	bx	lr
_03803B20:	.word	0x027FFC30
_03803B24:	.word	0x0000FFFF
_03803B28:	.word	CTRDGi_Work
_03803B2C:	.word	0x0801FFFE

	arm_func_start CTRDG_IsPulledOut
CTRDG_IsPulledOut: ;@ 0x03803B30
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	ldr	r2, _03803B80	;@ =0x027FFC30
	ldrh	r1, [r2]
	ldr	r0, _03803B84	;@ =0x0000FFFF
	cmp	r1, r0
	moveq	r0, #0
	beq	_03803B74
	ldrb	r0, [r2, #5]
	mov	r0, r0, lsl #30
	movs	r0, r0, lsr #31
	bne	_03803B64
	bl	CTRDG_IsExisting
_03803B64:
	ldr	r0, _03803B80	;@ =0x027FFC30
	ldrb	r0, [r0, #5]
	mov	r0, r0, lsl #30
	mov	r0, r0, lsr #31
_03803B74:
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_03803B80:	.word	0x027FFC30
_03803B84:	.word	0x0000FFFF

	arm_func_start CTRDGi_InitCommon
CTRDGi_InitCommon: ;@ 0x03803B88
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	mov	r0, #0
	str	r0, [sp]
	add	r0, sp, #0
	ldr	r1, _03803BC0	;@ =CTRDGi_Work
	ldr	r2, _03803BC4	;@ =0x05000001
	bl	FUN_03803BC8
	bl	OS_GetLockID
	ldr	r1, _03803BC0	;@ =CTRDGi_Work
	strh	r0, [r1, #2]
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_03803BC0:	.word	CTRDGi_Work
_03803BC4:	.word	0x05000001

	arm_func_start FUN_03803BC8
FUN_03803BC8: ;@ 0x03803BC8
	ldr	ip, _03803BD0	;@ =SVC_CpuSet
	bx	ip
_03803BD0:	.word	SVC_CpuSet