mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-21 13:53:49 -07:00
Big-endian support (#909)
This commit is contained in:
parent
477cf7f6ec
commit
6818247317
22 changed files with 762 additions and 62 deletions
|
@ -1,6 +1,8 @@
|
|||
#ifndef COLOR_H
|
||||
#define COLOR_H
|
||||
|
||||
#include "endianness.h"
|
||||
|
||||
typedef struct {
|
||||
u8 r, g, b;
|
||||
} Color_RGB8;
|
||||
|
@ -12,7 +14,11 @@ typedef struct {
|
|||
// only use when necessary for alignment purposes
|
||||
typedef union {
|
||||
struct {
|
||||
#ifdef IS_BIGENDIAN
|
||||
u8 r, g, b, a;
|
||||
#else
|
||||
u8 a, b, g, r;
|
||||
#endif
|
||||
};
|
||||
u32 rgba;
|
||||
} Color_RGBA8_u32;
|
||||
|
|
|
@ -6,6 +6,15 @@
|
|||
* Each macro packs bytes (B), halfwords (H) and words (W, for consistency) into a single word
|
||||
*/
|
||||
|
||||
#ifdef IS_BIGENDIAN
|
||||
#define CMD_BBBB(a, b, c, d) (_SHIFTL(a, 24, 8) | _SHIFTL(b, 16, 8) | _SHIFTL(c, 8, 8) | _SHIFTL(d, 0, 8))
|
||||
|
||||
#define CMD_BBH(a, b, c) (_SHIFTL(a, 24, 8) | _SHIFTL(b, 16, 8) | _SHIFTL(c, 0, 16))
|
||||
|
||||
#define CMD_HBB(a, b, c) (_SHIFTL(a, 16, 16) | _SHIFTL(b, 8, 8) | _SHIFTL(c, 0, 8))
|
||||
|
||||
#define CMD_HH(a, b) (_SHIFTL(a, 16, 16) | _SHIFTL(b, 0, 16))
|
||||
#else
|
||||
#define CMD_BBBB(a, b, c, d) (_SHIFTL(a, 0, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(c, 16, 8) | _SHIFTL(d, 24, 8))
|
||||
|
||||
#define CMD_BBH(a, b, c) (_SHIFTL(a, 0, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(c, 16, 16))
|
||||
|
@ -13,6 +22,7 @@
|
|||
#define CMD_HBB(a, b, c) (_SHIFTL(a, 0, 16) | _SHIFTL(b, 16, 8) | _SHIFTL(c, 24, 8))
|
||||
|
||||
#define CMD_HH(a, b) (_SHIFTL(a, 0, 16) | _SHIFTL(b, 16, 16))
|
||||
#endif
|
||||
|
||||
#define CMD_W(a) (a)
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef MACROS_H
|
||||
#define MACROS_H
|
||||
|
||||
#include "endianness.h"
|
||||
|
||||
#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
|
||||
#define ARRAY_COUNTU(arr) (u32)(sizeof(arr) / sizeof(arr[0]))
|
||||
|
||||
|
@ -254,12 +256,5 @@ extern GraphicsContext* __gfxCtx;
|
|||
|
||||
#define SEG_ADDR(seg, addr) (addr | (seg << 24) | 1)
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define BOMSWAP16 _byteswap_ushort
|
||||
#define BOMSWAP32 _byteswap_ulong
|
||||
#else
|
||||
#define BOMSWAP16 __builtin_bswap16
|
||||
#define BOMSWAP32 __builtin_bswap32
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef Z64_AUDIO_H
|
||||
#define Z64_AUDIO_H
|
||||
|
||||
#include "endianness.h"
|
||||
|
||||
#define MK_CMD(b0,b1,b2,b3) ((((b0) & 0xFF) << 0x18) | (((b1) & 0xFF) << 0x10) | (((b2) & 0xFF) << 0x8) | (((b3) & 0xFF) << 0))
|
||||
|
||||
#define NO_LAYER ((SequenceLayer*)(-1))
|
||||
|
@ -685,6 +687,35 @@ typedef struct {
|
|||
} AudioPreloadReq; // size = 0x14
|
||||
|
||||
typedef struct {
|
||||
#ifdef IS_BIGENDIAN
|
||||
union{
|
||||
u32 opArgs;
|
||||
struct {
|
||||
u8 op;
|
||||
u8 arg0;
|
||||
u8 arg1;
|
||||
u8 arg2;
|
||||
};
|
||||
};
|
||||
union {
|
||||
void* data;
|
||||
f32 asFloat;
|
||||
s32 asInt;
|
||||
struct {
|
||||
u16 asUShort;
|
||||
u8 pad2[2];
|
||||
};
|
||||
struct {
|
||||
s8 asSbyte;
|
||||
u8 pad1[3];
|
||||
};
|
||||
struct {
|
||||
u8 asUbyte;
|
||||
u8 pad0[3];
|
||||
};
|
||||
u32 asUInt;
|
||||
};
|
||||
#else
|
||||
union{
|
||||
u32 opArgs;
|
||||
struct {
|
||||
|
@ -712,6 +743,7 @@ typedef struct {
|
|||
};
|
||||
u32 asUInt;
|
||||
};
|
||||
#endif
|
||||
} AudioCmd;
|
||||
|
||||
typedef struct {
|
||||
|
|
|
@ -117,8 +117,7 @@ extern "C" void InitOTR() {
|
|||
|
||||
if (!t->bHasLoadError)
|
||||
{
|
||||
//uint32_t gameVersion = BitConverter::ToUInt32BE((uint8_t*)t->buffer.get(), 0);
|
||||
uint32_t gameVersion = *((uint32_t*)t->buffer.get());
|
||||
uint32_t gameVersion = LE32SWAP(*((uint32_t*)t->buffer.get()));
|
||||
OTRGlobals::Instance->context->GetResourceManager()->SetGameVersion(gameVersion);
|
||||
}
|
||||
|
||||
|
@ -795,8 +794,8 @@ extern "C" SoundFont* ResourceMgr_LoadAudioSoundFont(const char* path) {
|
|||
|
||||
for (size_t k = 0; k < soundFont->drums[i].env.size(); k++)
|
||||
{
|
||||
drum->envelope[k].delay = BOMSWAP16(soundFont->drums[i].env[k]->delay);
|
||||
drum->envelope[k].arg = BOMSWAP16(soundFont->drums[i].env[k]->arg);
|
||||
drum->envelope[k].delay = BE16SWAP(soundFont->drums[i].env[k]->delay);
|
||||
drum->envelope[k].arg = BE16SWAP(soundFont->drums[i].env[k]->arg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -827,8 +826,8 @@ extern "C" SoundFont* ResourceMgr_LoadAudioSoundFont(const char* path) {
|
|||
|
||||
for (int k = 0; k < soundFont->instruments[i].env.size(); k++)
|
||||
{
|
||||
inst->envelope[k].delay = BOMSWAP16(soundFont->instruments[i].env[k]->delay);
|
||||
inst->envelope[k].arg = BOMSWAP16(soundFont->instruments[i].env[k]->arg);
|
||||
inst->envelope[k].delay = BE16SWAP(soundFont->instruments[i].env[k]->delay);
|
||||
inst->envelope[k].arg = BE16SWAP(soundFont->instruments[i].env[k]->arg);
|
||||
}
|
||||
}
|
||||
if (soundFont->instruments[i].lowNotesSound != nullptr)
|
||||
|
|
|
@ -544,10 +544,10 @@ u8 gDefaultShortNoteGateTimeTable[] = {
|
|||
};
|
||||
|
||||
AdsrEnvelope gDefaultEnvelope[] = {
|
||||
{ 0x0100, 0x007D },
|
||||
{ 0xE803, 0x007D },
|
||||
{ 0xFFFF, 0x0000 },
|
||||
{ 0x0000, 0x0000 },
|
||||
{ BE16SWAP_CONST(1), BE16SWAP_CONST(32000) },
|
||||
{ BE16SWAP_CONST(1000), BE16SWAP_CONST(32000) },
|
||||
{ BE16SWAP_CONST(-1), BE16SWAP_CONST(0) },
|
||||
{ BE16SWAP_CONST(0), BE16SWAP_CONST(0) },
|
||||
};
|
||||
|
||||
NoteSubEu gZeroNoteSub = { 0 };
|
||||
|
|
|
@ -246,7 +246,7 @@ f32 Audio_AdsrUpdate(AdsrState* adsr) {
|
|||
|
||||
retry:
|
||||
case ADSR_STATE_LOOP:
|
||||
adsr->delay = (s16)BOMSWAP16(adsr->envelope[adsr->envIndex].delay);
|
||||
adsr->delay = (s16)BE16SWAP(adsr->envelope[adsr->envIndex].delay);
|
||||
switch (adsr->delay) {
|
||||
case ADSR_DISABLE:
|
||||
adsr->action.s.state = ADSR_STATE_DISABLED;
|
||||
|
@ -255,7 +255,7 @@ f32 Audio_AdsrUpdate(AdsrState* adsr) {
|
|||
adsr->action.s.state = ADSR_STATE_HANG;
|
||||
break;
|
||||
case ADSR_GOTO:
|
||||
adsr->envIndex = (s16)BOMSWAP16(adsr->envelope[adsr->envIndex].arg);
|
||||
adsr->envIndex = (s16)BE16SWAP(adsr->envelope[adsr->envIndex].arg);
|
||||
goto retry;
|
||||
case ADSR_RESTART:
|
||||
adsr->action.s.state = ADSR_STATE_INITIAL;
|
||||
|
@ -266,7 +266,7 @@ f32 Audio_AdsrUpdate(AdsrState* adsr) {
|
|||
if (adsr->delay == 0) {
|
||||
adsr->delay = 1;
|
||||
}
|
||||
adsr->target = (s16)BOMSWAP16(adsr->envelope[adsr->envIndex].arg) / 32767.0f;
|
||||
adsr->target = (s16)BE16SWAP(adsr->envelope[adsr->envIndex].arg) / 32767.0f;
|
||||
adsr->target = adsr->target * adsr->target;
|
||||
adsr->velocity = (adsr->target - adsr->current) / adsr->delay;
|
||||
adsr->action.s.state = ADSR_STATE_FADE;
|
||||
|
|
|
@ -1340,13 +1340,13 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
|
|||
break;
|
||||
case 0xB2:
|
||||
offset = (u16)parameters[0];
|
||||
channel->unk_22 = BOMSWAP16(*(u16*)(seqPlayer->seqData + (uintptr_t)(offset + scriptState->value * 2)));
|
||||
channel->unk_22 = BE16SWAP(*(u16*)(seqPlayer->seqData + (uintptr_t)(offset + scriptState->value * 2)));
|
||||
break;
|
||||
case 0xB4:
|
||||
channel->dynTable = (void*)&seqPlayer->seqData[channel->unk_22];
|
||||
break;
|
||||
case 0xB5:
|
||||
channel->unk_22 = BOMSWAP16(((u16*)(channel->dynTable))[scriptState->value]);
|
||||
channel->unk_22 = BE16SWAP(((u16*)(channel->dynTable))[scriptState->value]);
|
||||
break;
|
||||
case 0xB6:
|
||||
scriptState->value = (*channel->dynTable)[0][scriptState->value];
|
||||
|
|
|
@ -217,13 +217,12 @@ void func_80095D04(GlobalContext* globalCtx, Room* room, u32 flags) {
|
|||
CLOSE_DISPS(globalCtx->state.gfxCtx);
|
||||
}
|
||||
|
||||
//#define JPEG_MARKER 0xFFD8FFE0
|
||||
#define JPEG_MARKER 0xE0FFD8FF
|
||||
#define JPEG_MARKER 0xFFD8FFE0
|
||||
|
||||
s32 func_80096238(void* data) {
|
||||
OSTime time;
|
||||
|
||||
if (*(u32*)data == JPEG_MARKER)
|
||||
if (BE32SWAP(*(u32*)data) == JPEG_MARKER)
|
||||
{
|
||||
char* decodedJpeg = ResourceMgr_LoadJPEG(data, 320 * 240 * 2);
|
||||
//char* decodedJpeg = ResourceMgr_LoadJPEG(data, 480 * 240 * 2);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue