diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h index 90e5e421a8..8b1b18571f 100644 --- a/include/gba/m4a_internal.h +++ b/include/gba/m4a_internal.h @@ -279,7 +279,7 @@ struct MusicPlayerTrack u8 key; u8 velocity; u8 runningStatus; - u8 keyM; + s8 keyM; u8 pitM; s8 keyShift; s8 keyShiftX; @@ -342,6 +342,7 @@ struct MusicPlayerInfo u16 fadeOI; u16 fadeOC; u16 fadeOV; + u16 dummy; struct MusicPlayerTrack *tracks; struct ToneData *tone; u32 ident; @@ -371,16 +372,13 @@ extern const struct Song gSongTable[]; extern u8 gMPlayMemAccArea[]; -//u8 gPokemonCrySong[52]; -//u8 gPokemonCrySongs[52 * MAX_POKEMON_CRIES]; - #define MAX_POKEMON_CRIES 2 extern struct PokemonCrySong gPokemonCrySong; -extern struct PokemonCrySong gPokemonCrySongs[]; +extern struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES]; -extern struct MusicPlayerInfo gPokemonCryMusicPlayers[]; -extern struct MusicPlayerTrack gPokemonCryTracks[]; +extern struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES]; +extern struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES][2]; extern char SoundMainRAM[]; diff --git a/src/m4a.c b/src/m4a.c index 1a2d541887..40af846242 100644 --- a/src/m4a.c +++ b/src/m4a.c @@ -15,7 +15,7 @@ COMMON_DATA MPlayFunc gMPlayJumpTable[36] = {0}; COMMON_DATA struct CgbChannel gCgbChans[4] = {0}; COMMON_DATA struct MusicPlayerInfo gMPlayInfo_SE1 = {0}; COMMON_DATA struct MusicPlayerInfo gMPlayInfo_SE2 = {0}; -COMMON_DATA struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2] = {0}; +COMMON_DATA struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES][2] = {0}; COMMON_DATA struct PokemonCrySong gPokemonCrySong = {0}; COMMON_DATA u8 gMPlayMemAccArea[0x10] = {0}; COMMON_DATA struct MusicPlayerInfo gMPlayInfo_SE3 = {0}; @@ -71,7 +71,7 @@ void m4aSoundInit(void) { s32 i; - CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); + CpuCopy32((void *)((u32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); SoundInit(&gSoundInfo); MPlayExtender(gCgbChans); @@ -92,10 +92,8 @@ void m4aSoundInit(void) for (i = 0; i < MAX_POKEMON_CRIES; i++) { - struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i]; - struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; - MPlayOpen(mplayInfo, track, 2); - track->chan = 0; + MPlayOpen(&gPokemonCryMusicPlayers[i], gPokemonCryTracks[i], 2); + gPokemonCryTracks[i]->chan = 0; } } @@ -231,10 +229,10 @@ void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) { - s32 trackCount = mplayInfo->trackCount; - struct MusicPlayerTrack *track = mplayInfo->tracks; + s32 trackCount; + struct MusicPlayerTrack *track; - while (trackCount > 0) + for (trackCount = mplayInfo->trackCount, track = mplayInfo->tracks; trackCount > 0; trackCount--, track++) { if (track->flags & MPT_FLG_EXIST) { @@ -248,9 +246,6 @@ void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) track->tone.type = 1; } } - - trackCount--; - track++; } } @@ -333,9 +328,9 @@ static void UNUSED MusicPlayerJumpTableCopy(void) void ClearChain(void *x) { #if __STDC_VERSION__ < 202311L - void (*func)(void *) = *(&gMPlayJumpTable[34]); + void (*func)(void *) = *(gMPlayJumpTable + 34); #else - void (*func)(...) = *(&gMPlayJumpTable[34]); + void (*func)(...) = *(gMPlayJumpTable + 34); #endif func(x); } @@ -343,9 +338,9 @@ void ClearChain(void *x) void Clear64byte(void *x) { #if __STDC_VERSION__ < 202311L - void (*func)(void *) = *(&gMPlayJumpTable[35]); + void (*func)(void *) = *(gMPlayJumpTable + 35); #else - void (*func)(...) = *(&gMPlayJumpTable[35]); + void (*func)(...) = *(gMPlayJumpTable + 35); #endif func(x); } @@ -372,10 +367,10 @@ void SoundInit(struct SoundInfo *soundInfo) | SOUND_ALL_MIX_FULL; REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; - REG_DMA1SAD = (s32)soundInfo->pcmBuffer; - REG_DMA1DAD = (s32)®_FIFO_A; - REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; - REG_DMA2DAD = (s32)®_FIFO_B; + REG_DMA1SAD = (u32)soundInfo->pcmBuffer; + REG_DMA1DAD = (u32)®_FIFO_A; + REG_DMA2SAD = (u32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; + REG_DMA2DAD = (u32)®_FIFO_B; SOUND_INFO_PTR = soundInfo; CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); @@ -452,15 +447,8 @@ void m4aSoundMode(u32 mode) soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; - temp = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (temp != 0) - { + for (temp = MAX_DIRECTSOUND_CHANNELS, chan = soundInfo->chans; temp != 0; temp--, chan++) chan->statusFlags = 0; - temp--; - chan++; - } } temp = mode & SOUND_MODE_MASVOL; @@ -491,35 +479,27 @@ void SoundClear(void) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; s32 i; - void *chan; + union { + struct SoundChannel *ds; + struct CgbChannel *cgb; + } chan; if (soundInfo->ident != ID_NUMBER) return; soundInfo->ident++; - i = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; + for (i = MAX_DIRECTSOUND_CHANNELS, chan.ds = soundInfo->chans; i > 0; i--, chan.ds++) + chan.ds->statusFlags = 0; - while (i > 0) + chan.cgb = soundInfo->cgbChans; + + if (chan.cgb != NULL) { - ((struct SoundChannel *)chan)->statusFlags = 0; - i--; - chan = (void *)((s32)chan + sizeof(struct SoundChannel)); - } - - chan = soundInfo->cgbChans; - - if (chan) - { - i = 1; - - while (i <= 4) + for (i = 1; i <= 4; i++, chan.cgb++) { soundInfo->CgbOscOff(i); - ((struct CgbChannel *)chan)->statusFlags = 0; - i++; - chan = (void *)((s32)chan + sizeof(struct CgbChannel)); + chan.cgb->statusFlags = 0; } } @@ -585,12 +565,8 @@ void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track mplayInfo->trackCount = trackCount; mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; - while (trackCount != 0) - { + for (; trackCount != 0; trackCount--, tracks++) tracks->flags = 0; - trackCount--; - tracks++; - } // append music player and MPlayMain to linked list @@ -617,8 +593,10 @@ void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader if (mplayInfo->ident != ID_NUMBER) return; + // unk_B is gMPlayTable[].unk_A: 0 = BGM/SE3 (always restart), 1 = SE1/SE2 (respect active tracks and priority) unk_B = mplayInfo->unk_B; + // Start when: always-restart player, idle/paused SE player, or new song has equal/higher priority if (!unk_B || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 @@ -637,25 +615,18 @@ void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader mplayInfo->tempoC = 0; mplayInfo->fadeOI = 0; - i = 0; - track = mplayInfo->tracks; - - while (i < songHeader->trackCount && i < mplayInfo->trackCount) + for (i = 0, track = mplayInfo->tracks; i < songHeader->trackCount && i < mplayInfo->trackCount; i++, track++) { TrackStop(mplayInfo, track); track->flags = MPT_FLG_EXIST | MPT_FLG_START; track->chan = 0; track->cmdPtr = songHeader->part[i]; - i++; - track++; } - while (i < mplayInfo->trackCount) + for (; i < mplayInfo->trackCount; i++, track++) { TrackStop(mplayInfo, track); track->flags = 0; - i++; - track++; } if (songHeader->reverb & SOUND_MODE_REVERB_SET) @@ -676,15 +647,8 @@ void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) mplayInfo->ident++; mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { + for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++) TrackStop(mplayInfo, track); - i--; - track++; - } mplayInfo->ident = ID_NUMBER; } @@ -693,7 +657,6 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) { s32 i; struct MusicPlayerTrack *track; - u16 fadeOV; if (mplayInfo->fadeOI == 0) return; @@ -714,24 +677,12 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) { if ((s16)(mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT)) <= 0) { - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++) { - u32 val; - TrackStop(mplayInfo, track); - val = TEMPORARY_FADE; - fadeOV = mplayInfo->fadeOV; - val &= fadeOV; - - if (!val) + if (!(mplayInfo->fadeOV & TEMPORARY_FADE)) track->flags = 0; - - i--; - track++; } if (mplayInfo->fadeOV & TEMPORARY_FADE) @@ -744,64 +695,51 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) } } - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++) { if (track->flags & MPT_FLG_EXIST) { - fadeOV = mplayInfo->fadeOV; - - track->volX = (fadeOV >> FADE_VOL_SHIFT); + track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); track->flags |= MPT_FLG_VOLCHG; } - - i--; - track++; } } void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { + s32 bend; + u32 x, y; if (track->flags & MPT_FLG_VOLSET) { - s32 x; - s32 y; - - x = (u32)(track->vol * track->volX) >> 5; + x = ((u32)track->vol * track->volX) >> 5; if (track->modT == 1) x = (u32)(x * (track->modM + 128)) >> 7; - y = 2 * track->pan + track->panX; + bend = (track->pan << 1) + track->panX; if (track->modT == 2) - y += track->modM; + bend += track->modM; - if (y < -128) - y = -128; - else if (y > 127) - y = 127; + if (bend < -128) + bend = -128; + else if (bend > 127) + bend = 127; - track->volMR = (u32)((y + 128) * x) >> 8; - track->volML = (u32)((127 - y) * x) >> 8; + track->volMR = (u32)((bend + 128) * x) >> 8; + track->volML = (u32)((127 - bend) * x) >> 8; } if (track->flags & MPT_FLG_PITSET) { - s32 bend = track->bend * track->bendRange; - s32 x = (track->tune + bend) - * 4 - + (track->keyShift << 8) - + (track->keyShiftX << 8) - + track->pitX; + bend = ((track->bend * track->bendRange) << 2) + + (track->tune << 2) + (track->keyShift << 8) + + + (track->keyShiftX << 8) + track->pitX; - if (track->modT == 0) - x += 16 * track->modM; + if (track->modT == 0) bend += track->modM << 4; - track->keyM = x >> 8; - track->pitM = x; + track->keyM = bend >> 8; + track->pitM = (u8)bend; } track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); @@ -809,6 +747,7 @@ void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tr u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) { + s32 val1, val2; if (chanNum == 4) { if (key <= 20) @@ -824,34 +763,29 @@ u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) return gNoiseTable[key]; } + + if (key <= 35) + { + fineAdjust = 0; + key = 0; + } else { - s32 val1; - s32 val2; - - if (key <= 35) + key -= 36; + if (key > 130) { - fineAdjust = 0; - key = 0; + key = 130; + fineAdjust = 255; } - else - { - key -= 36; - if (key > 130) - { - key = 130; - fineAdjust = 255; - } - } - - val1 = gCgbScaleTable[key]; - val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); - - val2 = gCgbScaleTable[key + 1]; - val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); - - return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; } + + val1 = gCgbScaleTable[key]; + val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gCgbScaleTable[key + 1]; + val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); + + return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; } void CgbOscOff(u8 chanNum) @@ -880,7 +814,10 @@ static inline int CgbPan(struct CgbChannel *chan) u32 rightVolume = chan->rightVolume; u32 leftVolume = chan->leftVolume; - if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) + rightVolume = (u8)rightVolume; + leftVolume = (u8)leftVolume; + + if (rightVolume >= leftVolume) { if (rightVolume / 2 >= leftVolume) { @@ -987,63 +924,56 @@ void CgbSound(void) /* 2. calculate envelope volume */ if (channels->statusFlags & SOUND_CHANNEL_SF_START) { - if (!(channels->statusFlags & SOUND_CHANNEL_SF_STOP)) - { - channels->statusFlags = SOUND_CHANNEL_SF_ENV_ATTACK; - channels->modify = CGB_CHANNEL_MO_PIT | CGB_CHANNEL_MO_VOL; - CgbModVol(channels); - switch (ch) - { - case 1: - *nrx0ptr = channels->sweep; - // fallthrough - case 2: - *nrx1ptr = ((u32)channels->wavePointer << 6) + channels->length; - goto init_env_step_time_dir; - case 3: - if (channels->wavePointer != channels->currentPointer) - { - *nrx0ptr = 0x40; - REG_WAVE_RAM0 = channels->wavePointer[0]; - REG_WAVE_RAM1 = channels->wavePointer[1]; - REG_WAVE_RAM2 = channels->wavePointer[2]; - REG_WAVE_RAM3 = channels->wavePointer[3]; - channels->currentPointer = channels->wavePointer; - } - *nrx0ptr = 0; - *nrx1ptr = channels->length; - if (channels->length) - channels->n4 = 0xC0; - else - channels->n4 = 0x80; - break; - default: - *nrx1ptr = channels->length; - *nrx3ptr = (u32)channels->wavePointer << 3; - init_env_step_time_dir: - envelopeStepTimeAndDir = channels->attack + CGB_NRx2_ENV_DIR_INC; - if (channels->length) - channels->n4 = 0x40; - else - channels->n4 = 0x00; - break; - } - channels->envelopeCounter = channels->attack; - if ((s8)(channels->attack & mask)) - { - channels->envelopeVolume = 0; - goto envelope_step_complete; - } - else - { - // skip attack phase if attack is instantaneous (=0) - goto envelope_decay_start; - } - } - else - { + if (channels->statusFlags & SOUND_CHANNEL_SF_STOP) goto oscillator_off; + + channels->statusFlags = SOUND_CHANNEL_SF_ENV_ATTACK; + channels->modify = CGB_CHANNEL_MO_PIT | CGB_CHANNEL_MO_VOL; + CgbModVol(channels); + switch (ch) + { + case 1: + *nrx0ptr = channels->sweep; + // fallthrough + case 2: + *nrx1ptr = ((u32)channels->wavePointer << 6) + channels->length; + goto init_env_step_time_dir; + case 3: + if (channels->wavePointer != channels->currentPointer) + { + *nrx0ptr = 0x40; + REG_WAVE_RAM0 = channels->wavePointer[0]; + REG_WAVE_RAM1 = channels->wavePointer[1]; + REG_WAVE_RAM2 = channels->wavePointer[2]; + REG_WAVE_RAM3 = channels->wavePointer[3]; + channels->currentPointer = channels->wavePointer; + } + *nrx0ptr = 0; + *nrx1ptr = channels->length; + if (channels->length) + channels->n4 = 0xC0; + else + channels->n4 = 0x80; + break; + default: + *nrx1ptr = channels->length; + *nrx3ptr = (u32)channels->wavePointer << 3; + init_env_step_time_dir: + envelopeStepTimeAndDir = channels->attack + CGB_NRx2_ENV_DIR_INC; + if (channels->length) + channels->n4 = 0x40; + else + channels->n4 = 0x00; + break; } + channels->envelopeCounter = channels->attack; + if ((s8)(channels->attack & mask)) + { + channels->envelopeVolume = 0; + goto envelope_step_complete; + } + // skip attack phase if attack is instantaneous (=0) + goto envelope_decay_start; } else if (channels->statusFlags & SOUND_CHANNEL_SF_IEC) { @@ -1068,21 +998,22 @@ void CgbSound(void) envelopeStepTimeAndDir = channels->release | CGB_NRx2_ENV_DIR_DEC; goto envelope_step_complete; } - else - { - goto envelope_pseudoecho_start; - } + goto envelope_pseudoecho_start; } else { envelope_step_repeat: if (channels->envelopeCounter == 0) { + u8 envPhase; + if (ch == 3) channels->modify |= CGB_CHANNEL_MO_VOL; CgbModVol(channels); - if ((channels->statusFlags & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_RELEASE) + envPhase = channels->statusFlags & SOUND_CHANNEL_SF_ENV; + + if (envPhase == SOUND_CHANNEL_SF_ENV_RELEASE) { channels->envelopeVolume--; if ((s8)(channels->envelopeVolume & mask) <= 0) @@ -1094,33 +1025,23 @@ void CgbSound(void) channels->statusFlags |= SOUND_CHANNEL_SF_IEC; channels->modify |= CGB_CHANNEL_MO_VOL; if (ch != 3) - envelopeStepTimeAndDir = 0 | CGB_NRx2_ENV_DIR_INC; + envelopeStepTimeAndDir = CGB_NRx2_ENV_DIR_INC; goto envelope_complete; } - else - { - goto oscillator_off; - } - } - else - { - channels->envelopeCounter = channels->release; + goto oscillator_off; } + channels->envelopeCounter = channels->release; } - else if ((channels->statusFlags & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_SUSTAIN) + else if (envPhase == SOUND_CHANNEL_SF_ENV_SUSTAIN) { envelope_sustain: channels->envelopeVolume = channels->sustainGoal; channels->envelopeCounter = 7; } - else if ((channels->statusFlags & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_DECAY) + else if (envPhase == SOUND_CHANNEL_SF_ENV_DECAY) { - int envelopeVolume, sustainGoal; - channels->envelopeVolume--; - envelopeVolume = (s8)(channels->envelopeVolume & mask); - sustainGoal = (s8)(channels->sustainGoal); - if (envelopeVolume <= sustainGoal) + if ((s8)(channels->envelopeVolume & mask) <= (s8)(channels->sustainGoal)) { envelope_sustain_start: if (channels->sustain == 0) @@ -1128,19 +1049,13 @@ void CgbSound(void) channels->statusFlags &= ~SOUND_CHANNEL_SF_ENV; goto envelope_pseudoecho_start; } - else - { - channels->statusFlags--; - channels->modify |= CGB_CHANNEL_MO_VOL; - if (ch != 3) - envelopeStepTimeAndDir = 0 | CGB_NRx2_ENV_DIR_INC; - goto envelope_sustain; - } - } - else - { - channels->envelopeCounter = channels->decay; + channels->statusFlags--; + channels->modify |= CGB_CHANNEL_MO_VOL; + if (ch != 3) + envelopeStepTimeAndDir = CGB_NRx2_ENV_DIR_INC; + goto envelope_sustain; } + channels->envelopeCounter = channels->decay; } else { @@ -1150,7 +1065,7 @@ void CgbSound(void) envelope_decay_start: channels->statusFlags--; channels->envelopeCounter = channels->decay; - if ((u8)(channels->envelopeCounter & mask)) + if ((u8)(channels->decay & mask)) { channels->modify |= CGB_CHANNEL_MO_VOL; channels->envelopeVolume = channels->envelopeGoal; @@ -1253,11 +1168,7 @@ void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 mplayInfo->ident++; - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks, bit = 1; i > 0; i--, track++, bit <<= 1) { if (trackBits & bit) { @@ -1267,10 +1178,6 @@ void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 track->flags |= MPT_FLG_VOLCHG; } } - - i--; - track++; - bit <<= 1; } mplayInfo->ident = ID_NUMBER; @@ -1287,11 +1194,7 @@ void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 mplayInfo->ident++; - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks, bit = 1; i > 0; i--, track++, bit <<= 1) { if (trackBits & bit) { @@ -1302,10 +1205,6 @@ void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 track->flags |= MPT_FLG_PITCHG; } } - - i--; - track++; - bit <<= 1; } mplayInfo->ident = ID_NUMBER; @@ -1322,11 +1221,7 @@ void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 mplayInfo->ident++; - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks, bit = 1; i > 0; i--, track++, bit <<= 1) { if (trackBits & bit) { @@ -1336,10 +1231,6 @@ void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 track->flags |= MPT_FLG_VOLCHG; } } - - i--; - track++; - bit <<= 1; } mplayInfo->ident = ID_NUMBER; @@ -1367,11 +1258,7 @@ void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 mo mplayInfo->ident++; - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks, bit = 1; i > 0; i--, track++, bit <<= 1) { if (trackBits & bit) { @@ -1383,10 +1270,6 @@ void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 mo ClearModM(track); } } - - i--; - track++; - bit <<= 1; } mplayInfo->ident = ID_NUMBER; @@ -1403,11 +1286,7 @@ void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lf mplayInfo->ident++; - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks, bit = 1; i > 0; i--, track++, bit <<= 1) { if (trackBits & bit) { @@ -1419,10 +1298,6 @@ void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lf ClearModM(track); } } - - i--; - track++; - bit <<= 1; } mplayInfo->ident = ID_NUMBER; @@ -1430,7 +1305,7 @@ void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lf #define MEMACC_COND_JUMP(cond) \ if (cond) \ - goto cond_true; \ + break; \ else \ goto cond_false; \ @@ -1471,50 +1346,34 @@ void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *trac return; case 6: MEMACC_COND_JUMP(*addr == data) - return; case 7: MEMACC_COND_JUMP(*addr != data) - return; case 8: MEMACC_COND_JUMP(*addr > data) - return; case 9: MEMACC_COND_JUMP(*addr >= data) - return; case 10: MEMACC_COND_JUMP(*addr <= data) - return; case 11: MEMACC_COND_JUMP(*addr < data) - return; case 12: MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) - return; case 13: MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) - return; case 14: MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) - return; case 15: MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) - return; case 16: MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) - return; case 17: MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) - return; default: return; } -cond_true: - { - // *& is required for matching - (*&gMPlayJumpTable[1])(mplayInfo, track); - return; - } + (*(gMPlayJumpTable + 1))(mplayInfo, track); + return; cond_false: track->cmdPtr += 4; @@ -1533,28 +1392,16 @@ void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) gMPlayJumpTable[0](mplayInfo, track); } -#define READ_XCMD_BYTE(var, n) \ -{ \ - u32 byte = track->cmdPtr[(n)]; \ - byte <<= n * 8; \ - (var) &= ~(0xFF << (n * 8)); \ - (var) |= byte; \ -} - void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { - u32 wav; + union { struct WaveData *w; u8 d[4]; } u; -#ifdef UBFIX - wav = 0; -#endif + u.d[0] = *(track->cmdPtr + 0); + u.d[1] = *(track->cmdPtr + 1); + u.d[2] = *(track->cmdPtr + 2); + u.d[3] = *(track->cmdPtr + 3); - READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable - READ_XCMD_BYTE(wav, 1) - READ_XCMD_BYTE(wav, 2) - READ_XCMD_BYTE(wav, 3) - - track->tone.wav = (struct WaveData *)wav; + track->tone.wav = u.w; track->cmdPtr += 4; } @@ -1614,16 +1461,12 @@ void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track void ply_xwait(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { - u32 len; + union { u16 a; u8 d[2]; } u; -#ifdef UBFIX - len = 0; -#endif + u.d[0] = *(track->cmdPtr + 0); + u.d[1] = *(track->cmdPtr + 1); - READ_XCMD_BYTE(len, 0) // UB: uninitialized variable - READ_XCMD_BYTE(len, 1) - - if (track->timer < (u16)len) + if (track->timer < u.a) { track->timer++; track->cmdPtr -= 2; @@ -1638,18 +1481,14 @@ void ply_xwait(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { - u32 unk; + union { u32 a; u8 d[4]; } u; -#ifdef UBFIX - unk = 0; -#endif + u.d[0] = *(track->cmdPtr + 0); + u.d[1] = *(track->cmdPtr + 1); + u.d[2] = *(track->cmdPtr + 2); + u.d[3] = *(track->cmdPtr + 3); - READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable - READ_XCMD_BYTE(unk, 1) - READ_XCMD_BYTE(unk, 2) - READ_XCMD_BYTE(unk, 3) - - track->unk_3C = unk; + track->unk_3C = u.a; track->cmdPtr += 4; } @@ -1666,7 +1505,7 @@ struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone) for (i = 0; i < MAX_POKEMON_CRIES; i++) { - struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; + struct MusicPlayerTrack *track = &gPokemonCryTracks[i][0]; if (!track->flags && (!track->chan || track->chan->track != track)) goto start_song; diff --git a/src/m4a_1.s b/src/m4a_1.s index 20f9197a8d..d47c0635b4 100644 --- a/src/m4a_1.s +++ b/src/m4a_1.s @@ -308,7 +308,7 @@ _081DD068: mov r10, r10, lsl 16 mov r11, r11, lsl 16 ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x8 + tst r0, TONEDATA_TYPE_FIX beq _081DD19C _081DD07C: cmp r2, 0x4 diff --git a/src/main.c b/src/main.c index 2a47ec51ac..5958c1736d 100644 --- a/src/main.c +++ b/src/main.c @@ -439,5 +439,5 @@ void DoSoftReset(void) void ClearPokemonCrySongs(void) { - CpuFill16(0, gPokemonCrySongs, MAX_POKEMON_CRIES * sizeof(struct PokemonCrySong)); + CpuFill16(0, gPokemonCrySongs, sizeof(gPokemonCrySongs)); }