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

    .text

	arm_func_start CARDi_TaskThread
CARDi_TaskThread: ; 0x03800B20
	stmdb	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
	sub	sp, sp, #4
	ldr	r9, _03800D28	; =cardi_common
	add	r5, r9, #72	; 0x48
	mov	r8, #0
	add	r7, r9, #252	; 0xfc
	mov	r6, #1
	mov	r4, #3
	mov	fp, #11
_03800B44:
	mov	sl, r8
	bl	OS_DisableInterrupts
	str	r0, [sp]
_03800B50:
	ldr	r0, [r9, #252]	; 0xfc
	ands	r0, r0, #4
	bne	_03800B88
	ldr	r0, [r9, #252]	; 0xfc
	ands	r0, r0, #16
	beq	_03800B94
	ldr	r0, [r7]
	orr	r0, r0, #4
	str	r0, [r7]
	ldr	r0, [r7]
	bic	r0, r0, #16
	str	r0, [r7]
	mov	sl, r6
	b	_03800BA4
_03800B88:
	ldr	r0, [r9, #252]	; 0xfc
	ands	r0, r0, #8
	bne	_03800BA4
_03800B94:
	str	r5, [r9, #236]	; 0xec
	mov	r0, r8
	bl	OS_SleepThread
	b	_03800B50
_03800BA4:
	ldr	r0, [sp]
	bl	OS_RestoreInterrupts
	cmp	sl, #0
	beq	_03800D14
	ldr	r0, [r9]
	str	r8, [r0]
	ldr	r2, [r9]
	ldr	r1, [r2, #76]	; 0x4c
	ldr	r0, [r9, #4]
	mov	r0, r6, lsl r0
	ands	r0, r1, r0
	streq	r4, [r2]
	ldr	r0, [r9, #4]
	cmp	r0, #12
	addls	pc, pc, r0, lsl #2
	b	_03800CB8
	b	_03800CC0
	b	_03800CC0
	b	_03800C18
	b	_03800C20
	b	_03800C30
	b	_03800CB8
	b	_03800C3C
	b	_03800C54
	b	_03800C6C
	b	_03800C84
	b	_03800CB8
	b	_03800C9C
	b	_03800CB0
_03800C18:
	bl	CARDi_InitStatusRegister
	b	_03800CC0
_03800C20:
	bl	CARDi_ReadRomIDCore
	ldr	r1, [r9]
	str	r0, [r1, #8]
	b	_03800CC0
_03800C30:
	ldr	r0, [r9]
	str	r4, [r0]
	b	_03800CC0
_03800C3C:
	ldr	r2, [r9]
	ldr	r0, [r2, #12]
	ldr	r1, [r2, #16]
	ldr	r2, [r2, #20]
	bl	CARDi_ReadBackupCore
	b	_03800CC0
_03800C54:
	ldr	r2, [r9]
	ldr	r0, [r2, #16]
	ldr	r1, [r2, #12]
	ldr	r2, [r2, #20]
	bl	CARDi_WriteBackupCore
	b	_03800CC0
_03800C6C:
	ldr	r2, [r9]
	ldr	r0, [r2, #16]
	ldr	r1, [r2, #12]
	ldr	r2, [r2, #20]
	bl	CARDi_ProgramBackupCore
	b	_03800CC0
_03800C84:
	ldr	r2, [r9]
	ldr	r0, [r2, #16]
	ldr	r1, [r2, #12]
	ldr	r2, [r2, #20]
	bl	CARDi_VerifyBackupCore
	b	_03800CC0
_03800C9C:
	ldr	r1, [r9]
	ldr	r0, [r1, #16]
	ldr	r1, [r1, #20]
	bl	CARDi_EraseBackupSectorCore
	b	_03800CC0
_03800CB0:
	bl	CARDi_EraseChipCore
	b	_03800CC0
_03800CB8:
	ldr	r0, [r9]
	str	r4, [r0]
_03800CC0:
	mov	r0, fp
	mov	r1, r6
	mov	r2, r6
	bl	PXI_SendWordByFifo
	cmp	r0, #0
	blt	_03800CC0
	bl	OS_DisableInterrupts
	mov	sl, r0
	ldr	r0, [r9, #252]	; 0xfc
	bic	r0, r0, #76	; 0x4c
	str	r0, [r9, #252]	; 0xfc
	add	r0, r9, #244	; 0xf4
	bl	OS_WakeupThread
	ldr	r0, [r9, #252]	; 0xfc
	ands	r0, r0, #16
	beq	_03800D08
	mov	r0, r5
	bl	OS_WakeupThreadDirect
_03800D08:
	mov	r0, sl
	bl	OS_RestoreInterrupts
	b	_03800B44
_03800D14:
	mov	r0, r9
	ldr	r1, [r9, #68]	; 0x44
	mov	lr, pc
	bx	r1
	b	_03800B44
_03800D28:	.word	cardi_common