summaryrefslogtreecommitdiff
path: root/arm7/asm/PXI_fifo.s
blob: a6e60692cc3ac2b384a38d9dd30f6e4f3555fae1 (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 _03807958
_03807958: ;0x03807958
	.space 0x0380795C - 0x03807958

	.global _0380795C
_0380795C: ;0x0380795C
	.space 0x038079DC - 0x0380795C

    .section .text

	arm_func_start PXIi_HandlerRecvFifoNotEmpty
PXIi_HandlerRecvFifoNotEmpty: ; 0x037FB5BC
	stmdb	sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
	sub	sp, sp, #8
	ldr	sl, _037FB6D0	; =0x04000184
	ldr	r5, _037FB6D4	; =_0380795C
	mov	r7, #68157440	; 0x4100000
	mov	r6, #0
	mvn	r8, #3
	mvn	r9, #2
	ldr	r4, _037FB6D8	; =0x04000188
_037FB5E0:
	ldrh	r0, [sl]
	ands	r0, r0, #16384	; 0x4000
	ldrneh	r0, [sl]
	orrne	r0, r0, #49152	; 0xc000
	strneh	r0, [sl]
	movne	r1, r9
	bne	_037FB628
	bl	OS_DisableInterrupts
	ldrh	r1, [sl]
	ands	r1, r1, #256	; 0x100
	beq	_037FB618
	bl	OS_RestoreInterrupts
	mov	r1, r8
	b	_037FB628
_037FB618:
	ldr	r1, [r7]
	str	r1, [sp]
	bl	OS_RestoreInterrupts
	mov	r1, r6
_037FB628:
	cmp	r1, r8
	beq	_037FB6C4
	mvn	r0, #2
	cmp	r1, r0
	beq	_037FB5E0
	ldr	r2, [sp]
	mov	r0, r2, lsl #27
	movs	r0, r0, lsr #27
	beq	_037FB5E0
	ldr	r3, [r5, r0, lsl #2]
	cmp	r3, #0
	beq	_037FB670
	mov	r1, r2, lsr #6
	mov	r2, r2, lsl #26
	mov	r2, r2, lsr #31
	mov	lr, pc
	bx	r3
	b	_037FB5E0
_037FB670:
	mov	r0, r2, lsl #26
	movs	r0, r0, lsr #31
	bne	_037FB5E0
	orr	r0, r2, #32
	str	r0, [sp]
	ldrh	r0, [sl]
	ands	r0, r0, #16384	; 0x4000
	ldrneh	r0, [sl]
	orrne	r0, r0, #49152	; 0xc000
	strneh	r0, [sl]
	bne	_037FB5E0
	bl	OS_DisableInterrupts
	ldrh	r1, [sl]
	ands	r1, r1, #2
	beq	_037FB6B4
	bl	OS_RestoreInterrupts
	b	_037FB5E0
_037FB6B4:
	ldr	r1, [sp]
	str	r1, [r4]
	bl	OS_RestoreInterrupts
	b	_037FB5E0
_037FB6C4:
	add	sp, sp, #8
	ldmia	sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
	bx	lr
_037FB6D0:	.word	0x04000184
_037FB6D4:	.word	_0380795C
_037FB6D8:	.word	0x04000188

	arm_func_start PXI_SendWordByFifo
PXI_SendWordByFifo: ; 0x037FB6DC
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	ldr	r3, [sp]
	bic	r3, r3, #31
	and	r0, r0, #31
	orr	r0, r3, r0
	str	r0, [sp]
	bic	r3, r0, #32
	and	r0, r2, #1
	orr	r0, r3, r0, lsl #5
	str	r0, [sp]
	and	r2, r0, #63	; 0x3f
	bic	r0, r1, #-67108864	; 0xfc000000
	orr	r0, r2, r0, lsl #6
	str	r0, [sp]
	ldr	r1, _037FB778	; =0x04000184
	ldrh	r0, [r1]
	ands	r0, r0, #16384	; 0x4000
	ldrneh	r0, [r1]
	orrne	r0, r0, #49152	; 0xc000
	strneh	r0, [r1]
	mvnne	r0, #0
	bne	_037FB76C
	bl	OS_DisableInterrupts
	ldr	r1, _037FB778	; =0x04000184
	ldrh	r1, [r1]
	ands	r1, r1, #2
	beq	_037FB758
	bl	OS_RestoreInterrupts
	mvn	r0, #1
	b	_037FB76C
_037FB758:
	ldr	r2, [sp]
	ldr	r1, _037FB77C	; =0x04000188
	str	r2, [r1]
	bl	OS_RestoreInterrupts
	mov	r0, #0
_037FB76C:
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_037FB778:	.word	0x04000184
_037FB77C:	.word	0x04000188

	arm_func_start PXI_IsCallbackReady
PXI_IsCallbackReady: ; 0x037FB780
	mov	r3, #1
	mov	r2, r3, lsl r0
	ldr	r0, _037FB7A4	; =0x027FFC00
	add	r0, r0, r1, lsl #2
	ldr	r0, [r0, #904]	; 0x388
	ands	r0, r2, r0
	moveq	r3, #0
	mov	r0, r3
	bx	lr
_037FB7A4:	.word	0x027FFC00

	arm_func_start PXI_SetFifoRecvCallback
PXI_SetFifoRecvCallback: ; 0x037FB7A8
	stmdb	sp!, {r4, r5, lr}
	sub	sp, sp, #4
	mov	r4, r0
	mov	r5, r1
	bl	OS_DisableInterrupts
	ldr	r1, _037FB80C	; =_0380795C
	str	r5, [r1, r4, lsl #2]
	cmp	r5, #0
	beq	_037FB7E4
	ldr	r3, _037FB810	; =0x027FFC00
	ldr	r2, [r3, #908]	; 0x38c
	mov	r1, #1
	orr	r1, r2, r1, lsl r4
	str	r1, [r3, #908]	; 0x38c
	b	_037FB7FC
_037FB7E4:
	ldr	r3, _037FB810	; =0x027FFC00
	ldr	r2, [r3, #908]	; 0x38c
	mov	r1, #1
	mvn	r1, r1, lsl r4
	and	r1, r2, r1
	str	r1, [r3, #908]	; 0x38c
_037FB7FC:
	bl	OS_RestoreInterrupts
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, lr}
	bx	lr
_037FB80C:	.word	_0380795C
_037FB810:	.word	0x027FFC00

	arm_func_start PXI_InitFifo
PXI_InitFifo: ; 0x037FB814
	stmdb	sp!, {r4, r5, r6, r7, r8, lr}
	bl	OS_DisableInterrupts
	mov	r5, r0
	ldr	r0, _037FB8D4	; =_03807958
	ldrh	r1, [r0]
	cmp	r1, #0
	bne	_037FB8C4
	mov	r1, #1
	strh	r1, [r0]
	mov	r2, #0
	ldr	r0, _037FB8D8	; =0x027FFC00
	str	r2, [r0, #908]	; 0x38c
	mov	r1, r2
	ldr	r0, _037FB8DC	; =_0380795C
_037FB84C:
	str	r1, [r0, r2, lsl #2]
	add	r2, r2, #1
	cmp	r2, #32
	blt	_037FB84C
	ldr	r1, _037FB8E0	; =0x0000C408
	ldr	r0, _037FB8E4	; =0x04000184
	strh	r1, [r0]
	mov	r0, #262144	; 0x40000
	bl	OS_ResetRequestIrqMask
	mov	r0, #262144	; 0x40000
	ldr	r1, _037FB8E8	; =PXIi_HandlerRecvFifoNotEmpty
	bl	OS_SetIrqFunction
	mov	r0, #262144	; 0x40000
	bl	OS_EnableIrqMask
	mov	r4, #8
	mov	r6, r4
	ldr	r8, _037FB8EC	; =0x04000180
	mov	r7, #1000	; 0x3e8
	b	_037FB8BC
_037FB898:
	mov	r0, r4, lsl #8
	strh	r0, [r8]
	mov	r0, r7
	bl	OS_SpinWait
	ldrh	r0, [r8]
	and	r0, r0, #15
	cmp	r0, r4
	movne	r4, r6
	sub	r4, r4, #1
_037FB8BC:
	cmp	r4, #0
	bge	_037FB898
_037FB8C4:
	mov	r0, r5
	bl	OS_RestoreInterrupts
	ldmia	sp!, {r4, r5, r6, r7, r8, lr}
	bx	lr
_037FB8D4:	.word	_03807958
_037FB8D8:	.word	0x027FFC00
_037FB8DC:	.word	_0380795C
_037FB8E0:	.word	0x0000C408
_037FB8E4:	.word	0x04000184
_037FB8E8:	.word	PXIi_HandlerRecvFifoNotEmpty
_037FB8EC:	.word	0x04000180