/** * @file d_a_movie_player.cpp * */ // This TU seems to disable inlining entirely, as there are several weak functions that get inlined // in other TUs, but not here. #pragma dont_inline on #include #include #include #include "JSystem/JKernel/JKRExpHeap.h" #include "JSystem/JAudio2/JASAiCtrl.h" #include "d/actor/d_a_movie_player.h" #include "d/d_com_inf_game.h" #include "dol2asm.h" #include "Z2AudioLib/Z2Instances.h" #include "m_Do/m_Do_graphic.h" #include "f_op/f_op_overlap_mng.h" #include "SSystem/SComponent/c_API_controller_pad.h" #ifdef __cplusplus extern "C" { #endif /* 80872758-80872BF0 000078 0498+00 1/1 0/0 0/0 .text THPAudioDecode */ // NONMATCHING static u32 THPAudioDecode(s16* audioBuffer, u8* audioFrame, s32 flag) { THPAudioRecordHeader* header; THPAudioDecodeInfo decInfo; u8 *left, *right; s16 *decLeftPtr, *decRightPtr; s16 yn1, yn2; s32 i; s32 step; s32 sample; s64 yn; if (audioBuffer == NULL || audioFrame == NULL) { return 0; } header = (THPAudioRecordHeader*)audioFrame; left = audioFrame + sizeof(THPAudioRecordHeader); right = left + header->offsetNextChannel; if (flag == 1) { decRightPtr = audioBuffer; decLeftPtr = audioBuffer + header->sampleSize; step = 1; } else { decRightPtr = audioBuffer; decLeftPtr = audioBuffer + 1; step = 2; } if (header->offsetNextChannel == 0) { __THPAudioInitialize(&decInfo, left); yn1 = header->lYn1; yn2 = header->lYn2; for (i = 0; i < header->sampleSize; i++) { sample = __THPAudioGetNewSample(&decInfo); yn = header->lCoef[decInfo.predictor][1] * yn2; yn += header->lCoef[decInfo.predictor][0] * yn1; yn += (sample << decInfo.scale) << 11; yn <<= 5; if (sample > 0x8000) { yn += 0x10000; } else if ((sample == 0x8000) && ((yn & 0x10000) != 0)) { yn += 0x10000; } yn += 0x8000; if (yn > 2147483647LL) { yn = 2147483647LL; } if (yn < -2147483648LL) { yn = -2147483648LL; } *decLeftPtr = (s16)(yn >> 16); decLeftPtr += step; *decRightPtr = (s16)(yn >> 16); decRightPtr += step; yn2 = yn1; yn1 = (s16)(yn >> 16); } } else { __THPAudioInitialize(&decInfo, left); yn1 = header->lYn1; yn2 = header->lYn2; for (i = 0; i < header->sampleSize; i++) { sample = __THPAudioGetNewSample(&decInfo); yn = header->lCoef[decInfo.predictor][1] * yn2; yn += header->lCoef[decInfo.predictor][0] * yn1; yn += (sample << decInfo.scale) << 11; yn <<= 5; yn += 0x8000; if (yn > 2147483647LL) { yn = 2147483647LL; } if (yn < -2147483648LL) { yn = -2147483648LL; } *decLeftPtr = (s16)(yn >> 16); decLeftPtr += step; yn2 = yn1; yn1 = (s16)(yn >> 16); } __THPAudioInitialize(&decInfo, right); yn1 = header->rYn1; yn2 = header->rYn2; for (i = 0; i < header->sampleSize; i++) { sample = __THPAudioGetNewSample(&decInfo); yn = header->rCoef[decInfo.predictor][1] * yn2; yn += header->rCoef[decInfo.predictor][0] * yn1; yn += (sample << decInfo.scale) << 11; yn <<= 5; yn += 0x8000; if (yn > 2147483647LL) { yn = 2147483647LL; } if (yn < -2147483648LL) { yn = -2147483648LL; } *decRightPtr = (s16)(yn >> 16); decRightPtr += step; yn2 = yn1; yn1 = (s16)(yn >> 16); } } return header->sampleSize; } /* 80872BF0-80872C80 000510 0090+00 1/1 0/0 0/0 .text __THPAudioGetNewSample */ static s32 __THPAudioGetNewSample(THPAudioDecodeInfo* info) { s32 sample; if (!(info->offsetNibbles & 0x0f)) { info->predictor = (u8)((*(info->encodeData) & 0x70) >> 4); info->scale = (u8)((*(info->encodeData) & 0xF)); info->encodeData++; info->offsetNibbles += 2; } if (info->offsetNibbles & 0x1) { sample = (s32)((*(info->encodeData) & 0xF) << 28) >> 28; info->encodeData++; } else { sample = (s32)((*(info->encodeData) & 0xF0) << 24) >> 28; } info->offsetNibbles++; return sample; } /* 80872C80-80872CBC 0005A0 003C+00 1/1 0/0 0/0 .text __THPAudioInitialize */ static void __THPAudioInitialize(THPAudioDecodeInfo* info, u8* ptr) { info->encodeData = ptr; info->offsetNibbles = 2; info->predictor = (u8)((*(info->encodeData) & 0x70) >> 4); info->scale = (u8)((*(info->encodeData) & 0xF)); info->encodeData++; } UNK_BSS(1109); UNK_BSS(1107); UNK_BSS(1105); UNK_BSS(1104); UNK_BSS(1099); UNK_BSS(1097); UNK_BSS(1095); UNK_BSS(1094); UNK_BSS(1057); UNK_BSS(1055); UNK_BSS(1053); UNK_BSS(1052); UNK_BSS(1014); UNK_BSS(1012); UNK_BSS(1010); UNK_BSS(1009); /* 808795E0-80879A40 000040 0460+00 0/0 0/0 0/0 .bss THPStatistics */ static u8 THPStatistics[1120] ALIGN_DECL(32); /* 80879A40-80879A44 0004A0 0004+00 1/2 0/0 0/0 .bss Ydchuff */ static THPHuffmanTab* Ydchuff; /* 80879A44-80879A48 0004A4 0004+00 1/2 0/0 0/0 .bss Udchuff */ static THPHuffmanTab* Udchuff; /* 80879A48-80879A4C 0004A8 0004+00 1/2 0/0 0/0 .bss Vdchuff */ static THPHuffmanTab* Vdchuff; /* 80879A4C-80879A50 0004AC 0004+00 1/2 0/0 0/0 .bss Yachuff */ static THPHuffmanTab* Yachuff; /* 80879A50-80879A54 0004B0 0004+00 1/2 0/0 0/0 .bss Uachuff */ static THPHuffmanTab* Uachuff; /* 80879A54-80879A60 0004B4 0004+08 1/2 0/0 0/0 .bss Vachuff */ static THPHuffmanTab* Vachuff; /* 80879A60-80879B60 0004C0 0100+00 0/2 0/0 0/0 .bss __THPIDCTWorkspace */ static f32 __THPIDCTWorkspace[64] ALIGN_DECL(32); /* 80879B60-80879B64 0005C0 0004+00 1/3 0/0 0/0 .bss __THPHuffmanBits */ static u8* __THPHuffmanBits; /* 80879B64-80879B68 0005C4 0004+00 2/3 0/0 0/0 .bss __THPHuffmanSizeTab */ static u8* __THPHuffmanSizeTab; /* 80879B68-80879B6C 0005C8 0004+00 1/3 0/0 0/0 .bss __THPHuffmanCodeTab */ static u16* __THPHuffmanCodeTab; /* 80879B6C-80879B80 0005CC 0004+10 0/5 0/0 0/0 .bss Gbase */ static THPSample* Gbase; /* 80879B80-80879B84 0005E0 0004+00 0/5 0/0 0/0 .bss Gwid */ static u32 Gwid ALIGN_DECL(32); /* 80879B84-80879B88 0005E4 0004+00 0/5 0/0 0/0 .bss Gq */ static f32* Gq; /* 80879B88-80879B94 0005E8 000C+00 0/2 0/0 0/0 .bss __THPLCWork512 */ static u8* __THPLCWork512[3]; /* 80879B94-80879BA0 0005F4 000C+00 0/3 0/0 0/0 .bss __THPLCWork640 */ static u8* __THPLCWork640[3]; /* 80879BA0-80879BA4 000600 0004+00 2/2 0/0 0/0 .bss __THPOldGQR5 */ static u32 __THPOldGQR5; /* 80879BA4-80879BA8 000604 0004+00 2/2 0/0 0/0 .bss __THPOldGQR6 */ static u32 __THPOldGQR6; /* 80879BA8-80879BAC 000608 0004+00 1/3 0/0 0/0 .bss __THPWorkArea */ static u8* __THPWorkArea; /* 80879BAC-80879BC4 00060C 0018+00 1/4 0/0 0/0 .bss __THPMCUBuffer */ static THPCoeff* __THPMCUBuffer[6]; /* 80879BC4-80879BC8 000624 0004+00 5/12 0/0 0/0 .bss __THPInfo */ static THPFileInfo* __THPInfo; /* 80879BC8-80879BD0 000628 0004+04 0/2 0/0 0/0 .bss __THPInitFlag */ static BOOL __THPInitFlag; /* 80872CBC-80872F00 0005DC 0244+00 1/1 0/0 0/0 .text THPVideoDecode */ static s32 THPVideoDecode(void* file, void* tileY, void* tileU, void* tileV, void* work) { u8 all_done, status; s32 errorCode; if (!file) { goto _err_no_input; } if (tileY == NULL || tileU == NULL || tileV == NULL) { goto _err_no_output; } if (!work) { goto _err_no_work; } if (!(PPCMfhid2() & 0x10000000)) { goto _err_lc_not_enabled; } if (__THPInitFlag == FALSE) { goto _err_not_initialized; } __THPWorkArea = (u8*)work; __THPInfo = (THPFileInfo*)OSRoundUp32B(__THPWorkArea); __THPWorkArea = (u8*)OSRoundUp32B(__THPWorkArea) + sizeof(THPFileInfo); DCZeroRange(__THPInfo, sizeof(THPFileInfo)); __THPInfo->cnt = 33; __THPInfo->decompressedY = 0; __THPInfo->c = (u8*)file; all_done = FALSE; for (;;) { if ((*(__THPInfo->c)++) != 255) { goto _err_bad_syntax; } while (*__THPInfo->c == 255) { ((__THPInfo->c)++); } status = (*(__THPInfo->c)++); if (status <= 0xD7) { if (status == 196) { status = __THPReadHuffmanTableSpecification(); if (status != 0) { goto _err_bad_status; } } else if (status == 192) { status = __THPReadFrameHeader(); if (status != 0) { goto _err_bad_status; } } else { goto _err_unsupported_marker; } } else if (0xD8 <= status && status <= 0xDF) { if (status == 221) { __THPRestartDefinition(); } else if (status == 219) { status = __THPReadQuantizationTable(); if (status != 0) { goto _err_bad_status; } } else if (status == 218) { status = __THPReadScaneHeader(); if (status != 0) { goto _err_bad_status; } all_done = TRUE; } else if (status == 216) { // empty but required for match } else { goto _err_unsupported_marker; } } else if (0xE0 <= status) { if ((224 <= status && status <= 239) || status == 254) { __THPInfo->c += (__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]; } else { goto _err_unsupported_marker; } } if (all_done) { break; } } __THPSetupBuffers(); __THPDecompressYUV(tileY, tileU, tileV); return 0; _err_no_input: errorCode = 25; goto _err_exit; _err_no_output: errorCode = 27; goto _err_exit; _err_no_work: errorCode = 26; goto _err_exit; _err_unsupported_marker: errorCode = 11; goto _err_exit; _err_bad_resource: errorCode = 1; goto _err_exit; _err_no_mem: errorCode = 6; goto _err_exit; _err_bad_syntax: errorCode = 3; goto _err_exit; _err_bad_status: errorCode = status; goto _err_exit; _err_lc_not_enabled: errorCode = 28; goto _err_exit; _err_not_initialized: errorCode = 29; goto _err_exit; _err_exit: return errorCode; } /* 80872F00-80872F48 000820 0048+00 1/1 0/0 0/0 .text __THPSetupBuffers */ static void __THPSetupBuffers() { u8 i; THPCoeff* buffer; buffer = (THPCoeff*)OSRoundUp32B(__THPWorkArea); for (i = 0; i < 6; i++) { __THPMCUBuffer[i] = &buffer[i * 64]; } } /* 80872F48-80873088 000868 0140+00 1/1 0/0 0/0 .text __THPReadFrameHeader */ static u8 __THPReadFrameHeader() { u8 i, utmp8; __THPInfo->c += 2; utmp8 = (*(__THPInfo->c)++); if (utmp8 != 8) { return 10; } __THPInfo->yPixelSize = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); __THPInfo->c += 2; __THPInfo->xPixelSize = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); __THPInfo->c += 2; utmp8 = (*(__THPInfo->c)++); if (utmp8 != 3) { return 12; } for (i = 0; i < 3; i++) { utmp8 = (*(__THPInfo->c)++); utmp8 = (*(__THPInfo->c)++); if ((i == 0 && utmp8 != 0x22) || (i > 0 && utmp8 != 0x11)) { return 19; } __THPInfo->components[i].quantizationTableSelector = (*(__THPInfo->c)++); } return 0; } #define THPROUNDUP(a, b) ((((s32)(a)) + ((s32)(b)-1L)) / ((s32)(b))) /* 80873088-808731B4 0009A8 012C+00 1/1 0/0 0/0 .text __THPReadScaneHeader */ static u8 __THPReadScaneHeader() { u8 i, utmp8; __THPInfo->c += 2; utmp8 = (*(__THPInfo->c)++); if (utmp8 != 3) { return 12; } for (i = 0; i < 3; i++) { utmp8 = (*(__THPInfo->c)++); utmp8 = (*(__THPInfo->c)++); __THPInfo->components[i].DCTableSelector = (u8)(utmp8 >> 4); __THPInfo->components[i].ACTableSelector = (u8)(utmp8 & 15); if ((__THPInfo->validHuffmanTabs & (1 << ((utmp8 >> 4)))) == 0) { return 15; } if ((__THPInfo->validHuffmanTabs & (1 << ((utmp8 & 15) + 1))) == 0) { return 15; } } __THPInfo->c += 3; __THPInfo->MCUsPerRow = (u16)THPROUNDUP(__THPInfo->xPixelSize, 16); __THPInfo->components[0].predDC = 0; __THPInfo->components[1].predDC = 0; __THPInfo->components[2].predDC = 0; return 0; } /* 80879034-80879084 000000 0050+00 8/8 0/0 0/0 .rodata __THPJpegNaturalOrder */ static const u8 __THPJpegNaturalOrder[80] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, }; /* 80879084-808790C4 000050 0040+00 1/1 0/0 0/0 .rodata __THPAANScaleFactor */ static const f64 __THPAANScaleFactor[8] = { 1.0f, 1.387039845f, 1.306562965f, 1.175875602f, 1.0f, 0.785694958f, 0.541196100f, 0.275899379f, }; /* 808731B4-80873574 000AD4 03C0+00 1/1 0/0 0/0 .text __THPReadQuantizationTable */ // NONMATCHING - regalloc static u8 __THPReadQuantizationTable() { f32 q_temp[64]; u16 length = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); __THPInfo->c += 2; length -= 2; do { u16 i; u16 id = (*(__THPInfo->c)++); for (i = 0; i < 64; i++) { q_temp[__THPJpegNaturalOrder[i]] = (f32)(*(__THPInfo->c)++); } u16 row; u16 col; u16 j; j = 0; for (row = 0; row < 8; row++) { for (col = 0; col < 8; col++) { __THPInfo->quantTabs[id][j] = (f32)((f64)q_temp[j] * __THPAANScaleFactor[row] * __THPAANScaleFactor[col]); j++; } } length -= 65; } while (length != 0); return 0; } /* 80873574-8087375C 000E94 01E8+00 1/1 0/0 0/0 .text __THPReadHuffmanTableSpecification */ static u8 __THPReadHuffmanTableSpecification() { u8 t_class, id, i, tab_index; u16 length, num_Vij; __THPHuffmanSizeTab = __THPWorkArea; __THPHuffmanCodeTab = (u16*)((u32)__THPWorkArea + 256 + 1); length = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); __THPInfo->c += 2; length -= 2; for (;;) { i = (*(__THPInfo->c)++); id = (u8)(i & 15); t_class = (u8)(i >> 4); __THPHuffmanBits = __THPInfo->c; tab_index = (u8)((id << 1) + t_class); num_Vij = 0; for (i = 0; i < 16; i++) { num_Vij += (*(__THPInfo->c)++); } __THPInfo->huffmanTabs[tab_index].Vij = __THPInfo->c; __THPInfo->c += num_Vij; __THPHuffGenerateSizeTable(); __THPHuffGenerateCodeTable(); __THPHuffGenerateDecoderTables(tab_index); __THPInfo->validHuffmanTabs |= 1 << tab_index; length -= 17 + num_Vij; if (length == 0) { break; } } return 0; } /* 8087375C-8087383C 00107C 00E0+00 1/1 0/0 0/0 .text __THPHuffGenerateSizeTable */ static void __THPHuffGenerateSizeTable() { s32 p, l, i; p = 0; for (l = 1; l <= 16; l++) { i = (s32)__THPHuffmanBits[l - 1]; while (i--) { __THPHuffmanSizeTab[p++] = (u8)l; } } __THPHuffmanSizeTab[p] = 0; } /* 8087383C-808738B0 00115C 0074+00 1/1 0/0 0/0 .text __THPHuffGenerateCodeTable */ static void __THPHuffGenerateCodeTable() { u8 si; u16 p, code; p = 0; code = 0; si = __THPHuffmanSizeTab[0]; while (__THPHuffmanSizeTab[p]) { while (__THPHuffmanSizeTab[p] == si) { __THPHuffmanCodeTab[p++] = code; code++; } code <<= 1; si++; } } /* 808738B0-808739A8 0011D0 00F8+00 1/1 0/0 0/0 .text __THPHuffGenerateDecoderTables */ static void __THPHuffGenerateDecoderTables(u8 tabIndex) { s32 p, l; THPHuffmanTab* h; p = 0; h = &__THPInfo->huffmanTabs[tabIndex]; for (l = 1; l <= 16; l++) { if (__THPHuffmanBits[l - 1]) { h->valPtr[l] = p - __THPHuffmanCodeTab[p]; p += __THPHuffmanBits[l - 1]; h->maxCode[l] = __THPHuffmanCodeTab[p - 1]; } else { h->maxCode[l] = -1; h->valPtr[l] = -1; } } h->maxCode[17] = 0xfffffL; } /* 808739A8-80873A04 0012C8 005C+00 1/1 0/0 0/0 .text __THPRestartDefinition */ static void __THPRestartDefinition() { __THPInfo->RST = TRUE; __THPInfo->c += 2; __THPInfo->nMCU = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); __THPInfo->c += 2; __THPInfo->currMCU = __THPInfo->nMCU; } /* 80873A04-80873C44 001324 0240+00 1/1 0/0 0/0 .text __THPPrepBitStream */ static void __THPPrepBitStream() { u32* ptr; u32 offset, i, j, k; ptr = (u32*)((u32)__THPInfo->c & 0xFFFFFFFC); offset = (u32)__THPInfo->c & 3; if (__THPInfo->cnt != 33) { __THPInfo->cnt -= (3 - offset) * 8; } else { __THPInfo->cnt = (offset * 8) + 1; } __THPInfo->c = (u8*)ptr; __THPInfo->currByte = *ptr; for (i = 0; i < 4; i++) { if (__THPInfo->validHuffmanTabs & (1 << i)) { for (j = 0; j < 32; j++) { __THPInfo->huffmanTabs[i].quick[j] = 0xFF; for (k = 0; k < 5; k++) { s32 code = (s32)(j >> (5 - k - 1)); if (code <= __THPInfo->huffmanTabs[i].maxCode[k + 1]) { __THPInfo->huffmanTabs[i].quick[j] = __THPInfo->huffmanTabs[i].Vij[(s32)(code + __THPInfo->huffmanTabs[i].valPtr[k + 1])]; __THPInfo->huffmanTabs[i].increment[j] = (u8)(k + 1); k = 99; } else { } } } } } { s32 YdcTab, UdcTab, VdcTab, YacTab, UacTab, VacTab; YdcTab = (__THPInfo->components[0].DCTableSelector << 1); UdcTab = (__THPInfo->components[1].DCTableSelector << 1); VdcTab = (__THPInfo->components[2].DCTableSelector << 1); YacTab = (__THPInfo->components[0].ACTableSelector << 1) + 1; UacTab = (__THPInfo->components[1].ACTableSelector << 1) + 1; VacTab = (__THPInfo->components[2].ACTableSelector << 1) + 1; Ydchuff = &__THPInfo->huffmanTabs[YdcTab]; Udchuff = &__THPInfo->huffmanTabs[UdcTab]; Vdchuff = &__THPInfo->huffmanTabs[VdcTab]; Yachuff = &__THPInfo->huffmanTabs[YacTab]; Uachuff = &__THPInfo->huffmanTabs[UacTab]; Vachuff = &__THPInfo->huffmanTabs[VacTab]; } } /* 80873C44-80873D28 001564 00E4+00 1/1 0/0 0/0 .text __THPDecompressYUV */ static void __THPDecompressYUV(void* tileY, void* tileU, void* tileV) { u16 currentY, targetY; __THPInfo->dLC[0] = (u8*)tileY; __THPInfo->dLC[1] = (u8*)tileU; __THPInfo->dLC[2] = (u8*)tileV; currentY = __THPInfo->decompressedY; targetY = __THPInfo->yPixelSize; __THPGQRSetup(); __THPPrepBitStream(); if (__THPInfo->xPixelSize == 512 && targetY == 448) { while (currentY < targetY) { __THPDecompressiMCURow512x448(); currentY += 16; } } else if (__THPInfo->xPixelSize == 640 && targetY == 480) { while (currentY < targetY) { __THPDecompressiMCURow640x480(); currentY += 16; } } else { while (currentY < targetY) { __THPDecompressiMCURowNxN(); currentY += 16; } } __THPGQRRestore(); } /* 80873D28-80873D48 001648 0020+00 1/1 0/0 0/0 .text __THPGQRRestore */ static void __THPGQRRestore() { register u32 tmp1, tmp2; tmp1 = __THPOldGQR5; tmp2 = __THPOldGQR6; // clang-format off #ifdef __MWERKS__ asm { mtspr GQR5, tmp1; mtspr GQR6, tmp2; } #endif // clang-format on } /* 80873D48-80873D7C 001668 0034+00 1/1 0/0 0/0 .text __THPGQRSetup */ static void __THPGQRSetup() { register u32 tmp1, tmp2; // clang-format off #ifdef __MWERKS__ asm { mfspr tmp1, GQR5; mfspr tmp2, GQR6; } #endif // clang-format on __THPOldGQR5 = tmp1; __THPOldGQR6 = tmp2; // clang-format off #ifdef __MWERKS__ asm { li r3, 0x0007 oris r3, r3, 0x0007 mtspr GQR5, r3 li r3, 0x3D04 oris r3, r3, 0x3D04 mtspr GQR6, r3 } #endif // clang-format on } /* 80873D7C-80873FBC 00169C 0240+00 1/1 0/0 0/0 .text __THPDecompressiMCURow512x448 */ static void __THPDecompressiMCURow512x448() { u8 cl_num; u32 x_pos; THPComponent* comp; LCQueueWait(3); for (cl_num = 0; cl_num < __THPInfo->MCUsPerRow; cl_num++) { __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[0]); __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[1]); __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[2]); __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[3]); __THPHuffDecodeDCTCompU(__THPInfo, __THPMCUBuffer[4]); __THPHuffDecodeDCTCompV(__THPInfo, __THPMCUBuffer[5]); comp = &__THPInfo->components[0]; Gbase = __THPLCWork512[0]; Gwid = 512; Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; x_pos = (u32)(cl_num * 16); __THPInverseDCTNoYPos(__THPMCUBuffer[0], x_pos); __THPInverseDCTNoYPos(__THPMCUBuffer[1], x_pos + 8); __THPInverseDCTY8(__THPMCUBuffer[2], x_pos); __THPInverseDCTY8(__THPMCUBuffer[3], x_pos + 8); comp = &__THPInfo->components[1]; Gbase = __THPLCWork512[1]; Gwid = 256; Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; x_pos /= 2; __THPInverseDCTNoYPos(__THPMCUBuffer[4], x_pos); comp = &__THPInfo->components[2]; Gbase = __THPLCWork512[2]; Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; __THPInverseDCTNoYPos(__THPMCUBuffer[5], x_pos); if (__THPInfo->RST != 0) { if ((--__THPInfo->currMCU) == 0) { __THPInfo->currMCU = __THPInfo->nMCU; __THPInfo->cnt = 1 + ((__THPInfo->cnt + 6) & 0xFFFFFFF8); if (__THPInfo->cnt > 33) { __THPInfo->cnt = 33; } __THPInfo->components[0].predDC = 0; __THPInfo->components[1].predDC = 0; __THPInfo->components[2].predDC = 0; } } } LCStoreData(__THPInfo->dLC[0], __THPLCWork512[0], 0x2000); LCStoreData(__THPInfo->dLC[1], __THPLCWork512[1], 0x800); LCStoreData(__THPInfo->dLC[2], __THPLCWork512[2], 0x800); __THPInfo->dLC[0] += 0x2000; __THPInfo->dLC[1] += 0x800; __THPInfo->dLC[2] += 0x800; } /* 80873FBC-8087445C 0018DC 04A0+00 3/3 0/0 0/0 .text __THPInverseDCTY8 */ static void __THPInverseDCTY8(register THPCoeff* in, register u32 xPos) { register f32 *q, *ws; register f32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9; register f32 tmp10, tmp11, tmp12, tmp13; register f32 tmp20, tmp21, tmp22, tmp23; register f32 cc4 = 1.414213562F; register f32 cc2 = 1.847759065F; register f32 cc2c6s = 1.082392200F; register f32 cc2c6a = -2.613125930F; register f32 bias = 1024.0F; q = Gq; ws = &__THPIDCTWorkspace[0] - 2; { register u32 itmp0, itmp1, itmp2, itmp3; // clang-format off #ifdef __MWERKS__ asm { li itmp2, 8 mtctr itmp2 _loopHead0: psq_l tmp10, 0(in), 0, 5 psq_l tmp11, 0(q), 0, 0 lwz itmp0, 12(in) lwz itmp3, 8(in) ps_mul tmp10, tmp10, tmp11 lwz itmp1, 4(in) lhz itmp2, 2(in) or itmp0, itmp0, itmp3 _loopHead1: cmpwi itmp0, 0 bne _regularIDCT ps_merge00 tmp0, tmp10, tmp10 cmpwi itmp1, 0 psq_st tmp0, 8(ws), 0, 0 bne _halfIDCT psq_st tmp0, 16(ws), 0, 0 cmpwi itmp2, 0 psq_st tmp0, 24(ws), 0, 0 bne _quarterIDCT addi q, q, 8*sizeof(f32) psq_stu tmp0, 32(ws), 0, 0 addi in, in, 8*sizeof(THPCoeff) bdnz _loopHead0 b _loopEnd _quarterIDCT: ps_msub tmp2, tmp10, cc2, tmp10 addi in, in, 8*sizeof(THPCoeff) ps_merge00 tmp9, tmp10, tmp10 addi q, q, 8*sizeof(f32) ps_sub tmp1, cc2, cc2c6s lwz itmp1, 4(in) ps_msub tmp3, tmp10, cc4, tmp2 lhz itmp2, 2(in) ps_merge11 tmp5, tmp10, tmp2 psq_l tmp11, 0(q), 0, 0 ps_nmsub tmp4, tmp10, tmp1, tmp3 ps_add tmp7, tmp9, tmp5 psq_l tmp10, 0(in), 0, 5 ps_merge11 tmp6, tmp3, tmp4 ps_sub tmp5, tmp9, tmp5 lwz itmp0, 12(in) ps_add tmp8, tmp9, tmp6 lwz itmp3, 8(in) ps_sub tmp6, tmp9, tmp6 psq_stu tmp7, 8(ws), 0, 0 ps_merge10 tmp6, tmp6, tmp6 psq_stu tmp8, 8(ws), 0, 0 ps_merge10 tmp5, tmp5, tmp5 or itmp0, itmp0, itmp3 psq_stu tmp6, 8(ws), 0, 0 ps_mul tmp10, tmp10, tmp11 psq_stu tmp5, 8(ws), 0, 0 bdnz _loopHead1 b _loopEnd _halfIDCT: psq_l tmp1, 4(in), 0, 5 psq_l tmp9, 8(q), 0, 0 addi in, in, 8*sizeof(THPCoeff) ps_mul tmp1, tmp1, tmp9 addi q, q, 8*sizeof(f32) ps_sub tmp3, tmp10, tmp1 ps_add tmp2, tmp10, tmp1 lwz itmp0, 12(in) ps_madd tmp4, tmp1, cc4, tmp3 ps_nmsub tmp5, tmp1, cc4, tmp2 ps_mul tmp8, tmp3, cc2 ps_merge00 tmp4, tmp2, tmp4 lwz itmp3, 8(in) ps_nmsub tmp6, tmp1, cc2c6a, tmp8 ps_merge00 tmp5, tmp5, tmp3 lwz itmp1, 4(in) ps_sub tmp6, tmp6, tmp2 ps_nmsub tmp7, tmp10, cc2c6s, tmp8 lhz itmp2, 2(in) ps_merge11 tmp2, tmp2, tmp6 ps_msub tmp8, tmp3, cc4, tmp6 psq_l tmp10, 0(in), 0, 5 ps_add tmp9, tmp4, tmp2 ps_sub tmp7, tmp7, tmp8 psq_l tmp11, 0(q), 0, 0 ps_merge11 tmp3, tmp8, tmp7 ps_sub tmp4, tmp4, tmp2 psq_stu tmp9, 8(ws), 0, 0 ps_add tmp0, tmp5, tmp3 ps_sub tmp1, tmp5, tmp3 or itmp0, itmp0, itmp3 psq_stu tmp0, 8(ws), 0, 0 ps_merge10 tmp1, tmp1, tmp1 ps_merge10 tmp4, tmp4, tmp4 psq_stu tmp1, 8(ws), 0, 0 ps_mul tmp10, tmp10, tmp11 psq_stu tmp4, 8(ws), 0, 0 bdnz _loopHead1 b _loopEnd _regularIDCT: psq_l tmp9, 4(in), 0, 5 psq_l tmp5, 8(q), 0, 0 ps_mul tmp9, tmp9, tmp5 psq_l tmp2, 8(in), 0, 5 psq_l tmp6, 16(q), 0, 0 ps_merge01 tmp0, tmp10, tmp9 psq_l tmp3, 12(in), 0, 5 ps_merge01 tmp1, tmp9, tmp10 psq_l tmp7, 24(q), 0, 0 addi in, in, 8*sizeof(THPCoeff) ps_madd tmp4, tmp2, tmp6, tmp0 ps_nmsub tmp5, tmp2, tmp6, tmp0 ps_madd tmp6, tmp3, tmp7, tmp1 ps_nmsub tmp7, tmp3, tmp7, tmp1 addi q, q, 8*sizeof(f32) ps_add tmp0, tmp4, tmp6 ps_sub tmp3, tmp4, tmp6 ps_msub tmp2, tmp7, cc4, tmp6 lwz itmp0, 12(in) ps_sub tmp8, tmp7, tmp5 ps_add tmp1, tmp5, tmp2 ps_sub tmp2, tmp5, tmp2 ps_mul tmp8, tmp8, cc2 lwz itmp3, 8(in) ps_merge00 tmp1, tmp0, tmp1 ps_nmsub tmp6, tmp5, cc2c6a, tmp8 ps_msub tmp4, tmp7, cc2c6s, tmp8 lwz itmp1, 4(in) ps_sub tmp6, tmp6, tmp0 ps_merge00 tmp2, tmp2, tmp3 lhz itmp2, 2(in) ps_madd tmp5, tmp3, cc4, tmp6 ps_merge11 tmp7, tmp0, tmp6 psq_l tmp10, 0(in), 0, 5 ps_sub tmp4, tmp4, tmp5 ps_add tmp3, tmp1, tmp7 psq_l tmp11, 0(q), 0, 0 ps_merge11 tmp4, tmp5, tmp4 ps_sub tmp0, tmp1, tmp7 ps_mul tmp10, tmp10, tmp11 ps_add tmp5, tmp2, tmp4 ps_sub tmp6, tmp2, tmp4 ps_merge10 tmp5, tmp5, tmp5 psq_stu tmp3, 8(ws), 0, 0 ps_merge10 tmp0, tmp0, tmp0 psq_stu tmp6, 8(ws), 0, 0 psq_stu tmp5, 8(ws), 0, 0 or itmp0, itmp0, itmp3 psq_stu tmp0, 8(ws), 0, 0 bdnz _loopHead1 _loopEnd: } #endif // clang-format on } ws = &__THPIDCTWorkspace[0]; { register THPSample* obase = Gbase; register u32 wid = Gwid; register u32 itmp0, off0, off1; register THPSample *out0, *out1; // clang-format off #ifdef __MWERKS__ asm { psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 slwi off0, wid, 3; psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 slwi xPos, xPos, 2 psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 slwi off1, wid, 2 ps_add tmp6, tmp10, tmp11 add off0, off0, xPos psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 ps_sub tmp8, tmp10, tmp11 add off1, off0, off1 ps_add tmp6, tmp6, bias li itmp0, 3 ps_add tmp7, tmp12, tmp13 add out0, obase, off0 ps_sub tmp9, tmp12, tmp13 ps_add tmp0, tmp6, tmp7 add out1, obase, off1 ps_add tmp8, tmp8, bias mtctr itmp0 _loopHead10: psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 ps_msub tmp9, tmp9, cc4, tmp7 psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 ps_sub tmp3, tmp6, tmp7 ps_add tmp1, tmp8, tmp9 psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 ps_sub tmp2, tmp8, tmp9 psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 ps_add tmp8, tmp6, tmp5 ps_sub tmp6, tmp6, tmp5 addi ws, ws, 2*sizeof(f32) ps_add tmp9, tmp4, tmp7 ps_sub tmp4, tmp4, tmp7 psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 ps_add tmp7, tmp9, tmp8 ps_sub tmp5, tmp9, tmp8 ps_add tmp8, tmp6, tmp4 psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 ps_add tmp9, tmp0, tmp7 ps_mul tmp8, tmp8, cc2 psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 ps_sub tmp23, tmp0, tmp7 ps_madd tmp6, tmp6, cc2c6a, tmp8 psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 ps_sub tmp6, tmp6, tmp7 addi off0, off0, 2*sizeof(THPSample) psq_st tmp9, 0(out0), 0, 6 ps_msub tmp4, tmp4, cc2c6s, tmp8 ps_add tmp9, tmp1, tmp6 ps_msub tmp5, tmp5, cc4, tmp6 ps_sub tmp22, tmp1, tmp6 psq_st tmp9, 8(out0), 0, 6 ps_add tmp8, tmp2, tmp5 ps_add tmp4, tmp4, tmp5 psq_st tmp8, 16(out0), 0, 6 addi off1, off1, 2*sizeof(THPSample) ps_sub tmp9, tmp3, tmp4 ps_add tmp20, tmp3, tmp4 psq_st tmp9, 24(out0), 0, 6 ps_sub tmp21, tmp2, tmp5 ps_add tmp6, tmp10, tmp11 psq_st tmp20, 0(out1), 0, 6 ps_sub tmp8, tmp10, tmp11 ps_add tmp6, tmp6, bias psq_st tmp21, 8(out1), 0, 6 ps_add tmp7, tmp12, tmp13 ps_sub tmp9, tmp12, tmp13 psq_st tmp22, 16(out1), 0, 6 add out0, obase, off0 ps_add tmp0, tmp6, tmp7 psq_st tmp23, 24(out1), 0, 6 ps_add tmp8, tmp8, bias add out1, obase, off1 bdnz _loopHead10 psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 ps_msub tmp9, tmp9, cc4, tmp7 psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 ps_sub tmp3, tmp6, tmp7 ps_add tmp1, tmp8, tmp9 psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 ps_sub tmp2, tmp8, tmp9 psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 ps_add tmp8, tmp6, tmp5 ps_sub tmp6, tmp6, tmp5 ps_add tmp9, tmp4, tmp7 ps_sub tmp4, tmp4, tmp7 ps_add tmp7, tmp9, tmp8 ps_sub tmp5, tmp9, tmp8 ps_add tmp8, tmp6, tmp4 ps_add tmp9, tmp0, tmp7 ps_mul tmp8, tmp8, cc2 ps_sub tmp23, tmp0, tmp7 ps_madd tmp6, tmp6, cc2c6a, tmp8 psq_st tmp9, 0(out0), 0, 6 ps_sub tmp6, tmp6, tmp7 ps_msub tmp4, tmp4, cc2c6s, tmp8 psq_st tmp23, 24(out1), 0, 6 ps_add tmp9, tmp1, tmp6 ps_msub tmp5, tmp5, cc4, tmp6 ps_sub tmp22, tmp1, tmp6 psq_st tmp9, 8(out0), 0, 6 ps_add tmp8, tmp2, tmp5 ps_add tmp4, tmp4, tmp5 psq_st tmp8, 16(out0), 0, 6 ps_sub tmp9, tmp3, tmp4 psq_st tmp22, 16(out1), 0, 6 ps_add tmp20, tmp3, tmp4 psq_st tmp9, 24(out0), 0, 6 ps_sub tmp21, tmp2, tmp5 psq_st tmp20, 0(out1), 0, 6 psq_st tmp21, 8(out1), 0, 6 } #endif // clang-format on } } /* 8087445C-808748F4 001D7C 0498+00 3/3 0/0 0/0 .text __THPInverseDCTNoYPos */ static void __THPInverseDCTNoYPos(register THPCoeff* in, register u32 xPos) { register f32 *q, *ws; register f32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9; register f32 tmp10, tmp11, tmp12, tmp13; register f32 tmp20, tmp21, tmp22, tmp23; register f32 cc4 = 1.414213562F; register f32 cc2 = 1.847759065F; register f32 cc2c6s = 1.082392200F; register f32 cc2c6a = -2.613125930F; register f32 bias = 1024.0F; q = Gq; ws = &__THPIDCTWorkspace[0] - 2; { register u32 itmp0, itmp1, itmp2, itmp3; // clang-format off #ifdef __MWERKS__ asm { li itmp2, 8 mtctr itmp2 _loopHead0: psq_l tmp10, 0(in), 0, 5 psq_l tmp11, 0(q), 0, 0 lwz itmp0, 12(in) lwz itmp3, 8(in) ps_mul tmp10, tmp10, tmp11 lwz itmp1, 4(in) lhz itmp2, 2(in) or. itmp0, itmp0, itmp3 _loopHead1: cmpwi itmp0, 0 bne _regularIDCT ps_merge00 tmp0, tmp10, tmp10 cmpwi itmp1, 0 psq_st tmp0, 8(ws), 0, 0 bne _halfIDCT psq_st tmp0, 16(ws), 0, 0 cmpwi itmp2, 0 psq_st tmp0, 24(ws), 0, 0 bne _quarterIDCT addi q, q, 8*sizeof(f32) psq_stu tmp0, 32(ws), 0, 0 addi in, in, 8*sizeof(THPCoeff) bdnz _loopHead0 b _loopEnd _quarterIDCT: addi in, in, 8*sizeof(THPCoeff) ps_msub tmp2, tmp10, cc2, tmp10 addi q, q, 8*sizeof(f32) ps_merge00 tmp9, tmp10, tmp10 lwz itmp1, 4(in) ps_sub tmp1, cc2, cc2c6s ps_msub tmp3, tmp10, cc4, tmp2 lhz itmp2, 2(in) ps_merge11 tmp5, tmp10, tmp2 psq_l tmp11, 0(q), 0, 0 ps_nmsub tmp4, tmp10, tmp1, tmp3 ps_add tmp7, tmp9, tmp5 psq_l tmp10, 0(in), 0, 5 ps_merge11 tmp6, tmp3, tmp4 ps_sub tmp5, tmp9, tmp5 lwz itmp0, 12(in) ps_add tmp8, tmp9, tmp6 lwz itmp3, 8(in) ps_sub tmp6, tmp9, tmp6 psq_stu tmp7, 8(ws), 0, 0 ps_merge10 tmp6, tmp6, tmp6 psq_stu tmp8, 8(ws), 0, 0 ps_merge10 tmp5, tmp5, tmp5 or itmp0, itmp0, itmp3 psq_stu tmp6, 8(ws), 0, 0 ps_mul tmp10, tmp10, tmp11 psq_stu tmp5, 8(ws), 0, 0 bdnz _loopHead1 b _loopEnd _halfIDCT: psq_l tmp1, 4(in), 0, 5 psq_l tmp9, 8(q), 0, 0 addi in, in, 8*sizeof(THPCoeff) ps_mul tmp1, tmp1, tmp9 addi q, q, 8*sizeof(f32) ps_sub tmp3, tmp10, tmp1 ps_add tmp2, tmp10, tmp1 lwz itmp0, 12(in) ps_madd tmp4, tmp1, cc4, tmp3 ps_nmsub tmp5, tmp1, cc4, tmp2 ps_mul tmp8, tmp3, cc2 ps_merge00 tmp4, tmp2, tmp4 lwz itmp3, 8(in) ps_nmsub tmp6, tmp1, cc2c6a, tmp8 ps_merge00 tmp5, tmp5, tmp3 lwz itmp1, 4(in) ps_sub tmp6, tmp6, tmp2 ps_nmsub tmp7, tmp10, cc2c6s, tmp8 lhz itmp2, 2(in) ps_merge11 tmp2, tmp2, tmp6 ps_msub tmp8, tmp3, cc4, tmp6 psq_l tmp10, 0(in), 0, 5 ps_add tmp9, tmp4, tmp2 ps_sub tmp7, tmp7, tmp8 psq_l tmp11, 0(q), 0, 0 ps_merge11 tmp3, tmp8, tmp7 ps_sub tmp4, tmp4, tmp2 psq_stu tmp9, 8(ws), 0, 0 ps_add tmp0, tmp5, tmp3 ps_sub tmp1, tmp5, tmp3 or itmp0, itmp0, itmp3 psq_stu tmp0, 8(ws), 0, 0 ps_merge10 tmp1, tmp1, tmp1 ps_merge10 tmp4, tmp4, tmp4 psq_stu tmp1, 8(ws), 0, 0 ps_mul tmp10, tmp10, tmp11 psq_stu tmp4, 8(ws), 0, 0 bdnz _loopHead1 b _loopEnd _regularIDCT: psq_l tmp9, 4(in), 0, 5 psq_l tmp5, 8(q), 0, 0 ps_mul tmp9, tmp9, tmp5 psq_l tmp2, 8(in), 0, 5 psq_l tmp6, 16(q), 0, 0 ps_merge01 tmp0, tmp10, tmp9 psq_l tmp3, 12(in), 0, 5 ps_merge01 tmp1, tmp9, tmp10 psq_l tmp7, 24(q), 0, 0 addi in, in, 8*sizeof(THPCoeff) ps_madd tmp4, tmp2, tmp6, tmp0 ps_nmsub tmp5, tmp2, tmp6, tmp0 ps_madd tmp6, tmp3, tmp7, tmp1 ps_nmsub tmp7, tmp3, tmp7, tmp1 addi q, q, 8*sizeof(f32) ps_add tmp0, tmp4, tmp6 ps_sub tmp3, tmp4, tmp6 ps_msub tmp2, tmp7, cc4, tmp6 lwz itmp0, 12(in) ps_sub tmp8, tmp7, tmp5 ps_add tmp1, tmp5, tmp2 ps_sub tmp2, tmp5, tmp2 ps_mul tmp8, tmp8, cc2 lwz itmp3, 8(in) ps_merge00 tmp1, tmp0, tmp1 ps_nmsub tmp6, tmp5, cc2c6a, tmp8 ps_msub tmp4, tmp7, cc2c6s, tmp8 lwz itmp1, 4(in) ps_sub tmp6, tmp6, tmp0 ps_merge00 tmp2, tmp2, tmp3 lhz itmp2, 2(in) ps_madd tmp5, tmp3, cc4, tmp6 ps_merge11 tmp7, tmp0, tmp6 psq_l tmp10, 0(in), 0, 5 ps_sub tmp4, tmp4, tmp5 ps_add tmp3, tmp1, tmp7 psq_l tmp11, 0(q), 0, 0 ps_merge11 tmp4, tmp5, tmp4 ps_sub tmp0, tmp1, tmp7 ps_mul tmp10, tmp10, tmp11 ps_add tmp5, tmp2, tmp4 ps_sub tmp6, tmp2, tmp4 ps_merge10 tmp5, tmp5, tmp5 psq_stu tmp3, 8(ws), 0, 0 ps_merge10 tmp0, tmp0, tmp0 psq_stu tmp6, 8(ws), 0, 0 psq_stu tmp5, 8(ws), 0, 0 or itmp0, itmp0, itmp3 psq_stu tmp0, 8(ws), 0, 0 bdnz _loopHead1 _loopEnd: } #endif // clang-format on } ws = &__THPIDCTWorkspace[0]; { register THPSample* obase = Gbase; register u32 wid = Gwid; register u32 itmp0, off0, off1; register THPSample *out0, *out1; // clang-format off #ifdef __MWERKS__ asm { psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 slwi xPos, xPos, 2 psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 slwi off1, wid, 2 psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 mr off0, xPos ps_add tmp6, tmp10, tmp11 psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 ps_sub tmp8, tmp10, tmp11 add off1, off0, off1 ps_add tmp6, tmp6, bias li itmp0, 3 ps_add tmp7, tmp12, tmp13 add out0, obase, off0 ps_sub tmp9, tmp12, tmp13 ps_add tmp0, tmp6, tmp7 add out1, obase, off1 ps_add tmp8, tmp8, bias mtctr itmp0 _loopHead10: psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 ps_msub tmp9, tmp9, cc4, tmp7 psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 ps_sub tmp3, tmp6, tmp7 ps_add tmp1, tmp8, tmp9 psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 ps_sub tmp2, tmp8, tmp9 psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 ps_add tmp8, tmp6, tmp5 ps_sub tmp6, tmp6, tmp5 addi ws, ws, 2*sizeof(f32) ps_add tmp9, tmp4, tmp7 ps_sub tmp4, tmp4, tmp7 psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 ps_add tmp7, tmp9, tmp8 ps_sub tmp5, tmp9, tmp8 ps_add tmp8, tmp6, tmp4 psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 ps_add tmp9, tmp0, tmp7 ps_mul tmp8, tmp8, cc2 psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 ps_sub tmp23, tmp0, tmp7 ps_madd tmp6, tmp6, cc2c6a, tmp8 psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 ps_sub tmp6, tmp6, tmp7 addi off0, off0, 2*sizeof(THPSample) psq_st tmp9, 0(out0), 0, 6 ps_msub tmp4, tmp4, cc2c6s, tmp8 ps_add tmp9, tmp1, tmp6 ps_msub tmp5, tmp5, cc4, tmp6 ps_sub tmp22, tmp1, tmp6 psq_st tmp9, 8(out0), 0, 6 ps_add tmp8, tmp2, tmp5 ps_add tmp4, tmp4, tmp5 psq_st tmp8, 16(out0), 0, 6 addi off1, off1, 2*sizeof(THPSample) ps_sub tmp9, tmp3, tmp4 ps_add tmp20, tmp3, tmp4 psq_st tmp9, 24(out0), 0, 6 ps_sub tmp21, tmp2, tmp5 ps_add tmp6, tmp10, tmp11 psq_st tmp20, 0(out1), 0, 6 ps_sub tmp8, tmp10, tmp11 ps_add tmp6, tmp6, bias psq_st tmp21, 8(out1), 0, 6 ps_add tmp7, tmp12, tmp13 ps_sub tmp9, tmp12, tmp13 psq_st tmp22, 16(out1), 0, 6 add out0, obase, off0 ps_add tmp0, tmp6, tmp7 psq_st tmp23, 24(out1), 0, 6 ps_add tmp8, tmp8, bias add out1, obase, off1 bdnz _loopHead10 psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 ps_msub tmp9, tmp9, cc4, tmp7 psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 ps_sub tmp3, tmp6, tmp7 ps_add tmp1, tmp8, tmp9 psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 ps_sub tmp2, tmp8, tmp9 psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 ps_add tmp8, tmp6, tmp5 ps_sub tmp6, tmp6, tmp5 ps_add tmp9, tmp4, tmp7 ps_sub tmp4, tmp4, tmp7 ps_add tmp7, tmp9, tmp8 ps_sub tmp5, tmp9, tmp8 ps_add tmp8, tmp6, tmp4 ps_add tmp9, tmp0, tmp7 ps_mul tmp8, tmp8, cc2 ps_sub tmp23, tmp0, tmp7 ps_madd tmp6, tmp6, cc2c6a, tmp8 psq_st tmp9, 0(out0), 0, 6 ps_sub tmp6, tmp6, tmp7 ps_msub tmp4, tmp4, cc2c6s, tmp8 psq_st tmp23, 24(out1), 0, 6 ps_add tmp9, tmp1, tmp6 ps_msub tmp5, tmp5, cc4, tmp6 ps_sub tmp22, tmp1, tmp6 psq_st tmp9, 8(out0), 0, 6 ps_add tmp8, tmp2, tmp5 ps_add tmp4, tmp4, tmp5 psq_st tmp22, 16(out1), 0, 6 psq_st tmp8, 16(out0), 0, 6 ps_sub tmp9, tmp3, tmp4 ps_add tmp20, tmp3, tmp4 psq_st tmp9, 24(out0), 0, 6 ps_sub tmp21, tmp2, tmp5 psq_st tmp20, 0(out1), 0, 6 psq_st tmp21, 8(out1), 0, 6 } #endif // clang-format on } } /* 808748F4-80874B38 002214 0244+00 1/1 0/0 0/0 .text __THPDecompressiMCURow640x480 */ static void __THPDecompressiMCURow640x480() { u8 cl_num; u32 x_pos; THPComponent* comp; LCQueueWait(3); { for (cl_num = 0; cl_num < __THPInfo->MCUsPerRow; cl_num++) { THPFileInfo* um = __THPInfo; __THPHuffDecodeDCTCompY(um, __THPMCUBuffer[0]); __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[1]); __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[2]); __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[3]); __THPHuffDecodeDCTCompU(__THPInfo, __THPMCUBuffer[4]); __THPHuffDecodeDCTCompV(__THPInfo, __THPMCUBuffer[5]); comp = &__THPInfo->components[0]; Gbase = __THPLCWork640[0]; Gwid = 640; Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; x_pos = (u32)(cl_num * 16); __THPInverseDCTNoYPos(__THPMCUBuffer[0], x_pos); __THPInverseDCTNoYPos(__THPMCUBuffer[1], x_pos + 8); __THPInverseDCTY8(__THPMCUBuffer[2], x_pos); __THPInverseDCTY8(__THPMCUBuffer[3], x_pos + 8); comp = &__THPInfo->components[1]; Gbase = __THPLCWork640[1]; Gwid = 320; Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; x_pos /= 2; __THPInverseDCTNoYPos(__THPMCUBuffer[4], x_pos); comp = &__THPInfo->components[2]; Gbase = __THPLCWork640[2]; Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; __THPInverseDCTNoYPos(__THPMCUBuffer[5], x_pos); if (__THPInfo->RST != 0) { __THPInfo->currMCU--; if (__THPInfo->currMCU == 0) { __THPInfo->currMCU = __THPInfo->nMCU; __THPInfo->cnt = 1 + ((__THPInfo->cnt + 6) & 0xFFFFFFF8); if (__THPInfo->cnt > 32) { __THPInfo->cnt = 33; } __THPInfo->components[0].predDC = 0; __THPInfo->components[1].predDC = 0; __THPInfo->components[2].predDC = 0; } } } } LCStoreData(__THPInfo->dLC[0], __THPLCWork640[0], 0x2800); LCStoreData(__THPInfo->dLC[1], __THPLCWork640[1], 0xA00); LCStoreData(__THPInfo->dLC[2], __THPLCWork640[2], 0xA00); __THPInfo->dLC[0] += 0x2800; __THPInfo->dLC[1] += 0xA00; __THPInfo->dLC[2] += 0xA00; } /* 80874B38-80874D8C 002458 0254+00 1/1 0/0 0/0 .text __THPDecompressiMCURowNxN */ static void __THPDecompressiMCURowNxN() { u8 cl_num; u32 x_pos, x; THPComponent* comp; x = __THPInfo->xPixelSize; LCQueueWait(3); for (cl_num = 0; cl_num < __THPInfo->MCUsPerRow; cl_num++) { __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[0]); __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[1]); __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[2]); __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[3]); __THPHuffDecodeDCTCompU(__THPInfo, __THPMCUBuffer[4]); __THPHuffDecodeDCTCompV(__THPInfo, __THPMCUBuffer[5]); comp = &__THPInfo->components[0]; Gbase = __THPLCWork640[0]; Gwid = x; Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; x_pos = (u32)(cl_num * 16); __THPInverseDCTNoYPos(__THPMCUBuffer[0], x_pos); __THPInverseDCTNoYPos(__THPMCUBuffer[1], x_pos + 8); __THPInverseDCTY8(__THPMCUBuffer[2], x_pos); __THPInverseDCTY8(__THPMCUBuffer[3], x_pos + 8); comp = &__THPInfo->components[1]; Gbase = __THPLCWork640[1]; Gwid = x / 2; Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; x_pos /= 2; __THPInverseDCTNoYPos(__THPMCUBuffer[4], x_pos); comp = &__THPInfo->components[2]; Gbase = __THPLCWork640[2]; Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; __THPInverseDCTNoYPos(__THPMCUBuffer[5], x_pos); if (__THPInfo->RST != 0) { __THPInfo->currMCU--; if (__THPInfo->currMCU == 0) { __THPInfo->currMCU = __THPInfo->nMCU; __THPInfo->cnt = 1 + ((__THPInfo->cnt + 6) & 0xFFFFFFF8); if (__THPInfo->cnt > 32) { __THPInfo->cnt = 33; } __THPInfo->components[0].predDC = 0; __THPInfo->components[1].predDC = 0; __THPInfo->components[2].predDC = 0; } } } LCStoreData(__THPInfo->dLC[0], __THPLCWork640[0], ((4 * sizeof(u8) * 64) * (x / 16))); LCStoreData(__THPInfo->dLC[1], __THPLCWork640[1], ((sizeof(u8) * 64) * (x / 16))); LCStoreData(__THPInfo->dLC[2], __THPLCWork640[2], ((sizeof(u8) * 64) * (x / 16))); __THPInfo->dLC[0] += ((4 * sizeof(u8) * 64) * (x / 16)); __THPInfo->dLC[1] += ((sizeof(u8) * 64) * (x / 16)); __THPInfo->dLC[2] += ((sizeof(u8) * 64) * (x / 16)); } /* 80874D8C-80875198 0026AC 040C+00 3/3 0/0 0/0 .text __THPHuffDecodeDCTCompY */ static void __THPHuffDecodeDCTCompY(register THPFileInfo* info, THPCoeff* block) { { register s32 t; THPCoeff dc; register THPCoeff diff; __dcbz((void*)block, 0); t = __THPHuffDecodeTab(info, Ydchuff); __dcbz((void*)block, 32); diff = 0; __dcbz((void*)block, 64); if (t) { { register s32 v; register u32 cb; register u32 cnt; register u32 code; register u32 tmp; register u32 cnt1; register u32 tmp1; // clang-format off #ifdef __MWERKS__ asm { lwz cnt,info->cnt; subfic code,cnt,33; lwz cb,info->currByte; subfc. tmp, code, t; subi cnt1,cnt,1; bgt _notEnoughBitsDIFF; add v,cnt,t; slw cnt,cb,cnt1; stw v,info->cnt; subfic v,t,32; srw diff,cnt,v; } #endif // clang-format on // clang-format off #ifdef __MWERKS__ asm { b _DoneDIFF; _notEnoughBitsDIFF: lwz tmp1, info->c; slw v, cb, cnt1; lwzu cb, 4(tmp1); addi tmp, tmp, 1; stw cb, info->currByte; srw cb, cb, code; stw tmp1, info->c; add v, cb, v; stw tmp, info->cnt; subfic tmp, t, 32; srw diff, v, tmp; _DoneDIFF: } #endif // clang-format on } if (__cntlzw((u32)diff) > 32 - t) { diff += ((0xFFFFFFFF << t) + 1); } }; __dcbz((void*)block, 96); dc = (s16)(info->components[0].predDC + diff); block[0] = info->components[0].predDC = dc; } { register s32 k; register s32 code; register u32 cnt; register u32 cb; register u32 increment; register s32 tmp; register THPHuffmanTab* h = Yachuff; // clang-format off #ifdef __MWERKS__ asm { lwz cnt, info->cnt; addi increment, h, 32; lwz cb, info->currByte; } #endif // clang-format on for (k = 1; k < 64; k++) { register s32 ssss; register s32 rrrr; // clang-format off #ifdef __MWERKS__ asm { addi code, cnt, 4; cmpwi cnt, 28; rlwnm tmp, cb, code, 27, 31; bgt _notEnoughBits; lbzx ssss, h, tmp; lbzx code, increment, tmp; cmpwi ssss, 0xFF; beq _FailedCheckEnoughBits; add cnt, cnt, code; b _DoneDecodeTab; } #endif // clang-format on { register u32 maxcodebase; register u32 tmp2; _FailedCheckEnoughBits: cnt += 5; maxcodebase = (u32) & (h->maxCode); // clang-format off #ifdef __MWERKS__ asm { li tmp2, sizeof(s32)*(5); li code, 5; add maxcodebase, maxcodebase, tmp2; __WHILE_START: cmpwi cnt, 33; slwi tmp, tmp, 1 beq _FCEB_faster; rlwnm ssss, cb, cnt, 31, 31; lwzu tmp2, 4(maxcodebase); or tmp, tmp, ssss addi cnt, cnt, 1; b __WHILE_CHECK; _FCEB_faster: lwz ssss, info->c; li cnt, 1; lwzu cb, 4(ssss); lwzu tmp2, 4(maxcodebase); stw ssss, info->c; rlwimi tmp, cb, 1,31,31; b __FL_WHILE_CHECK; __FL_WHILE_START: slwi tmp, tmp, 1; rlwnm ssss, cb, cnt, 31, 31; lwzu tmp2, 4(maxcodebase); or tmp, tmp, ssss; __FL_WHILE_CHECK: cmpw tmp,tmp2 addi cnt, cnt, 1; addi code, code, 1 bgt __FL_WHILE_START; b _FCEB_Done; __WHILE_CHECK: cmpw tmp,tmp2 addi code, code, 1 bgt __WHILE_START; } #endif // clang-format on } _FCEB_Done: ssss = (h->Vij[(s32)(tmp + h->valPtr[code])]); goto _DoneDecodeTab; _notEnoughBits: // clang-format off #ifdef __MWERKS__ asm { cmpwi cnt, 33; lwz tmp, info->c; beq _getfullword; cmpwi cnt, 32; rlwnm code, cb, code, 27, 31 beq _1bitleft; lbzx ssss, h, code; lbzx rrrr, increment, code; cmpwi ssss, 0xFF; add code, cnt, rrrr; beq _FailedCheckNoBits0; cmpwi code, 33; bgt _FailedCheckNoBits1; } #endif // clang-format on cnt = (u32)code; goto _DoneDecodeTab; _getfullword : { // clang-format off #ifdef __MWERKS__ asm { lwzu cb, 4(tmp); rlwinm code, cb, 5, 27, 31 stw tmp, info->c; lbzx ssss, h, code; lbzx tmp, increment, code; cmpwi ssss, 0xFF addi cnt, tmp, 1 beq _FailedCheckEnoughbits_Updated; } #endif // clang-format on } goto _DoneDecodeTab; _FailedCheckEnoughbits_Updated: ssss = 5; do { // clang-format off #ifdef __MWERKS__ asm { subfic tmp, ssss, 31; addi ssss, ssss, 1; srw code, cb, tmp; } #endif // clang-format on } while (code > h->maxCode[ssss]); cnt = (u32)(ssss + 1); ssss = (h->Vij[(s32)(code + h->valPtr[ssss])]); goto _DoneDecodeTab; _1bitleft: // clang-format off #ifdef __MWERKS__ asm { lwzu cb, 4(tmp); stw tmp, info->c; rlwimi code, cb, 4, 28, 31; lbzx ssss, h, code; lbzx cnt, increment, code cmpwi ssss, 0xFF beq _Read4; } #endif // clang-format on goto _DoneDecodeTab; _Read4 : { register u32 maxcodebase = (u32) & (h->maxCode); register u32 tmp2; // clang-format off #ifdef __MWERKS__ asm { li cnt, sizeof(s32)*5; add maxcodebase, maxcodebase, cnt; slwi tmp, code, 32-5; li cnt,5; rlwimi tmp, cb, 32-1, 1,31; __DR4_WHILE_START: subfic ssss, cnt, 31; lwzu tmp2, 4(maxcodebase); srw code, tmp, ssss; __DR4_WHILE_CHECK: cmpw code, tmp2 addi cnt, cnt, 1 bgt __DR4_WHILE_START; } #endif // clang-format on } ssss = (h->Vij[(s32)(code + h->valPtr[cnt])]); goto _DoneDecodeTab; _FailedCheckNoBits0: _FailedCheckNoBits1: _REALFAILEDCHECKNOBITS : { register u32 mask = 0xFFFFFFFF << (33 - cnt); register u32 tmp2; register u32 tmp3; code = (s32)(cb & (~mask)); mask = (u32) & (h->maxCode); // clang-format off #ifdef __MWERKS__ asm { lwz tmp, info->c; subfic tmp2, cnt, 33; addi tmp3, tmp2, 1; slwi tmp2, tmp2, 2; lwzu cb, 4(tmp); add mask,mask, tmp2; stw tmp, info->c; slwi code, code, 1; rlwimi code, cb, 1, 31, 31; lwzu tmp2, 4(mask); li cnt, 2; b __FCNB1_WHILE_CHECK; __FCNB1_WHILE_START: slwi code, code, 1; addi tmp3, tmp3, 1; lwzu tmp2, 4(mask); add code, code, rrrr; addi cnt, cnt, 1; __FCNB1_WHILE_CHECK: cmpw code, tmp2; rlwnm rrrr, cb, cnt, 31, 31; bgt __FCNB1_WHILE_START; } #endif // clang-format on ssss = (h->Vij[(s32)(code + h->valPtr[tmp3])]); } goto _DoneDecodeTab; _DoneDecodeTab: // clang-format off #ifdef __MWERKS__ asm { andi. rrrr, ssss, 15; srawi ssss, ssss, 4; beq _RECV_SSSS_ZERO; } #endif // clang-format on { k += ssss; { register s32 v; register u32 cnt1; register u32 tmp1; // clang-format off #ifdef __MWERKS__ asm { subfic code,cnt,33; subfc. tmp, code, rrrr; subi cnt1,cnt,1; bgt _RECVnotEnoughBits; add cnt,cnt,rrrr; slw tmp1,cb,cnt1; subfic v,rrrr,32; srw ssss,tmp1,v; } #endif // clang-format on // clang-format off #ifdef __MWERKS__ asm { b _RECVDone; _RECVnotEnoughBits: lwz tmp1, info->c; slw v, cb, cnt1; lwzu cb, 4(tmp1); addi cnt, tmp, 1; stw tmp1, info->c; srw tmp1, cb, code; add v, tmp1, v; subfic tmp, rrrr, 32; srw ssss, v, tmp; _RECVDone: } #endif // clang-format on } if (__cntlzw((u32)ssss) > 32 - rrrr) { ssss += ((0xFFFFFFFF << rrrr) + 1); } block[__THPJpegNaturalOrder[k]] = (s16)ssss; #ifdef __MWERKS__ goto _RECV_END; #else continue; #endif } { _RECV_SSSS_ZERO: if (ssss != 15) { break; } k += 15; }; // clang-format off #ifdef __MWERKS__ asm { _RECV_END: } #endif // clang-format on } info->cnt = cnt; info->currByte = cb; } } /* 80875198-80875410 002AB8 0278+00 3/3 0/0 0/0 .text __THPHuffDecodeTab */ static s32 __THPHuffDecodeTab(register THPFileInfo* info, register THPHuffmanTab* h) { register s32 code; register u32 cnt; register s32 cb; register u32 increment; register s32 tmp; // clang-format off #ifdef __MWERKS__ asm { lwz cnt, info->cnt; addi increment, h, 32; lwz cb, info->currByte; addi code, cnt, 4; cmpwi cnt, 28; rlwnm tmp, cb, code, 27, 31; bgt _notEnoughBits; lbzx code, h, tmp; lbzx increment, increment, tmp; cmpwi code, 0xFF; beq _FailedCheckEnoughBits; add cnt, cnt, increment; stw cnt, info->cnt; } #endif // clang-format on _done: return code; { register u32 maxcodebase; register u32 tmp2; _FailedCheckEnoughBits: maxcodebase = (u32) & (h->maxCode); cnt += 5; // clang-format off #ifdef __MWERKS__ asm { li tmp2, sizeof(s32)*(5); li code, 5; add maxcodebase, maxcodebase, tmp2; __WHILE_START: cmpwi cnt, 33; slwi tmp, tmp, 1 beq _FCEB_faster; rlwnm increment, cb, cnt, 31, 31; lwzu tmp2, 4(maxcodebase); or tmp, tmp, increment addi cnt, cnt, 1; b __WHILE_CHECK; _FCEB_faster: lwz increment, info->c; li cnt, 1; lwzu cb, 4(increment); lwzu tmp2, 4(maxcodebase); stw increment, info->c; rlwimi tmp, cb, 1,31,31; stw cb, info->currByte; b __FL_WHILE_CHECK; __FL_WHILE_START: slwi tmp, tmp, 1; rlwnm increment, cb, cnt, 31, 31; lwzu tmp2, 4(maxcodebase); or tmp, tmp, increment; __FL_WHILE_CHECK: cmpw tmp,tmp2 addi cnt, cnt, 1; addi code, code, 1 bgt __FL_WHILE_START; b _FCEB_Done; __WHILE_CHECK: cmpw tmp,tmp2 addi code, code, 1 bgt __WHILE_START; } #endif // clang-format on } _FCEB_Done: info->cnt = cnt; return (h->Vij[(s32)(tmp + h->valPtr[code])]); // clang-format off #ifdef __MWERKS__ asm { _notEnoughBits: cmpwi cnt, 33; lwz tmp, info->c; beq _getfullword; cmpwi cnt, 32; rlwnm code, cb, code, 27, 31 beq _1bitleft; lbzx tmp, h, code; lbzx increment, increment, code; cmpwi tmp, 0xFF; add code, cnt, increment; beq _FailedCheckNoBits0; cmpwi code, 33; stw code, info->cnt; bgt _FailedCheckNoBits1; } #endif // clang-format on return tmp; // clang-format off #ifdef __MWERKS__ asm { _1bitleft: lwzu cb, 4(tmp); stw tmp, info->c; rlwimi code, cb, 4, 28, 31; lbzx tmp, h, code; lbzx increment, increment, code stw cb, info->currByte; cmpwi tmp, 0xFF stw increment, info->cnt; beq _Read4; } #endif // clang-format on return tmp; _Read4 : { register u32 maxcodebase = (u32) & (h->maxCode); register u32 tmp2; // clang-format off #ifdef __MWERKS__ asm { li cnt, sizeof(s32)*5; add maxcodebase, maxcodebase, cnt; slwi tmp, code, 32-5; li cnt,5; rlwimi tmp, cb, 32-1, 1,31; __DR4_WHILE_START: subfic cb, cnt, 31; lwzu tmp2, 4(maxcodebase); srw code, tmp, cb; __DR4_WHILE_CHECK: cmpw code, tmp2 addi cnt, cnt, 1 bgt __DR4_WHILE_START; } #endif // clang-format on } info->cnt = cnt; __CODE_PLUS_VP_CNT: return (h->Vij[(s32)(code + h->valPtr[cnt])]); _getfullword: // clang-format off #ifdef __MWERKS__ asm { lwzu cb, 4(tmp); rlwinm code, cb, 5, 27, 31 stw tmp, info->c; lbzx cnt, h, code; lbzx increment, increment, code; cmpwi cnt, 0xFF stw cb, info->currByte; addi increment, increment, 1 beq _FailedCheckEnoughbits_Updated; stw increment, info->cnt; } #endif // clang-format on return (s32)cnt; _FailedCheckEnoughbits_Updated: cnt = 5; do { // clang-format off #ifdef __MWERKS__ asm { subfic tmp, cnt, 31; addi cnt, cnt, 1; srw code, cb, tmp; } #endif // clang-format on } while (code > h->maxCode[cnt]); info->cnt = cnt + 1; goto __CODE_PLUS_VP_CNT; _FailedCheckNoBits0: _FailedCheckNoBits1: { register u32 mask = 0xFFFFFFFF << (33 - cnt); register u32 tmp2; code = (s32)(cb & (~mask)); mask = (u32) & (h->maxCode); // clang-format off #ifdef __MWERKS__ asm { lwz tmp, info->c; subfic tmp2, cnt, 33; addi cnt, tmp2, 1; slwi tmp2, tmp2, 2; lwzu cb, 4(tmp); add mask,mask, tmp2; stw tmp, info->c; slwi code, code, 1; stw cb, info->currByte; rlwimi code, cb, 1, 31, 31; lwzu tmp2, 4(mask); li tmp, 2; b __FCNB1_WHILE_CHECK; __FCNB1_WHILE_START: slwi code, code, 1; addi cnt, cnt, 1; lwzu tmp2, 4(mask); add code, code, increment; addi tmp, tmp, 1; __FCNB1_WHILE_CHECK: cmpw code, tmp2; rlwnm increment, cb, tmp, 31, 31; bgt __FCNB1_WHILE_START; } #endif // clang-format on } info->cnt = (u32)tmp; return (h->Vij[(s32)(code + h->valPtr[cnt])]); } /* 80875410-808755F8 002D30 01E8+00 3/3 0/0 0/0 .text __THPHuffDecodeDCTCompU */ static void __THPHuffDecodeDCTCompU(register THPFileInfo* info, THPCoeff* block) { register s32 t; register THPCoeff diff; THPCoeff dc; register s32 v; register u32 cb; register u32 cnt; register u32 cnt33; register u32 tmp; register u32 cnt1; register u32 tmp1; register s32 k; register s32 ssss; register s32 rrrr; __dcbz((void*)block, 0); t = __THPHuffDecodeTab(info, Udchuff); __dcbz((void*)block, 32); diff = 0; __dcbz((void*)block, 64); if (t) { // clang-format off #ifdef __MWERKS__ asm { lwz cnt,info->cnt; subfic cnt33,cnt,33; lwz cb,info->currByte; subfc. tmp, cnt33, t; subi cnt1,cnt,1; bgt _notEnoughBitsDIFF; add v,cnt,t; slw cnt,cb,cnt1; stw v,info->cnt; subfic v,t,32; srw diff,cnt,v; } #endif // clang-format on // clang-format off #ifdef __MWERKS__ asm { b _DoneDIFF; _notEnoughBitsDIFF: lwz tmp1, info->c; slw v, cb, cnt1; lwzu cb, 4(tmp1); addi tmp, tmp, 1; stw cb, info->currByte; srw cb, cb, cnt33; stw tmp1, info->c; add v, cb, v; stw tmp, info->cnt; subfic tmp, t, 32; srw diff, v, tmp; _DoneDIFF: } #endif // clang-format on if (__cntlzw((u32)diff) > 32 - t) { diff += ((0xFFFFFFFF << t) + 1); } } __dcbz((void*)block, 96); dc = (s16)(info->components[1].predDC + diff); block[0] = info->components[1].predDC = dc; for (k = 1; k < 64; k++) { ssss = __THPHuffDecodeTab(info, Uachuff); rrrr = ssss >> 4; ssss &= 15; if (ssss) { k += rrrr; // clang-format off #ifdef __MWERKS__ asm { lwz cnt,info->cnt; subfic cnt33,cnt,33; lwz cb,info->currByte; subf. tmp, cnt33, ssss; subi cnt1,cnt,1; bgt _notEnoughBits; add v,cnt,ssss; slw cnt,cb,cnt1; stw v,info->cnt; subfic v,ssss,32; srw rrrr,cnt,v; } #endif // clang-format on // clang-format off #ifdef __MWERKS__ asm { b _Done; _notEnoughBits: lwz tmp1, info->c; slw v, cb, cnt1; lwzu cb, 4(tmp1); addi tmp, tmp, 1; stw cb, info->currByte; srw cb, cb, cnt33; stw tmp1, info->c; add v, cb, v; stw tmp, info->cnt; subfic tmp, ssss, 32; srw rrrr, v, tmp; _Done: } #endif // clang-format on if (__cntlzw((u32)rrrr) > 32 - ssss) { rrrr += ((0xFFFFFFFF << ssss) + 1); } block[__THPJpegNaturalOrder[k]] = (s16)rrrr; } else { if (rrrr != 15) break; k += 15; } } } /* 808755F8-808757E0 002F18 01E8+00 3/3 0/0 0/0 .text __THPHuffDecodeDCTCompV */ static void __THPHuffDecodeDCTCompV(register THPFileInfo* info, THPCoeff* block) { register s32 t; register THPCoeff diff; THPCoeff dc; register s32 v; register u32 cb; register u32 cnt; register u32 cnt33; register u32 tmp; register u32 cnt1; register u32 tmp1; register s32 k; register s32 ssss; register s32 rrrr; __dcbz((void*)block, 0); t = __THPHuffDecodeTab(info, Vdchuff); __dcbz((void*)block, 32); diff = 0; __dcbz((void*)block, 64); if (t) { // clang-format off #ifdef __MWERKS__ asm { lwz cnt,info->cnt; subfic cnt33,cnt,33; lwz cb,info->currByte; subf. tmp, cnt33, t; subi cnt1,cnt,1; bgt _notEnoughBitsDIFF; add v,cnt,t; slw cnt,cb,cnt1; stw v,info->cnt; subfic v,t,32; srw diff,cnt,v; } #endif // clang-format on // clang-format off #ifdef __MWERKS__ asm { b _DoneDIFF; _notEnoughBitsDIFF: lwz tmp1, info->c; slw v, cb, cnt1; lwzu cb, 4(tmp1); addi tmp, tmp, 1; stw cb, info->currByte; srw cb, cb, cnt33; stw tmp1, info->c; add v, cb, v; stw tmp, info->cnt; subfic tmp, t, 32; srw diff, v, tmp; _DoneDIFF: } #endif // clang-format on if (__cntlzw((u32)diff) > 32 - t) { diff += ((0xFFFFFFFF << t) + 1); } } __dcbz((void*)block, 96); dc = (s16)(info->components[2].predDC + diff); block[0] = info->components[2].predDC = dc; for (k = 1; k < 64; k++) { ssss = __THPHuffDecodeTab(info, Vachuff); rrrr = ssss >> 4; ssss &= 15; if (ssss) { k += rrrr; // clang-format off #ifdef __MWERKS__ asm { lwz cnt,info->cnt; subfic cnt33,cnt,33; lwz cb,info->currByte; subf. tmp, cnt33, ssss; subi cnt1,cnt,1; bgt _notEnoughBits; add v,cnt,ssss; slw cnt,cb,cnt1; stw v,info->cnt; subfic v,ssss,32; srw rrrr,cnt,v; } #endif // clang-format on // clang-format off #ifdef __MWERKS__ asm { b _Done; _notEnoughBits: lwz tmp1, info->c; slw v, cb, cnt1; lwzu cb, 4(tmp1); addi tmp, tmp, 1; stw cb, info->currByte; srw cb, cb, cnt33; stw tmp1, info->c; add v, cb, v; stw tmp, info->cnt; subfic tmp, ssss, 32; srw rrrr, v, tmp; _Done: } #endif // clang-format on if (__cntlzw((u32)rrrr) > 32 - ssss) { rrrr += ((0xFFFFFFFF << ssss) + 1); } block[__THPJpegNaturalOrder[k]] = (s16)rrrr; } else { if (rrrr != 15) break; k += 15; } } } /* 808757E0-8087584C 003100 006C+00 1/1 0/0 0/0 .text THPInit */ static BOOL THPInit() { u8* base; base = (u8*)(0xE000 << 16); __THPLCWork512[0] = base; base += 0x2000; __THPLCWork512[1] = base; base += 0x800; __THPLCWork512[2] = base; base += 0x200; base = (u8*)(0xE000 << 16); __THPLCWork640[0] = base; base += 0x2800; __THPLCWork640[1] = base; base += 0xA00; __THPLCWork640[2] = base; base += 0xA00; OSInitFastCast(); __THPInitFlag = TRUE; return TRUE; } #ifdef __cplusplus } #endif /* 80879BD0-80879DA0 000630 01D0+00 28/29 0/0 0/0 .bss daMP_ActivePlayer */ static daMP_Player_c daMP_ActivePlayer ALIGN_DECL(16); /* 80879DA0-80879DA4 000800 0004+00 2/3 0/0 0/0 .bss daMP_ReadThreadCreated */ static BOOL daMP_ReadThreadCreated; /* 80879DA4-80879DC4 000804 0020+00 2/3 0/0 0/0 .bss daMP_FreeReadBufferQueue */ static OSMessageQueue daMP_FreeReadBufferQueue; /* 80879DC4-80879DE4 000824 0020+00 2/3 0/0 0/0 .bss daMP_ReadedBufferQueue */ static OSMessageQueue daMP_ReadedBufferQueue; /* 80875880-808758B4 0031A0 0034+00 2/2 0/0 0/0 .text daMP_PopReadedBuffer__Fv */ void* daMP_PopReadedBuffer() { OSMessage msg; OSReceiveMessage(&daMP_ReadedBufferQueue, &msg, 1); return msg; } /* 808758B4-808758E4 0031D4 0030+00 1/1 0/0 0/0 .text daMP_PushReadedBuffer__FPv */ void daMP_PushReadedBuffer(void* r3) { OSMessage msg = (OSMessage)r3; OSSendMessage(&daMP_ReadedBufferQueue, msg, 1); } /* 808758E4-80875918 003204 0034+00 1/1 0/0 0/0 .text daMP_PopFreeReadBuffer__Fv */ daMP_THPReadBuffer* daMP_PopFreeReadBuffer() { OSMessage msg; OSReceiveMessage(&daMP_FreeReadBufferQueue, &msg, 1); return (daMP_THPReadBuffer*)msg; } /* 80875918-80875948 003238 0030+00 2/2 0/0 0/0 .text daMP_PushFreeReadBuffer__FPv */ void daMP_PushFreeReadBuffer(void* r3) { OSMessage msg = (OSMessage)r3; OSSendMessage(&daMP_FreeReadBufferQueue, msg, 1); } /* 80879DE4-80879E04 000844 0020+00 2/3 0/0 0/0 .bss daMP_ReadedBufferQueue2 */ static OSMessageQueue daMP_ReadedBufferQueue2; /* 80875948-8087597C 003268 0034+00 1/1 0/0 0/0 .text daMP_PopReadedBuffer2__Fv */ void* daMP_PopReadedBuffer2() { OSMessage msg; OSReceiveMessage(&daMP_ReadedBufferQueue2, &msg, 1); return msg; } /* 8087597C-808759AC 00329C 0030+00 1/1 0/0 0/0 .text daMP_PushReadedBuffer2__FPv */ void daMP_PushReadedBuffer2(void* r3) { OSMessage msg = (OSMessage)r3; OSSendMessage(&daMP_ReadedBufferQueue2, msg, 1); } /* 80879E04-80879E2C 000864 0028+00 0/1 0/0 0/0 .bss daMP_FreeReadBufferMessage */ static OSMessage daMP_FreeReadBufferMessage[10]; /* 80879E2C-80879E54 00088C 0028+00 0/1 0/0 0/0 .bss daMP_ReadedBufferMessage */ static OSMessage daMP_ReadedBufferMessage[10]; /* 80879E54-80879E80 0008B4 0028+04 0/1 0/0 0/0 .bss daMP_ReadedBufferMessage2 */ static OSMessage daMP_ReadedBufferMessage2[10]; /* 80879E80-8087A198 0008E0 0318+00 3/4 0/0 0/0 .bss daMP_ReadThread */ static OSThread daMP_ReadThread; /* 808759AC-808759E4 0032CC 0038+00 1/1 0/0 0/0 .text daMP_ReadThreadStart__Fv */ void daMP_ReadThreadStart() { if (daMP_ReadThreadCreated) { OSResumeThread(&daMP_ReadThread); } } /* 808759E4-80875A28 003304 0044+00 1/1 0/0 0/0 .text daMP_ReadThreadCancel__Fv */ void daMP_ReadThreadCancel() { if (daMP_ReadThreadCreated) { OSCancelThread(&daMP_ReadThread); daMP_ReadThreadCreated = FALSE; } } /* 80875A28-80875B0C 003348 00E4+00 1/1 0/0 0/0 .text daMP_Reader__FPv */ // NONMATCHINIG - regalloc void daMP_Reader(void*) { s32 r28 = 0; s32 r30 = daMP_ActivePlayer.field_0xb8; s32 r29 = daMP_ActivePlayer.field_0xbc; while (true) { daMP_THPReadBuffer* readBuf = daMP_PopFreeReadBuffer(); int readBytes = DVDReadPrio(&daMP_ActivePlayer.mFileInfo, readBuf->m00, r29, r30, 2); if (readBytes != r29) { if (readBytes == -1) { daMP_ActivePlayer.field_0xa8 = -1; } if (r28 == 0) { daMP_PrepareReady(0); } OSSuspendThread(&daMP_ReadThread); } readBuf->m04 = r28; daMP_PushReadedBuffer(readBuf); r30 += r29; r29 = daMP_NEXT_READ_SIZE(readBuf); u32 r0 = (r28 + daMP_ActivePlayer.field_0xc0) % daMP_ActivePlayer.mTotalFrames; if (r0 == daMP_ActivePlayer.mTotalFrames - 1) { if (daMP_ActivePlayer.field_0xa6 & 0x01) { r30 = daMP_ActivePlayer.field_0x64; } else { OSSuspendThread(&daMP_ReadThread); } } r28++; } } /* 8087A198-8087C198 000BF8 2000+00 0/1 0/0 0/0 .bss daMP_ReadThreadStack */ static u8 daMP_ReadThreadStack[0x2000]; /* 8087C198-8087C1A0 002BF8 0004+04 2/4 0/0 0/0 .bss daMP_VideoDecodeThreadCreated */ static BOOL daMP_VideoDecodeThreadCreated; /* 80875B18-80875BC8 003438 00B0+00 1/1 0/0 0/0 .text daMP_CreateReadThread__Fl */ static BOOL daMP_CreateReadThread(s32 param_0) { // NONMATCHING if (!OSCreateThread(&daMP_ReadThread, (void*(*)(void*))daMP_Reader, 0, daMP_ReadThreadStack + sizeof(daMP_ReadThreadStack), sizeof(daMP_ReadThreadStack), param_0, 1)) { OSReport("Can't create read thread\n"); return 0; } OSInitMessageQueue(&daMP_FreeReadBufferQueue, daMP_FreeReadBufferMessage, 10); OSInitMessageQueue(&daMP_ReadedBufferQueue, daMP_ReadedBufferMessage, 10); OSInitMessageQueue(&daMP_ReadedBufferQueue2, daMP_ReadedBufferMessage2, 10); daMP_ReadThreadCreated = TRUE; return 1; } /* 8087C1A0-8087C4B8 002C00 0318+00 4/5 0/0 0/0 .bss daMP_VideoDecodeThread */ static OSThread daMP_VideoDecodeThread; /* 8087C4B8-808E04B8 002F18 64000+00 1/1 0/0 0/0 .bss daMP_VideoDecodeThreadStack */ static u8 daMP_VideoDecodeThreadStack[0x64000]; /* 808E04B8-808E04D8 066F18 0020+00 2/2 0/0 0/0 .bss daMP_FreeTextureSetQueue */ static OSMessageQueue daMP_FreeTextureSetQueue; /* 80875BC8-80875BFC 0034E8 0034+00 1/1 0/0 0/0 .text daMP_PopFreeTextureSet__Fv */ OSMessage daMP_PopFreeTextureSet() { OSMessage msg; OSReceiveMessage(&daMP_FreeTextureSetQueue, &msg, 1); return msg; } /* 80875BFC-80875C2C 00351C 0030+00 2/2 0/0 0/0 .text daMP_PushFreeTextureSet__FPv */ void daMP_PushFreeTextureSet(void* r3) { OSMessage msg = (OSMessage)r3; OSSendMessage(&daMP_FreeTextureSetQueue, msg, 0); } /* 808E04D8-808E04F8 066F38 0020+00 2/2 0/0 0/0 .bss daMP_DecodedTextureSetQueue */ static OSMessageQueue daMP_DecodedTextureSetQueue; /* 80875C2C-80875C70 00354C 0044+00 1/1 0/0 0/0 .text daMP_PopDecodedTextureSet__Fl */ void* daMP_PopDecodedTextureSet(s32 r3) { OSMessage msg; if (OSReceiveMessage(&daMP_DecodedTextureSetQueue, &msg, r3) == TRUE) { return msg; } else { return NULL; } } /* 80875C70-80875CA0 003590 0030+00 1/1 0/0 0/0 .text daMP_PushDecodedTextureSet__FPv */ void daMP_PushDecodedTextureSet(void* r3) { OSMessage msg = (OSMessage)r3; OSSendMessage(&daMP_DecodedTextureSetQueue, msg, 1); } /* 808E04F8-808E0504 066F58 000C+00 0/0 0/0 0/0 .bss daMP_FreeTextureSetMessage */ static OSMessage daMP_FreeTextureSetMessage[3]; /* 808E0504-808E0510 066F64 000C+00 0/0 0/0 0/0 .bss daMP_DecodedTextureSetMessage */ static OSMessage daMP_DecodedTextureSetMessage[3]; /* 808E0510-808E0514 066F70 0004+00 1/1 0/0 0/0 .bss daMP_First */ static BOOL daMP_First; /* 80875CA0-80875DD8 0035C0 0138+00 2/2 0/0 0/0 .text daMP_VideoDecode__FP18daMP_THPReadBuffer */ static void daMP_VideoDecode(daMP_THPReadBuffer* param_0) { // NONMATCHING } /* 80875DD8-80875EA0 0036F8 00C8+00 1/1 0/0 0/0 .text daMP_VideoDecoder__FPv */ static void daMP_VideoDecoder(void* param_0) { // NONMATCHING } /* 80875EA0-80875FD4 0037C0 0134+00 1/1 0/0 0/0 .text daMP_VideoDecoderForOnMemory__FPv */ static void daMP_VideoDecoderForOnMemory(void* param_0) { // NONMATCHING } /* 80875FD4-808760EC 0038F4 0118+00 1/1 0/0 0/0 .text daMP_CreateVideoDecodeThread__FlPUc */ static int daMP_CreateVideoDecodeThread(s32 param_0, u8* param_1) { if (param_1 != NULL) { if (!OSCreateThread(&daMP_VideoDecodeThread, (void*(*)(void*))daMP_VideoDecoderForOnMemory, param_1, daMP_VideoDecodeThreadStack + sizeof(daMP_VideoDecodeThreadStack), sizeof(daMP_VideoDecodeThreadStack), param_0, 1)) { OSReport("Can't create video decode thread\n"); return 0; } } else { if (!OSCreateThread(&daMP_VideoDecodeThread, (void*(*)(void*))daMP_VideoDecoder, NULL, daMP_VideoDecodeThreadStack + sizeof(daMP_VideoDecodeThreadStack), sizeof(daMP_VideoDecodeThreadStack), param_0, 1)) { OSReport("Can't create video decode thread\n"); return 0; } } OSInitMessageQueue(&daMP_FreeTextureSetQueue, daMP_FreeTextureSetMessage, 3); OSInitMessageQueue(&daMP_DecodedTextureSetQueue, daMP_DecodedTextureSetMessage, 3); daMP_First = daMP_VideoDecodeThreadCreated = TRUE; return 1; } /* 808760EC-80876124 003A0C 0038+00 1/1 0/0 0/0 .text daMP_VideoDecodeThreadStart__Fv */ static void daMP_VideoDecodeThreadStart() { if (daMP_VideoDecodeThreadCreated) { OSResumeThread(&daMP_VideoDecodeThread); } } /* 80876124-80876168 003A44 0044+00 1/1 0/0 0/0 .text daMP_VideoDecodeThreadCancel__Fv */ void daMP_VideoDecodeThreadCancel() { if (daMP_VideoDecodeThreadCreated) { OSCancelThread(&daMP_VideoDecodeThread); daMP_VideoDecodeThreadCreated = FALSE; } } /* 808E0514-808E0518 066F74 0004+00 2/2 0/0 0/0 .bss daMP_AudioDecodeThreadCreated */ static BOOL daMP_AudioDecodeThreadCreated; /* 808E0518-808E0830 066F78 0318+00 3/3 0/0 0/0 .bss daMP_AudioDecodeThread */ static OSThread daMP_AudioDecodeThread; /* 808E0830-80944830 067290 64000+00 0/0 0/0 0/0 .bss daMP_AudioDecodeThreadStack */ static u8 daMP_AudioDecodeThreadStack[0x64000]; /* 80944830-80944850 0CB290 0020+00 2/2 0/0 0/0 .bss daMP_FreeAudioBufferQueue */ static OSMessageQueue daMP_FreeAudioBufferQueue; /* 80876168-8087619C 003A88 0034+00 1/1 0/0 0/0 .text daMP_PopFreeAudioBuffer__Fv */ static OSMessage daMP_PopFreeAudioBuffer() { OSMessage msg; OSReceiveMessage(&daMP_FreeAudioBufferQueue, &msg, OS_MESSAGE_BLOCK); return msg; } /* 8087619C-808761CC 003ABC 0030+00 2/2 0/0 0/0 .text daMP_PushFreeAudioBuffer__FPv */ static void daMP_PushFreeAudioBuffer(void* param_0) { OSMessage msg = (OSMessage)param_0; OSSendMessage(&daMP_FreeAudioBufferQueue, msg, OS_MESSAGE_NOBLOCK); } /* 80944850-80944870 0CB2B0 0020+00 2/2 0/0 0/0 .bss daMP_DecodedAudioBufferQueue */ static OSMessageQueue daMP_DecodedAudioBufferQueue; /* 808761CC-80876210 003AEC 0044+00 1/1 0/0 0/0 .text daMP_PopDecodedAudioBuffer__Fl */ static OSMessage daMP_PopDecodedAudioBuffer(s32 param_0) { OSMessage msg; if (OSReceiveMessage(&daMP_DecodedAudioBufferQueue, &msg, param_0) == 1) { return msg; } return NULL; } /* 80876210-80876240 003B30 0030+00 1/1 0/0 0/0 .text daMP_PushDecodedAudioBuffer__FPv */ static void daMP_PushDecodedAudioBuffer(void* param_0) { OSMessage msg = (OSMessage)param_0; OSSendMessage(&daMP_DecodedAudioBufferQueue, msg, OS_MESSAGE_BLOCK); } /* 80876240-8087631C 003B60 00DC+00 2/2 0/0 0/0 .text daMP_AudioDecode__FP18daMP_THPReadBuffer */ static void daMP_AudioDecode(daMP_THPReadBuffer* param_0) { // NONMATCHING } /* 8087631C-80876344 003C3C 0028+00 1/1 0/0 0/0 .text daMP_AudioDecoder__FPv */ static void daMP_AudioDecoder(void* param_0) { while (1) { void* var_r31 = daMP_PopReadedBuffer(); daMP_AudioDecode((daMP_THPReadBuffer*)var_r31); daMP_PushReadedBuffer2(var_r31); } } /* 80876344-808763EC 003C64 00A8+00 1/1 0/0 0/0 .text daMP_AudioDecoderForOnMemory__FPv */ static void daMP_AudioDecoderForOnMemory(void* param_0) { // NONMATCHING } /* 80944870-8094487C 0CB2D0 000C+00 0/0 0/0 0/0 .bss daMP_FreeAudioBufferMessage */ static OSMessage daMP_FreeAudioBufferMessage[3]; /* 8094487C-80944888 0CB2DC 000C+00 0/0 0/0 0/0 .bss daMP_DecodedAudioBufferMessage */ static OSMessage daMP_DecodedAudioBufferMessage[3]; /* 808763EC-808764E8 003D0C 00FC+00 1/1 0/0 0/0 .text daMP_CreateAudioDecodeThread__FlPUc */ static int daMP_CreateAudioDecodeThread(s32 param_0, u8* param_1) { if (param_1 != NULL) { if (!OSCreateThread(&daMP_AudioDecodeThread, (void*(*)(void*))daMP_AudioDecoderForOnMemory, param_1, daMP_AudioDecodeThreadStack + sizeof(daMP_AudioDecodeThreadStack), sizeof(daMP_AudioDecodeThreadStack), param_0, 1)) { return 0; } } else { if (!OSCreateThread(&daMP_AudioDecodeThread, (void*(*)(void*))daMP_AudioDecoder, NULL, daMP_AudioDecodeThreadStack + sizeof(daMP_AudioDecodeThreadStack), sizeof(daMP_AudioDecodeThreadStack), param_0, 1)) { OSReport("Can't create audio decode thread\n"); return 0; } } OSInitMessageQueue(&daMP_FreeAudioBufferQueue, daMP_FreeAudioBufferMessage, 3); OSInitMessageQueue(&daMP_DecodedAudioBufferQueue, daMP_DecodedAudioBufferMessage, 3); daMP_AudioDecodeThreadCreated = TRUE; return 1; } /* 808764E8-80876520 003E08 0038+00 1/1 0/0 0/0 .text daMP_AudioDecodeThreadStart__Fv */ void daMP_AudioDecodeThreadStart() { if (daMP_AudioDecodeThreadCreated) { OSResumeThread(&daMP_AudioDecodeThread); } } /* 80876520-80876564 003E40 0044+00 1/1 0/0 0/0 .text daMP_AudioDecodeThreadCancel__Fv */ void daMP_AudioDecodeThreadCancel() { if (daMP_AudioDecodeThreadCreated) { OSCancelThread(&daMP_AudioDecodeThread); daMP_AudioDecodeThreadCreated = FALSE; } } /* 80876564-8087667C 003E84 0118+00 1/1 0/0 0/0 .text daMP_THPGXRestore__Fv */ static void daMP_THPGXRestore() { GXSetZMode(GX_ENABLE, GX_ALWAYS, GX_DISABLE); GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_SET); GXSetNumTexGens(1); GXSetNumChans(0); GXSetNumTevStages(1); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); GXSetTevOp(GX_TEVSTAGE0, GX_REPLACE); GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0); GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0); GXSetTevSwapMode(GX_TEVSTAGE2, GX_TEV_SWAP0, GX_TEV_SWAP0); GXSetTevSwapMode(GX_TEVSTAGE3, GX_TEV_SWAP0, GX_TEV_SWAP0); GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); GXSetTevSwapModeTable(GX_TEV_SWAP1, GX_CH_RED, GX_CH_RED, GX_CH_RED, GX_CH_ALPHA); GXSetTevSwapModeTable(GX_TEV_SWAP2, GX_CH_GREEN, GX_CH_GREEN, GX_CH_GREEN, GX_CH_ALPHA); GXSetTevSwapModeTable(GXTevSwapSel(GX_TEV_SWAP1|GX_TEV_SWAP2), GX_CH_BLUE, GX_CH_BLUE, GX_CH_BLUE, GX_CH_ALPHA); } static f32 dummyLiteral() { f32 temp = 100.0f; temp += 60.0f; return temp; } /* 8087667C-80876BA8 003F9C 052C+00 1/1 0/0 0/0 .text * daMP_THPGXYuv2RgbSetup__FPC16_GXRenderModeObj */ // NONMATCHING - stack slightly too small static void daMP_THPGXYuv2RgbSetup(GXRenderModeObj const* param_0) { int width = param_0->fbWidth; int height = param_0->efbHeight; f32 var_f31 = 0.0f; Mtx sp50; Mtx sp20; GXSetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); C_MTXOrtho(sp50, var_f31, height - var_f31, 0.0f, width, 0.0f, -1.0f); GXSetProjection(sp50, GX_ORTHOGRAPHIC); GXSetViewport(0.0f, 0.0f, width, height, 0.0f, 1.0f); GXSetScissor(0, 0, width, height); MTXIdentity(sp20); GXLoadPosMtxImm(sp20, GX_PNMTX0); GXSetCurrentMtx(0); GXSetZCompLoc(GX_TRUE); GXSetZMode(GX_ENABLE, GX_ALWAYS, GX_DISABLE); GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_CLEAR); GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0); GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor); GXSetFogRangeAdj(GX_DISABLE, 0, NULL); GXSetCullMode(GX_CULL_NONE); GXSetDither(GX_ENABLE); GXSetColorUpdate(GX_ENABLE); GXSetAlphaUpdate(GX_DISABLE); GXSetNumIndStages(0); GXSetNumChans(0); GXSetNumTexGens(2); GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 60); GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, 60); GXInvalidateTexAll(); GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); GXSetVtxAttrFmt(GX_VTXFMT7, GX_VA_POS, GX_CLR_RGBA, GX_RGBA4, 0); GXSetVtxAttrFmt(GX_VTXFMT7, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBX8, 0); GXSetNumTevStages(4); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL); GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_KONST, GX_CC_C0); GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV); GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_TEXA, GX_CA_KONST, GX_CA_A0); GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_SUB, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV); GXSetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_K0); GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A); GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0); GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP2, GX_COLOR_NULL); GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_KONST, GX_CC_CPREV); GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_2, GX_FALSE, GX_TEVPREV); GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA, GX_CA_KONST, GX_CA_APREV); GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_SUB, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV); GXSetTevKColorSel(GX_TEVSTAGE1, GX_TEV_KCSEL_K1); GXSetTevKAlphaSel(GX_TEVSTAGE1, GX_TEV_KASEL_K1_A); GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0); GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_TEXC, GX_CC_ONE, GX_CC_CPREV); GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_TEXA, GX_CA_ZERO, GX_CA_ZERO, GX_CA_APREV); GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXSetTevSwapMode(GX_TEVSTAGE2, GX_TEV_SWAP0, GX_TEV_SWAP0); GXSetTevOrder(GX_TEVSTAGE3, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); GXSetTevColorIn(GX_TEVSTAGE3, GX_CC_APREV, GX_CC_CPREV, GX_CC_KONST, GX_CC_ZERO); GXSetTevColorOp(GX_TEVSTAGE3, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXSetTevAlphaIn(GX_TEVSTAGE3, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); GXSetTevAlphaOp(GX_TEVSTAGE3, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXSetTevSwapMode(GX_TEVSTAGE3, GX_TEV_SWAP0, GX_TEV_SWAP0); GXSetTevKColorSel(GX_TEVSTAGE3, GX_TEV_KCSEL_K2); GXColorS10 spA8 = {-0x5A, 0x00, -0x72, 0x87}; GXSetTevColorS10(GX_TEVREG0, spA8); GXColor spB0 = {0x00, 0x00, 0xE2, 0x58}; GXSetTevKColor(GX_KCOLOR0, spB0); GXColor spB4 = {0xB3, 0x00, 0x00, 0xB6}; GXSetTevKColor(GX_KCOLOR1, spB4); GXColor spB8 = {0xFF, 0x00, 0xFF, 0x80}; GXSetTevKColor(GX_KCOLOR2, spB8); GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); } /* 80876BD0-80876DE4 0044F0 0214+00 1/1 0/0 0/0 .text daMP_THPGXYuv2RgbDraw__FPUcPUcPUcssssss */ static void daMP_THPGXYuv2RgbDraw(u8* param_0, u8* param_1, u8* param_2, s16 param_3, s16 param_4, s16 param_5, s16 param_6, s16 param_7, s16 param_8) { GXTexObj sp48; GXTexObj sp28; GXTexObj sp8; GXInitTexObj(&sp48, param_0, param_5, param_6, GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE); GXInitTexObjLOD(&sp48, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); GXLoadTexObj(&sp48, GX_TEXMAP0); GXInitTexObj(&sp28, param_1, param_5 >> 1, param_6 >> 1, GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE); GXInitTexObjLOD(&sp28, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); GXLoadTexObj(&sp28, GX_TEXMAP1); GXInitTexObj(&sp8, param_2, param_5 >> 1, param_6 >> 1, GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE); GXInitTexObjLOD(&sp8, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); GXLoadTexObj(&sp8, GX_TEXMAP2); GXBegin(GX_QUADS, GX_VTXFMT7, 4); GXPosition3s16(param_3, param_4, 0); GXTexCoord2u16(0, 0); GXPosition3s16(param_3 + param_7, param_4, 0); GXTexCoord2u16(1, 0); GXPosition3s16(param_3 + param_7, param_4 + param_8, 0); GXTexCoord2u16(1, 1); GXPosition3s16(param_3, param_4 + param_8, 0); GXTexCoord2u16(0, 1); GXEnd(); } /* 80879114-80879118 0000E0 0004+00 1/1 0/0 0/0 .rodata @4894 */ SECTION_RODATA static f32 const lit_4894 = 7.0f / 10.0f; COMPILER_STRIP_GATE(0x80879114, &lit_4894); /* 80879434-80879534 000000 0100+00 1/1 0/0 0/0 .data daMP_VolumeTable */ SECTION_DATA static u16 daMP_VolumeTable[] = { 0x0000, 0x0002, 0x0008, 0x0012, 0x0020, 0x0032, 0x0049, 0x0063, 0x0082, 0x00A4, 0x00CB, 0x00F5, 0x0124, 0x0157, 0x018E, 0x01C9, 0x0208, 0x024B, 0x0292, 0x02DD, 0x032C, 0x037F, 0x03D7, 0x0432, 0x0492, 0x04F5, 0x055D, 0x05C9, 0x0638, 0x06AC, 0x0724, 0x07A0, 0x0820, 0x08A4, 0x092C, 0x09B8, 0x0A48, 0x0ADD, 0x0B75, 0x0C12, 0x0CB2, 0x0D57, 0x0DFF, 0x0EAC, 0x0F5D, 0x1012, 0x10CA, 0x1187, 0x1248, 0x130D, 0x13D7, 0x14A4, 0x1575, 0x164A, 0x1724, 0x1801, 0x18E3, 0x19C8, 0x1AB2, 0x1BA0, 0x1C91, 0x1D87, 0x1E81, 0x1F7F, 0x2081, 0x2187, 0x2291, 0x239F, 0x24B2, 0x25C8, 0x26E2, 0x2801, 0x2923, 0x2A4A, 0x2B75, 0x2CA3, 0x2DD6, 0x2F0D, 0x3048, 0x3187, 0x32CA, 0x3411, 0x355C, 0x36AB, 0x37FF, 0x3956, 0x3AB1, 0x3C11, 0x3D74, 0x3EDC, 0x4048, 0x41B7, 0x432B, 0x44A3, 0x461F, 0x479F, 0x4923, 0x4AAB, 0x4C37, 0x4DC7, 0x4F5C, 0x50F4, 0x5290, 0x5431, 0x55D6, 0x577E, 0x592B, 0x5ADC, 0x5C90, 0x5E49, 0x6006, 0x61C7, 0x638C, 0x6555, 0x6722, 0x68F4, 0x6AC9, 0x6CA2, 0x6E80, 0x7061, 0x7247, 0x7430, 0x761E, 0x7810, 0x7A06, 0x7C00, 0x7DFE, 0x8000, }; /* 80876E0C-80877074 00472C 0268+00 1/1 0/0 0/0 .text daMP_MixAudio__FPsPsUl */ static void daMP_MixAudio(s16* param_0, s16* param_1, u32 param_2) { // NONMATCHING } /* 80944888-809448A0 0CB2E8 0004+14 3/3 0/0 0/0 .bss daMP_Initialized */ static BOOL daMP_Initialized; /* 809448A0-809448E0 0CB300 0040+00 2/2 0/0 0/0 .bss daMP_WorkBuffer */ static u8 daMP_WorkBuffer[0x40] ALIGN_DECL(32); /* 809448E0-80944900 0CB340 0020+00 3/3 0/0 0/0 .bss daMP_PrepareReadyQueue */ static OSMessageQueue daMP_PrepareReadyQueue; /* 80944900-80944920 0CB360 0020+00 2/2 0/0 0/0 .bss daMP_UsedTextureSetQueue */ static OSMessageQueue daMP_UsedTextureSetQueue; /* 80944920-80944924 0CB380 0004+00 1/1 0/0 0/0 .bss daMP_PrepareReadyMessage */ static OSMessage daMP_PrepareReadyMessage; /* 80944924-80944930 0CB384 000C+00 0/0 0/0 0/0 .bss daMP_UsedTextureSetMessage */ static OSMessage daMP_UsedTextureSetMessage[3]; /* 80944930-80944934 0CB390 0004+00 3/3 0/0 0/0 .bss daMP_OldVIPostCallback */ static VIRetraceCallback daMP_OldVIPostCallback; /* 80944934-80944938 0CB394 0004+00 1/1 0/0 0/0 .bss daMP_SoundBufferIndex */ static u32 daMP_SoundBufferIndex; /* 80944938-8094493C 0CB398 0004+00 0/0 0/0 0/0 .bss daMP_OldAIDCallback */ static u32 daMP_OldAIDCallback; /* 8094493C-80944940 0CB39C 0004+00 0/0 0/0 0/0 .bss daMP_LastAudioBuffer */ static void* daMP_LastAudioBuffer; /* 80944940-80944944 0CB3A0 0004+00 0/0 0/0 0/0 .bss daMP_CurAudioBuffer */ static void* daMP_CurAudioBuffer; /* 80944944-80944960 0CB3A4 0004+18 0/0 0/0 0/0 .bss daMP_AudioSystem */ static s32 daMP_AudioSystem; /* 80944960-80945AE0 0CB3C0 1180+00 1/1 0/0 0/0 .bss daMP_SoundBuffer */ static u8 daMP_SoundBuffer[2][0x8C0] ALIGN_DECL(32); /* 80877074-8087712C 004994 00B8+00 1/1 0/0 0/0 .text daMP_audioCallbackWithMSound__Fl */ static s16* daMP_audioCallbackWithMSound(s32 param_0) { if (daMP_ActivePlayer.field_0xa0 == 0 || daMP_ActivePlayer.field_0xa5 != 2 || daMP_ActivePlayer.field_0xa7 == 0) { return NULL; } BOOL intr = OSEnableInterrupts(); daMP_SoundBufferIndex ^= 1; daMP_MixAudio((s16*)daMP_SoundBuffer[daMP_SoundBufferIndex], NULL, param_0); OSRestoreInterrupts(intr); return (s16*)daMP_SoundBuffer[daMP_SoundBufferIndex]; } /* 8087712C-80877158 004A4C 002C+00 1/1 0/0 0/0 .text daMP_audioInitWithMSound__Fv */ static void daMP_audioInitWithMSound() { JASDriver::registerMixCallback(daMP_audioCallbackWithMSound, MIX_MODE_INTERLEAVE); } /* 80877158-80877180 004A78 0028+00 2/2 0/0 0/0 .text daMP_audioQuitWithMSound__Fv */ static void daMP_audioQuitWithMSound() { JASDriver::registerMixCallback(NULL, MIX_MODE_MONO); } /* 80877180-808771B0 004AA0 0030+00 1/1 0/0 0/0 .text daMP_PushUsedTextureSet__FPv */ static void daMP_PushUsedTextureSet(void* param_0) { OSMessage msg = (OSMessage)param_0; OSSendMessage(&daMP_UsedTextureSetQueue, msg, OS_MESSAGE_NOBLOCK); } /* 808771B0-808771F4 004AD0 0044+00 2/2 0/0 0/0 .text daMP_PopUsedTextureSet__Fv */ static OSMessage daMP_PopUsedTextureSet() { OSMessage msg; if (OSReceiveMessage(&daMP_DecodedAudioBufferQueue, &msg, OS_MESSAGE_NOBLOCK) == 1) { return msg; } return NULL; } /* 808771F4-808772CC 004B14 00D8+00 1/1 0/0 0/0 .text daMP_THPPlayerInit__Fl */ static int daMP_THPPlayerInit(s32 param_0) { // NONMATCHING memset(&daMP_ActivePlayer, 0, sizeof(daMP_ActivePlayer)); LCEnable(); OSInitMessageQueue(&daMP_UsedTextureSetQueue, daMP_UsedTextureSetMessage, 3); if (!THPInit()) { return 0; } BOOL enable = OSDisableInterrupts(); daMP_AudioSystem = param_0; daMP_SoundBufferIndex = 0; daMP_LastAudioBuffer = NULL; daMP_CurAudioBuffer = NULL; daMP_audioInitWithMSound(); OSRestoreInterrupts(enable); if (daMP_AudioSystem == 0) { memset(daMP_SoundBuffer, 0, sizeof(daMP_SoundBuffer)); DCStoreRange(daMP_SoundBuffer, sizeof(daMP_SoundBuffer)); } daMP_Initialized = TRUE; return 1; } /* 808772CC-8087730C 004BEC 0040+00 1/1 0/0 0/0 .text daMP_THPPlayerQuit__Fv */ static void daMP_THPPlayerQuit() { LCDisable(); daMP_audioQuitWithMSound(); daMP_Initialized = FALSE; daMP_ActivePlayer.field_0xa8 = 0; daMP_ActivePlayer.field_0xac = 0; } /* 8087730C-808776EC 004C2C 03E0+00 1/1 0/0 0/0 .text daMP_THPPlayerOpen__FPCci */ // NONMATCHING - regalloc, some missing instructions static BOOL daMP_THPPlayerOpen(char const* filename, int param_1) { if (!daMP_Initialized) { OSReport("You must call daMP_THPPlayerInit before you call this function\n"); return 0; } if (daMP_ActivePlayer.field_0xa0 != 0) { OSReport("Can't open %s. Because thp file have already opened.\n"); return 0; } THPVideoInfo* temp_r29 = &daMP_ActivePlayer.mVideoInfo; memset(temp_r29, 0, sizeof(THPVideoInfo)); memset(&daMP_ActivePlayer.mAudioInfo, 0, sizeof(THPAudioInfo)); if (!DVDOpen(filename, &daMP_ActivePlayer.mFileInfo)) { OSReport("Can't open %s.\n", filename); return 0; } if (DVDReadPrio(&daMP_ActivePlayer.mFileInfo, daMP_WorkBuffer, sizeof(daMP_WorkBuffer), 0, 2) < 0) { OSReport("Fail to read the header from THP file.\n"); DVDClose(&daMP_ActivePlayer.mFileInfo); return 0; } char* temp_r23 = (char*)&daMP_ActivePlayer.field_0x3c; memcpy(temp_r23, daMP_WorkBuffer, 0x30); if (strcmp(temp_r23, "THP") != 0) { OSReport("This file is not THP file.\n"); DVDClose(&daMP_ActivePlayer.mFileInfo); return 0; } if (daMP_ActivePlayer.field_0x40 != 0x11000) { OSReport("invalid version.\n"); DVDClose(&daMP_ActivePlayer.mFileInfo); return 0; } s32 var_r26 = daMP_ActivePlayer.field_0x5c; if (DVDReadPrio(&daMP_ActivePlayer.mFileInfo, daMP_WorkBuffer, 0x20, var_r26, 2) < 0) { OSReport("Fail to read the frame component infomation from THP file.\n"); DVDClose(&daMP_ActivePlayer.mFileInfo); return 0; } memcpy(&daMP_ActivePlayer.field_0x6c, daMP_WorkBuffer, 0x14); var_r26 += 0x14; daMP_ActivePlayer.field_0xa7 = 0; for (int i = 0; i < daMP_ActivePlayer.field_0x6c._0; i++) { switch (daMP_ActivePlayer.field_0x6c._4) { case 0: if (DVDReadPrio(&daMP_ActivePlayer.mFileInfo, daMP_WorkBuffer, 0x20, var_r26, 2) < 0) { OSReport("Fail to read the video infomation from THP file.\n"); DVDClose(&daMP_ActivePlayer.mFileInfo); return 0; } memcpy(temp_r29, daMP_WorkBuffer, sizeof(THPVideoInfo)); var_r26 += 0xC; break; case 1: if (DVDReadPrio(&daMP_ActivePlayer.mFileInfo, daMP_WorkBuffer, 0x20, var_r26, 2) < 0) { OSReport("Fail to read the video infomation from THP file.\n"); DVDClose(&daMP_ActivePlayer.mFileInfo); return 0; } memcpy(&daMP_ActivePlayer.mAudioInfo, daMP_WorkBuffer, sizeof(THPAudioInfo)); daMP_ActivePlayer.field_0xa7 = 1; var_r26 += 0x10; break; default: OSReport("Unknow frame components.\n"); return 0; } } daMP_ActivePlayer.field_0xa5 = 0; daMP_ActivePlayer.mState = 0; daMP_ActivePlayer.field_0xa6 = 0; daMP_ActivePlayer.field_0xb0 = param_1; daMP_ActivePlayer.field_0xa0 = 1; daMP_ActivePlayer.field_0xdc = 127.0f; daMP_ActivePlayer.field_0xe0 = 127.0f; daMP_ActivePlayer.field_0xe8 = 0; return 1; } /* 808776EC-80877740 00500C 0054+00 2/2 0/0 0/0 .text daMP_THPPlayerClose__Fv */ static int daMP_THPPlayerClose() { if (daMP_ActivePlayer.field_0xa0 != 0 && daMP_ActivePlayer.mState == 0) { daMP_ActivePlayer.field_0xa0 = 0; DVDClose(&daMP_ActivePlayer.mFileInfo); return 1; } return 0; } /* 80877740-808777F0 005060 00B0+00 1/1 0/0 0/0 .text daMP_THPPlayerCalcNeedMemory__Fv */ static u32 daMP_THPPlayerCalcNeedMemory() { // NONMATCHING } /* 808777F0-80877A08 005110 0218+00 1/1 0/0 0/0 .text daMP_THPPlayerSetBuffer__FPUc */ static void daMP_THPPlayerSetBuffer(u8* param_0) { // NONMATCHING } /* 80877A08-80877ADC 005328 00D4+00 1/1 0/0 0/0 .text daMP_InitAllMessageQueue__Fv */ static void daMP_InitAllMessageQueue() { // NONMATCHING } /* 80877ADC-80877B48 0053FC 006C+00 1/1 0/0 0/0 .text daMP_ProperTimingForStart__Fv */ static void daMP_ProperTimingForStart() { // NONMATCHING } /* 80877B48-80877C8C 005468 0144+00 1/1 0/0 0/0 .text daMP_ProperTimingForGettingNextFrame__Fv */ static void daMP_ProperTimingForGettingNextFrame() { // NONMATCHING } /* 80877C8C-80877F48 0055AC 02BC+00 1/1 0/0 0/0 .text daMP_PlayControl__FUl */ static void daMP_PlayControl(u32 param_0) { // NONMATCHING } /* 80877F48-80877F88 005868 0040+00 1/1 0/0 0/0 .text daMP_WaitUntilPrepare__Fv */ s32 daMP_WaitUntilPrepare() { OSMessage msg; OSReceiveMessage(&daMP_PrepareReadyQueue, &msg, 1); u32 temp = (s32)msg; return (-temp | temp) >> 31; // fakematch? should be temp != 0; } /* 80877F88-80877FB8 0058A8 0030+00 2/2 0/0 0/0 .text daMP_PrepareReady__Fi */ void daMP_PrepareReady(int r3) { OSMessage msg = (OSMessage)r3; OSSendMessage(&daMP_PrepareReadyQueue, msg, 1); } /* 8087911C-8087911C 0000E8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_808792E2 = "This thp file doesn't have the offset data\n"; SECTION_DEAD static char const* const stringBase_8087930E = "Fail to read the offset data from THP file.\n"; SECTION_DEAD static char const* const stringBase_8087933B = "Specified frame number is over total frame numbe" "r\n"; SECTION_DEAD static char const* const stringBase_8087936E = "Specified audio track number is invalid\n"; SECTION_DEAD static char const* const stringBase_80879397 = "Fail to read all movie data from THP file\n"; #pragma pop /* 80877FB8-808782A0 0058D8 02E8+00 1/1 0/0 0/0 .text daMP_THPPlayerPrepare__Flll */ static BOOL daMP_THPPlayerPrepare(s32 param_0, s32 param_1, s32 param_2) { // NONMATCHING } /* 808782A0-808782E4 005BC0 0044+00 1/1 0/0 0/0 .text daMP_THPPlayerDrawDone__Fv */ static void daMP_THPPlayerDrawDone() { GXDrawDone(); if (daMP_Initialized) { while (1) { void* temp_r3 = daMP_PopUsedTextureSet(); if (temp_r3 == NULL) { break; } daMP_PushFreeTextureSet(temp_r3); } } } /* 808782E4-80878344 005C04 0060+00 1/1 0/0 0/0 .text daMP_THPPlayerPlay__Fv */ static int daMP_THPPlayerPlay() { if (daMP_ActivePlayer.field_0xa0 != 0 && (daMP_ActivePlayer.mState == 1 || daMP_ActivePlayer.mState == 4)) { daMP_ActivePlayer.mState = 2; daMP_ActivePlayer.field_0xd0 = 0; daMP_ActivePlayer.field_0xd4 = 0; daMP_ActivePlayer.field_0xc8 = -1; return 1; } return 0; } /* 80878344-808783FC 005C64 00B8+00 3/3 0/0 0/0 .text daMP_THPPlayerStop__Fv */ static void daMP_THPPlayerStop() { if (daMP_ActivePlayer.field_0xa0 != 0 && daMP_ActivePlayer.mState != 0) { daMP_ActivePlayer.field_0xa5 = 0; daMP_ActivePlayer.mState = 0; VISetPostRetraceCallback(daMP_OldVIPostCallback); if (daMP_ActivePlayer.field_0xb0 == 0) { DVDCancel(&daMP_ActivePlayer.mFileInfo.cb); daMP_ReadThreadCancel(); } daMP_VideoDecodeThreadCancel(); if (daMP_ActivePlayer.field_0xa7 != 0) { daMP_AudioDecodeThreadCancel(); daMP_audioQuitWithMSound(); } while (daMP_PopUsedTextureSet() != NULL) {} daMP_ActivePlayer.field_0xdc = daMP_ActivePlayer.field_0xe0; daMP_ActivePlayer.field_0xe8 = 0.0f; } } /* 808783FC-80878438 005D1C 003C+00 1/1 0/0 0/0 .text daMP_THPPlayerPause__Fv */ static int daMP_THPPlayerPause() { if (daMP_ActivePlayer.field_0xa0 != 0 && daMP_ActivePlayer.mState == 2) { daMP_ActivePlayer.field_0xa5 = 4; daMP_ActivePlayer.mState = 4; return 1; } return 0; } /* 80878438-80878534 005D58 00FC+00 1/1 0/0 0/0 .text * daMP_THPPlayerDrawCurrentFrame__FPC16_GXRenderModeObjUlUlUlUl */ static int daMP_THPPlayerDrawCurrentFrame(_GXRenderModeObj const* param_0, u32 param_1, u32 param_2, u32 param_3, u32 param_4) { // NONMATCHING } /* 80878568-808785B0 005E88 0048+00 1/1 0/0 0/0 .text daMP_THPPlayerGetVideoInfo__FP12THPVideoInfo */ static int daMP_THPPlayerGetVideoInfo(THPVideoInfo* info) { if (daMP_ActivePlayer.field_0xa0 != 0) { memcpy(info, &daMP_ActivePlayer.mVideoInfo, sizeof(THPVideoInfo)); return 1; } return 0; } /* 808785B0-808785F8 005ED0 0048+00 1/1 0/0 0/0 .text daMP_THPPlayerGetAudioInfo__FP12THPAudioInfo */ static int daMP_THPPlayerGetAudioInfo(THPAudioInfo* info) { if (daMP_ActivePlayer.field_0xa0 != 0) { memcpy(info, &daMP_ActivePlayer.mAudioInfo, sizeof(THPAudioInfo)); return 1; } return 0; } /* 808785F8-8087861C 005F18 0024+00 2/2 0/0 0/0 .text daMP_THPPlayerGetTotalFrame__Fv */ static u32 daMP_THPPlayerGetTotalFrame() { if (daMP_ActivePlayer.field_0xa0 != 0) { return daMP_ActivePlayer.mTotalFrames; } return 0; } /* 8087861C-8087862C 005F3C 0010+00 2/2 0/0 0/0 .text daMP_THPPlayerGetState__Fv */ static int daMP_THPPlayerGetState() { return daMP_ActivePlayer.mState; } /* 8087862C-80878758 005F4C 012C+00 1/1 0/0 0/0 .text daMP_THPPlayerSetVolume__Fll */ static void daMP_THPPlayerSetVolume(s32 param_0, s32 param_1) { // NONMATCHING } /* 80945AE0-80945AEC 0CC540 000C+00 1/1 0/0 0/0 .bss daMP_videoInfo */ static THPVideoInfo daMP_videoInfo; /* 80945AEC-80945AFC 0CC54C 0010+00 0/0 0/0 0/0 .bss daMP_audioInfo */ static THPAudioInfo daMP_audioInfo; /* 80945AFC-80945B00 0CC55C 0004+00 1/1 0/0 0/0 .bss daMP_DrawPosX */ static u32 daMP_DrawPosX; /* 80945B00-80945B04 0CC560 0004+00 1/1 0/0 0/0 .bss daMP_DrawPosY */ static u32 daMP_DrawPosY; /* 80945B04-80945B08 0CC564 0004+00 2/2 0/0 0/0 .bss daMP_buffer */ static void* daMP_buffer; /* 80878758-808788BC 006078 0164+00 1/1 0/0 0/0 .text daMP_ActivePlayer_Init__FPCc */ static BOOL daMP_ActivePlayer_Init(char const* moviePath) { daMP_THPPlayerInit(0); if (!daMP_THPPlayerOpen(moviePath, 0)) { OSReport("Fail to open the thp file\n"); JUT_ASSERT(0, 0); return 0; } daMP_THPPlayerGetVideoInfo(&daMP_videoInfo); daMP_THPPlayerGetAudioInfo(&daMP_audioInfo); u16 var_r31 = JUTVideo::getManager()->getRenderMode()->fbWidth; u16 temp_r4 = JUTVideo::getManager()->getRenderMode()->efbHeight; daMP_DrawPosX = (var_r31 - daMP_videoInfo.field_0x0) >> 1; daMP_DrawPosY = (temp_r4 - daMP_videoInfo.field_0x4) >> 1; // "The memory needed for this THP movie is %d bytes\n" OS_REPORT("このTHPムービーが必要なメモリは%dバイトです\n", daMP_THPPlayerCalcNeedMemory()); daMP_buffer = mDoExt_getArchiveHeap()->alloc(daMP_THPPlayerCalcNeedMemory(), 0x20); if (daMP_buffer == NULL) { OSReport("Can't allocate the memory"); JUT_ASSERT(0, 0); return 0; } daMP_THPPlayerSetBuffer((u8*)daMP_buffer); if (!daMP_THPPlayerPrepare(0, 0, daMP_audioInfo.field_0xc != 1 ? OSGetTick() % daMP_audioInfo.field_0xc : 0)) { OSReport("Fail to prepare\n"); JUT_ASSERT(0, 0); return 0; } return 1; } /* 808788D4-80878914 0061F4 0040+00 1/1 0/0 0/0 .text daMP_ActivePlayer_Finish__Fv */ static void daMP_ActivePlayer_Finish() { daMP_THPPlayerStop(); daMP_THPPlayerClose(); daMP_THPPlayerQuit(); if (daMP_buffer != NULL) { JKRFree(daMP_buffer); } } /* 80878938-80878994 006258 005C+00 1/1 0/0 0/0 .text daMP_ActivePlayer_Main__Fv */ static void daMP_ActivePlayer_Main() { if (daMP_THPPlayerGetState() == 5) { daMP_THPPlayerStop(); daMP_THPPlayerClose(); if (daMP_buffer != NULL) { JKRFree(daMP_buffer); } OSReport("Error happen"); } } /* 80878994-80878A34 0062B4 00A0+00 1/1 0/0 0/0 .text daMP_ActivePlayer_Draw__Fv */ static void daMP_ActivePlayer_Draw() { int var_r31 = daMP_THPPlayerDrawCurrentFrame(JUTVideo::getManager()->getRenderMode(), daMP_DrawPosX, daMP_DrawPosY, daMP_videoInfo.field_0x0, daMP_videoInfo.field_0x4); daMP_THPPlayerDrawDone(); if (!fopOvlpM_IsPeek() && var_r31 > 0 && (cAPICPad_ANY_BUTTON(0) || !daMP_c::daMP_c_Get_MovieRestFrame())) { dComIfGp_event_reset(); daMP_c::daMP_c_Set_PercentMovieVolume(0.0f); } } /* 80945B08-80945B0C 0CC568 0004+00 5/5 0/0 0/0 .bss daMP_Fail_alloc */ static BOOL daMP_Fail_alloc; /* 80878A6C-80878B38 00638C 00CC+00 1/1 0/0 0/0 .text daMP_Get_MovieRestFrame__Fv */ static u32 daMP_Get_MovieRestFrame() { // NONMATCHING return 0; } /* 80878B38-80878BB8 006458 0080+00 1/1 0/0 0/0 .text daMP_Set_PercentMovieVolume__Ff */ static void daMP_Set_PercentMovieVolume(f32 param_0) { if (!daMP_Fail_alloc) { s32 var_r3; if (param_0 >= 1.0f) { var_r3 = 127; } else if (param_0 <= 0.0f) { var_r3 = 0; } else { var_r3 = param_0 / 127.0f; } daMP_THPPlayerSetVolume(var_r3, 1000); } } /* 80878BB8-80878BDC 0064D8 0024+00 1/1 0/0 0/0 .text daMP_c_Get_arg_demoNo__6daMP_cFv */ int daMP_c::daMP_c_Get_arg_demoNo() { return (fopAcM_GetParam(this) >> 7) & 0x7F; } /* 80878C04-80878C28 006524 0024+00 1/1 0/0 0/0 .text daMP_c_Get_arg_movieNo__6daMP_cFv */ int daMP_c::daMP_c_Get_arg_movieNo() { return fopAcM_GetParam(this) & 0x7F; } /* 80878C28-80878D10 006548 00E8+00 1/1 0/0 0/0 .text daMP_c_Init__6daMP_cFv */ int daMP_c::daMP_c_Init() { JUT_ASSERT(9469, m_myObj == 0); mDoGph_gInf_c::setFrameRate(1); daMP_Fail_alloc = FALSE; int demoNo = daMP_c_Get_arg_demoNo(); JUT_ASSERT(9505, 0 <= demoNo && demoNo <= 99); int movieNo = daMP_c_Get_arg_movieNo(); JUT_ASSERT(9507, 0 <= movieNo && movieNo <= 99); char path[32]; sprintf(path, "/Movie/demo_movie%02d_%02d.thp", demoNo, movieNo); if (!daMP_ActivePlayer_Init(path)) { daMP_Fail_alloc = TRUE; } mpGetMovieRestFrame = daMP_Get_MovieRestFrame; mpSetPercentMovieVol = daMP_Set_PercentMovieVolume; mpTHPGetTotalFrame = daMP_THPPlayerGetTotalFrame; mpTHPPlay = daMP_THPPlayerPlay; mpTHPStop = daMP_THPPlayerStop; mpTHPPause = daMP_THPPlayerPause; m_myObj = this; return cPhs_COMPLEATE_e; } /* 80878D64-80878D94 006684 0030+00 1/1 0/0 0/0 .text daMP_c_Finish__6daMP_cFv */ int daMP_c::daMP_c_Finish() { daMP_ActivePlayer_Finish(); m_myObj = NULL; return 1; } /* 80878D94-80878DB8 0066B4 0024+00 1/1 0/0 0/0 .text daMP_c_Main__6daMP_cFv */ int daMP_c::daMP_c_Main() { daMP_ActivePlayer_Main(); return 1; } /* 80878DB8-80878DD8 0066D8 0020+00 1/0 0/0 0/0 .text draw__16daMP_Dlst_base_cFv */ void daMP_Dlst_base_c::draw() { daMP_ActivePlayer_Draw(); } /* 80945B0C-80945B10 0CC56C 0004+00 2/2 0/0 0/0 .bss daMP_c_Dlst_base */ static daMP_Dlst_base_c daMP_c_Dlst_base; /* 80878DD8-80878E04 0066F8 002C+00 1/1 0/0 0/0 .text daMP_c_Draw__6daMP_cFv */ int daMP_c::daMP_c_Draw() { dComIfGd_set2DOpa(&daMP_c_Dlst_base); return 1; } /* 80878E60-80878EC4 006780 0064+00 1/0 0/0 0/0 .text daMP_c_Callback_Init__6daMP_cFP10fopAc_ac_c */ int daMP_c::daMP_c_Callback_Init(fopAc_ac_c* i_this) { fopAcM_SetupActor(i_this, daMP_c); return ((daMP_c*)i_this)->daMP_c_Init(); } /* 80878F18-80878F38 006838 0020+00 1/0 0/0 0/0 .text daMP_c_Callback_Finish__6daMP_cFP6daMP_c */ int daMP_c::daMP_c_Callback_Finish(daMP_c* i_this) { return i_this->daMP_c_Finish(); } /* 80878F38-80878F70 006858 0038+00 1/0 0/0 0/0 .text daMP_c_Callback_Main__6daMP_cFP6daMP_c */ int daMP_c::daMP_c_Callback_Main(daMP_c* i_this) { if (daMP_Fail_alloc) { return 1; } return i_this->daMP_c_Main(); } /* 80878F70-80878FA8 006890 0038+00 1/0 0/0 0/0 .text daMP_c_Callback_Draw__6daMP_cFP6daMP_c */ int daMP_c::daMP_c_Callback_Draw(daMP_c* i_this) { if (daMP_Fail_alloc) { return 1; } return i_this->daMP_c_Draw(); } /* 80878FA8-80878FB0 0068C8 0008+00 1/0 0/0 0/0 .text daMP_Callback_Dummy__FP6daMP_c */ static int daMP_Callback_Dummy(daMP_c* i_this) { return 1; } /* 80879534-80879554 -00001 0020+00 1/0 0/0 0/0 .data daMP_METHODS */ static actor_method_class daMP_METHODS = { (process_method_func)daMP_c::daMP_c_Callback_Init, (process_method_func)daMP_c::daMP_c_Callback_Finish, (process_method_func)daMP_c::daMP_c_Callback_Main, (process_method_func)daMP_Callback_Dummy, (process_method_func)daMP_c::daMP_c_Callback_Draw, }; /* 80879554-80879584 -00001 0030+00 0/0 0/0 1/0 .data g_profile_MOVIE_PLAYER */ extern actor_process_profile_definition g_profile_MOVIE_PLAYER = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_MOVIE_PLAYER, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daMP_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 9, // mPriority &daMP_METHODS, // sub_method 0x0006C000, // mStatus fopAc_ACTOR_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType }; AUDIO_INSTANCES;