Finish decompiling internation_string_util.c

This commit is contained in:
Marcus Huderle 2018-11-27 17:21:23 -06:00
parent 0cdd1cc1da
commit 9fafa63743
9 changed files with 249 additions and 420 deletions

View File

@ -1,355 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_81DB41C
sub_81DB41C: @ 81DB41C
push {r4-r7,lr}
adds r4, r0, 0
ldr r1, [r4]
movs r7, 0
movs r6, 0
ldrh r0, [r4, 0xC]
cmp r7, r0
bge _081DB44C
adds r5, r1, 0
_081DB42E:
ldrb r0, [r4, 0x17]
lsls r0, 26
lsrs r0, 26
ldr r1, [r5]
movs r2, 0
bl GetStringWidth
cmp r0, r7
ble _081DB442
adds r7, r0, 0
_081DB442:
adds r5, 0x8
adds r6, 0x1
ldrh r0, [r4, 0xC]
cmp r6, r0
blt _081DB42E
_081DB44C:
ldrb r0, [r4, 0x12]
adds r1, r7, r0
adds r0, r1, 0
adds r0, 0x9
cmp r0, 0
bge _081DB45A
adds r0, 0x7
_081DB45A:
asrs r0, 3
cmp r0, 0x1C
ble _081DB462
movs r0, 0x1C
_081DB462:
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end sub_81DB41C
thumb_func_start CopyMonCategoryText
CopyMonCategoryText: @ 81DB468
push {lr}
adds r2, r0, 0
adds r0, r1, 0
lsls r2, 5
ldr r1, =gPokedexEntries
adds r2, r1
adds r1, r2, 0
bl StringCopy
movs r1, 0
strb r1, [r0]
adds r0, 0x1
ldr r1, =gText_Pokemon
bl StringCopy
pop {r0}
bx r0
.pool
thumb_func_end CopyMonCategoryText
thumb_func_start sub_81DB494
sub_81DB494: @ 81DB494
push {r4-r7,lr}
adds r6, r1, 0
adds r5, r2, 0
adds r7, r3, 0
cmp r5, 0
beq _081DB4B6
adds r1, r5, 0
bl StringCopy
adds r4, r0, 0
lsls r0, r6, 24
lsrs r0, 24
adds r1, r5, 0
movs r2, 0
bl GetStringWidth
b _081DB4BA
_081DB4B6:
adds r4, r0, 0
movs r0, 0
_081DB4BA:
subs r3, r7, r0
cmp r3, 0
ble _081DB4D4
movs r0, 0xFC
strb r0, [r4]
adds r4, 0x1
movs r0, 0x11
strb r0, [r4]
adds r4, 0x1
strb r3, [r4]
adds r4, 0x1
movs r0, 0xFF
strb r0, [r4]
_081DB4D4:
adds r0, r4, 0
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end sub_81DB494
thumb_func_start PadNameString
PadNameString: @ 81DB4DC
push {r4,r5,lr}
adds r4, r0, 0
lsls r1, 24
lsrs r5, r1, 24
bl StripExtCtrlCodes
adds r0, r4, 0
bl StringLength
lsls r0, 24
lsrs r1, r0, 24
cmp r5, 0xFC
bne _081DB51A
cmp r1, 0x5
bhi _081DB51E
movs r3, 0xFC
movs r2, 0x7
_081DB4FE:
adds r0, r4, r1
strb r3, [r0]
strb r2, [r0, 0x1]
adds r0, r1, 0x2
lsls r0, 24
lsrs r1, r0, 24
cmp r1, 0x5
bls _081DB4FE
b _081DB51E
_081DB510:
adds r0, r4, r1
strb r5, [r0]
adds r0, r1, 0x1
lsls r0, 24
lsrs r1, r0, 24
_081DB51A:
cmp r1, 0x5
bls _081DB510
_081DB51E:
adds r1, r4, r1
movs r0, 0xFF
strb r0, [r1]
pop {r4,r5}
pop {r0}
bx r0
thumb_func_end PadNameString
thumb_func_start sub_81DB52C
sub_81DB52C: @ 81DB52C
push {r4,lr}
adds r4, r0, 0
bl StringLength
lsls r0, 16
lsrs r0, 16
cmp r0, 0x5
bhi _081DB546
adds r0, r4, 0
movs r1, 0x1
bl ConvertInternationalString
b _081DB54C
_081DB546:
adds r0, r4, 0
bl StripExtCtrlCodes
_081DB54C:
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_81DB52C
thumb_func_start sub_81DB554
sub_81DB554: @ 81DB554
push {r4,r5,lr}
adds r4, r0, 0
lsls r1, 24
lsrs r5, r1, 24
bl StringLength
lsls r0, 16
lsrs r0, 16
cmp r0, 0x5
bhi _081DB572
adds r0, r4, 0
movs r1, 0x1
bl ConvertInternationalString
b _081DB5A4
_081DB572:
cmp r5, 0xFC
bne _081DB57E
adds r0, r4, 0
bl StripExtCtrlCodes
b _081DB5A4
_081DB57E:
adds r1, r4, 0
b _081DB584
_081DB582:
adds r1, 0x1
_081DB584:
ldrb r0, [r1, 0x1]
cmp r0, 0xFF
bne _081DB582
cmp r1, r4
bcc _081DB5A4
ldrb r0, [r1]
cmp r0, r5
bne _081DB5A4
movs r2, 0xFF
_081DB596:
strb r2, [r1]
subs r1, 0x1
cmp r1, r4
bcc _081DB5A4
ldrb r0, [r1]
cmp r0, r5
beq _081DB596
_081DB5A4:
pop {r4,r5}
pop {r0}
bx r0
thumb_func_end sub_81DB554
thumb_func_start sub_81DB5AC
sub_81DB5AC: @ 81DB5AC
push {lr}
adds r2, r0, 0
ldrb r0, [r2]
adds r2, 0x1
cmp r0, 0xFC
bne _081DB5E4
ldrb r0, [r2]
adds r2, 0x1
cmp r0, 0x15
bne _081DB5E4
b _081DB5CE
_081DB5C2:
cmp r1, 0xFC
bne _081DB5CC
ldrb r0, [r2, 0x1]
cmp r0, 0x16
beq _081DB5E4
_081DB5CC:
adds r2, 0x1
_081DB5CE:
ldrb r1, [r2]
adds r0, r1, 0
cmp r0, 0xFF
bne _081DB5C2
movs r0, 0xFC
strb r0, [r2]
adds r2, 0x1
movs r0, 0x16
strb r0, [r2]
movs r0, 0xFF
strb r0, [r2, 0x1]
_081DB5E4:
pop {r0}
bx r0
thumb_func_end sub_81DB5AC
thumb_func_start TVShowConvertInternationalString
TVShowConvertInternationalString: @ 81DB5E8
push {r4,r5,lr}
adds r5, r0, 0
adds r4, r2, 0
bl StringCopy
lsls r4, 24
lsrs r4, 24
adds r0, r5, 0
adds r1, r4, 0
bl ConvertInternationalString
pop {r4,r5}
pop {r0}
bx r0
thumb_func_end TVShowConvertInternationalString
thumb_func_start sub_81DB604
sub_81DB604: @ 81DB604
push {lr}
adds r1, r0, 0
ldrb r0, [r1]
cmp r0, 0xFC
bne _081DB618
ldrb r0, [r1, 0x1]
cmp r0, 0x15
bne _081DB618
movs r0, 0x1
b _081DB61A
_081DB618:
movs r0, 0x2
_081DB61A:
pop {r1}
bx r1
thumb_func_end sub_81DB604
thumb_func_start sub_81DB620
sub_81DB620: @ 81DB620
push {r4-r7,lr}
sub sp, 0x4
lsls r4, r0, 1
adds r4, r0
lsls r4, 2
ldr r0, =gWindows
adds r4, r0
lsls r7, r3, 5
ldrb r0, [r4, 0x3]
lsls r6, r0, 5
muls r2, r6
ldr r0, [r4, 0x8]
adds r0, r2
lsls r1, 5
adds r5, r0, r1
ldr r0, [sp, 0x18]
cmp r0, 0
ble _081DB66C
adds r4, r0, 0
_081DB646:
ldr r0, =0x11111111
str r0, [sp]
adds r2, r7, 0
cmp r2, 0
bge _081DB652
adds r2, 0x3
_081DB652:
lsls r2, 9
lsrs r2, 11
movs r0, 0x80
lsls r0, 17
orrs r2, r0
mov r0, sp
adds r1, r5, 0
bl CpuFastSet
adds r5, r6
subs r4, 0x1
cmp r4, 0
bne _081DB646
_081DB66C:
add sp, 0x4
pop {r4-r7}
pop {r0}
bx r0
.pool
thumb_func_end sub_81DB620
.align 2, 0 @ Don't pad with nop.

