From 540a9ef64e0a9379ab3f717f6d4992ee553ccad5 Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Wed, 20 Sep 2023 05:30:44 -0700 Subject: [PATCH] JUTConsole, JUTException (#1938) --- Progress.md | 28 ++-- .../JUTException/run__12JUTExceptionFv.s | 78 ----------- include/JSystem/JUtility/JUTConsole.h | 12 +- include/JSystem/JUtility/JUTDirectPrint.h | 1 + include/JSystem/JUtility/JUTException.h | 2 +- libs/JSystem/JUtility/JUTConsole.cpp | 124 +++++++++++++++++- libs/JSystem/JUtility/JUTException.cpp | 74 ++++++----- 7 files changed, 182 insertions(+), 137 deletions(-) delete mode 100644 asm/JSystem/JUtility/JUTException/run__12JUTExceptionFv.s diff --git a/Progress.md b/Progress.md index 6bcebba6422..5572520cad6 100644 --- a/Progress.md +++ b/Progress.md @@ -7,22 +7,22 @@ Section | Percentage | Decompiled (bytes) | Total (bytes) .init | 97.972973% | 9280 | 9472 .extab | 100.000000% | 96 | 96 .extabindex | 100.000000% | 96 | 96 -.text | 31.880161% | 1146584 | 3596544 +.text | 33.360248% | 1199816 | 3596544 .ctors | 100.000000% | 448 | 448 .dtors | 100.000000% | 32 | 32 .rodata | 100.000000% | 193856 | 193856 .data | 100.000000% | 197632 | 197632 .sdata | 100.000000% | 1408 | 1408 .sdata2 | 100.000000% | 20832 | 20832 -Total | 39.061132% | 1570520 | 4020672 +Total | 40.385090% | 1623752 | 4020672 ## Total Section | Percentage | Decompiled (bytes) | Total (bytes) ---|---|---|--- -main.dol | 39.061132% | 1570520 | 4020672 -RELs | 34.410518% | 3957288 | 11500228 -Total | 35.615254% | 5527808 | 15520900 +main.dol | 40.385090% | 1623752 | 4020672 +RELs | 34.516071% | 3969460 | 11500324 +Total | 36.036424% | 5593212 | 15520996 ## RELs @@ -54,7 +54,7 @@ d_a_b_yo | 25.613486% | 14404 | 56236 d_a_b_yo_ice | 28.297953% | 5972 | 21104 d_a_b_zant | 22.203940% | 19432 | 87516 d_a_b_zant_magic | 42.453480% | 2464 | 5804 -d_a_b_zant_mobile | 35.841270% | 4516 | 12600 +d_a_b_zant_mobile | 36.326402% | 4612 | 12696 d_a_b_zant_sima | 100.000000% | 4020 | 4020 d_a_balloon_2D | 29.886212% | 3572 | 11952 d_a_bd | 31.115418% | 5780 | 18576 @@ -184,7 +184,7 @@ d_a_econt | 100.000000% | 1464 | 1464 d_a_ep | 30.950696% | 5248 | 16956 d_a_formation_mng | 27.806286% | 3468 | 12472 d_a_fr | 34.866377% | 4488 | 12872 -d_a_grass | 49.074395% | 28312 | 57692 +d_a_grass | 54.690425% | 31552 | 57692 d_a_guard_mng | 100.000000% | 1504 | 1504 d_a_hitobj | 100.000000% | 1640 | 1640 d_a_horse | 22.301298% | 15668 | 70256 @@ -488,7 +488,7 @@ d_a_obj_lv3Candle | 45.638126% | 2260 | 4952 d_a_obj_lv3Water | 44.263566% | 4568 | 10320 d_a_obj_lv3Water2 | 41.786571% | 2788 | 6672 d_a_obj_lv3WaterB | 46.278317% | 1716 | 3708 -d_a_obj_lv3saka00 | 50.576369% | 1404 | 2776 +d_a_obj_lv3saka00 | 100.000000% | 2776 | 2776 d_a_obj_lv3waterEff | 100.000000% | 1704 | 1704 d_a_obj_lv4CandleDemoTag | 80.688935% | 3092 | 3832 d_a_obj_lv4CandleTag | 50.114416% | 1752 | 3496 @@ -502,7 +502,7 @@ d_a_obj_lv4bridge | 47.146866% | 2016 | 4276 d_a_obj_lv4chandelier | 26.284971% | 4848 | 18444 d_a_obj_lv4digsand | 43.888433% | 2140 | 4876 d_a_obj_lv4floor | 100.000000% | 2804 | 2804 -d_a_obj_lv4gear | 42.242704% | 1100 | 2604 +d_a_obj_lv4gear | 100.000000% | 2604 | 2604 d_a_obj_lv4prelvtr | 48.664688% | 1312 | 2696 d_a_obj_lv4prwall | 38.593750% | 1976 | 5120 d_a_obj_lv4sand | 46.461825% | 1996 | 4296 @@ -626,7 +626,7 @@ d_a_obj_swpropeller | 98.552722% | 5720 | 5804 d_a_obj_swpush | 31.657104% | 3752 | 11852 d_a_obj_swpush2 | 34.150019% | 3624 | 10612 d_a_obj_swpush5 | 39.210384% | 2900 | 7396 -d_a_obj_swspinner | 39.141631% | 1824 | 4660 +d_a_obj_swspinner | 100.000000% | 4660 | 4660 d_a_obj_swturn | 31.295716% | 2396 | 7656 d_a_obj_syRock | 38.458961% | 4592 | 11940 d_a_obj_szbridge | 43.280632% | 1752 | 4048 @@ -673,7 +673,7 @@ d_a_obj_wind_stone | 37.702265% | 1864 | 4944 d_a_obj_window | 42.655602% | 2056 | 4820 d_a_obj_wood_pendulum | 44.455748% | 1748 | 3932 d_a_obj_wood_statue | 36.601579% | 3524 | 9628 -d_a_obj_wsword | 48.936170% | 1380 | 2820 +d_a_obj_wsword | 77.021277% | 2172 | 2820 d_a_obj_yel_bag | 33.773087% | 3584 | 10612 d_a_obj_yobikusa | 39.095993% | 3356 | 8584 d_a_obj_yousei | 27.926623% | 4628 | 16572 @@ -741,7 +741,7 @@ d_a_tag_lv2prchk | 100.000000% | 2776 | 2776 d_a_tag_lv5soup | 100.000000% | 1908 | 1908 d_a_tag_lv6CstaSw | 100.000000% | 2560 | 2560 d_a_tag_magne | 100.000000% | 928 | 928 -d_a_tag_mhint | 35.576923% | 1332 | 3744 +d_a_tag_mhint | 55.128205% | 2064 | 3744 d_a_tag_mist | 100.000000% | 2072 | 2072 d_a_tag_mmsg | 100.000000% | 1960 | 1960 d_a_tag_msg | 37.563971% | 1468 | 3908 @@ -754,7 +754,7 @@ d_a_tag_poFire | 100.000000% | 1688 | 1688 d_a_tag_push | 41.000000% | 1148 | 2800 d_a_tag_qs | 34.804270% | 1956 | 5620 d_a_tag_ret_room | 100.000000% | 1684 | 1684 -d_a_tag_river_back | 45.725916% | 1348 | 2948 +d_a_tag_river_back | 100.000000% | 2948 | 2948 d_a_tag_rmbit_sw | 100.000000% | 2204 | 2204 d_a_tag_schedule | 100.000000% | 712 | 712 d_a_tag_setBall | 100.000000% | 880 | 880 @@ -785,4 +785,4 @@ d_a_vrbox2 | 44.907111% | 2804 | 6244 d_a_warp_bug | 100.000000% | 2024 | 2024 d_a_ykgr | 44.400631% | 2252 | 5072 f_pc_profile_lst | 100.000000% | 28156 | 28156 -Total | 34.410518% | 3957288 | 11500228 +Total | 34.516071% | 3969460 | 11500324 diff --git a/asm/JSystem/JUtility/JUTException/run__12JUTExceptionFv.s b/asm/JSystem/JUtility/JUTException/run__12JUTExceptionFv.s deleted file mode 100644 index cc81726a111..00000000000 --- a/asm/JSystem/JUtility/JUTException/run__12JUTExceptionFv.s +++ /dev/null @@ -1,78 +0,0 @@ -lbl_802E1EA8: -/* 802E1EA8 94 21 FF D0 */ stwu r1, -0x30(r1) -/* 802E1EAC 7C 08 02 A6 */ mflr r0 -/* 802E1EB0 90 01 00 34 */ stw r0, 0x34(r1) -/* 802E1EB4 39 61 00 30 */ addi r11, r1, 0x30 -/* 802E1EB8 48 08 03 15 */ bl _savegpr_25 -/* 802E1EBC 7C 7F 1B 78 */ mr r31, r3 -/* 802E1EC0 48 05 7E 01 */ bl PPCMfmsr -/* 802E1EC4 38 00 F6 FF */ li r0, -2305 -/* 802E1EC8 7C 63 00 38 */ and r3, r3, r0 -/* 802E1ECC 48 05 7D FD */ bl PPCMtmsr -/* 802E1ED0 3C 60 80 3D */ lis r3, sMessageQueue__12JUTException@ha /* 0x803CC620@ha */ -/* 802E1ED4 38 63 C6 20 */ addi r3, r3, sMessageQueue__12JUTException@l /* 0x803CC620@l */ -/* 802E1ED8 38 8D 83 70 */ la r4, sMessageBuffer__12JUTException(r13) /* 804508F0-_SDA_BASE_ */ -/* 802E1EDC 38 A0 00 01 */ li r5, 1 -/* 802E1EE0 48 05 CA B5 */ bl OSInitMessageQueue -/* 802E1EE4 3C 60 80 3D */ lis r3, sMessageQueue__12JUTException@ha /* 0x803CC620@ha */ -/* 802E1EE8 3B C3 C6 20 */ addi r30, r3, sMessageQueue__12JUTException@l /* 0x803CC620@l */ -lbl_802E1EEC: -/* 802E1EEC 7F C3 F3 78 */ mr r3, r30 -/* 802E1EF0 38 81 00 08 */ addi r4, r1, 8 -/* 802E1EF4 38 A0 00 01 */ li r5, 1 -/* 802E1EF8 48 05 CB C5 */ bl OSReceiveMessage -/* 802E1EFC 38 60 00 00 */ li r3, 0 -/* 802E1F00 48 06 A2 E1 */ bl VISetPreRetraceCallback -/* 802E1F04 38 60 00 00 */ li r3, 0 -/* 802E1F08 48 06 A3 1D */ bl VISetPostRetraceCallback -/* 802E1F0C 80 61 00 08 */ lwz r3, 8(r1) -/* 802E1F10 83 A3 00 00 */ lwz r29, 0(r3) -/* 802E1F14 A3 83 00 04 */ lhz r28, 4(r3) -/* 802E1F18 83 63 00 08 */ lwz r27, 8(r3) -/* 802E1F1C 83 43 00 0C */ lwz r26, 0xc(r3) -/* 802E1F20 83 23 00 10 */ lwz r25, 0x10(r3) -/* 802E1F24 28 1C 00 11 */ cmplwi r28, 0x11 -/* 802E1F28 40 80 00 0C */ bge lbl_802E1F34 -/* 802E1F2C 80 1B 00 04 */ lwz r0, 4(r27) -/* 802E1F30 90 1F 00 A0 */ stw r0, 0xa0(r31) -lbl_802E1F34: -/* 802E1F34 48 06 B9 05 */ bl VIGetCurrentFrameBuffer -/* 802E1F38 90 7F 00 7C */ stw r3, 0x7c(r31) -/* 802E1F3C 80 1F 00 7C */ lwz r0, 0x7c(r31) -/* 802E1F40 28 00 00 00 */ cmplwi r0, 0 -/* 802E1F44 40 82 00 0C */ bne lbl_802E1F50 -/* 802E1F48 80 6D 8F 88 */ lwz r3, sErrorManager__12JUTException(r13) -/* 802E1F4C 48 00 1A BD */ bl createFB__12JUTExceptionFv -lbl_802E1F50: -/* 802E1F50 80 6D 8F 88 */ lwz r3, sErrorManager__12JUTException(r13) -/* 802E1F54 80 63 00 80 */ lwz r3, 0x80(r3) -/* 802E1F58 80 9F 00 7C */ lwz r4, 0x7c(r31) -/* 802E1F5C A0 A3 00 04 */ lhz r5, 4(r3) -/* 802E1F60 A0 C3 00 06 */ lhz r6, 6(r3) -/* 802E1F64 48 00 26 09 */ bl changeFrameBuffer__14JUTDirectPrintFPvUsUs -/* 802E1F68 28 1D 00 00 */ cmplwi r29, 0 -/* 802E1F6C 41 82 00 20 */ beq lbl_802E1F8C -/* 802E1F70 7F 83 E3 78 */ mr r3, r28 -/* 802E1F74 7F 64 DB 78 */ mr r4, r27 -/* 802E1F78 7F 45 D3 78 */ mr r5, r26 -/* 802E1F7C 7F 26 CB 78 */ mr r6, r25 -/* 802E1F80 7F AC EB 78 */ mr r12, r29 -/* 802E1F84 7D 89 03 A6 */ mtctr r12 -/* 802E1F88 4E 80 04 21 */ bctrl -lbl_802E1F8C: -/* 802E1F8C 48 05 B7 69 */ bl OSDisableInterrupts -/* 802E1F90 48 06 B8 A9 */ bl VIGetCurrentFrameBuffer -/* 802E1F94 90 7F 00 7C */ stw r3, 0x7c(r31) -/* 802E1F98 80 6D 8F 88 */ lwz r3, sErrorManager__12JUTException(r13) -/* 802E1F9C 80 63 00 80 */ lwz r3, 0x80(r3) -/* 802E1FA0 80 9F 00 7C */ lwz r4, 0x7c(r31) -/* 802E1FA4 A0 A3 00 04 */ lhz r5, 4(r3) -/* 802E1FA8 A0 C3 00 06 */ lhz r6, 6(r3) -/* 802E1FAC 48 00 25 C1 */ bl changeFrameBuffer__14JUTDirectPrintFPvUsUs -/* 802E1FB0 80 6D 8F 88 */ lwz r3, sErrorManager__12JUTException(r13) -/* 802E1FB4 7F 84 E3 78 */ mr r4, r28 -/* 802E1FB8 7F 65 DB 78 */ mr r5, r27 -/* 802E1FBC 7F 46 D3 78 */ mr r6, r26 -/* 802E1FC0 7F 27 CB 78 */ mr r7, r25 -/* 802E1FC4 48 00 14 FD */ bl printContext__12JUTExceptionFUsP9OSContextUlUl -/* 802E1FC8 4B FF FF 24 */ b lbl_802E1EEC diff --git a/include/JSystem/JUtility/JUTConsole.h b/include/JSystem/JUtility/JUTConsole.h index 6b154047e6f..7786c64b462 100644 --- a/include/JSystem/JUtility/JUTConsole.h +++ b/include/JSystem/JUtility/JUTConsole.h @@ -67,6 +67,7 @@ public: bool isVisible() const { return mVisible; } void setVisible(bool visible) { mVisible = visible; } + u8 getLineAttr(int param_0) { return mBuf[(field_0x20 + 2) * param_0]; } void setLineAttr(int param_0, u8 param_1) { mBuf[(field_0x20 + 2) * param_0] = param_1; } u8* getLinePtr(int param_0) const { return &mBuf[(field_0x20 + 2) * param_0] + 1; } int diffIndex(int param_0, int param_1) const { @@ -77,13 +78,12 @@ public: return diff += mMaxLines; } - int nextIndex(int param_0) const { - int index = param_0 + 1; - if (mMaxLines <= index) { - index = 0; - } + int prevIndex(int index) const { + return --index < 0 ? index = mMaxLines - 1 : index; + } - return index; + int nextIndex(int index) const { + return ++index >= mMaxLines ? 0 : index; } void scrollToLastLine() { scroll(mMaxLines); } diff --git a/include/JSystem/JUtility/JUTDirectPrint.h b/include/JSystem/JUtility/JUTDirectPrint.h index bc17dab88ef..745f8c9ba22 100644 --- a/include/JSystem/JUtility/JUTDirectPrint.h +++ b/include/JSystem/JUtility/JUTDirectPrint.h @@ -23,6 +23,7 @@ public: bool isActive() const { return field_0x00 != 0; } JUtility::TColor getCharColor() const { return mCharColor; } + void changeFrameBuffer(void *param_0) { changeFrameBuffer(param_0, mFrameBufferWidth, mFrameBufferHeight); } static JUTDirectPrint* getManager() { return sDirectPrint; } diff --git a/include/JSystem/JUtility/JUTException.h b/include/JSystem/JUtility/JUTException.h index 05a1661c417..5704f63c924 100644 --- a/include/JSystem/JUtility/JUTException.h +++ b/include/JSystem/JUtility/JUTException.h @@ -111,7 +111,7 @@ private: static OSMessageQueue sMessageQueue; static const char* sCpuExpName[17]; static JSUList sMapFileList; - static u8 sMessageBuffer[4 + 4 /* padding */]; + static OSMessage sMessageBuffer[1 + 1 /* padding */]; static JUTException* sErrorManager; static OSErrorHandler sPreUserCallback; static OSErrorHandler sPostUserCallback; diff --git a/libs/JSystem/JUtility/JUTConsole.cpp b/libs/JSystem/JUtility/JUTConsole.cpp index 87ff86d2df3..e1c06db78cd 100644 --- a/libs/JSystem/JUtility/JUTConsole.cpp +++ b/libs/JSystem/JUtility/JUTConsole.cpp @@ -6,6 +6,7 @@ #include "JSystem/JUtility/JUTConsole.h" #include "JSystem/J2DGraph/J2DOrthoGraph.h" #include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" #include "JSystem/JUtility/JUTDirectPrint.h" #include "JSystem/JUtility/JUTVideo.h" #include "MSL_C/stdio.h" @@ -164,7 +165,7 @@ void JUTConsole::clear() { field_0x38 = 0; field_0x3c = 0; - for (int i = 0; i < mMaxLines; i++) { + for (u32 i = 0; i < mMaxLines; i++) { setLineAttr(i, 0); } setLineAttr(0, -1); @@ -261,6 +262,74 @@ void JUTConsole::print_f(char const* fmt, ...) { } /* 802E7C38-802E7F30 2E2578 02F8+00 2/2 10/10 0/0 .text print__10JUTConsoleFPCc */ +// signed/unsigned +#ifdef NONMATCHING +void JUTConsole::print(char const* param_0) { + if (mOutput & 2) { +#if DEBUG + OSReport("%s", param_0); +#endif + } + if (mOutput & 1) { + const u8* r29 = (const u8*)param_0; + u8* r28 = getLinePtr(field_0x38) + field_0x3c; + while (*r29 != 0) { + if (field_0x6a && field_0x34 == nextIndex(field_0x38)) { + break; + } + if (*r29 == '\n') { + r29++; + field_0x3c = field_0x20; + } else if (*r29 == '\t') { + r29++; + while (field_0x3c < field_0x20) { + *(r28++) = ' '; + field_0x3c++; + if (field_0x3c % field_0x64 == 0) { + break; + } + } + } else if (mFont && mFont->isLeadByte(*r29)) { + if (field_0x3c + 1 < field_0x20) { + *(r28++) = *(r29++); + *(r28++) = *(r29++); + field_0x3c++; + field_0x3c++; + } else { + *(r28++) = 0; + field_0x3c++; + } + } else { + *(r28++) = *(r29++); + field_0x3c++; + } + if (field_0x3c < field_0x20) { + continue; + } + *r28 = 0; + field_0x38 = nextIndex(field_0x38); + field_0x3c = 0; + setLineAttr(field_0x38, 0xff); + r28 = getLinePtr(field_0x38); + *r28 = 0; + int local_28 = diffIndex(field_0x30, field_0x38); + if (local_28 == mHeight) { + field_0x30 = nextIndex(field_0x30); + } + if (field_0x38 == field_0x34) { + field_0x34 = nextIndex(field_0x34); + } + if (field_0x38 == field_0x30) { + field_0x30 = nextIndex(field_0x30); + } + if (field_0x6b) { + break; + } + } + *r28 = 0; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -269,6 +338,7 @@ asm void JUTConsole::print(char const* param_0) { #include "asm/JSystem/JUtility/JUTConsole/print__10JUTConsoleFPCc.s" } #pragma pop +#endif /* 802E7F30-802E7F7C 2E2870 004C+00 1/1 1/1 0/0 .text JUTConsole_print_f_va_ */ extern "C" void JUTConsole_print_f_va_(JUTConsole* console, const char* fmt, va_list args) { @@ -286,6 +356,50 @@ SECTION_DEAD static char const* const stringBase_8039D9B3 = "%s\n"; #pragma pop /* 802E7F7C-802E80A8 2E28BC 012C+00 0/0 2/2 0/0 .text dumpToTerminal__10JUTConsoleFUi */ +// signed/unsigned, instruction order +#ifdef NONMATCHING +void JUTConsole::dumpToTerminal(unsigned int param_0) { + if (param_0 == 0) { + return; + } + u32 r29 = field_0x34; + if (param_0 != -1) { + r29 = field_0x38; + for (int i = 0; i != param_0; i++) { + int r25 = prevIndex(r29); + if (getLineAttr(r25) == 0) { + break; + } + r29 = r25; + if (r25 == field_0x34) { + break; + } + } + } + + int r27 = 0; +#if DEBUG + OSReport("\n:::dump of console[%x]--------------------------------\n",this); +#endif + do { + u8* r28 = getLinePtr(r29); + u8 r24 = r28[-1]; + if (r24 == 0) { + break; + } + if (field_0x69) { + OSReport("[%03d] %s\n", r27, r28); + } else { + OSReport("%s\n", r28); + } + r29 = nextIndex(r29); + r27++; + } while (r27 != field_0x34); +#if DEBUG + OSReport(":::dump of console[%x] END----------------------------\n",this); +#endif +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -294,6 +408,7 @@ asm void JUTConsole::dumpToTerminal(unsigned int param_0) { #include "asm/JSystem/JUtility/JUTConsole/dumpToTerminal__10JUTConsoleFUi.s" } #pragma pop +#endif /* 802E80A8-802E8184 2E29E8 00DC+00 0/0 3/3 0/0 .text scroll__10JUTConsoleFi */ void JUTConsole::scroll(int scrollAmnt) { @@ -357,10 +472,11 @@ JUTConsoleManager* JUTConsoleManager::createManager(JKRHeap* pHeap) { /* 802E8240-802E82B0 2E2B80 0070+00 3/3 0/0 0/0 .text * appendConsole__17JUTConsoleManagerFP10JUTConsole */ #ifdef NONMATCHING -void JUTConsoleManager::appendConsole(JUTConsole* param_0) { - mLinkList.Push_back(param_0); +void JUTConsoleManager::appendConsole(JUTConsole* console) { + JUT_ASSERT(961, sManager != 0 && console != 0); + mLinkList.Push_back(console); if (mActiveConsole == NULL) { - mActiveConsole = param_0; + mActiveConsole = console; } } #else diff --git a/libs/JSystem/JUtility/JUTException.cpp b/libs/JSystem/JUtility/JUTException.cpp index 5258b1fbd77..d40b198067c 100644 --- a/libs/JSystem/JUtility/JUTException.cpp +++ b/libs/JSystem/JUtility/JUTException.cpp @@ -10,7 +10,9 @@ #include "MSL_C/stdio.h" #include "MSL_C/stdlib.h" #include "dol2asm.h" +#include "dolphin/base/PPCArch.h" #include "dolphin/os/OS.h" +#include "dolphin/vi/vi.h" #include "global.h" // @@ -38,11 +40,6 @@ extern "C" u8 sConsole__12JUTException[4]; // extern "C" void changeFrameBuffer__14JUTDirectPrintFPvUsUs(); -extern "C" void* VIGetCurrentFrameBuffer(); -extern "C" void VISetPreRetraceCallback(void*); -extern "C" void VISetPostRetraceCallback(void*); -extern "C" void PPCMtmsr(); -extern "C" u32 PPCMfmsr(); extern "C" void _savegpr_25(); extern "C" void _restgpr_25(); extern "C" void _savegpr_28(); @@ -51,12 +48,7 @@ extern "C" void OSYieldThread(); extern "C" void OSFillFPUContext(OSContext*); extern "C" void print_f__10JUTConsoleFPCce(); extern "C" OSContext* OSGetCurrentContext(); -extern "C" void VIFlush(); -extern "C" void VISetBlack(BOOL); -extern "C" u32 VIGetRetraceCount(); extern "C" extern _GXRenderModeObj GXNtsc480Int; -extern "C" void VIConfigure(_GXRenderModeObj*); -extern "C" void VISetNextFrameBuffer(void*); extern "C" void _restgpr_16(); extern "C" void fopen__13JUTDirectFileFPCc(); extern "C" void fclose__13JUTDirectFileFv(); @@ -143,33 +135,11 @@ JUTException* JUTException::create(JUTDirectPrint* directPrint) { /* ############################################################################################## */ /* 804508F0-804508F8 000370 0004+04 1/1 0/0 0/0 .sdata sMessageBuffer__12JUTException */ -SECTION_SDATA u8 JUTException::sMessageBuffer[4 + 4 /* padding */] = { - 0x00, - 0x00, - 0x00, - 0x00, - /* padding */ - 0x00, - 0x00, - 0x00, - 0x00, -}; +SECTION_SDATA OSMessage JUTException::sMessageBuffer[1 + 1 /* padding */] = {0}; -/* 802E1EA8-802E1FCC 2DC7E8 0124+00 1/0 0/0 0/0 .text run__12JUTExceptionFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void* JUTException::run() { - nofralloc -#include "asm/JSystem/JUtility/JUTException/run__12JUTExceptionFv.s" -} -#pragma pop - -/* ############################################################################################## */ -/* 80434578-8043458C 061298 0014+00 2/2 0/0 0/0 .bss exCallbackObject */ struct CallbackObject { /* 0x00 */ OSErrorHandler callback; - /* 0x04 */ s16 error; + /* 0x04 */ u16 error; /* 0x06 */ u16 pad_0x06; /* 0x08 */ OSContext* context; /* 0x0C */ int param_3; @@ -177,6 +147,42 @@ struct CallbackObject { /* 0x14 */ }; +/* 802E1EA8-802E1FCC 2DC7E8 0124+00 1/0 0/0 0/0 .text run__12JUTExceptionFv */ +void* JUTException::run() { + PPCMtmsr(PPCMfmsr() & ~0x0900); + OSInitMessageQueue(&sMessageQueue, sMessageBuffer, 1); + OSMessage message; + while (true) { + OSReceiveMessage(&sMessageQueue, &message, OS_MESSAGE_BLOCK); + VISetPreRetraceCallback(NULL); + VISetPostRetraceCallback(NULL); + CallbackObject* cb = (CallbackObject*)message; + OSErrorHandler callback = cb->callback; + u16 error = cb->error; + OSContext* context = cb->context; + int r24 = cb->param_3; + int r23 = cb->param_4; + if (error < 17) { + mStackPointer = context->gpr[1]; + } + mFrameMemory = (JUTExternalFB*)VIGetCurrentFrameBuffer(); + if (!mFrameMemory) { + sErrorManager->createFB(); + } + sErrorManager->mDirectPrint->changeFrameBuffer(mFrameMemory); + if (callback) { + callback(error, context, r24, r23); + } + OSDisableInterrupts(); + mFrameMemory = (JUTExternalFB*)VIGetCurrentFrameBuffer(); + sErrorManager->mDirectPrint->changeFrameBuffer(mFrameMemory); + sErrorManager->printContext(error, context, r24, r23); + } +} + +/* ############################################################################################## */ +/* 80434578-8043458C 061298 0014+00 2/2 0/0 0/0 .bss exCallbackObject */ + STATIC_ASSERT(sizeof(CallbackObject) == 0x14); static CallbackObject exCallbackObject;