tp/src/d/actor/d_a_movie_player.cpp

3775 lines
121 KiB
C++

/**
* @file d_a_movie_player.cpp
*
*/
#include "d/dolzel_rel.h"
// 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 <stdio.h>
#include <cstring.h>
#include <dolphin.h>
#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++;
}
/* 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 */
void daMP_Reader(void*) {
daMP_THPReadBuffer* readBuf;
int r30;
int r29;
int r28;
int readBytes;
r28 = 0;
r30 = daMP_ActivePlayer.field_0xb8;
r29 = daMP_ActivePlayer.field_0xbc;
while (true) {
readBuf = daMP_PopFreeReadBuffer();
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 */
static void daMP_THPGXYuv2RgbSetup(GXRenderModeObj const* param_0) {
int width = param_0->fbWidth;
int height = param_0->efbHeight;
f32 var_f31 = 0.0f;
#if PLATFORM_WII || PLATFORM_SHIELD
if (!mDoGph_gInf_c::isWide()) {
var_f31 = ((u16)height - (width * 808.0f) / 608.0f) * 0.5f;
}
#endif
Mtx44 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;