View File

@ -2,22 +2,23 @@
#define GUARD_INTERNATIONAL_STRING_UTIL_H
#include "menu.h"
#include "list_menu.h"
void sub_81DB52C(const u8 *src);
void TVShowConvertInternationalString(u8 *dest, const u8 *src, u8 language);
s32 GetStringCenterAlignXOffset(s32 fontId, const u8 *str, s32 totalWidth);
s32 GetStringRightAlignXOffset(s32 fontId, const u8 *str, s32 totalWidth);
s32 GetStringCenterAlignXOffsetWithLetterSpacing(s32 fontId, const u8 *str, s32 totalWidth, s32 letterSpacing);
s32 GetStringWidthDifference(s32 fontId, const u8 *str, s32 totalWidth, s32 letterSpacing);
s32 GetMaxWidthInMenuTable(const struct MenuAction *str, s32 arg1);
s32 sub_81DB3D8(const struct MenuAction *str, const u8* arg1, s32 arg2);
// sub_81DB41C
// CopyMonCategoryText
// sub_81DB494
void PadNameString(u8 *dst, u8 padWith);
void sub_81DB52C(u8 *src);
void TVShowConvertInternationalString(u8 *dest, const u8 *src, int language);
int GetStringCenterAlignXOffset(int fontId, const u8 *str, int totalWidth);
int GetStringRightAlignXOffset(int fontId, const u8 *str, int totalWidth);
int GetStringCenterAlignXOffsetWithLetterSpacing(int fontId, const u8 *str, int totalWidth, int letterSpacing);
int GetStringWidthDifference(int fontId, const u8 *str, int totalWidth, int letterSpacing);
int GetMaxWidthInMenuTable(const struct MenuAction *str, int arg1);
int sub_81DB3D8(const struct MenuAction *str, const u8* arg1, int arg2);
int sub_81DB41C(const struct ListMenuTemplate *listMenu);
void CopyMonCategoryText(int dexNum, u8 *dest);
u8 *sub_81DB494(u8 *str, int fontId, u8 *str2, int totalStringWidth);
void PadNameString(u8 *dest, u8 padChar);
void sub_81DB554(u8 *, u8);
void sub_81DB5AC(u8 *);
u32 sub_81DB604(const u8 *);
// sub_81DB620
int sub_81DB604(u8 *);
void sub_81DB620(int windowId, int columnStart, int rowStart, int numFillTiles, int numRows);
#endif // GUARD_INTERNATIONAL_STRING_UTIL_H

