diff --git a/Makefile b/Makefile index 9530a56aee..4823283c08 100644 --- a/Makefile +++ b/Makefile @@ -578,7 +578,7 @@ EGCS_O_FILES += $(BUILD_DIR)/src/boot/z_std_dma.o # EGCS_O_FILES += $(BUILD_DIR)/src/code/z_actor.o EGCS_O_FILES += $(BUILD_DIR)/src/code/z_common_data.o EGCS_O_FILES += $(BUILD_DIR)/src/code/z_construct.o -# EGCS_O_FILES += $(BUILD_DIR)/src/code/z_kanfont.o +EGCS_O_FILES += $(BUILD_DIR)/src/code/z_kanfont.o # EGCS_O_FILES += $(BUILD_DIR)/src/code/z_message.o EGCS_O_FILES += $(BUILD_DIR)/src/code/z_parameter.o EGCS_O_FILES += $(BUILD_DIR)/src/code/z_sram.o diff --git a/include/functions.h b/include/functions.h index f89ce3a0af..6984ea1634 100644 --- a/include/functions.h +++ b/include/functions.h @@ -74,6 +74,9 @@ void CutsceneFlags_Unset(PlayState* play, s16 flag); s32 CutsceneFlags_Get(PlayState* play, s16 flag); s32 Kanji_OffsetFromShiftJIS(s32 character); +#if PLATFORM_IQUE +void Font_LoadCharCHN(Font* font, u16 character, u16 codePointIndex); +#endif void Font_LoadCharWide(Font* font, u16 character, u16 codePointIndex); void Font_LoadChar(Font* font, u8 character, u16 codePointIndex); void Font_LoadMessageBoxIcon(Font* font, u16 icon); diff --git a/include/message_data_static.h b/include/message_data_static.h index 2b08302731..15e93ec475 100644 --- a/include/message_data_static.h +++ b/include/message_data_static.h @@ -47,9 +47,6 @@ typedef struct MessageTableEntry { #define DEFINE_MESSAGE_FFFC(textId, type, yPos, jpnMessage, nesMessage, gerMessage, fraMessage) \ DEFINE_MESSAGE_JPN(textId, type, yPos, jpnMessage, nesMessage, gerMessage, fraMessage) - -#define FONT_MESSAGE_OFFSET (_message_0xFFFC_jpn - (const char*)_jpn_message_data_staticSegmentStart) -#define FONT_MESSAGE_LENGTH (_message_0xFFFD_jpn - _message_0xFFFC_jpn) #else #define DEFINE_MESSAGE_NES(textId, type, yPos, jpnMessage, nesMessage, gerMessage, fraMessage) \ extern const char _message_##textId##_nes[]; \ @@ -61,9 +58,6 @@ typedef struct MessageTableEntry { #define DEFINE_MESSAGE_FFFC(textId, type, yPos, jpnMessage, nesMessage, gerMessage, fraMessage) \ DEFINE_MESSAGE_NES(textId, type, yPos, jpnMessage, nesMessage, gerMessage, fraMessage) - -#define FONT_MESSAGE_OFFSET (_message_0xFFFC_nes - (const char*)_nes_message_data_staticSegmentStart) -#define FONT_MESSAGE_LENGTH (_message_0xFFFD_nes - _message_0xFFFC_nes) #endif #define DEFINE_MESSAGE(textId, type, yPos, jpnMessage, nesMessage, gerMessage, fraMessage) \ diff --git a/src/code/z_kanfont.c b/src/code/z_kanfont.c index 4093f775a9..985e2d52fa 100644 --- a/src/code/z_kanfont.c +++ b/src/code/z_kanfont.c @@ -19,13 +19,21 @@ void Font_LoadCharWide(Font* font, u16 character, u16 codePointIndex) { * at `codePointIndex`. The value of `character` is the ASCII codepoint subtract ' '/0x20. */ void Font_LoadChar(Font* font, u8 character, u16 codePointIndex) { - u8 charTmp = character; + s32 offset = character * FONT_CHAR_TEX_SIZE; - DMA_REQUEST_SYNC(&font->charTexBuf[codePointIndex], - (uintptr_t)_nes_font_staticSegmentRomStart + charTmp * FONT_CHAR_TEX_SIZE, FONT_CHAR_TEX_SIZE, - "../z_kanfont.c", 93); + DMA_REQUEST_SYNC(&font->charTexBuf[codePointIndex], (uintptr_t)_nes_font_staticSegmentRomStart + offset, + FONT_CHAR_TEX_SIZE, "../z_kanfont.c", 93); } +#if PLATFORM_IQUE +void Font_LoadCharCHN(Font* font, u16 character, u16 codePointIndex) { + s32 offset = character * FONT_CHAR_TEX_SIZE; + + DMA_REQUEST_SYNC(&font->charTexBuf[codePointIndex], (uintptr_t)_nes_font_staticSegmentRomStart + offset, + FONT_CHAR_TEX_SIZE, "../z_kanfont.c", UNK_LINE); +} +#endif + /** * Loads a message box icon from message_static, such as the ending triangle/square or choice arrow into the * icon buffer. @@ -48,18 +56,23 @@ void Font_LoadOrderedFont(Font* font) { s32 codePointIndex; s32 fontBufIndex; u32 offset; + const char* messageDataStart; + u16* msgBufWide; - font->msgOffset = FONT_MESSAGE_OFFSET; - size = font->msgLength = FONT_MESSAGE_LENGTH; - -#if OOT_NTSC +#if OOT_NTSC && !PLATFORM_IQUE + messageDataStart = (const char*)_jpn_message_data_staticSegmentStart; + font->msgOffset = _message_0xFFFC_jpn - messageDataStart; + size = font->msgLength = _message_0xFFFD_jpn - _message_0xFFFC_jpn; len = (u32)size / 2; DMA_REQUEST_SYNC(font->msgBufWide, (uintptr_t)_jpn_message_data_staticSegmentRomStart + font->msgOffset, size, "../z_kanfont.c", UNK_LINE); + PRINTF("msg_data=%x, msg_data0=%x jj=%x\n", font->msgOffset, font->msgLength, len); + fontBufIndex = 0; for (codePointIndex = 0; font->msgBufWide[codePointIndex] != MESSAGE_WIDE_END; codePointIndex++) { if (len < codePointIndex) { + PRINTF(T("ERROR!! エラー!!! error───!!!!\n", "ERROR!! Error!!! error───!!!!\n")); return; } @@ -70,7 +83,10 @@ void Font_LoadOrderedFont(Font* font) { fontBufIndex += FONT_CHAR_TEX_SIZE / 8; } } -#else +#elif OOT_PAL + messageDataStart = (const char*)_nes_message_data_staticSegmentStart; + font->msgOffset = _message_0xFFFC_nes - messageDataStart; + size = font->msgLength = _message_0xFFFD_nes - _message_0xFFFC_nes; len = size; DMA_REQUEST_SYNC(font->msgBuf, (uintptr_t)_nes_message_data_staticSegmentRomStart + font->msgOffset, len, "../z_kanfont.c", 122); @@ -93,5 +109,31 @@ void Font_LoadOrderedFont(Font* font) { fontBufIndex += FONT_CHAR_TEX_SIZE / 8; } } +#elif PLATFORM_IQUE + messageDataStart = (const char*)_jpn_message_data_staticSegmentStart; + font->msgOffset = _message_0xFFFC_jpn - messageDataStart; + size = font->msgLength = _message_0xFFFD_jpn - _message_0xFFFC_jpn; + len = (u32)size / 2; + DMA_REQUEST_SYNC(font->msgBufWide, (uintptr_t)_jpn_message_data_staticSegmentRomStart + font->msgOffset, size, + "../z_kanfont.c", UNK_LINE); + + PRINTF("msg_data=%x, msg_data0=%x jj=%x\n", font->msgOffset, font->msgLength, len); + + // Workaround for EGCS bug + msgBufWide = font->msgBufWide; + fontBufIndex = 0; + for (codePointIndex = 0; msgBufWide[codePointIndex] != MESSAGE_WIDE_END; codePointIndex++) { + if (len < codePointIndex) { + PRINTF(T("ERROR!! エラー!!! error───!!!!\n", "ERROR!! Error!!! error───!!!!\n")); + return; + } + + if (msgBufWide[codePointIndex] != MESSAGE_WIDE_NEWLINE) { + offset = Kanji_OffsetFromShiftJIS(msgBufWide[codePointIndex]); + DMA_REQUEST_SYNC(&font->fontBuf[fontBufIndex * 8], (uintptr_t)_kanjiSegmentRomStart + offset, + FONT_CHAR_TEX_SIZE, "../z_kanfont.c", UNK_LINE); + fontBufIndex += FONT_CHAR_TEX_SIZE / 8; + } + } #endif } diff --git a/tools/disasm/ique-cn/functions.txt b/tools/disasm/ique-cn/functions.txt index 0cbe54456d..1afd8b8b50 100644 --- a/tools/disasm/ique-cn/functions.txt +++ b/tools/disasm/ique-cn/functions.txt @@ -1191,6 +1191,7 @@ KaleidoSetup_Init = 0x8006261C; // type:func KaleidoSetup_Destroy = 0x80062770; // type:func Font_LoadCharWide = 0x80062780; // type:func Font_LoadChar = 0x800627D0; // type:func +Font_LoadCharCHN = 0x8006280C; // type:func Font_LoadMessageBoxIcon = 0x80062848; // type:func Font_LoadOrderedFont = 0x8006287C; // type:func Environment_ZBufValToFixedPoint = 0x80062980; // type:func