summaryrefslogtreecommitdiff
path: root/arm9/asm/NNS_G2D_g2d_font.s
blob: 162fe423c6b670c08f4a0ec5d76dbbc66a0aeb20 (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
	.include "asm/macros.inc"
	.include "global.inc"

	.section .text

	arm_func_start NNSi_G2dFontGetTextRect
NNSi_G2dFontGetTextRect: ; 0x020B5ABC
	stmdb sp!, {r4-r9,lr}
	sub sp, sp, #0xc
	add r5, sp, #0x0
	mov r4, #0x0
	str r4, [r5, #0x0]
	str r4, [r5, #0x4]
	mov r8, r2
	ldr r2, [sp, #0x28]
	mov r5, r0
	mov r9, r1
	mov r4, r3
	cmp r2, #0x0
	mov r7, #0x1
	beq _020B5B24
	add r6, sp, #0x28
_020B5AF8:
	mov r0, r9
	mov r1, r8
	mov r3, r6
	bl NNSi_G2dFontGetStringWidth
	ldr r1, [sp, #0x0]
	ldr r2, [sp, #0x28]
	cmp r0, r1
	strgt r0, [sp, #0x0]
	add r7, r7, #0x1
	cmp r2, #0x0
	bne _020B5AF8
_020B5B24:
	ldr r0, [r9, #0x0]
	sub r2, r7, #0x1
	ldrsb r1, [r0, #0x1]
	ldr r0, [sp, #0x0]
	add r1, r4, r1
	mul r1, r2, r1
	sub r1, r1, r4
	str r1, [sp, #0x4]
	str r0, [r5, #0x0]
	str r1, [r5, #0x4]
	add sp, sp, #0xc
	ldmia sp!, {r4-r9,pc}
	arm_func_end NNSi_G2dFontGetTextRect

	arm_func_start NNSi_G2dFontGetTextHeight
NNSi_G2dFontGetTextHeight: ; 0x020B5B54
	stmdb sp!, {r4-r8,lr}
	sub sp, sp, #0x10
	str r2, [sp, #0x0]
	add r3, sp, #0x4
	mov r2, #0x0
	str r2, [r3, #0x0]
	mov r8, r0
	str r2, [r3, #0x4]
	ldr r7, [r8, #0x4]
	add r0, sp, #0x0
	mov r5, r1
	mov r4, #0x1
	blx r7
	cmp r0, #0x0
	beq _020B5BAC
	add r6, sp, #0x0
_020B5B94:
	cmp r0, #0xa
	mov r0, r6
	addeq r4, r4, #0x1
	blx r7
	cmp r0, #0x0
	bne _020B5B94
_020B5BAC:
	ldr r0, [r8, #0x0]
	ldrsb r0, [r0, #0x1]
	add r0, r5, r0
	mul r0, r4, r0
	sub r0, r0, r5
	add sp, sp, #0x10
	ldmia sp!, {r4-r8,pc}
	arm_func_end NNSi_G2dFontGetTextHeight

	arm_func_start NNSi_G2dFontGetStringWidth
NNSi_G2dFontGetStringWidth: ; 0x020B5BC8
	stmdb sp!, {r4-r10,lr}
	sub sp, sp, #0x8
	mov r8, r0
	str r2, [sp, #0x0]
	ldr r4, [r8, #0x4]
	add r0, sp, #0x0
	mov r7, r1
	mov r6, r3
	mov r5, #0x0
	blx r4
	movs r1, r0
	beq _020B5C58
	ldr sb, _020B5C84 ; =0x0000FFFF
	add r10, sp, #0x0
_020B5C00:
	cmp r1, #0xa
	beq _020B5C58
	mov r0, r8
	bl NNS_G2dFontFindGlyphIndex
	mov r1, r0
	cmp r1, r9
	ldreq r0, [r8, #0x0]
	ldreqh r1, [r0, #0x2]
	mov r0, r8
	bl NNS_G2dFontGetCharWidthsFromIndex
	ldrh r1, [r8, #0x8]
	cmp r1, #0x0
	ldrnesb r1, [r0, #0x0]
	ldrneb r0, [r0, #0x1]
	addne r0, r1, r0
	ldreqsb r0, [r0, #0x2]
	add r1, r7, r0
	mov r0, r10
	add r5, r5, r1
	blx r4
	movs r1, r0
	bne _020B5C00
_020B5C58:
	cmp r6, #0x0
	beq _020B5C70
	cmp r1, #0xa
	ldreq r0, [sp, #0x0]
	movne r0, #0x0
	str r0, [r6, #0x0]
_020B5C70:
	cmp r5, #0x0
	subgt r5, r5, r7
	mov r0, r5
	add sp, sp, #0x8
	ldmia sp!, {r4-r10,pc}
	.balign 4
_020B5C84: .word 0x0000FFFF
	arm_func_end NNSi_G2dFontGetStringWidth

	arm_func_start NNS_G2dFontGetCharWidthsFromIndex
NNS_G2dFontGetCharWidthsFromIndex: ; 0x020B5C88
	stmdb sp!, {lr}
	sub sp, sp, #0x4
	ldr r3, [r0, #0x0]
	ldr lr, [r3, #0xc]
	cmp lr, #0x0
	beq _020B5CD8
_020B5CA0:
	ldrh r12, [lr, #0x0]
	cmp r12, r1
	bhi _020B5CCC
	ldrh r2, [lr, #0x2]
	cmp r1, r2
	ldrlsh r2, [r0, #0xa]
	addls r3, lr, #0x8
	subls r0, r1, r12
	mlals r0, r2, r0, r3
	addls sp, sp, #0x4
	ldmlsia sp!, {pc}
_020B5CCC:
	ldr lr, [lr, #0x4]
	cmp lr, #0x0
	bne _020B5CA0
_020B5CD8:
	add r0, r3, #0x4
	add sp, sp, #0x4
	ldmia sp!, {pc}
	arm_func_end NNS_G2dFontGetCharWidthsFromIndex

	arm_func_start NNS_G2dFontFindGlyphIndex
NNS_G2dFontFindGlyphIndex: ; 0x020B5CE4
	stmdb sp!, {lr}
	sub sp, sp, #0x4
	ldr r0, [r0, #0x0]
	ldr r0, [r0, #0x10]
	cmp r0, #0x0
	beq _020B5D2C
_020B5CFC:
	ldrh r2, [r0, #0x0]
	cmp r2, r1
	bhi _020B5D20
	ldrh r2, [r0, #0x2]
	cmp r1, r2
	bhi _020B5D20
	bl GetGlyphIndex
	add sp, sp, #0x4
	ldmia sp!, {pc}
_020B5D20:
	ldr r0, [r0, #0x8]
	cmp r0, #0x0
	bne _020B5CFC
_020B5D2C:
	ldr r0, _020B5D38 ; =0x0000FFFF
	add sp, sp, #0x4
	ldmia sp!, {pc}
	.balign 4
_020B5D38: .word 0x0000FFFF
	arm_func_end NNS_G2dFontFindGlyphIndex

	arm_func_start NNS_G2dFontInitUTF16
NNS_G2dFontInitUTF16: ; 0x020B5D3C
	stmdb sp!, {r4,lr}
	mov r4, r0
	mov r0, r1
	mov r1, r4
	bl NNSi_G2dGetUnpackedFont
	sub r0, r0, #0x1
	strh r0, [r4, #0x8]
	ldrh r0, [r4, #0x8]
	cmp r0, #0x0
	movne r1, #0x2
	moveq r1, #0x3
	ldr r0, _020B5D78 ; =NNSi_G2dSplitCharUTF16
	strh r1, [r4, #0xa]
	str r0, [r4, #0x4]
	ldmia sp!, {r4,pc}
	.balign 4
_020B5D78: .word NNSi_G2dSplitCharUTF16
	arm_func_end NNS_G2dFontInitUTF16

	arm_func_start GetGlyphIndex
GetGlyphIndex: ; 0x020B5D7C
	stmdb sp!, {lr}
	sub sp, sp, #0x4
	ldrh r3, [r0, #0x4]
	ldr r2, _020B5E4C ; =0x0000FFFF
	cmp r3, #0x0
	beq _020B5DA8
	cmp r3, #0x1
	beq _020B5DC4
	cmp r3, #0x2
	beq _020B5DD8
	b _020B5E40
_020B5DA8:
	ldrh r2, [r0, #0x0]
	ldrh r3, [r0, #0xc]
	sub r0, r1, r2
	add r0, r3, r0
	mov r0, r0, lsl #0x10
	mov r2, r0, lsr #0x10
	b _020B5E40
_020B5DC4:
	ldrh r2, [r0, #0x0]
	sub r1, r1, r2
	add r0, r0, r1, lsl #0x1
	ldrh r2, [r0, #0xc]
	b _020B5E40
_020B5DD8:
	ldrh r3, [r0, #0xc]
	add r0, r0, #0xc
	add r0, r0, #0x2
	sub r3, r3, #0x1
	add lr, r0, r3, lsl #0x2
	cmp r0, lr
	bhi _020B5E40
_020B5DF4:
	sub r12, lr, r0
	mov r3, r12, asr #0x1
	add r3, r12, r3, lsr #0x1e
	mov r3, r3, asr #0x2
	add r3, r3, r3, lsr #0x1f
	mov r12, r3, asr #0x1
	mov r3, r12, lsl #0x2
	ldrh r3, [r0, r3]
	add r12, r0, r12, lsl #0x2
	cmp r3, r1
	addcc r0, r12, #0x4
	blo _020B5E38
	cmp r1, r3
	subcc lr, r12, #0x4
	blo _020B5E38
	ldrh r2, [r12, #0x2]
	b _020B5E40
_020B5E38:
	cmp r0, lr
	bls _020B5DF4
_020B5E40:
	mov r0, r2
	add sp, sp, #0x4
	ldmia sp!, {pc}
	.balign 4
_020B5E4C: .word 0x0000FFFF
	arm_func_end GetGlyphIndex