View File

@ -4,13 +4,6 @@
extern u8 gUnknown_030060B0;
extern void (*gUnknown_030060B4)(void);
void ResetPokedex(void);
void CopyMonCategoryText(u32 species, u8 *dst);
u16 GetPokedexHeightWeight(u16 dexNum, u8 data);
u16 GetNationalPokedexCount(u8);
u16 GetHoennPokedexCount(u8);
u8 CreateDexDisplayMonDataTask(u16 dexNum, u32 trainerId, u32 personality);
enum
{
FLAG_GET_SEEN,
@ -19,6 +12,24 @@ enum
FLAG_SET_CAUGHT
};
struct PokedexEntry
{
/*0x00*/ u8 categoryName[12];
/*0x0C*/ u16 height; //in decimeters
/*0x0E*/ u16 weight; //in hectograms
/*0x10*/ const u8 *description;
/*0x14*/ u16 unused;
/*0x16*/ u16 pokemonScale;
/*0x18*/ u16 pokemonOffset;
/*0x1A*/ u16 trainerScale;
/*0x1C*/ u16 trainerOffset;
}; /*size = 0x20*/
void ResetPokedex(void);
u16 GetPokedexHeightWeight(u16 dexNum, u8 data);
u16 GetNationalPokedexCount(u8);
u16 GetHoennPokedexCount(u8);
u8 CreateDexDisplayMonDataTask(u16 dexNum, u32 trainerId, u32 personality);
s8 GetSetPokedexFlag(u16 nationalNum, u8 caseId);
u16 sub_80C0E9C(u16, s16, s16, u16);

