summaryrefslogtreecommitdiff
path: root/arm7/asm/CARD_rom.s
blob: 51725ca11145ced3ba0bc2a080e4d0b856a69f3e (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
	.include "asm/macros.inc"
	.include "global.inc"

    .section .data

	.global cardi_rom_header_addr
cardi_rom_header_addr:
	.word	0x027FFE00

    .section .bss

	.global cardi_rom_base
cardi_rom_base: ;0x03809774
	.space 0x03809780 - 0x03809774

	.global rom_stat
rom_stat: ;0x03809780
	.space 0x038099A0 - 0x03809780

    .section .text

	arm_func_start CARDi_GetRomAccessor
CARDi_GetRomAccessor: ; 0x038008C4
	ldr	r0, _038008CC	; =_03800A7C
	bx	lr
_038008CC:	.word	_03800A7C

	arm_func_start CARD_Init
CARD_Init: ; 0x038008D0
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	ldr	r2, _03800940	; =cardi_common
	ldr	r0, [r2, #252]	; 0xfc
	cmp	r0, #0
	bne	_03800934
	mov	r0, #1
	str	r0, [r2, #252]	; 0xfc
	mov	r1, #0
	str	r1, [r2, #40]	; 0x28
	ldr	r0, [r2, #40]	; 0x28
	str	r0, [r2, #36]	; 0x24
	ldr	r0, [r2, #36]	; 0x24
	str	r0, [r2, #32]
	mvn	r0, #0
	str	r0, [r2, #44]	; 0x2c
	str	r1, [r2, #60]	; 0x3c
	str	r1, [r2, #64]	; 0x40
	ldr	r0, _03800944	; =cardi_rom_base
	str	r1, [r0]
	bl	CARDi_InitCommon
	bl	CARDi_GetRomAccessor
	ldr	r1, _03800948	; =rom_stat
	str	r0, [r1]
	bl	CARD_InitPulledOutCallback
_03800934:
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_03800940:	.word	cardi_common
_03800944:	.word	cardi_rom_base
_03800948:	.word	rom_stat

	arm_func_start CARDi_ReadRomID
CARDi_ReadRomID: ; 0x0380094C
	stmdb	sp!, {r4, r5, r6, r7, r8, lr}
	ldr	r5, _03800A10	; =cardi_common
	bl	OS_DisableInterrupts
	mov	r4, r0
	add	r6, r5, #244	; 0xf4
	b	_0380096C
_03800964:
	mov	r0, r6
	bl	OS_SleepThread
_0380096C:
	ldr	r0, [r5, #252]	; 0xfc
	ands	r0, r0, #4
	bne	_03800964
	ldr	r0, [r5, #252]	; 0xfc
	orr	r0, r0, #4
	str	r0, [r5, #252]	; 0xfc
	mov	r0, #0
	str	r0, [r5, #60]	; 0x3c
	str	r0, [r5, #64]	; 0x40
	mov	r0, r4
	bl	OS_RestoreInterrupts
	bl	CARDi_ReadRomIDCore
	mov	r8, r0
	ldr	r7, _03800A10	; =cardi_common
	mov	r1, #0
	ldr	r0, [r7]
	str	r1, [r0]
	ldr	r6, [r7, #60]	; 0x3c
	ldr	r5, [r7, #64]	; 0x40
	bl	OS_DisableInterrupts
	mov	r4, r0
	ldr	r0, [r7, #252]	; 0xfc
	bic	r0, r0, #76	; 0x4c
	str	r0, [r7, #252]	; 0xfc
	add	r0, r7, #244	; 0xf4
	bl	OS_WakeupThread
	ldr	r0, [r7, #252]	; 0xfc
	ands	r0, r0, #16
	beq	_038009E8
	add	r0, r7, #72	; 0x48
	bl	OS_WakeupThreadDirect
_038009E8:
	mov	r0, r4
	bl	OS_RestoreInterrupts
	cmp	r6, #0
	beq	_03800A04
	mov	r0, r5
	mov	lr, pc
	bx	r6
_03800A04:
	mov	r0, r8
	ldmia	sp!, {r4, r5, r6, r7, r8, lr}
	bx	lr
_03800A10:	.word	cardi_common

	arm_func_start CARDi_ReadRomIDCore
CARDi_ReadRomIDCore: ; 0x03800A14
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	mov	r0, #-1207959552	; 0xb8000000
	mov	r1, #0
	bl	CARDi_SetRomOp
	ldr	r0, _03800A70	; =cardi_rom_header_addr
	ldr	r0, [r0]
	ldr	r0, [r0, #96]	; 0x60
	bic	r0, r0, #117440512	; 0x7000000
	orr	r1, r0, #-1493172224	; 0xa7000000
	mov	r0, #8192	; 0x2000
	rsb	r0, r0, #0
	and	r0, r1, r0
	ldr	r1, _03800A74	; =0x040001A4
	str	r0, [r1]
_03800A50:
	ldr	r0, [r1]
	ands	r0, r0, #8388608	; 0x800000
	beq	_03800A50
	ldr	r0, _03800A78	; =0x04100010
	ldr	r0, [r0]
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_03800A70:	.word	cardi_rom_header_addr
_03800A74:	.word	0x040001A4
_03800A78:	.word	0x04100010
_03800A7C:
	bx	lr

	arm_func_start CARDi_SetRomOp
CARDi_SetRomOp: ; 0x03800A80
	ldr	r3, _03800AF8	; =0x040001A4
_03800A84:
	ldr	r2, [r3]
	ands	r2, r2, #-2147483648	; 0x80000000
	bne	_03800A84
	mov	r3, #192	; 0xc0
	ldr	r2, _03800AFC	; =0x040001A1
	strb	r3, [r2]
	mov	r3, r0, lsr #24
	ldr	r2, _03800B00	; =0x040001A8
	strb	r3, [r2]
	mov	r3, r0, lsr #16
	ldr	r2, _03800B04	; =0x040001A9
	strb	r3, [r2]
	mov	r3, r0, lsr #8
	ldr	r2, _03800B08	; =0x040001AA
	strb	r3, [r2]
	ldr	r2, _03800B0C	; =0x040001AB
	strb	r0, [r2]
	mov	r2, r1, lsr #24
	ldr	r0, _03800B10	; =0x040001AC
	strb	r2, [r0]
	mov	r2, r1, lsr #16
	ldr	r0, _03800B14	; =0x040001AD
	strb	r2, [r0]
	mov	r2, r1, lsr #8
	ldr	r0, _03800B18	; =0x040001AE
	strb	r2, [r0]
	ldr	r0, _03800B1C	; =0x040001AF
	strb	r1, [r0]
	bx	lr
_03800AF8:	.word	0x040001A4
_03800AFC:	.word	0x040001A1
_03800B00:	.word	0x040001A8
_03800B04:	.word	0x040001A9
_03800B08:	.word	0x040001AA
_03800B0C:	.word	0x040001AB
_03800B10:	.word	0x040001AC
_03800B14:	.word	0x040001AD
_03800B18:	.word	0x040001AE
_03800B1C:	.word	0x040001AF