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
|
#include "global.h"
#include "text.h"
#include "string_util.h"
// static types
// static declarations
// rodata
extern const u32 gFont3LatinGlyphs[];
// text
// some CSE stuff + register swaps (possibly DUE to CSE)
#ifdef NONMATCHING
void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *buffer)
{
u16 strlen = StringLength(src);
if (bgOverride == 0)
{
u16 i;
for (i = 0; i < strlen; i++)
{
const u8 *glyphs = (const u8 *)(gFont3LatinGlyphs + ((src[i] & 0xfff0) * 16) + ((src[i] & 0xf) * 8));
CpuCopy16(glyphs, dest, 32);
CpuCopy16(glyphs + 0x200, dest + width, 32);
dest += 32;
}
}
else
{
u16 i; // sp18
u16 r9 = 0;
u8 bgHi = bg << 4;
u16 size = strlen * 32;
for (i = 0; i < 2; i++)
{
u16 j;
for (j = 0; j < strlen; j++) // r5
{
const u32 *glyphs = (const u32 *)(gFont3LatinGlyphs + (i * 0x80) + ((src[j] & 0xfff0) * 16) + ((src[j] & 0xf) * 8));
u16 k; // r6
for (k = 0; k < 32; k++)
{
u8 r3 = *glyphs & 0xf0;
u8 r2 = *glyphs & 0x0f;
if (r3 == 0)
{
r3 = bgHi;
}
if (r2 == 0)
{
r2 = bg;
}
buffer[r9++] = r3 | r2;
glyphs++;
}
}
CpuCopy16(buffer, dest, size);
dest += width;
r9 = 0;
}
}
}
#else
NAKED void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *buffer)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tmov r7, r10\n"
"\tmov r6, r9\n"
"\tmov r5, r8\n"
"\tpush {r5-r7}\n"
"\tsub sp, 0x1C\n"
"\tstr r0, [sp]\n"
"\tadds r7, r1, 0\n"
"\tadds r4, r2, 0\n"
"\tldr r0, [sp, 0x3C]\n"
"\tlsls r4, 24\n"
"\tlsrs r4, 24\n"
"\tlsls r3, 16\n"
"\tlsrs r3, 16\n"
"\tstr r3, [sp, 0x4]\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tstr r0, [sp, 0x8]\n"
"\tldr r0, [sp]\n"
"\tbl StringLength\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tmov r8, r0\n"
"\tcmp r4, 0\n"
"\tbne _08095988\n"
"\tmovs r5, 0\n"
"\tcmp r5, r8\n"
"\tbcs _08095A2E\n"
"_0809593E:\n"
"\tldr r1, [sp]\n"
"\tadds r0, r1, r5\n"
"\tldrb r2, [r0]\n"
"\tldr r0, _08095980 @ =0x0000fff0\n"
"\tands r0, r2\n"
"\tlsls r0, 6\n"
"\tmovs r1, 0xF\n"
"\tands r2, r1\n"
"\tlsls r2, 5\n"
"\tadds r0, r2\n"
"\tldr r1, _08095984 @ =gFont3LatinGlyphs\n"
"\tadds r4, r0, r1\n"
"\tadds r0, r4, 0\n"
"\tadds r1, r7, 0\n"
"\tmovs r2, 0x10\n"
"\tbl CpuSet\n"
"\tmovs r2, 0x80\n"
"\tlsls r2, 2\n"
"\tadds r0, r4, r2\n"
"\tldr r3, [sp, 0x4]\n"
"\tadds r1, r7, r3\n"
"\tmovs r2, 0x10\n"
"\tbl CpuSet\n"
"\tadds r7, 0x20\n"
"\tadds r0, r5, 0x1\n"
"\tlsls r0, 16\n"
"\tlsrs r5, r0, 16\n"
"\tcmp r5, r8\n"
"\tbcc _0809593E\n"
"\tb _08095A2E\n"
"\t.align 2, 0\n"
"_08095980: .4byte 0x0000fff0\n"
"_08095984: .4byte gFont3LatinGlyphs\n"
"_08095988:\n"
"\tmovs r0, 0\n"
"\tmov r9, r0\n"
"\tldr r1, [sp, 0x8]\n"
"\tlsls r0, r1, 28\n"
"\tlsrs r0, 24\n"
"\tstr r0, [sp, 0xC]\n"
"\tmov r2, r8\n"
"\tlsls r0, r2, 21\n"
"\tmovs r1, 0\n"
"\tlsrs r0, 1\n"
"\tstr r0, [sp, 0x10]\n"
"_0809599E:\n"
"\tmovs r5, 0\n"
"\tldr r3, [sp, 0x4]\n"
"\tadds r3, r7, r3\n"
"\tstr r3, [sp, 0x14]\n"
"\tadds r0, r1, 0x1\n"
"\tstr r0, [sp, 0x18]\n"
"\tcmp r5, r8\n"
"\tbcs _08095A12\n"
"\tmovs r2, 0xF\n"
"\tmov r12, r2\n"
"\tlsls r1, 9\n"
"\tldr r0, _08095A40 @ =gFont3LatinGlyphs\n"
"\tadds r1, r0\n"
"\tmov r10, r1\n"
"_080959BA:\n"
"\tldr r3, [sp]\n"
"\tadds r0, r3, r5\n"
"\tldrb r1, [r0]\n"
"\tldr r0, _08095A44 @ =0x0000fff0\n"
"\tands r0, r1\n"
"\tlsls r0, 6\n"
"\tmov r2, r12\n"
"\tands r1, r2\n"
"\tlsls r1, 5\n"
"\tadds r0, r1\n"
"\tmov r3, r10\n"
"\tadds r4, r0, r3\n"
"\tmovs r6, 0\n"
"\tadds r5, 0x1\n"
"_080959D6:\n"
"\tldrb r0, [r4]\n"
"\tmovs r3, 0xF0\n"
"\tands r3, r0\n"
"\tmov r2, r12\n"
"\tands r2, r0\n"
"\tcmp r3, 0\n"
"\tbne _080959E6\n"
"\tldr r3, [sp, 0xC]\n"
"_080959E6:\n"
"\tcmp r2, 0\n"
"\tbne _080959EC\n"
"\tldr r2, [sp, 0x8]\n"
"_080959EC:\n"
"\tmov r0, r9\n"
"\tadds r1, r0, 0x1\n"
"\tlsls r1, 16\n"
"\tlsrs r1, 16\n"
"\tmov r9, r1\n"
"\tldr r1, [sp, 0x40]\n"
"\tadds r0, r1, r0\n"
"\torrs r3, r2\n"
"\tstrb r3, [r0]\n"
"\tadds r4, 0x1\n"
"\tadds r0, r6, 0x1\n"
"\tlsls r0, 16\n"
"\tlsrs r6, r0, 16\n"
"\tcmp r6, 0x1F\n"
"\tbls _080959D6\n"
"\tlsls r0, r5, 16\n"
"\tlsrs r5, r0, 16\n"
"\tcmp r5, r8\n"
"\tbcc _080959BA\n"
"_08095A12:\n"
"\tldr r0, [sp, 0x40]\n"
"\tadds r1, r7, 0\n"
"\tldr r3, [sp, 0x10]\n"
"\tlsrs r2, r3, 16\n"
"\tbl CpuSet\n"
"\tldr r7, [sp, 0x14]\n"
"\tmovs r0, 0\n"
"\tmov r9, r0\n"
"\tldr r1, [sp, 0x18]\n"
"\tlsls r0, r1, 16\n"
"\tlsrs r1, r0, 16\n"
"\tcmp r1, 0x1\n"
"\tbls _0809599E\n"
"_08095A2E:\n"
"\tadd sp, 0x1C\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_08095A40: .4byte gFont3LatinGlyphs\n"
"_08095A44: .4byte 0x0000fff0");
}
#endif
void unref_sub_8095A48(const u8 *src, u8 *dest, u8 bgOverride, u8 width, u8 *buffer)
{
u8 tmpBuffer[5];
bool8 r6 = FALSE;
while (!r6)
{
u16 i;
for (i = 0; i < 4; i++)
{
if (*src == EOS)
{
if (i == 0)
{
return;
}
r6 = TRUE;
break;
}
else
{
tmpBuffer[i] = *src++;
}
}
while (i < 4)
{
tmpBuffer[i++] = 0;
}
tmpBuffer[i] = EOS;
sub_8095904(tmpBuffer, dest, bgOverride, 0x80, width, buffer);
dest += 0x100;
}
}
|