View File

@ -89,6 +89,13 @@
#define EXT_CTRL_CODE_COLOR 0x1
#define EXT_CTRL_CODE_HIGHLIGHT 0x2
#define EXT_CTRL_CODE_SHADOW 0x3
//
#define EXT_CTRL_CODE_UNKNOWN_7 0x7
//
#define EXT_CTRL_CODE_CLEAR 0x11
//
#define EXT_CTRL_CODE_JPN 0x15
#define EXT_CTRL_CODE_ENG 0x16
#define TEXT_COLOR_TRANSPARENT 0x0
#define TEXT_COLOR_WHITE 0x1
@ -102,9 +109,6 @@
// battle placeholders are located in battle_message.h
#define EXT_CTRL_CODE_JPN 0x15
#define EXT_CTRL_CODE_ENG 0x16
#define NUM_TEXT_PRINTERS 32
#define TEXT_SPEED_FF 0xFF

View File

@ -297,7 +297,6 @@ SECTIONS {
src/gym_leader_rematch.o(.text);
src/unk_transition.o(.text);
src/international_string_util.o(.text);
asm/international_string_util.o(.text);
} =0
script_data :

View File

@ -1,40 +1,46 @@
#include "global.h"
#include "text.h"
#include "international_string_util.h"
#include "list_menu.h"
#include "pokedex.h"
#include "script_menu.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
#include "window.h"
extern s32 convert_pixel_width_to_tile_width(s32 a0); // script menu
extern const struct PokedexEntry gPokedexEntries[];
s32 GetStringCenterAlignXOffset(s32 fontId, const u8 *str, s32 totalWidth)
int GetStringCenterAlignXOffset(int fontId, const u8 *str, int totalWidth)
{
return GetStringCenterAlignXOffsetWithLetterSpacing(fontId, str, totalWidth, 0);
}
s32 GetStringRightAlignXOffset(s32 fontId, const u8 *str, s32 totalWidth)
int GetStringRightAlignXOffset(int fontId, const u8 *str, int totalWidth)
{
return GetStringWidthDifference(fontId, str, totalWidth, 0);
}
s32 GetStringCenterAlignXOffsetWithLetterSpacing(s32 fontId, const u8 *str, s32 totalWidth, s32 letterSpacing)
int GetStringCenterAlignXOffsetWithLetterSpacing(int fontId, const u8 *str, int totalWidth, int letterSpacing)
{
return GetStringWidthDifference(fontId, str, totalWidth, letterSpacing) / 2;
}
s32 GetStringWidthDifference(s32 fontId, const u8 *str, s32 totalWidth, s32 letterSpacing)
int GetStringWidthDifference(int fontId, const u8 *str, int totalWidth, int letterSpacing)
{
s32 stringWidth = GetStringWidth(fontId, str, letterSpacing);
int stringWidth = GetStringWidth(fontId, str, letterSpacing);
if (totalWidth > stringWidth)
return totalWidth - stringWidth;
else
return 0;
}
s32 GetMaxWidthInMenuTable(const struct MenuAction *str, s32 arg1)
int GetMaxWidthInMenuTable(const struct MenuAction *str, int arg1)
{
s32 i, var;
int i, var;
for (var = 0, i = 0; i < arg1; i++)
{
s32 stringWidth = GetStringWidth(1, str[i].text, 0);
int stringWidth = GetStringWidth(1, str[i].text, 0);
if (stringWidth > var)
var = stringWidth;
}
@ -42,16 +48,192 @@ s32 GetMaxWidthInMenuTable(const struct MenuAction *str, s32 arg1)
return convert_pixel_width_to_tile_width(var);
}
s32 sub_81DB3D8(const struct MenuAction *str, const u8* arg1, s32 arg2)
int sub_81DB3D8(const struct MenuAction *str, const u8* arg1, int arg2)
{
s32 i, var;
int i, var;
for (var = 0, i = 0; i < arg2; i++)
{
s32 stringWidth = GetStringWidth(1, str[arg1[i]].text, 0);
int stringWidth = GetStringWidth(1, str[arg1[i]].text, 0);
if (stringWidth > var)
var = stringWidth;
}
return convert_pixel_width_to_tile_width(var);
}
int sub_81DB41C(const struct ListMenuTemplate *listMenu)
{
int i, maxWidth, finalWidth;
const struct ListMenuItem *items = listMenu->items;
maxWidth = 0;
for (i = 0; i < listMenu->totalItems; i++)
{
int width = GetStringWidth(listMenu->fontId, items[i].name, 0);
if (width > maxWidth)
maxWidth = width;
}
finalWidth = maxWidth + listMenu->item_X + 9;
if (finalWidth < 0)
finalWidth += 7;
finalWidth >>= 3;
if (finalWidth > 28)
finalWidth = 28;
return finalWidth;
}
void CopyMonCategoryText(int dexNum, u8 *dest)
{
u8 *str = StringCopy(dest, gPokedexEntries[dexNum].categoryName);
*str = CHAR_SPACE;
StringCopy(str + 1, gText_Pokemon);
}
u8 *sub_81DB494(u8 *str, int fontId, u8 *str2, int totalStringWidth)
{
u8 *buffer;
int width;
int clearWidth;
if (str2)
{
buffer = StringCopy(str, str2);
width = GetStringWidth(fontId, str2, 0);
}
else
{
buffer = str;
width = 0;
}
clearWidth = totalStringWidth - width;
if (clearWidth > 0)
{
*buffer = EXT_CTRL_CODE_BEGIN;
buffer++;
*buffer = EXT_CTRL_CODE_CLEAR;
buffer++;
*buffer = clearWidth;
buffer++;
*buffer = EOS;
}
return buffer;
}
void PadNameString(u8 *dest, u8 padChar)
{
u8 length;
StripExtCtrlCodes(dest);
length = StringLength(dest);
if (padChar == EXT_CTRL_CODE_BEGIN)
{
while (length < PLAYER_NAME_LENGTH - 1)
{
dest[length] = EXT_CTRL_CODE_BEGIN;
dest[length + 1] = EXT_CTRL_CODE_UNKNOWN_7;
length += 2;
}
}
else
{
while (length < PLAYER_NAME_LENGTH - 1)
{
dest[length] = padChar;
length++;
}
}
dest[length] = EOS;
}
void sub_81DB52C(u8 *str)
{
if (StringLength(str) < PLAYER_NAME_LENGTH - 1)
ConvertInternationalString(str, LANGUAGE_JAPANESE);
else
StripExtCtrlCodes(str);
}
void sub_81DB554(u8 *str, u8 arg1)
{
u8 *buffer;
if (StringLength(str) < PLAYER_NAME_LENGTH - 1)
{
ConvertInternationalString(str, LANGUAGE_JAPANESE);
}
else if (arg1 == EXT_CTRL_CODE_BEGIN)
{
StripExtCtrlCodes(str);
}
else
{
buffer = str;
while (buffer[1] != EOS)
buffer++;
while (buffer >= str && buffer[0] == arg1)
{
buffer[0] = EOS;
buffer--;
}
}
}
void sub_81DB5AC(u8 *str)
{
if (*str++ == EXT_CTRL_CODE_BEGIN && *str++ == EXT_CTRL_CODE_JPN)
{
while (*str != EOS)
{
if (str[0] == EXT_CTRL_CODE_BEGIN && str[1] == EXT_CTRL_CODE_ENG)
return;
str++;
}
*str++ = EXT_CTRL_CODE_BEGIN;
*str++ = EXT_CTRL_CODE_ENG;
*str = EOS;
}
}
void TVShowConvertInternationalString(u8 *dest, const u8 *src, int language)
{
StringCopy(dest, src);
ConvertInternationalString(dest, language);
}
int sub_81DB604(u8 *str)
{
if (str[0] == EXT_CTRL_CODE_BEGIN && str[1] == EXT_CTRL_CODE_JPN)
return LANGUAGE_JAPANESE;
else
return LANGUAGE_ENGLISH;
}
void sub_81DB620(int windowId, int columnStart, int rowStart, int numFillTiles, int numRows)
{
u8 *windowTileData;
int fillSize, windowRowSize, rowsToFill;
struct Window *window = &gWindows[windowId];
fillSize = numFillTiles * TILE_SIZE_4BPP;
windowRowSize = window->window.width * TILE_SIZE_4BPP;
windowTileData = window->tileData + (rowStart * windowRowSize) + (columnStart * TILE_SIZE_4BPP);
if (numRows > 0)
{
rowsToFill = numRows;
while (rowsToFill)
{
CpuFastFill8(0x11, windowTileData, fillSize);
windowTileData += windowRowSize;
rowsToFill--;
}
}
}

