diff options
author | red031000 <rubenru09@aol.com> | 2021-03-11 22:03:17 +0000 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2021-03-11 22:03:17 +0000 |
commit | 82b20d5a8badb77010fb5dfc4d20b9282985703a (patch) | |
tree | aa3fcf3e22b0f8b9aea37554e474dc70dfb124b5 | |
parent | a4ff58c3adee6e7c11bb6e141ed7e7417983fb43 (diff) |
decompile AddTextPrinter
-rw-r--r-- | arm9/asm/unk_0201BCBC.s | 159 | ||||
-rw-r--r-- | arm9/src/text.c | 102 | ||||
-rw-r--r-- | arm9/src/text_02054590.c | 4 | ||||
-rw-r--r-- | include/text.h | 17 | ||||
-rw-r--r-- | include/text_02054590.h | 4 |
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); |