summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2021-03-11 22:03:17 +0000
committerred031000 <rubenru09@aol.com>2021-03-11 22:03:17 +0000
commit82b20d5a8badb77010fb5dfc4d20b9282985703a (patch)
treeaa3fcf3e22b0f8b9aea37554e474dc70dfb124b5
parenta4ff58c3adee6e7c11bb6e141ed7e7417983fb43 (diff)
decompile AddTextPrinter
-rw-r--r--arm9/asm/unk_0201BCBC.s159
-rw-r--r--arm9/src/text.c102
-rw-r--r--arm9/src/text_02054590.c4
-rw-r--r--include/text.h17
-rw-r--r--include/text_02054590.h4
5 files changed, 95 insertions, 191 deletions
diff --git a/arm9/asm/unk_0201BCBC.s b/arm9/asm/unk_0201BCBC.s
index b87c3b7b..40471942 100644
--- a/arm9/asm/unk_0201BCBC.s
+++ b/arm9/asm/unk_0201BCBC.s
@@ -11,165 +11,6 @@
.text
- thumb_func_start AddTextPrinter
-AddTextPrinter: ; 0x0201BE98
- push {r3-r7, lr}
- add r7, r0, #0x0
- ldr r0, _0201BFD0 ; =gFonts
- add r6, r1, #0x0
- ldr r0, [r0, #0x0]
- add r5, r2, #0x0
- cmp r0, #0x0
- bne _0201BEAC
- mov r0, #0xff
- pop {r3-r7, pc}
-_0201BEAC:
- mov r0, #0x0
- mov r1, #0x30
- bl AllocFromHeap
- add r4, r0, #0x0
- mov r1, #0x1
- add r0, #0x23
- strb r1, [r0, #0x0]
- add r0, r4, #0x0
- mov r3, #0x0
- add r0, #0x24
- strb r3, [r0, #0x0]
- add r0, r4, #0x0
- add r0, #0x25
- ldrb r2, [r0, #0x0]
- mov r0, #0x7f
- bic r2, r0
- lsl r0, r6, #0x18
- lsr r1, r0, #0x18
- mov r0, #0x7f
- and r0, r1
- add r1, r2, #0x0
- orr r1, r0
- add r0, r4, #0x0
- add r0, #0x25
- strb r1, [r0, #0x0]
- add r0, r4, #0x0
- add r0, #0x26
- strb r3, [r0, #0x0]
- add r0, r4, #0x0
- add r0, #0x27
- strb r3, [r0, #0x0]
- add r0, r4, #0x0
- add r0, #0x29
- strb r3, [r0, #0x0]
- add r1, r3, #0x0
-_0201BEF4:
- add r0, r4, r3
- add r3, r3, #0x1
- strb r1, [r0, #0x1c]
- cmp r3, #0x7
- blt _0201BEF4
- add r3, r7, #0x0
- add r2, r4, #0x0
- ldmia r3!, {r0-r1}
- stmia r2!, {r0-r1}
- ldmia r3!, {r0-r1}
- stmia r2!, {r0-r1}
- ldmia r3!, {r0-r1}
- stmia r2!, {r0-r1}
- ldr r0, [r4, #0x0]
- bl String_c_str
- str r0, [r4, #0x0]
- ldr r0, _0201BFD4 ; =UNK_021C570C
- str r5, [r4, #0x18]
- mov r1, #0x0
- strb r1, [r0, #0x0]
- add r0, r4, #0x0
- bl FUN_0201C1A8
- cmp r6, #0xff
- beq _0201BF74
- cmp r6, #0x0
- beq _0201BF74
- add r0, r4, #0x0
- add r0, #0x25
- ldrb r2, [r0, #0x0]
- mov r1, #0x7f
- add r0, r2, #0x0
- bic r0, r1
- lsl r1, r2, #0x19
- lsr r1, r1, #0x19
- add r1, #0xff
- lsl r1, r1, #0x18
- lsr r2, r1, #0x18
- mov r1, #0x7f
- and r1, r2
- orr r1, r0
- add r0, r4, #0x0
- add r0, #0x25
- strb r1, [r0, #0x0]
- add r0, r4, #0x0
- add r0, #0x25
- ldrb r1, [r0, #0x0]
- mov r0, #0x80
- mov r2, #0x1
- orr r1, r0
- add r0, r4, #0x0
- add r0, #0x25
- strb r1, [r0, #0x0]
- ldr r0, _0201BFD8 ; =FUN_0201BFDC
- add r1, r4, #0x0
- bl FUN_0201BCC8
- add r1, r4, #0x0
- add r1, #0x28
- strb r0, [r1, #0x0]
- add r4, #0x28
- ldrb r0, [r4, #0x0]
- pop {r3-r7, pc}
-_0201BF74:
- add r0, r4, #0x0
- add r0, #0x25
- ldrb r1, [r0, #0x0]
- mov r0, #0x7f
- mov r5, #0x0
- bic r1, r0
- add r0, r4, #0x0
- add r0, #0x25
- strb r1, [r0, #0x0]
- add r0, r4, #0x0
- add r0, #0x25
- ldrb r1, [r0, #0x0]
- mov r0, #0x80
- bic r1, r0
- add r0, r4, #0x0
- add r0, #0x25
- strb r1, [r0, #0x0]
- ldrb r0, [r7, #0x11]
- ldrb r1, [r7, #0x12]
- ldrb r2, [r7, #0x13]
- bl FUN_0201C05C
- mov r7, #0x1
- lsl r7, r7, #0xa
-_0201BFA4:
- add r0, r4, #0x0
- bl RenderFont
- cmp r0, #0x1
- beq _0201BFB4
- add r5, r5, #0x1
- cmp r5, r7
- blo _0201BFA4
-_0201BFB4:
- cmp r6, #0xff
- beq _0201BFBE
- ldr r0, [r4, #0x4]
- bl FUN_020191D0
-_0201BFBE:
- add r0, r4, #0x0
- bl FUN_0201C238
- add r0, r4, #0x0
- bl FreeToHeap
- mov r0, #0x8
- pop {r3-r7, pc}
- nop
-_0201BFD0: .word gFonts
-_0201BFD4: .word UNK_021C570C
-_0201BFD8: .word FUN_0201BFDC
-
thumb_func_start FUN_0201BFDC
FUN_0201BFDC: ; 0x0201BFDC
push {r4, lr}
diff --git a/arm9/src/text.c b/arm9/src/text.c
index 0379769f..ccc86bab 100644
--- a/arm9/src/text.c
+++ b/arm9/src/text.c
@@ -1,5 +1,6 @@
#include "text.h"
#include "heap.h"
+#include "string16.h"
const struct FontInfo *gFonts = NULL;
@@ -7,19 +8,24 @@ u8 UNK_021C5734[0x200];
u32 UNK_021C5714[8];
u8 UNK_021C570C[8];
-extern u32 FUN_0200CA7C(void *param0, u32 param1, u32 param2);
-extern u16 AddTextPrinter(struct TextPrinterTemplate *template, u32 speed, void (*callback)(void *, u16));
+extern u32 FUN_0200CA7C(void *func, struct TextPrinter *printer, u32 param2);
-extern void *FUN_0201B6C8(void);
+extern struct TextPrinter *FUN_0201B6C8(void);
extern void FUN_0200CAB4(u32 param0);
-extern void FUN_0201C238(void);
+extern void FUN_0201C238(struct TextPrinter *printer);
+
+extern u32 RenderFont(struct TextPrinter *printer);
+extern void FUN_0201C1A8(struct TextPrinter *printer);
+extern FUN_0201BFDC(); //no idea what this is
+extern void FUN_0201C05C(u8 fgColor, u8 bgColor, u8 shadowColor);
+extern void FUN_020191D0(u32 windowId);
THUMB_FUNC void SetFontsPointer(const struct FontInfo *fonts)
{
gFonts = fonts;
}
-THUMB_FUNC u8 FUN_0201BCC8(void *param0, u32 param1, u32 param2)
+THUMB_FUNC u8 FUN_0201BCC8(void *func, struct TextPrinter *printer, u32 param2)
{
u32 *r4 = UNK_021C5714;
s32 i;
@@ -29,7 +35,7 @@ THUMB_FUNC u8 FUN_0201BCC8(void *param0, u32 param1, u32 param2)
{
continue;
}
- UNK_021C5714[i] = FUN_0200CA7C(param0, param1, param2);
+ UNK_021C5714[i] = FUN_0200CA7C(func, printer, param2);
if (UNK_021C5714[i] != 0)
{
break;
@@ -52,11 +58,11 @@ THUMB_FUNC void FUN_0201BCFC(u32 param0)
{
return;
}
- void *r5 = FUN_0201B6C8();
- if (r5)
+ struct TextPrinter *printer = FUN_0201B6C8();
+ if (printer)
{
- FUN_0201C238();
- FreeToHeap(r5);
+ FUN_0201C238(printer);
+ FreeToHeap((void *)printer);
}
FUN_0200CAB4(UNK_021C5714[param0]);
UNK_021C5714[param0] = 0;
@@ -85,7 +91,7 @@ THUMB_FUNC void FUN_0201BD7C(u32 param0)
FUN_0201BCFC(param0);
}
-THUMB_FUNC u16 AddTextPrinterParameterized(u32 windowId, u8 fontId, const u8 *str, u32 x, u32 y, u32 speed, void (*callback)(void *, u16))
+THUMB_FUNC u16 AddTextPrinterParameterized(u32 windowId, u8 fontId, const u16 *str, u32 x, u32 y, u32 speed, void (*callback)(struct TextPrinterTemplate *, u16))
{
struct TextPrinterTemplate printerTemplate;
@@ -108,7 +114,7 @@ THUMB_FUNC u16 AddTextPrinterParameterized(u32 windowId, u8 fontId, const u8 *st
return AddTextPrinter(&printerTemplate, speed, callback);
}
-THUMB_FUNC u16 AddTextPrinterParameterized2(u32 windowId, u8 fontId, const u8 *str, u32 x, u32 y, u32 speed, u32 colors, void (*callback)(void *, u16))
+THUMB_FUNC u16 AddTextPrinterParameterized2(u32 windowId, u8 fontId, const u16 *str, u32 x, u32 y, u32 speed, u32 colors, void (*callback)(struct TextPrinterTemplate *, u16))
{
struct TextPrinterTemplate printerTemplate;
@@ -122,16 +128,16 @@ THUMB_FUNC u16 AddTextPrinterParameterized2(u32 windowId, u8 fontId, const u8 *s
printerTemplate.letterSpacing = gFonts[fontId].letterSpacing;
printerTemplate.lineSpacing = gFonts[fontId].lineSpacing;
printerTemplate.unk = gFonts[fontId].unk;
- printerTemplate.fgColor = colors >> 16;
- printerTemplate.shadowColor = colors >> 8;
- printerTemplate.bgColor = colors;
+ printerTemplate.fgColor = (u8)(colors >> 16);
+ printerTemplate.shadowColor = (u8)(colors >> 8);
+ printerTemplate.bgColor = (u8)colors;
printerTemplate.unk2 = 0;
printerTemplate.unk3 = 0;
printerTemplate.unk4 = 255;
return AddTextPrinter(&printerTemplate, speed, callback);
}
-THUMB_FUNC u16 AddTextPrinterParameterized3(u32 windowId, u8 fontId, const u8 *str, u32 x, u32 y, u32 speed, u32 colors, u32 letterSpacing, u32 lineSpacing, void (*callback)(void *, u16))
+THUMB_FUNC u16 AddTextPrinterParameterized3(u32 windowId, u8 fontId, const u16 *str, u32 x, u32 y, u32 speed, u32 colors, u32 letterSpacing, u32 lineSpacing, void (*callback)(struct TextPrinterTemplate *, u16))
{
struct TextPrinterTemplate printerTemplate;
@@ -142,14 +148,68 @@ THUMB_FUNC u16 AddTextPrinterParameterized3(u32 windowId, u8 fontId, const u8 *s
printerTemplate.y = (u8)y;
printerTemplate.currentX = (u8)x;
printerTemplate.currentY = (u8)y;
- printerTemplate.letterSpacing = letterSpacing;
- printerTemplate.lineSpacing = lineSpacing;
+ printerTemplate.letterSpacing = (u8)letterSpacing;
+ printerTemplate.lineSpacing = (u8)lineSpacing;
printerTemplate.unk = gFonts[fontId].unk;
- printerTemplate.fgColor = colors >> 16;
- printerTemplate.shadowColor = colors >> 8;
- printerTemplate.bgColor = colors;
+ printerTemplate.fgColor = (u8)(colors >> 16);
+ printerTemplate.shadowColor = (u8)(colors >> 8);
+ printerTemplate.bgColor = (u8)colors;
printerTemplate.unk2 = 0;
printerTemplate.unk3 = 0;
printerTemplate.unk4 = 255;
return AddTextPrinter(&printerTemplate, speed, callback);
}
+
+THUMB_FUNC u16 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u32 speed, void (*callback)(struct TextPrinterTemplate *, u16))
+{
+ if (!gFonts)
+ return 0xff;
+
+ struct TextPrinter *printer = (struct TextPrinter *)AllocFromHeap(0, sizeof(struct TextPrinter));
+
+ printer->active = TRUE;
+ printer->state = 0;
+ printer->textSpeedBottom = (u8)speed;
+ printer->delayCounter = 0;
+ printer->scrollDistance = 0;
+ printer->japanese = 0;
+
+ for (s32 i = 0; i < 7; i++)
+ {
+ printer->subStructFields[i] = 0;
+ }
+
+ printer->printerTemplate = *printerTemplate;
+ printer->printerTemplate.currentChar = String_c_str((struct String *)printer->printerTemplate.currentChar); //TODO clean up
+ printer->callback = callback;
+ UNK_021C570C[0] = 0;
+ FUN_0201C1A8(printer);
+ if (speed != 0xff && speed != 0)
+ {
+ printer->textSpeedBottom += 0xff;
+ printer->textSpeedTop = 1;
+ printer->minLetterSpacing = FUN_0201BCC8(FUN_0201BFDC, printer, 1);
+ return printer->minLetterSpacing;
+ }
+ else
+ {
+ u32 j = 0;
+ printer->textSpeedBottom = 0;
+ printer->textSpeedTop = 0;
+ FUN_0201C05C(printerTemplate->fgColor, printerTemplate->bgColor, printerTemplate->shadowColor); //GenerateFontHalfRowLookupTable ?
+ for (; j < 0x400; ++j)
+ {
+ if (RenderFont(printer) == 1)
+ {
+ break;
+ }
+ }
+ if (speed != 0xff)
+ {
+ FUN_020191D0(printer->printerTemplate.windowId); // CopyWindowToVram?
+ }
+ FUN_0201C238(printer);
+ FreeToHeap((void *)printer);
+ return 8;
+ }
+}
diff --git a/arm9/src/text_02054590.c b/arm9/src/text_02054590.c
index 393ac3b2..470a2fe3 100644
--- a/arm9/src/text_02054590.c
+++ b/arm9/src/text_02054590.c
@@ -55,7 +55,7 @@ THUMB_FUNC void FUN_0205464C(u32 *param0)
FUN_02019620(param0, 15);
}
-THUMB_FUNC u16 FUN_02054658(u8 windowId, const u8 *str, struct Options *options, u8 param3)
+THUMB_FUNC u16 FUN_02054658(u8 windowId, const u16 *str, struct Options *options, u8 param3)
{
FUN_02002B60(param3);
FUN_02002B7C(0);
@@ -63,7 +63,7 @@ THUMB_FUNC u16 FUN_02054658(u8 windowId, const u8 *str, struct Options *options,
return AddTextPrinterParameterized(windowId, 1, str, 0, 0, (u32)Options_GetTextFrameDelay(options), NULL);
}
-THUMB_FUNC u16 DrawFieldMessage(u8 windowId, const u8 *str, u8 fontId, u32 speed, u8 a4, u32 a5)
+THUMB_FUNC u16 DrawFieldMessage(u8 windowId, const u16 *str, u8 fontId, u32 speed, u8 a4, u32 a5)
{
FUN_02002B60(a4);
FUN_02002B7C(a5);
diff --git a/include/text.h b/include/text.h
index edc5f58c..fab36565 100644
--- a/include/text.h
+++ b/include/text.h
@@ -5,7 +5,7 @@
struct TextPrinterTemplate
{
- const u8* currentChar;
+ const u16* currentChar;
u32 windowId;
u8 padding[1];
u8 fontId;
@@ -33,11 +33,13 @@ struct TextPrinter
u8 subStructFields[7]; // always cast to struct TextPrinterSubStruct... so why bother
u8 active;
u8 state; // 0x1C
- u8 textSpeed;
+ u8 textSpeedBottom:7;
+ u8 textSpeedTop:1;
u8 delayCounter;
u8 scrollDistance;
u8 minLetterSpacing; // 0x20
u8 japanese;
+ u8 padding[6];
};
struct FontInfo
@@ -53,14 +55,15 @@ struct FontInfo
};
void SetFontsPointer(const struct FontInfo *fonts);
-u8 FUN_0201BCC8(void *param0, u32 param1, u32 param2);
+u8 FUN_0201BCC8(void *func, struct TextPrinter *printer, u32 param2);
void FUN_0201BCFC(u32 param0);
BOOL FUN_0201BD44(u32 param0);
void FUN_0201BD5C(void);
u8 FUN_0201BD70(u32 param0);
-void FUN_0201BCFC(u32 param0);
-u16 AddTextPrinterParameterized(u32 windowId, u8 fontId, const u8 *str, u32 x, u32 y, u32 speed, void (*callback)(void *, u16));
-u16 AddTextPrinterParameterized2(u32 windowId, u8 fontId, const u8 *str, u32 x, u32 y, u32 speed, u32 colors, void (*callback)(void *, u16));
-u16 AddTextPrinterParameterized3(u32 windowId, u8 fontId, const u8 *str, u32 x, u32 y, u32 speed, u32 colors, u32 letterSpacing, u32 lineSpacing, void (*callback)(void *, u16));
+void FUN_0201BD7C(u32 param0);
+u16 AddTextPrinterParameterized(u32 windowId, u8 fontId, const u16 *str, u32 x, u32 y, u32 speed, void (*callback)(struct TextPrinterTemplate *, u16));
+u16 AddTextPrinterParameterized2(u32 windowId, u8 fontId, const u16 *str, u32 x, u32 y, u32 speed, u32 colors, void (*callback)(struct TextPrinterTemplate *, u16));
+u16 AddTextPrinterParameterized3(u32 windowId, u8 fontId, const u16 *str, u32 x, u32 y, u32 speed, u32 colors, u32 letterSpacing, u32 lineSpacing, void (*callback)(struct TextPrinterTemplate *, u16));
+u16 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u32 speed, void (*callback)(struct TextPrinterTemplate *, u16));
#endif //POKEDIAMOND_TEXT_H
diff --git a/include/text_02054590.h b/include/text_02054590.h
index 401fa11f..725bd9b4 100644
--- a/include/text_02054590.h
+++ b/include/text_02054590.h
@@ -8,8 +8,8 @@ void FUN_02054590(u32 param0, u32 param1);
void FUN_020545B8(u32 param0, u32 param1, u32 param2);
void FUN_02054608(u32 *param0, struct Options *options);
void FUN_0205464C(u32 *param0);
-u16 FUN_02054658(u8 windowId, const u8 *str, struct Options *options, u8 param3);
-u16 DrawFieldMessage(u8 windowId, const u8 *str, u8 fontId, u32 speed, u8 a4, u32 a5);
+u16 FUN_02054658(u8 windowId, const u16 *str, struct Options *options, u8 param3);
+u16 DrawFieldMessage(u8 windowId, const u16 *str, u8 fontId, u32 speed, u8 a4, u32 a5);
u8 FUN_020546C8(u32 param0);
void FUN_020546E0(u32 param0, u32 param1, u32 param2, u32 param3);
void FUN_02054744(u32 *param0, u32 param1, u32 param2);