View File

@ -42,19 +42,6 @@ static EWRAM_DATA struct PokedexListItem *gUnknown_02039B54 = NULL;
u8 gUnknown_030060B0;
void (*gUnknown_030060B4)(void);
struct PokedexEntry
{
/*0x00*/ u8 categoryName[12];
/*0x0C*/ u16 height; //in decimeters
/*0x0E*/ u16 weight; //in hectograms
/*0x10*/ const u8 *description;
/*0x14*/ u16 unused;
/*0x16*/ u16 pokemonScale;
/*0x18*/ u16 pokemonOffset;
/*0x1A*/ u16 trainerScale;
/*0x1C*/ u16 trainerOffset;
}; /*size = 0x20*/
struct UnknownStruct2
{
const u8 *text1;

View File

@ -1848,7 +1848,7 @@ static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src)
if (mail->message.itemId != 0)
{
if (mail->gameLanguage != LANGUAGE_JAPANESE)
PadNameString(mail->OT_name, 0xFC);
PadNameString(mail->OT_name, EXT_CTRL_CODE_BEGIN);
ConvertInternationalString(mail->monName, mail->monLanguage);
}

View File

@ -1539,7 +1539,7 @@ u16 RenderText(struct TextPrinter *textPrinter)
subStruct->glyphId = *textPrinter->printerTemplate.currentChar;
textPrinter->printerTemplate.currentChar++;
return 2;
case 7:
case EXT_CTRL_CODE_UNKNOWN_7:
return 2;
case 8:
textPrinter->delayCounter = *textPrinter->printerTemplate.currentChar;
@ -1591,7 +1591,7 @@ u16 RenderText(struct TextPrinter *textPrinter)
case 24:
m4aMPlayContinue(&gMPlayInfo_BGM);
return 2;
case 17:
case EXT_CTRL_CODE_CLEAR:
width = *textPrinter->printerTemplate.currentChar;
textPrinter->printerTemplate.currentChar++;
if (width > 0)
@ -1622,10 +1622,10 @@ u16 RenderText(struct TextPrinter *textPrinter)
case 20:
textPrinter->minLetterSpacing = *textPrinter->printerTemplate.currentChar++;
return 2;
case 21:
case EXT_CTRL_CODE_JPN:
textPrinter->japanese = 1;
return 2;
case 22:
case EXT_CTRL_CODE_ENG:
textPrinter->japanese = 0;
return 2;
}
@ -1810,12 +1810,12 @@ u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
case 0x14:
++strPos;
break;
case 0x7:
case EXT_CTRL_CODE_UNKNOWN_7:
case 0x9:
case 0xA:
case 0xF:
case 0x15:
case 0x16:
case EXT_CTRL_CODE_JPN:
case EXT_CTRL_CODE_ENG:
default:
break;
}
@ -1970,13 +1970,13 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
case 0x14:
minGlyphWidth = *++str;
break;
case 0x15:
case EXT_CTRL_CODE_JPN:
isJapanese = 1;
break;
case 0x16:
case EXT_CTRL_CODE_ENG:
isJapanese = 0;
break;
case 0x7:
case EXT_CTRL_CODE_UNKNOWN_7:
case 0x9:
case 0xA:
case 0xF:
@ -2096,12 +2096,12 @@ u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str)
case 0x14:
++strPos;
break;
case 0x7:
case EXT_CTRL_CODE_UNKNOWN_7:
case 0x9:
case 0xA:
case 0xF:
case 0x15:
case 0x16:
case EXT_CTRL_CODE_JPN:
case EXT_CTRL_CODE_ENG:
default:
continue;
}