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

    .text

	arm_func_start OS_ReadMessage
OS_ReadMessage: ; 0x037F980C
	stmdb	sp!, {r4, r5, r6, r7, r8, lr}
	mov	r6, r0
	mov	r5, r1
	mov	r7, r2
	bl	OS_DisableInterrupts
	mov	r4, r0
	and	r8, r7, #1
	add	r7, r6, #8
	b	_037F9850
_037F9830:
	cmp	r8, #0
	bne	_037F9848
	mov	r0, r4
	bl	OS_RestoreInterrupts
	mov	r0, #0
	b	_037F987C
_037F9848:
	mov	r0, r7
	bl	OS_SleepThread
_037F9850:
	ldr	r0, [r6, #28]
	cmp	r0, #0
	beq	_037F9830
	cmp	r5, #0
	ldrne	r1, [r6, #16]
	ldrne	r0, [r6, #24]
	ldrne	r0, [r1, r0, lsl #2]
	strne	r0, [r5]
	mov	r0, r4
	bl	OS_RestoreInterrupts
	mov	r0, #1
_037F987C:
	ldmia	sp!, {r4, r5, r6, r7, r8, lr}
	bx	lr

	arm_func_start OS_ReceiveMessage
OS_ReceiveMessage: ; 0x037F9884
	stmdb	sp!, {r4, r5, r6, r7, r8, lr}
	mov	r6, r0
	mov	r5, r1
	mov	r7, r2
	bl	OS_DisableInterrupts
	mov	r4, r0
	and	r8, r7, #1
	add	r7, r6, #8
	b	_037F98C8
_037F98A8:
	cmp	r8, #0
	bne	_037F98C0
	mov	r0, r4
	bl	OS_RestoreInterrupts
	mov	r0, #0
	b	_037F991C
_037F98C0:
	mov	r0, r7
	bl	OS_SleepThread
_037F98C8:
	ldr	r0, [r6, #28]
	cmp	r0, #0
	beq	_037F98A8
	cmp	r5, #0
	ldrne	r1, [r6, #16]
	ldrne	r0, [r6, #24]
	ldrne	r0, [r1, r0, lsl #2]
	strne	r0, [r5]
	ldr	r0, [r6, #24]
	add	r0, r0, #1
	ldr	r1, [r6, #20]
	bl	_s32_div_f
	str	r1, [r6, #24]
	ldr	r0, [r6, #28]
	sub	r0, r0, #1
	str	r0, [r6, #28]
	mov	r0, r6
	bl	OS_WakeupThread
	mov	r0, r4
	bl	OS_RestoreInterrupts
	mov	r0, #1
_037F991C:
	ldmia	sp!, {r4, r5, r6, r7, r8, lr}
	bx	lr

	arm_func_start OS_SendMessage
OS_SendMessage: ; 0x037F9924
	stmdb	sp!, {r4, r5, r6, r7, lr}
	sub	sp, sp, #4
	mov	r6, r0
	mov	r5, r1
	mov	r7, r2
	bl	OS_DisableInterrupts
	mov	r4, r0
	and	r7, r7, #1
	b	_037F9968
_037F9948:
	cmp	r7, #0
	bne	_037F9960
	mov	r0, r4
	bl	OS_RestoreInterrupts
	mov	r0, #0
	b	_037F99AC
_037F9960:
	mov	r0, r6
	bl	OS_SleepThread
_037F9968:
	ldr	r2, [r6, #28]
	ldr	r1, [r6, #20]
	cmp	r1, r2
	ble	_037F9948
	ldr	r0, [r6, #24]
	add	r0, r0, r2
	bl	_s32_div_f
	ldr	r0, [r6, #16]
	str	r5, [r0, r1, lsl #2]
	ldr	r0, [r6, #28]
	add	r0, r0, #1
	str	r0, [r6, #28]
	add	r0, r6, #8
	bl	OS_WakeupThread
	mov	r0, r4
	bl	OS_RestoreInterrupts
	mov	r0, #1
_037F99AC:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, lr}
	bx	lr

	arm_func_start OS_InitMessageQueue
OS_InitMessageQueue: ; 0x037F99B8
	mov	ip, #0
	str	ip, [r0, #4]
	ldr	r3, [r0, #4]
	str	r3, [r0]
	str	ip, [r0, #12]
	ldr	r3, [r0, #12]
	str	r3, [r0, #8]
	str	r1, [r0, #16]
	str	r2, [r0, #20]
	str	ip, [r0, #24]
	str	ip, [r0, #28]
	bx	lr