summaryrefslogtreecommitdiff
path: root/arm9/asm/crt0.s
blob: aaf2d22f89d06fa0640f2b9f3da56b22cd98ff75 (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
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
	.include "asm/macros.inc"
	.include "global.inc"

	.text

	arm_func_start _start
_start: ; 0x02000800
	mov ip, #0x4000000
	str ip, [ip, #0x208]
_02000808:
	ldrh r0, [ip, #6]
	cmp r0, #0
	bne _02000808
	bl init_cp15
	mov r0, #0x13
	msr cpsr_c, r0
	ldr r0, _02000918 ; =SDK_AUTOLOAD_DTCM_START
	add r0, r0, #0x3fc0
	mov sp, r0
	mov r0, #0x12
	msr cpsr_c, r0
	ldr r0, _02000918 ; =SDK_AUTOLOAD_DTCM_START
	add r0, r0, #0x3fc0
	sub r0, r0, #0x40
	sub sp, r0, #4
	tst sp, #4
	subeq sp, sp, #4
	ldr r1, _0200091C ; =0x00000400
	sub r1, r0, r1
	mov r0, #0x1f
	msr cpsr_fsxc, r0
	sub sp, r1, #4
	mov r0, #0
	ldr r1, _02000918 ; =SDK_AUTOLOAD_DTCM_START
	mov r2, #0x4000
	bl INITi_CpuClear32
	mov r0, #0
	ldr r1, _02000920 ; =0x05000000
	mov r2, #1024
	bl INITi_CpuClear32
	mov r0, #512
	ldr r1, _02000924 ; =0x07000000
	mov r2, #1024
	bl INITi_CpuClear32
	ldr r1, _02000928 ; =_start_ModuleParams
	ldr r0, [r1, #20]
	bl MIi_UncompressBackward
	bl do_autoload
	ldr r0, _02000928 ; =_start_ModuleParams
	ldr r1, [r0, #12]
	ldr r2, [r0, #16]
	mov r3, r1
	mov r0, #0
_020008B4:
	cmp r1, r2
	strcc r0, [r1], #4
	bcc _020008B4
	bic r1, r3, #31
_020008C4:
	mcr p15, 0x0, r0, cr7, cr10, 4
	mcr p15, 0x0, r1, cr7, cr5, 1
	mcr p15, 0x0, r1, cr7, cr14, 1
	add r1, r1, #32
	cmp r1, r2
	blt _020008C4
	ldr r1, _0200092C ; =0x027FFF9C
	str r0, [r1]
	ldr r1, _02000918 ; =SDK_AUTOLOAD_DTCM_START
	add r1, r1, #16320
	add r1, r1, #60
	ldr r0, _02000930 ; =OS_IrqHandler
	str r0, [r1]
	bl _fp_init
	bl NitroStartUp
	bl __call_static_initializers
	ldr r1, _02000934 ; =0x02000C55 
	ldr lr, _02000938 ; =0xFFFF0000
	tst sp, #4
	subne sp, sp, #4
	bx r1
_02000918: .word SDK_AUTOLOAD_DTCM_START
_0200091C: .word SDK_IRQ_STACKSIZE
_02000920: .word 0x05000000
_02000924: .word 0x07000000
_02000928: .word _start_ModuleParams
_0200092C: .word 0x027FFF9C
_02000930: .word OS_IrqHandler
_02000934: .word NitroMain
_02000938: .word 0xFFFF0000
	arm_func_end _start

	arm_func_start INITi_CpuClear32
INITi_CpuClear32:
	add ip, r1, r2
_02000940:
	cmp r1, ip
	stmltia r1!, {r0}
	blt _02000940
	bx lr
	arm_func_end INITi_CpuClear32

	arm_func_start MIi_UncompressBackward
MIi_UncompressBackward:
	cmp r0, #0
	beq _020009F8
	stmdb sp!, {r4-r7}
	ldmdb r0, {r1, r2}
	add r2, r0, r2
	sub r3, r0, r1, lsr #24
	bic r1, r1, #-16777216
	sub r1, r0, r1
	mov r4, r2
_02000974:
	cmp r3, r1
	ble _020009D4
	ldrb r5, [r3, #-1]!
	mov r6, #8
_02000984:
	subs r6, r6, #1
	blt _02000974
	tst r5, #128
	bne _020009A0
	ldrb r0, [r3, #-1]!
	strb r0, [r2, #-1]!
	b _020009C8
_020009A0:
	ldrb ip, [r3, #-1]!
	ldrb r7, [r3, #-1]!
	orr r7, r7, ip, lsl #8
	bic r7, r7, #61440
	add r7, r7, #2
	add ip, ip, #32
_020009B8:
	ldrb r0, [r2, r7]
	strb r0, [r2, #-1]!
	subs ip, ip, #16
	bge _020009B8
_020009C8:
	cmp r3, r1
	mov r5, r5, lsl #0x1
	bgt _02000984
_020009D4:
	mov r0, #0
	bic r3, r1, #31
_020009DC:
	mcr p15, 0x0, r0, cr7, cr10, 4
	mcr p15, 0x0, r3, cr7, cr5, 1
	mcr p15, 0x0, r3, cr7, cr14, 1
	add r3, r3, #32
	cmp r3, r4
	blt _020009DC
	ldmia sp!, {r4-r7}
_020009F8:
	bx lr
	arm_func_end MIi_UncompressBackward

	arm_func_start do_autoload
do_autoload:
	ldr r0, =_start_ModuleParams
	ldr r1, [r0]
	ldr r2, [r0, #4]
	ldr r3, [r0, #8]
_02000A0C:
	cmp r1, r2
	beq _02000A6C
	ldr r5, [r1], #4
	ldr r7, [r1], #4
	add r6, r5, r7
	mov r4, r5
_02000A24:
	cmp r4, r6
	ldrmi r7, [r3], #4
	strmi r7, [r4], #4
	bmi _02000A24
	ldr r7, [r1], #4
	add r6, r4, r7
	mov r7, #0
_02000A40:
	cmp r4, r6
	strcc r7, [r4], #4
	bcc _02000A40
	bic r4, r5, #31
_02000A50:
	mcr p15, 0x0, r7, cr7, cr10, 4
	mcr p15, 0x0, r4, cr7, cr5, 1
	mcr p15, 0x0, r4, cr7, cr14, 1
	add r4, r4, #32
	cmp r4, r6
	blt _02000A50
	b _02000A0C
_02000A6C:
	b _start_AutoloadDoneCallback
	.pool
	.global _start_AutoloadDoneCallback
_start_AutoloadDoneCallback:
	bx lr
	arm_func_end do_autoload

	arm_func_start init_cp15
init_cp15: ; 0x02000A78
	mrc p15, 0x0, r0, c1, c0, 0x0
	ldr r1, =0x000F9005
	bic r0, r0, r1
	mcr p15, 0x0, r0, c1, c0, 0x0
	mov r0, #0
	mcr p15, 0x0, r0, c7, c5, 0x0
	mcr p15, 0x0, r0, c7, c6, 0x0
	mcr p15, 0x0, r0, c7, c10, 0x4
	ldr r0, =0x04000033
	mcr p15, 0x0, r0, c6, c0, 0x0
	ldr r0, =0x0200002D
	mcr p15, 0x0, r0, c6, c1, 0x0
	ldr r0, =0x027E0021
	mcr p15, 0x0, r0, c6, c2, 0x0
	ldr r0, =0x08000035
	mcr p15, 0x0, r0, c6, c3, 0x0
	ldr r0, =SDK_AUTOLOAD_DTCM_START
	orr r0, r0, #0x1a
	orr r0, r0, #1
	mcr p15, 0x0, r0, c6, c4, 0x0
	ldr r0, =0x0100002F
	mcr p15, 0x0, r0, c6, c5, 0x0
	ldr r0, =0xFFFF001D
	mcr p15, 0x0, r0, c6, c6, 0x0
	ldr r0, =0x027FF017
	mcr p15, 0x0, r0, c6, c7, 0x0
	mov r0, #0x20
	mcr p15, 0x0, r0, c9, c1, 0x1
	ldr r0, =SDK_AUTOLOAD_DTCM_START
	orr r0, r0, #0xa
	mcr p15, 0x0, r0, c9, c1, 0x0
	mov r0, #0x42
	mcr p15, 0x0, r0, c2, c0, 0x1
	mov r0, #0x42
	mcr p15, 0x0, r0, c2, c0, 0x0
	mov r0, #2
	mcr p15, 0x0, r0, c3, c0, 0x0
	ldr r0, =0x05100011
	mcr p15, 0x0, r0, c5, c0, 0x3
	ldr r0, =0x15111011
	mcr p15, 0x0, r0, c5, c0, 0x2
	mrc p15, 0x0, r0, c1, c0, 0x0
	ldr r1, =0x0005707D
	orr r0, r0, r1
	mcr p15, 0x0, r0, c1, c0, 0x0
	bx lr
	.align 2, 0
	.pool

	arm_func_start OSi_ReferSymbol
OSi_ReferSymbol: ; 0x02000B60
	bx lr

	arm_func_start NitroStartUp
NitroStartUp: ; 0x02000B64
	bx lr

	.global _start_ModuleParams
_start_ModuleParams:
	.word SDK_AUTOLOAD_LIST
	.word SDK_AUTOLOAD_LIST_END
	.word SDK_AUTOLOAD_START
	.word SDK_STATIC_BSS_START
	.word SDK_STATIC_BSS_END

	.balign 16, 0

	.section .version
	; NITRO SDK 3.2.30001
	.word (3 << 24) | (2 << 16) | 30001
	.word 0xdec00621 ; Nitro code BE
	.word 0x2106c0de ; Nitro code LE
	
	# strings
	.balign 4
	.asciz "[SDK+NINTENDO:DWC1.2.30006.061019.2254_DWC_1_2_PLUS6]"
	.balign 4
	.asciz "[SDK+NINTENDO:WiFi1.2.30000.0609050341]"
	.balign 4
	.asciz "[SDK+UBIQUITOUS:CPS]"
	.balign 4
	.asciz "[SDK+UBIQUITOUS:SSL]"
	.balign 4
	.asciz "[SDK+Abiosso:libVCT 1.0.1_ec]"
	.balign 4
	.asciz "[SDK+NINTENDO:BACKUP]"