summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzelda2774 <69368340+zelda2774@users.noreply.github.com>2021-06-04 00:36:21 +0200
committerGitHub <noreply@github.com>2021-06-03 18:36:21 -0400
commit4b97acff2c299d9ffaa07a80363076bf3102c63e (patch)
tree5d9ebd54cdad74899e6259695e72765c1001263d /src
parentaceefd7384d037a986a13934d80eed48bc8367df (diff)
Improve Audio_SequencePlayerProcessSequence (#844)
Co-authored-by: zelda2774 <zelda2774@invalid>
Diffstat (limited to 'src')
-rw-r--r--src/code/audio_seqplayer.c68
1 files changed, 39 insertions, 29 deletions
diff --git a/src/code/audio_seqplayer.c b/src/code/audio_seqplayer.c
index 508a37f46..297d72546 100644
--- a/src/code/audio_seqplayer.c
+++ b/src/code/audio_seqplayer.c
@@ -1028,7 +1028,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) {
break;
case 0xC2:
offset = (u16)parameters[0];
- channel->dynTable = &player->seqData[offset];
+ channel->dynTable = (void*)&player->seqData[offset];
break;
case 0xC5:
if (scriptState->value != -1) {
@@ -1036,7 +1036,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) {
data = (*channel->dynTable)[scriptState->value];
offset = (u16)((data[0] << 8) + data[1]);
- channel->dynTable = &player->seqData[offset];
+ channel->dynTable = (void*)&player->seqData[offset];
}
break;
case 0xEB:
@@ -1108,7 +1108,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* channel) {
break;
case 0xDA:
offset = (u16)parameters[0];
- channel->adsr.envelope = &player->seqData[offset];
+ channel->adsr.envelope = (AdsrEnvelope*)&player->seqData[offset];
break;
case 0xD9:
command = (u8)parameters[0];
@@ -1462,8 +1462,7 @@ void Audio_SequenceChannelProcessScript(SequenceChannel* seqChannel);
#endif
#ifdef NON_MATCHING
-// regalloc, redundant branch, and extra cast. The large number of pads suggests cases may have their own temp
-// variables.
+// Regalloc. The large number of pads suggests cases may have their own temp variables.
void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
u8 command;
u8 commandLow;
@@ -1477,7 +1476,7 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
s32 pad1;
s32 pad2;
s32 pad3;
- s32 pad4;
+ s32 dummy;
if (!seqPlayer->enabled) {
return;
@@ -1535,9 +1534,19 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
switch (command) {
case 0xF1:
Audio_NotePoolClear(&seqPlayer->notePool);
- Audio_NotePoolFill(&seqPlayer->notePool, Audio_M64ReadU8(seqScript));
+ command = Audio_M64ReadU8(seqScript);
+ Audio_NotePoolFill(&seqPlayer->notePool, command);
+ // Fake-match: the asm has two breaks in a row here,
+ // which the compiler normally optimizes out.
+ dummy = -1;
+ if (dummy < 0) {
+ dummy = 0;
+ }
+ if (dummy > 1) {
+ dummy = 1;
+ }
+ if (dummy) {}
break;
- break; // This second break appears in the ASM, but the compiler currently optimizes it out.
case 0xF0:
Audio_NotePoolClear(&seqPlayer->notePool);
break;
@@ -1561,17 +1570,17 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
break;
case 0xDA:
command = Audio_M64ReadU8(seqScript);
- offset = Audio_M64ReadS16(seqScript);
+ temp = Audio_M64ReadS16(seqScript);
switch (command) {
case 0:
case 1:
if (seqPlayer->state != 2) {
- seqPlayer->fadeTimerUnkEu = offset;
+ seqPlayer->fadeTimerUnkEu = temp;
seqPlayer->state = command;
}
break;
case 2:
- seqPlayer->fadeTimer = offset;
+ seqPlayer->fadeTimer = temp;
seqPlayer->state = command;
seqPlayer->fadeVelocity = (0 - seqPlayer->fadeVolume) / (s32)seqPlayer->fadeTimer;
break;
@@ -1601,8 +1610,8 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
seqPlayer->fadeVolumeScale = (s8)Audio_M64ReadU8(seqScript) / 127.0f;
break;
case 0xD7:
- tempS = Audio_M64ReadS16(seqScript);
- Audio_SequencePlayerInitChannels(seqPlayer, tempS);
+ temp = Audio_M64ReadS16(seqScript);
+ Audio_SequencePlayerInitChannels(seqPlayer, temp);
break;
case 0xD6:
Audio_M64ReadS16(seqScript);
@@ -1629,28 +1638,28 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
case 0xD0:
seqPlayer->noteAllocPolicy = Audio_M64ReadU8(seqScript);
break;
- case 0xCE: {
+ case 0xCE:
command = Audio_M64ReadU8(seqScript);
- // t register shift here
if (command == 0) {
- seqScript->value = gAudioContext.gAudioRandom / 4;
+ seqScript->value = (gAudioContext.gAudioRandom >> 2) & 0xff;
} else {
- seqScript->value = (gAudioContext.gAudioRandom / 4) % command;
+ seqScript->value = (gAudioContext.gAudioRandom >> 2) % command;
}
- } break;
+ break;
case 0xCD: {
- temp = Audio_M64ReadS16(seqScript);
+ offset = Audio_M64ReadS16(seqScript);
if ((seqScript->value != -1) && (seqScript->depth != 3)) {
// a/v registers are wrong here. may need to mess with temps
- data = &seqPlayer->seqData[temp + seqScript->value * 2]; // should go in v0
+ data = seqPlayer->seqData + (u32)(offset + seqScript->value * 2);
seqScript->stack[seqScript->depth] = seqScript->pc;
-
seqScript->depth++;
- offset = (data[0] << 8) + data[1];
- seqScript->pc = &seqPlayer->seqData[offset];
+
+ temp = (data[0] << 8) + data[1];
+ seqScript->pc = &seqPlayer->seqData[temp];
}
- } break;
+ break;
+ }
case 0xCC:
seqScript->value = Audio_M64ReadU8(seqScript);
break;
@@ -1662,9 +1671,9 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
break;
case 0xC7:
command = Audio_M64ReadU8(seqScript);
- offset = Audio_M64ReadS16(seqScript);
- data = &seqPlayer->seqData[offset];
- data[0] = (u8)seqScript->value + command;
+ temp = Audio_M64ReadS16(seqScript);
+ data = &seqPlayer->seqData[temp];
+ *data = (u8)seqScript->value + command;
break;
case 0xC6:
seqPlayer->unk_0b2 = true;
@@ -1724,10 +1733,11 @@ void Audio_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
func_800E390C(command, &seqPlayer->seqData[temp], &seqPlayer->unk_158[commandLow]);
break;
case 0x60: {
- command = Audio_M64ReadU8(seqScript); // This shouldn't be cast to u8 when saved
+ command = Audio_M64ReadU8(seqScript);
+ value = command;
temp = Audio_M64ReadU8(seqScript);
- func_800E4EEC(command, temp, &seqPlayer->unk_158[commandLow]);
+ func_800E4EEC(value, temp, &seqPlayer->unk_158[commandLow]);
break;
}
}