From 8834fdd3e24e7904973af4ca160c1badbf5bb31a Mon Sep 17 00:00:00 2001 From: nullableVoidPtr <30564701+nullableVoidPtr@users.noreply.github.com> Date: Sun, 11 Aug 2019 14:31:39 +0000 Subject: Port m4a from pokeemerald --- src/m4a.c | 1652 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/m4a_2.c | 947 ---------------------------------- src/m4a_4.c | 384 -------------- 3 files changed, 1652 insertions(+), 1331 deletions(-) create mode 100644 src/m4a.c delete mode 100644 src/m4a_2.c delete mode 100644 src/m4a_4.c (limited to 'src') diff --git a/src/m4a.c b/src/m4a.c new file mode 100644 index 0000000..42e6d9d --- /dev/null +++ b/src/m4a.c @@ -0,0 +1,1652 @@ +#include "gba/m4a_internal.h" +#include "global.h" + +extern const u8 gCgb3Vol[]; + +extern char SoundMainRAM_Buffer[0x400]; + +extern struct SoundInfo gSoundInfo; + + +u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) +{ + u32 val1; + u32 val2; + u32 fineAdjustShifted = fineAdjust << 24; + + if (key > 178) + { + key = 178; + fineAdjustShifted = 255 << 24; + } + + val1 = gScaleTable[key]; + val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gScaleTable[key + 1]; + val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); + + return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); +} + +void UnusedDummyFunc() +{ +} + +void MPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aSoundInit(void) +{ + s32 i; + + CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); + + SoundInit(&gSoundInfo); + MPlayExtender(gCgbChans); + m4aSoundMode(SOUND_MODE_DA_BIT_8 + | SOUND_MODE_FREQ_18157 + | (14 << SOUND_MODE_MASVOL_SHIFT) + | (5 << SOUND_MODE_MAXCHN_SHIFT)); + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + { + struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; + MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); + mplayInfo->unk_B = gMPlayTable[i].unk_A; + mplayInfo->memAccArea = gMPlayMemAccArea; + } +} + +void m4aSoundMain(void) +{ + SoundMain(); +} + +void m4aSongNumStart(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + MPlayStart(mplay->info, song->header); +} + +void m4aSongNumStartOrChange(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + { + MPlayStart(mplay->info, song->header); + } + else + { + if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) + { + MPlayStart(mplay->info, song->header); + } + } +} + +void m4aSongNumStartOrContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + MPlayStart(mplay->info, song->header); + else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) + MPlayStart(mplay->info, song->header); + else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) + MPlayContinue(mplay->info); +} + + +void m4aSongNumStop(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + m4aMPlayStop(mplay->info); +} + +void m4aSongNumContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + MPlayContinue(mplay->info); +} + +void m4aMPlayAllStop(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + m4aMPlayStop(gMPlayTable[i].info); +} + +void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + MPlayContinue(mplayInfo); +} + +void m4aMPlayAllContinue(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + MPlayContinue(gMPlayTable[i].info); +} + +void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + MPlayFadeOut(mplayInfo, speed); +} + +void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; + mplayInfo->ident = ID_NUMBER; + } +} +void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) +{ + s32 trackCount = mplayInfo->trackCount; + struct MusicPlayerTrack *track = mplayInfo->tracks; + + while (trackCount > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + if (track->flags & MPT_FLG_START) + { + Clear64byte(track); + track->flags = MPT_FLG_EXIST; + track->bendRange = 2; + track->volX = 64; + track->lfoSpeed = 22; + track->tone.type = 1; + } + } + + trackCount--; + track++; + } +} + +void MPlayExtender(struct CgbChannel *cgbChans) +{ + struct SoundInfo *soundInfo; + u32 ident; + + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_L = 0; // set master volume to zero + REG_NR12 = 0x8; + REG_NR22 = 0x8; + REG_NR42 = 0x8; + REG_NR14 = 0x80; + REG_NR24 = 0x80; + REG_NR44 = 0x80; + REG_NR30 = 0; + REG_NR50 = 0x77; + + soundInfo = SOUND_INFO_PTR; + + ident = soundInfo->ident; + + if (ident != ID_NUMBER) + return; + + soundInfo->ident++; + + gMPlayJumpTable[8] = ply_memacc; + gMPlayJumpTable[17] = ply_lfos; + gMPlayJumpTable[19] = ply_mod; + gMPlayJumpTable[28] = ply_xcmd; + gMPlayJumpTable[29] = ply_endtie; + gMPlayJumpTable[30] = SampleFreqSet; + gMPlayJumpTable[31] = TrackStop; + gMPlayJumpTable[32] = FadeOutBody; + gMPlayJumpTable[33] = TrkVolPitSet; + + soundInfo->cgbChans = (struct CgbChannel *)cgbChans; + soundInfo->CgbSound = CgbSound; + soundInfo->CgbOscOff = CgbOscOff; + soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; + soundInfo->maxLines = MAX_LINES; + + CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); + + cgbChans[0].ty = 1; + cgbChans[0].panMask = 0x11; + cgbChans[1].ty = 2; + cgbChans[1].panMask = 0x22; + cgbChans[2].ty = 3; + cgbChans[2].panMask = 0x44; + cgbChans[3].ty = 4; + cgbChans[3].panMask = 0x88; + + soundInfo->ident = ident; +} + +void MusicPlayerJumpTableCopy(void) +{ + asm("swi 0x2A"); +} + +void ClearChain(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[34]); + func(x); +} + +void Clear64byte(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[35]); + func(x); +} + +void SoundInit(struct SoundInfo *soundInfo) +{ + soundInfo->ident = 0; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT + | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT + | 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; + + SOUND_INFO_PTR = soundInfo; + CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); + + soundInfo->maxChans = 8; + soundInfo->masterVolume = 15; + soundInfo->plynote = (u32)ply_note; + soundInfo->CgbSound = DummyFunc; + soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; + soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; + soundInfo->ExtVolPit = (u32)DummyFunc; + + MPlayJumpTableCopy(gMPlayJumpTable); + + soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; + + SampleFreqSet(SOUND_MODE_FREQ_13379); + + soundInfo->ident = ID_NUMBER; +} + +void SampleFreqSet(u32 freq) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + freq = (freq & 0xF0000) >> 16; + soundInfo->freq = freq; + soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; + soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; + + // LCD refresh rate 59.7275Hz + soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; + + // CPU frequency 16.78Mhz + soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; + + // Turn off timer 0. + REG_TM0CNT_H = 0; + + // cycles per LCD fresh 280896 + REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); + + m4aSoundVSyncOn(); + + while (*(vu8 *)REG_ADDR_VCOUNT == 159) + ; + + while (*(vu8 *)REG_ADDR_VCOUNT != 159) + ; + + REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; +} + +void m4aSoundMode(u32 mode) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 temp; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); + + if (temp) + soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; + + temp = mode & SOUND_MODE_MAXCHN; + + if (temp) + { + struct SoundChannel *chan; + + soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; + + temp = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (temp != 0) + { + chan->status = 0; + temp--; + chan++; + } + } + + temp = mode & SOUND_MODE_MASVOL; + + if (temp) + soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; + + temp = mode & SOUND_MODE_DA_BIT; + + if (temp) + { + temp = (temp & 0x300000) >> 14; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; + } + + temp = mode & SOUND_MODE_FREQ; + + if (temp) + { + m4aSoundVSyncOff(); + SampleFreqSet(temp); + } + + soundInfo->ident = ID_NUMBER; +} + +void SoundClear(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + s32 i; + void *chan; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + i = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (i > 0) + { + ((struct SoundChannel *)chan)->status = 0; + i--; + chan = (void *)((s32)chan + sizeof(struct SoundChannel)); + } + + chan = soundInfo->cgbChans; + + if (chan) + { + i = 1; + + while (i <= 4) + { + soundInfo->CgbOscOff(i); + ((struct CgbChannel *)chan)->sf = 0; + i++; + chan = (void *)((s32)chan + sizeof(struct CgbChannel)); + } + } + + soundInfo->ident = ID_NUMBER; +} + +void m4aSoundVSyncOff(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) + { + soundInfo->ident += 10; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + + CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); + } +} + +void m4aSoundVSyncOn(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 ident = soundInfo->ident; + + if (ident == ID_NUMBER) + return; + + REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + + soundInfo->pcmDmaCounter = 0; + soundInfo->ident = ident - 10; +} + +void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) +{ + struct SoundInfo *soundInfo; + + if (trackCount == 0) + return; + + if (trackCount > MAX_MUSICPLAYER_TRACKS) + trackCount = MAX_MUSICPLAYER_TRACKS; + + soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + Clear64byte(mplayInfo); + + mplayInfo->tracks = tracks; + mplayInfo->trackCount = trackCount; + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + while (trackCount != 0) + { + tracks->flags = 0; + trackCount--; + tracks++; + } + + if (soundInfo->func != 0) + { + mplayInfo->func = soundInfo->func; + mplayInfo->intp = soundInfo->intp; + soundInfo->func = 0; + } + + soundInfo->intp = (u32)mplayInfo; + soundInfo->func = (u32)MPlayMain; + soundInfo->ident = ID_NUMBER; + mplayInfo->ident = ID_NUMBER; +} + +void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) +{ + s32 i; + u8 unk_B; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + unk_B = mplayInfo->unk_B; + + if (!unk_B + || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) + && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) + || (mplayInfo->priority <= songHeader->priority)) + { + mplayInfo->ident++; + mplayInfo->status = 0; + mplayInfo->songHeader = songHeader; + mplayInfo->tone = songHeader->tone; + mplayInfo->priority = songHeader->priority; + mplayInfo->clock = 0; + mplayInfo->tempoD = 150; + mplayInfo->tempoI = 150; + mplayInfo->tempoU = 0x100; + mplayInfo->tempoC = 0; + mplayInfo->fadeOI = 0; + + i = 0; + track = mplayInfo->tracks; + + while (i < songHeader->trackCount && i < mplayInfo->trackCount) + { + 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) + { + TrackStop(mplayInfo, track); + track->flags = 0; + i++; + track++; + } + + if (songHeader->reverb & 0x80) + m4aSoundMode(songHeader->reverb); + + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + TrackStop(mplayInfo, track); + i--; + track++; + } + + mplayInfo->ident = ID_NUMBER; +} + +void FadeOutBody(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + u16 fadeOI = mplayInfo->fadeOI; + register u32 temp asm("r3"); + register u16 mask asm("r2"); + + if (fadeOI == 0) + return; + + mplayInfo->fadeOC--; + + temp = 0xFFFF; + mask = temp; + + if (mplayInfo->fadeOC != 0) + return; + + mplayInfo->fadeOC = fadeOI; + + if (mplayInfo->fadeOV & FADE_IN) + { + mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); + + if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) + { + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->fadeOI = 0; + } + } + else + { + mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); + + if ((s16)(mplayInfo->fadeOV & mask) <= 0) + { + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + register u32 fadeOV asm("r7"); + u32 val; + + TrackStop(mplayInfo, track); + + val = TEMPORARY_FADE; + fadeOV = mplayInfo->fadeOV; + val &= fadeOV; + + if (!val) + track->flags = 0; + + i--; + track++; + } + + if (mplayInfo->fadeOV & TEMPORARY_FADE) + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + else + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + mplayInfo->fadeOI = 0; + return; + } + } + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); + track->flags |= MPT_FLG_VOLCHG; + } + + i--; + track++; + } +} + +void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + if (track->flags & MPT_FLG_VOLSET) + { + s32 x; + s32 y; + + x = (u32)(track->vol * track->volX) >> 5; + + if (track->modT == 1) + x = (u32)(x * (track->modM + 128)) >> 7; + + y = 2 * track->pan + track->panX; + + if (track->modT == 2) + y += track->modM; + + if (y < -128) + y = -128; + else if (y > 127) + y = 127; + + track->volMR = (u32)((y + 128) * x) >> 8; + track->volML = (u32)((127 - y) * x) >> 8; + } + + if (track->flags & MPT_FLG_PITSET) + { + s32 bend = track->bend * track->bendRange; + register s32 x asm("r1") = track->tune; + x += bend; + x *= 4; + x += (track->keyShift << 8); + x += (track->keyShiftX << 8); + x += track->pitX; + + if (track->modT == 0) + x += 16 * track->modM; + + track->keyM = x >> 8; + track->pitM = x; + } + + track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); +} + +u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) +{ + if (chanNum == 4) + { + if (key <= 20) + { + key = 0; + } + else + { + key -= 21; + if (key > 59) + key = 59; + } + + return gNoiseTable[key]; + } + else + { + s32 val1; + s32 val2; + + if (key <= 35) + { + fineAdjust = 0; + key = 0; + } + 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; + } +} + +void CgbOscOff(u8 chanNum) +{ + switch (chanNum) + { + case 1: + REG_NR12 = 8; + REG_NR14 = 0x80; + break; + case 2: + REG_NR22 = 8; + REG_NR24 = 0x80; + break; + case 3: + REG_NR30 = 0; + break; + default: + REG_NR42 = 8; + REG_NR44 = 0x80; + } +} + +static inline int CgbPan(struct CgbChannel *chan) +{ + u32 rightVolume = chan->rightVolume; + u32 leftVolume = chan->leftVolume; + + if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) + { + if (rightVolume / 2 >= leftVolume) + { + chan->pan = 0x0F; + return 1; + } + } + else + { + if (leftVolume / 2 >= rightVolume) + { + chan->pan = 0xF0; + return 1; + } + } + + return 0; +} +#ifndef NONMATCHING +NAKED +#endif +void CgbModVol(struct CgbChannel *chan) +{ +#ifdef NONMATCHING + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if ((soundInfo->mode & 1) || !CgbPan(chan)) + { + chan->pan = 0xFF; + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + } + else + { + // Force chan->rightVolume and chan->leftVolume to be read from memory again, + // even though there is no reason to do so. + // The command line option "-fno-gcse" achieves the same result as this. + asm("" : : : "memory"); + + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + if (chan->eg > 15) + chan->eg = 15; + } + + chan->sg = (chan->eg * chan->su + 15) >> 4; + chan->pan &= chan->panMask; +#else + asm_unified("\tpush {r4,lr}\n" + "\tadds r1, r0, 0\n" + "\tldrb r0, [r1, 0x2]\n" + "\tlsls r2, r0, 24\n" + "\tlsrs r4, r2, 24\n" + "\tldrb r3, [r1, 0x3]\n" + "\tlsls r0, r3, 24\n" + "\tlsrs r3, r0, 24\n" + "\tcmp r4, r3\n" + "\tbcc _080AFA94\n" + "\tlsrs r0, r2, 25\n" + "\tcmp r0, r3\n" + "\tbcc _080AFAA0\n" + "\tmovs r0, 0xF\n" + "\tstrb r0, [r1, 0x1B]\n" + "\tb _080AFAAE\n" + "_080AFA94:\n" + "\tlsrs r0, 25\n" + "\tcmp r0, r4\n" + "\tbcc _080AFAA0\n" + "\tmovs r0, 0xF0\n" + "\tstrb r0, [r1, 0x1B]\n" + "\tb _080AFAAE\n" + "_080AFAA0:\n" + "\tmovs r0, 0xFF\n" + "\tstrb r0, [r1, 0x1B]\n" + "\tldrb r2, [r1, 0x3]\n" + "\tldrb r3, [r1, 0x2]\n" + "\tadds r0, r2, r3\n" + "\tlsrs r0, 4\n" + "\tb _080AFABE\n" + "_080AFAAE:\n" + "\tldrb r2, [r1, 0x3]\n" + "\tldrb r3, [r1, 0x2]\n" + "\tadds r0, r2, r3\n" + "\tlsrs r0, 4\n" + "\tstrb r0, [r1, 0xA]\n" + "\tcmp r0, 0xF\n" + "\tbls _080AFAC0\n" + "\tmovs r0, 0xF\n" + "_080AFABE:\n" + "\tstrb r0, [r1, 0xA]\n" + "_080AFAC0:\n" + "\tldrb r2, [r1, 0x6]\n" + "\tldrb r3, [r1, 0xA]\n" + "\tadds r0, r2, 0\n" + "\tmuls r0, r3\n" + "\tadds r0, 0xF\n" + "\tasrs r0, 4\n" + "\tstrb r0, [r1, 0x19]\n" + "\tldrb r0, [r1, 0x1C]\n" + "\tldrb r2, [r1, 0x1B]\n" + "\tands r0, r2\n" + "\tstrb r0, [r1, 0x1B]\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n"); +#endif +} + +void CgbSound(void) +{ + s32 ch; + struct CgbChannel *channels; + s32 evAdd; + s32 prevC15; + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + vu8 *nrx0ptr; + vu8 *nrx1ptr; + vu8 *nrx2ptr; + vu8 *nrx3ptr; + vu8 *nrx4ptr; + + // Most comparision operations that cast to s8 perform 'and' by 0xFF. + int mask = 0xff; + + if (soundInfo->c15) + soundInfo->c15--; + else + soundInfo->c15 = 14; + + for (ch = 1, channels = soundInfo->cgbChans; ch <= 4; ch++, channels++) + { + if (!(channels->sf & 0xc7)) + continue; + + switch (ch) + { + case 1: + nrx0ptr = (vu8 *)(REG_ADDR_NR10); + nrx1ptr = (vu8 *)(REG_ADDR_NR11); + nrx2ptr = (vu8 *)(REG_ADDR_NR12); + nrx3ptr = (vu8 *)(REG_ADDR_NR13); + nrx4ptr = (vu8 *)(REG_ADDR_NR14); + break; + case 2: + nrx0ptr = (vu8 *)(REG_ADDR_NR10+1); + nrx1ptr = (vu8 *)(REG_ADDR_NR21); + nrx2ptr = (vu8 *)(REG_ADDR_NR22); + nrx3ptr = (vu8 *)(REG_ADDR_NR23); + nrx4ptr = (vu8 *)(REG_ADDR_NR24); + break; + case 3: + nrx0ptr = (vu8 *)(REG_ADDR_NR30); + nrx1ptr = (vu8 *)(REG_ADDR_NR31); + nrx2ptr = (vu8 *)(REG_ADDR_NR32); + nrx3ptr = (vu8 *)(REG_ADDR_NR33); + nrx4ptr = (vu8 *)(REG_ADDR_NR34); + break; + default: + nrx0ptr = (vu8 *)(REG_ADDR_NR30+1); + nrx1ptr = (vu8 *)(REG_ADDR_NR41); + nrx2ptr = (vu8 *)(REG_ADDR_NR42); + nrx3ptr = (vu8 *)(REG_ADDR_NR43); + nrx4ptr = (vu8 *)(REG_ADDR_NR44); + break; + } + + prevC15 = soundInfo->c15; + evAdd = *nrx2ptr; + + if (channels->sf & 0x80) + { + if (!(channels->sf & 0x40)) + { + channels->sf = 3; + channels->mo = 3; + CgbModVol(channels); + switch (ch) + { + case 1: + *nrx0ptr = channels->sw; + // fallthrough + case 2: + *nrx1ptr = ((u32)channels->wp << 6) + channels->le; + goto loc_82E0E30; + case 3: + if ((u32)channels->wp != channels->cp) + { + *nrx0ptr = 0x40; + REG_WAVE_RAM0 = channels->wp[0]; + REG_WAVE_RAM1 = channels->wp[1]; + REG_WAVE_RAM2 = channels->wp[2]; + REG_WAVE_RAM3 = channels->wp[3]; + channels->cp = (u32)channels->wp; + } + *nrx0ptr = 0; + *nrx1ptr = channels->le; + if (channels->le) + channels->n4 = -64; + else + channels->n4 = -128; + break; + default: + *nrx1ptr = channels->le; + *nrx3ptr = (u32)channels->wp << 3; + loc_82E0E30: + evAdd = channels->at + 8; + if (channels->le) + channels->n4 = 64; + else + channels->n4 = 0; + break; + } + channels->ec = channels->at; + if ((s8)(channels->at & mask)) + { + channels->ev = 0; + goto EC_MINUS; + } + else + { + goto loc_82E0F96; + } + } + else + { + goto loc_82E0E82; + } + } + else if (channels->sf & 0x04) + { + channels->echoLength--; + if ((s8)(channels->echoLength & mask) <= 0) + { + loc_82E0E82: + CgbOscOff(ch); + channels->sf = 0; + goto LAST_LABEL; + } + goto loc_82E0FD6; + } + else if ((channels->sf & 0x40) && (channels->sf & 0x03)) + { + channels->sf &= 0xfc; + channels->ec = channels->re; + if ((s8)(channels->re & mask)) + { + channels->mo |= 1; + if (ch != 3) + { + evAdd = channels->re; + } + goto EC_MINUS; + } + else + { + goto loc_82E0F02; + } + } + else + { + loc_82E0ED0: + if (channels->ec == 0) + { + if (ch == 3) + { + channels->mo |= 1; + } + CgbModVol(channels); + if ((channels->sf & 0x3) == 0) + { + channels->ev--; + if ((s8)(channels->ev & mask) <= 0) + { + loc_82E0F02: + channels->ev = ((channels->eg * channels->echoVolume) + 0xFF) >> 8; + if (channels->ev) + { + channels->sf |= 0x4; + channels->mo |= 1; + if (ch != 3) + { + evAdd = 8; + } + goto loc_82E0FD6; + } + else + { + goto loc_82E0E82; + } + } + else + { + channels->ec = channels->re; + } + } + else if ((channels->sf & 0x3) == 1) + { + loc_82E0F3A: + channels->ev = channels->sg; + channels->ec = 7; + } + else if ((channels->sf & 0x3) == 2) + { + int ev, sg; + + channels->ev--; + ev = (s8)(channels->ev & mask); + sg = (s8)(channels->sg); + if (ev <= sg) + { + loc_82E0F5A: + if (channels->su == 0) + { + channels->sf &= 0xfc; + goto loc_82E0F02; + } + else + { + channels->sf--; + channels->mo |= 1; + if (ch != 3) + { + evAdd = 8; + } + goto loc_82E0F3A; + } + } + else + { + channels->ec = channels->de; + } + } + else + { + channels->ev++; + if ((u8)(channels->ev & mask) >= channels->eg) + { + loc_82E0F96: + channels->sf--; + channels->ec = channels->de; + if ((u8)(channels->ec & mask)) + { + channels->mo |= 1; + channels->ev = channels->eg; + if (ch != 3) + { + evAdd = channels->de; + } + } + else + { + goto loc_82E0F5A; + } + } + else + { + channels->ec = channels->at; + } + } + } + } + + EC_MINUS: + channels->ec--; + if (prevC15 == 0) + { + prevC15--; + goto loc_82E0ED0; + } + + loc_82E0FD6: + if (channels->mo & 0x2) + { + if (ch < 4 && (channels->ty & 0x08)) + { + int biasH = REG_SOUNDBIAS_H; + + if (biasH < 64) + { + channels->fr = (channels->fr + 2) & 0x7fc; + } + else if (biasH < 128) + { + channels->fr = (channels->fr + 1) & 0x7fe; + } + } + if (ch != 4) + { + *nrx3ptr = channels->fr; + } + else + { + *nrx3ptr = (*nrx3ptr & 0x08) | channels->fr; + } + channels->n4 = (channels->n4 & 0xC0) + (*((u8*)(&channels->fr) + 1)); + *nrx4ptr = (s8)(channels->n4 & mask); + } + + if (channels->mo & 1) + { + REG_NR51 = (REG_NR51 & ~channels->panMask) | channels->pan; + if (ch == 3) + { + *nrx2ptr = gCgb3Vol[channels->ev]; + if (channels->n4 & 0x80) + { + *nrx0ptr = 0x80; + *nrx4ptr = channels->n4; + channels->n4 &= 0x7f; + } + } + else + { + evAdd &= 0xf; + *nrx2ptr = (channels->ev << 4) + evAdd; + *nrx4ptr = channels->n4 | 0x80; + if (ch == 1 && !(*nrx0ptr & 0x08)) + { + *nrx4ptr = channels->n4 | 0x80; + } + } + } + + LAST_LABEL: + channels->mo = 0; + } +} + +void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->tempoU = tempo; + mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->volX = volume / 4; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->keyShiftX = pitch >> 8; + track->pitX = pitch; + track->flags |= MPT_FLG_PITCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->panX = pan; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void ClearModM(struct MusicPlayerTrack *track) +{ + track->lfoSpeedC = 0; + track->modM = 0; + + if (track->modT == 0) + track->flags |= MPT_FLG_PITCHG; + else + track->flags |= MPT_FLG_VOLCHG; +} + +void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->mod = modDepth; + + if (!track->mod) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->lfoSpeed = lfoSpeed; + + if (!track->lfoSpeed) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +#define MEMACC_COND_JUMP(cond) \ +if (cond) \ + goto cond_true; \ +else \ + goto cond_false; \ + +void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 op; + u8 *addr; + u8 data; + + op = *track->cmdPtr; + track->cmdPtr++; + + addr = mplayInfo->memAccArea + *track->cmdPtr; + track->cmdPtr++; + + data = *track->cmdPtr; + track->cmdPtr++; + + switch (op) + { + case 0: + *addr = data; + return; + case 1: + *addr += data; + return; + case 2: + *addr -= data; + return; + case 3: + *addr = mplayInfo->memAccArea[data]; + return; + case 4: + *addr += mplayInfo->memAccArea[data]; + return; + case 5: + *addr -= mplayInfo->memAccArea[data]; + 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: + { + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]); + func(mplayInfo, track); + return; + } + +cond_false: + track->cmdPtr += 4; +} + +void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 n = *track->cmdPtr; + track->cmdPtr++; + + gXcmdTable[n](mplayInfo, track); +} + +void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]); + func(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; + + 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->cmdPtr += 4; +} + +void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.type = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.attack = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.decay = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.sustain = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.release = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoVolume = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoLength = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.length = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.pan_sweep = *track->cmdPtr; + track->cmdPtr++; +} + +void DummyFunc() +{ + ; +} diff --git a/src/m4a_2.c b/src/m4a_2.c deleted file mode 100644 index ce9ac19..0000000 --- a/src/m4a_2.c +++ /dev/null @@ -1,947 +0,0 @@ -#include "gba/m4a_internal.h" -#include "global.h" - -extern char SoundMainRAM_Buffer[0x400]; - -extern struct SoundInfo gSoundInfo; - - -u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) -{ - u32 val1; - u32 val2; - u32 fineAdjustShifted = fineAdjust << 24; - - if (key > 178) - { - key = 178; - fineAdjustShifted = 255 << 24; - } - - val1 = gScaleTable[key]; - val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); - - val2 = gScaleTable[key + 1]; - val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); - - return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); -} - -void UnusedDummyFunc() -{ -} - -void MPlayContinue(struct MusicPlayerInfo *mplayInfo) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; - mplayInfo->ident = ID_NUMBER; - } -} - -void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aSoundInit(void) -{ - s32 i; - - CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); - - SoundInit(&gSoundInfo); - MPlayExtender(gCgbChans); - m4aSoundMode(SOUND_MODE_DA_BIT_8 - | SOUND_MODE_FREQ_18157 - | (14 << SOUND_MODE_MASVOL_SHIFT) - | (5 << SOUND_MODE_MAXCHN_SHIFT)); - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - { - struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; - MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); - mplayInfo->unk_B = gMPlayTable[i].unk_A; - mplayInfo->memAccArea = gMPlayMemAccArea; - } -} - -void m4aSoundMain(void) -{ - SoundMain(); -} - -void m4aSongNumStart(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - MPlayStart(mplay->info, song->header); -} - -void m4aSongNumStartOrChange(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader != song->header) - { - MPlayStart(mplay->info, song->header); - } - else - { - if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 - || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) - { - MPlayStart(mplay->info, song->header); - } - } -} - -void m4aSongNumStartOrContinue(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader != song->header) - MPlayStart(mplay->info, song->header); - else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) - MPlayStart(mplay->info, song->header); - else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) - MPlayContinue(mplay->info); -} - - -void m4aSongNumStop(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader == song->header) - m4aMPlayStop(mplay->info); -} - -void m4aSongNumContinue(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader == song->header) - MPlayContinue(mplay->info); -} - -void m4aMPlayAllStop(void) -{ - s32 i; - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - m4aMPlayStop(gMPlayTable[i].info); -} - -void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) -{ - MPlayContinue(mplayInfo); -} - -void m4aMPlayAllContinue(void) -{ - s32 i; - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - MPlayContinue(gMPlayTable[i].info); -} - -void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - MPlayFadeOut(mplayInfo, speed); -} - -void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; - mplayInfo->ident = ID_NUMBER; - } -} -void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; - mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) -{ - s32 trackCount = mplayInfo->trackCount; - struct MusicPlayerTrack *track = mplayInfo->tracks; - - while (trackCount > 0) - { - if (track->flags & MPT_FLG_EXIST) - { - if (track->flags & MPT_FLG_START) - { - Clear64byte(track); - track->flags = MPT_FLG_EXIST; - track->bendRange = 2; - track->volX = 64; - track->lfoSpeed = 22; - track->tone.type = 1; - } - } - - trackCount--; - track++; - } -} - -void MPlayExtender(struct CgbChannel *cgbChans) -{ - struct SoundInfo *soundInfo; - u32 ident; - - REG_SOUNDCNT_X = SOUND_MASTER_ENABLE - | SOUND_4_ON - | SOUND_3_ON - | SOUND_2_ON - | SOUND_1_ON; - REG_SOUNDCNT_L = 0; // set master volume to zero - REG_NR12 = 0x8; - REG_NR22 = 0x8; - REG_NR42 = 0x8; - REG_NR14 = 0x80; - REG_NR24 = 0x80; - REG_NR44 = 0x80; - REG_NR30 = 0; - REG_NR50 = 0x77; - - soundInfo = SOUND_INFO_PTR; - - ident = soundInfo->ident; - - if (ident != ID_NUMBER) - return; - - soundInfo->ident++; - - gMPlayJumpTable[8] = ply_memacc; - gMPlayJumpTable[17] = ply_lfos; - gMPlayJumpTable[19] = ply_mod; - gMPlayJumpTable[28] = ply_xcmd; - gMPlayJumpTable[29] = ply_endtie; - gMPlayJumpTable[30] = SampleFreqSet; - gMPlayJumpTable[31] = TrackStop; - gMPlayJumpTable[32] = FadeOutBody; - gMPlayJumpTable[33] = TrkVolPitSet; - - soundInfo->cgbChans = (struct CgbChannel *)cgbChans; - soundInfo->CgbSound = CgbSound; - soundInfo->CgbOscOff = CgbOscOff; - soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; - soundInfo->maxLines = MAX_LINES; - - CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); - - cgbChans[0].ty = 1; - cgbChans[0].panMask = 0x11; - cgbChans[1].ty = 2; - cgbChans[1].panMask = 0x22; - cgbChans[2].ty = 3; - cgbChans[2].panMask = 0x44; - cgbChans[3].ty = 4; - cgbChans[3].panMask = 0x88; - - soundInfo->ident = ident; -} - -void MusicPlayerJumpTableCopy(void) -{ - asm("swi 0x2A"); -} - -void ClearChain(void *x) -{ - void (*func)(void *) = *(&gMPlayJumpTable[34]); - func(x); -} - -void Clear64byte(void *x) -{ - void (*func)(void *) = *(&gMPlayJumpTable[35]); - func(x); -} - -void SoundInit(struct SoundInfo *soundInfo) -{ - soundInfo->ident = 0; - - if (REG_DMA1CNT & (DMA_REPEAT << 16)) - REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; - REG_SOUNDCNT_X = SOUND_MASTER_ENABLE - | SOUND_4_ON - | SOUND_3_ON - | SOUND_2_ON - | SOUND_1_ON; - REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT - | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT - | 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; - - SOUND_INFO_PTR = soundInfo; - CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); - - soundInfo->maxChans = 8; - soundInfo->masterVolume = 15; - soundInfo->plynote = (u32)ply_note; - soundInfo->CgbSound = DummyFunc; - soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; - soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; - soundInfo->ExtVolPit = (u32)DummyFunc; - - MPlayJumpTableCopy(gMPlayJumpTable); - - soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; - - SampleFreqSet(SOUND_MODE_FREQ_13379); - - soundInfo->ident = ID_NUMBER; -} - -void SampleFreqSet(u32 freq) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - freq = (freq & 0xF0000) >> 16; - soundInfo->freq = freq; - soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; - soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; - - // LCD refresh rate 59.7275Hz - soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; - - // CPU frequency 16.78Mhz - soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; - - // Turn off timer 0. - REG_TM0CNT_H = 0; - - // cycles per LCD fresh 280896 - REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); - - m4aSoundVSyncOn(); - - while (*(vu8 *)REG_ADDR_VCOUNT == 159) - ; - - while (*(vu8 *)REG_ADDR_VCOUNT != 159) - ; - - REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; -} - -void m4aSoundMode(u32 mode) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - u32 temp; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); - - if (temp) - soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; - - temp = mode & SOUND_MODE_MAXCHN; - - if (temp) - { - struct SoundChannel *chan; - - soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; - - temp = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (temp != 0) - { - chan->status = 0; - temp--; - chan++; - } - } - - temp = mode & SOUND_MODE_MASVOL; - - if (temp) - soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; - - temp = mode & SOUND_MODE_DA_BIT; - - if (temp) - { - temp = (temp & 0x300000) >> 14; - REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; - } - - temp = mode & SOUND_MODE_FREQ; - - if (temp) - { - m4aSoundVSyncOff(); - SampleFreqSet(temp); - } - - soundInfo->ident = ID_NUMBER; -} - -void SoundClear(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - s32 i; - void *chan; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - i = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (i > 0) - { - ((struct SoundChannel *)chan)->status = 0; - i--; - chan = (void *)((s32)chan + sizeof(struct SoundChannel)); - } - - chan = soundInfo->cgbChans; - - if (chan) - { - i = 1; - - while (i <= 4) - { - soundInfo->CgbOscOff(i); - ((struct CgbChannel *)chan)->sf = 0; - i++; - chan = (void *)((s32)chan + sizeof(struct CgbChannel)); - } - } - - soundInfo->ident = ID_NUMBER; -} - -void m4aSoundVSyncOff(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) - { - soundInfo->ident += 10; - - if (REG_DMA1CNT & (DMA_REPEAT << 16)) - REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; - - CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); - } -} - -void m4aSoundVSyncOn(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - u32 ident = soundInfo->ident; - - if (ident == ID_NUMBER) - return; - - REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; - REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; - - soundInfo->pcmDmaCounter = 0; - soundInfo->ident = ident - 10; -} - -void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) -{ - struct SoundInfo *soundInfo; - - if (trackCount == 0) - return; - - if (trackCount > MAX_MUSICPLAYER_TRACKS) - trackCount = MAX_MUSICPLAYER_TRACKS; - - soundInfo = SOUND_INFO_PTR; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - Clear64byte(mplayInfo); - - mplayInfo->tracks = tracks; - mplayInfo->trackCount = trackCount; - mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; - - while (trackCount != 0) - { - tracks->flags = 0; - trackCount--; - tracks++; - } - - if (soundInfo->func != 0) - { - mplayInfo->func = soundInfo->func; - mplayInfo->intp = soundInfo->intp; - soundInfo->func = 0; - } - - soundInfo->intp = (u32)mplayInfo; - soundInfo->func = (u32)MPlayMain; - soundInfo->ident = ID_NUMBER; - mplayInfo->ident = ID_NUMBER; -} - -void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) -{ - s32 i; - u8 unk_B; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - unk_B = mplayInfo->unk_B; - - if (!unk_B - || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) - && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 - || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) - || (mplayInfo->priority <= songHeader->priority)) - { - mplayInfo->ident++; - mplayInfo->status = 0; - mplayInfo->songHeader = songHeader; - mplayInfo->tone = songHeader->tone; - mplayInfo->priority = songHeader->priority; - mplayInfo->clock = 0; - mplayInfo->tempoD = 150; - mplayInfo->tempoI = 150; - mplayInfo->tempoU = 0x100; - mplayInfo->tempoC = 0; - mplayInfo->fadeOI = 0; - - i = 0; - track = mplayInfo->tracks; - - while (i < songHeader->trackCount && i < mplayInfo->trackCount) - { - 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) - { - TrackStop(mplayInfo, track); - track->flags = 0; - i++; - track++; - } - - if (songHeader->reverb & 0x80) - m4aSoundMode(songHeader->reverb); - - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) -{ - s32 i; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - TrackStop(mplayInfo, track); - i--; - track++; - } - - mplayInfo->ident = ID_NUMBER; -} - -void FadeOutBody(struct MusicPlayerInfo *mplayInfo) -{ - s32 i; - struct MusicPlayerTrack *track; - u16 fadeOI = mplayInfo->fadeOI; - register u32 temp asm("r3"); - register u16 mask asm("r2"); - - if (fadeOI == 0) - return; - - mplayInfo->fadeOC--; - - temp = 0xFFFF; - mask = temp; - - if (mplayInfo->fadeOC != 0) - return; - - mplayInfo->fadeOC = fadeOI; - - if (mplayInfo->fadeOV & FADE_IN) - { - mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); - - if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) - { - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); - mplayInfo->fadeOI = 0; - } - } - else - { - mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); - - if ((s16)(mplayInfo->fadeOV & mask) <= 0) - { - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - register u32 fadeOV asm("r7"); - u32 val; - - TrackStop(mplayInfo, track); - - val = TEMPORARY_FADE; - fadeOV = mplayInfo->fadeOV; - val &= fadeOV; - - if (!val) - track->flags = 0; - - i--; - track++; - } - - if (mplayInfo->fadeOV & TEMPORARY_FADE) - mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - else - mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; - - mplayInfo->fadeOI = 0; - return; - } - } - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - if (track->flags & MPT_FLG_EXIST) - { - track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); - track->flags |= MPT_FLG_VOLCHG; - } - - i--; - track++; - } -} - -void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - if (track->flags & MPT_FLG_VOLSET) - { - s32 x; - s32 y; - - x = (u32)(track->vol * track->volX) >> 5; - - if (track->modT == 1) - x = (u32)(x * (track->modM + 128)) >> 7; - - y = 2 * track->pan + track->panX; - - if (track->modT == 2) - y += track->modM; - - if (y < -128) - y = -128; - else if (y > 127) - y = 127; - - track->volMR = (u32)((y + 128) * x) >> 8; - track->volML = (u32)((127 - y) * x) >> 8; - } - - if (track->flags & MPT_FLG_PITSET) - { - s32 bend = track->bend * track->bendRange; - register s32 x asm("r1") = track->tune; - x += bend; - x *= 4; - x += (track->keyShift << 8); - x += (track->keyShiftX << 8); - x += track->pitX; - - if (track->modT == 0) - x += 16 * track->modM; - - track->keyM = x >> 8; - track->pitM = x; - } - - track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); -} - -u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) -{ - if (chanNum == 4) - { - if (key <= 20) - { - key = 0; - } - else - { - key -= 21; - if (key > 59) - key = 59; - } - - return gNoiseTable[key]; - } - else - { - s32 val1; - s32 val2; - - if (key <= 35) - { - fineAdjust = 0; - key = 0; - } - 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; - } -} - -void CgbOscOff(u8 chanNum) -{ - switch (chanNum) - { - case 1: - REG_NR12 = 8; - REG_NR14 = 0x80; - break; - case 2: - REG_NR22 = 8; - REG_NR24 = 0x80; - break; - case 3: - REG_NR30 = 0; - break; - default: - REG_NR42 = 8; - REG_NR44 = 0x80; - } -} - -static inline int CgbPan(struct CgbChannel *chan) -{ - u32 rightVolume = chan->rightVolume; - u32 leftVolume = chan->leftVolume; - - if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) - { - if (rightVolume / 2 >= leftVolume) - { - chan->pan = 0x0F; - return 1; - } - } - else - { - if (leftVolume / 2 >= rightVolume) - { - chan->pan = 0xF0; - return 1; - } - } - - return 0; -} -#ifndef NONMATCHING -NAKED -#endif -void CgbModVol(struct CgbChannel *chan) -{ -#ifdef NONMATCHING - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if ((soundInfo->mode & 1) || !CgbPan(chan)) - { - chan->pan = 0xFF; - chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; - } - else - { - // Force chan->rightVolume and chan->leftVolume to be read from memory again, - // even though there is no reason to do so. - // The command line option "-fno-gcse" achieves the same result as this. - asm("" : : : "memory"); - - chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; - if (chan->eg > 15) - chan->eg = 15; - } - - chan->sg = (chan->eg * chan->su + 15) >> 4; - chan->pan &= chan->panMask; -#else - asm_unified("\tpush {r4,lr}\n" - "\tadds r1, r0, 0\n" - "\tldrb r0, [r1, 0x2]\n" - "\tlsls r2, r0, 24\n" - "\tlsrs r4, r2, 24\n" - "\tldrb r3, [r1, 0x3]\n" - "\tlsls r0, r3, 24\n" - "\tlsrs r3, r0, 24\n" - "\tcmp r4, r3\n" - "\tbcc _080AFA94\n" - "\tlsrs r0, r2, 25\n" - "\tcmp r0, r3\n" - "\tbcc _080AFAA0\n" - "\tmovs r0, 0xF\n" - "\tstrb r0, [r1, 0x1B]\n" - "\tb _080AFAAE\n" - "_080AFA94:\n" - "\tlsrs r0, 25\n" - "\tcmp r0, r4\n" - "\tbcc _080AFAA0\n" - "\tmovs r0, 0xF0\n" - "\tstrb r0, [r1, 0x1B]\n" - "\tb _080AFAAE\n" - "_080AFAA0:\n" - "\tmovs r0, 0xFF\n" - "\tstrb r0, [r1, 0x1B]\n" - "\tldrb r2, [r1, 0x3]\n" - "\tldrb r3, [r1, 0x2]\n" - "\tadds r0, r2, r3\n" - "\tlsrs r0, 4\n" - "\tb _080AFABE\n" - "_080AFAAE:\n" - "\tldrb r2, [r1, 0x3]\n" - "\tldrb r3, [r1, 0x2]\n" - "\tadds r0, r2, r3\n" - "\tlsrs r0, 4\n" - "\tstrb r0, [r1, 0xA]\n" - "\tcmp r0, 0xF\n" - "\tbls _080AFAC0\n" - "\tmovs r0, 0xF\n" - "_080AFABE:\n" - "\tstrb r0, [r1, 0xA]\n" - "_080AFAC0:\n" - "\tldrb r2, [r1, 0x6]\n" - "\tldrb r3, [r1, 0xA]\n" - "\tadds r0, r2, 0\n" - "\tmuls r0, r3\n" - "\tadds r0, 0xF\n" - "\tasrs r0, 4\n" - "\tstrb r0, [r1, 0x19]\n" - "\tldrb r0, [r1, 0x1C]\n" - "\tldrb r2, [r1, 0x1B]\n" - "\tands r0, r2\n" - "\tstrb r0, [r1, 0x1B]\n" - "\tpop {r4}\n" - "\tpop {r0}\n" - "\tbx r0\n"); -#endif -} \ No newline at end of file diff --git a/src/m4a_4.c b/src/m4a_4.c deleted file mode 100644 index 595ea5a..0000000 --- a/src/m4a_4.c +++ /dev/null @@ -1,384 +0,0 @@ -#include "gba/m4a_internal.h" - -void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->tempoU = tempo; - mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->volX = volume / 4; - track->flags |= MPT_FLG_VOLCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->keyShiftX = pitch >> 8; - track->pitX = pitch; - track->flags |= MPT_FLG_PITCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->panX = pan; - track->flags |= MPT_FLG_VOLCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void ClearModM(struct MusicPlayerTrack *track) -{ - track->lfoSpeedC = 0; - track->modM = 0; - - if (track->modT == 0) - track->flags |= MPT_FLG_PITCHG; - else - track->flags |= MPT_FLG_VOLCHG; -} - -void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->mod = modDepth; - - if (!track->mod) - ClearModM(track); - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->lfoSpeed = lfoSpeed; - - if (!track->lfoSpeed) - ClearModM(track); - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -#define MEMACC_COND_JUMP(cond) \ -if (cond) \ - goto cond_true; \ -else \ - goto cond_false; \ - -void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 op; - u8 *addr; - u8 data; - - op = *track->cmdPtr; - track->cmdPtr++; - - addr = mplayInfo->memAccArea + *track->cmdPtr; - track->cmdPtr++; - - data = *track->cmdPtr; - track->cmdPtr++; - - switch (op) - { - case 0: - *addr = data; - return; - case 1: - *addr += data; - return; - case 2: - *addr -= data; - return; - case 3: - *addr = mplayInfo->memAccArea[data]; - return; - case 4: - *addr += mplayInfo->memAccArea[data]; - return; - case 5: - *addr -= mplayInfo->memAccArea[data]; - 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: - { - void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]); - func(mplayInfo, track); - return; - } - -cond_false: - track->cmdPtr += 4; -} - -void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 n = *track->cmdPtr; - track->cmdPtr++; - - gXcmdTable[n](mplayInfo, track); -} - -void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]); - func(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; - - 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->cmdPtr += 4; -} - -void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.type = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.attack = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.decay = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.sustain = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.release = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->echoVolume = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->echoLength = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.length = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.pan_sweep = *track->cmdPtr; - track->cmdPtr++; -} - -void DummyFunc() -{ - ; -} -- cgit v1.2.3 From cef20f5b34c507dabeaa292617963371faeca2e3 Mon Sep 17 00:00:00 2001 From: shinny Date: Tue, 2 Jun 2020 14:56:12 -0400 Subject: decomp dungeon data getters --- src/dungeon.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/dungeon.c (limited to 'src') diff --git a/src/dungeon.c b/src/dungeon.c new file mode 100644 index 0000000..effe1c3 --- /dev/null +++ b/src/dungeon.c @@ -0,0 +1,67 @@ +#include "global.h" +#include "dungeon.h" + +const u8 *GetDungeonName1(u8 dungeon) +{ + return gDungeonNames[dungeon].name1; +} + +const u8 *GetDungeonName2(u8 dungeon) +{ + return gDungeonNames[dungeon].name2; +} + +u8 GetStairDirection(u8 dungeon) +{ + return gDungeons[dungeon].stairDirection; +} + +s16 GetUnkC(u8 dungeon) +{ + return gDungeons[dungeon].unkC; +} + +u8 GetSaveBeforeEntering(u8 dungeon) +{ + return gDungeons[dungeon].saveBeforeEntering; +} + +u8 GetUnk9(u8 dungeon) +{ + return gDungeons[dungeon].unk9; +} + +u8 GetLevelCondition(u8 dungeon) +{ + return gDungeons[dungeon].levelCondition; +} + +u8 GetMaxItemCount(u8 dungeon) +{ + return gDungeons[dungeon].maxItemCount; +} + +u8 GetMoneyCondition(u8 dungeon) +{ + return gDungeons[dungeon].moneyCondition; +} + +s8 GetUnk3(u8 dungeon) +{ + return gDungeons[dungeon].unk3; +} + +u8 sub_8090148(u8 dungeon) +{ + return gDungeons[dungeon].unk2; +} + +u8 sub_8090158(u8 dungeon) +{ + return gDungeons[dungeon].unk8; +} + +s16 sub_8090168(u8 dungeon) +{ + return gDungeons[dungeon].unkE; +} -- cgit v1.2.3 From bfac262796684a0b75e836dc9d62c61fdb5eb92f Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 2 Aug 2020 18:20:39 -0500 Subject: decomp sub_8011F9C --- src/save.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src') diff --git a/src/save.c b/src/save.c index 6478c12..bb73fb0 100644 --- a/src/save.c +++ b/src/save.c @@ -269,3 +269,8 @@ u32 sub_8011DAC(u32 *a) MemoryFree(r5); return r7; } + +u32 sub_8011F9C(s32 *r0, u8 *r1, s32 r2) +{ + return ReadSaveSector(r0, r1, r2); +} -- cgit v1.2.3 From 70158a52c3973bca411791e48358aeaae12c891b Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 5 Sep 2020 12:43:37 -0500 Subject: decomp some nullsubs --- src/file_system.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src') diff --git a/src/file_system.c b/src/file_system.c index 61d9ec4..1555a65 100644 --- a/src/file_system.c +++ b/src/file_system.c @@ -173,3 +173,11 @@ void *UnusedGetSir0Ptr(struct SiroArchive *siro) void NDS_DecompressRLE(void *unused) { } + +void nullsub_16(void) +{ +} + +void nullsub_175(void) +{ +} -- cgit v1.2.3 From b7d1fe09f016ba8becfdcfaa2890cf3684dc85c4 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 5 Sep 2020 13:42:43 -0500 Subject: start dumping unformatted_type_names --- src/event_flag.c | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/event_flag.c (limited to 'src') diff --git a/src/event_flag.c b/src/event_flag.c new file mode 100644 index 0000000..85c320f --- /dev/null +++ b/src/event_flag.c @@ -0,0 +1,6 @@ +#include "global.h" + +void nullsub_140(void) +{ + +} -- cgit v1.2.3 From db15fdd32463da9ef007a068f87f9f81e47cf3a7 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 9 Sep 2020 19:46:02 -0500 Subject: documented some fields thx to PMDe --- src/dungeon.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/dungeon.c b/src/dungeon.c index effe1c3..a56b6e4 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -18,7 +18,7 @@ u8 GetStairDirection(u8 dungeon) s16 GetUnkC(u8 dungeon) { - return gDungeons[dungeon].unkC; + return gDungeons[dungeon].timer; } u8 GetSaveBeforeEntering(u8 dungeon) @@ -51,9 +51,9 @@ s8 GetUnk3(u8 dungeon) return gDungeons[dungeon].unk3; } -u8 sub_8090148(u8 dungeon) +u8 GetRecruitable(u8 dungeon) { - return gDungeons[dungeon].unk2; + return gDungeons[dungeon].isRecruitable; } u8 sub_8090158(u8 dungeon) -- cgit v1.2.3 From ef3c1e0138a71df58bf6a227df4a1913d7ff7b1d Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 9 Sep 2020 19:47:58 -0500 Subject: oops it's a bool --- src/dungeon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/dungeon.c b/src/dungeon.c index a56b6e4..912ac85 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -51,7 +51,7 @@ s8 GetUnk3(u8 dungeon) return gDungeons[dungeon].unk3; } -u8 GetRecruitable(u8 dungeon) +bool8 GetRecruitable(u8 dungeon) { return gDungeons[dungeon].isRecruitable; } -- cgit v1.2.3 From 312883043b04f54568c442b8db1a68aa868c852a Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 9 Sep 2020 19:58:33 -0500 Subject: doc'ing more bool stuff from pmde --- src/dungeon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/dungeon.c b/src/dungeon.c index 912ac85..9684ef2 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -21,7 +21,7 @@ s16 GetUnkC(u8 dungeon) return gDungeons[dungeon].timer; } -u8 GetSaveBeforeEntering(u8 dungeon) +bool8 GetSaveBeforeEntering(u8 dungeon) { return gDungeons[dungeon].saveBeforeEntering; } -- cgit v1.2.3 From d2be6ce16caf5cafc89e5120f26ff5010a748125 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 15 Sep 2020 17:09:36 -0500 Subject: some more nullsubs --- src/memory1.c | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/memory1.c (limited to 'src') diff --git a/src/memory1.c b/src/memory1.c new file mode 100644 index 0000000..8efcc04 --- /dev/null +++ b/src/memory1.c @@ -0,0 +1,11 @@ +#include "global.h" + +void nullsub_141(void) +{ + +} + +void nullsub_142(void) +{ + +} -- cgit v1.2.3 From 424db9c41bbe0fa23910606f4c85a5d5db0c19d1 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 16 Sep 2020 00:15:52 -0500 Subject: split out pokemon funcs and decomp another nullsub --- src/code.c | 5 +++++ src/pokemon.c | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 src/code.c create mode 100644 src/pokemon.c (limited to 'src') diff --git a/src/code.c b/src/code.c new file mode 100644 index 0000000..769a11d --- /dev/null +++ b/src/code.c @@ -0,0 +1,5 @@ +#include "global.h" +void nullsub_3(void) +{ + +} diff --git a/src/pokemon.c b/src/pokemon.c new file mode 100644 index 0000000..40606df --- /dev/null +++ b/src/pokemon.c @@ -0,0 +1,2 @@ +#include "global.h" +#include "pokemon.h" -- cgit v1.2.3 From 190c3562b9df62ab57297c46348f3739563c9868 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 16 Sep 2020 14:00:48 -0500 Subject: decomp a chunk of input --- src/input.c | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 src/input.c (limited to 'src') diff --git a/src/input.c b/src/input.c new file mode 100644 index 0000000..9455eb2 --- /dev/null +++ b/src/input.c @@ -0,0 +1,206 @@ +#include "global.h" +#include "input.h" + +extern struct Input gUnknown_2025600; +extern struct test gUnknown_20255F0; +extern struct test gUnknown_2025638; +extern struct test gUnknown_2025648; +extern struct test3 gUnknown_2025668; +extern u32 gUnknown_202562C; + +#ifndef NONMATCHING +NAKED +#endif +void InitInput(void) +{ +#ifdef NONMATCHING + gUnknown_20255F0.unk0 = 0; + gUnknown_20255F0.unk1 = 0; + gUnknown_20255F0.unk2 = 0; + gUnknown_20255F0.unk3 = 0; + + gUnknown_2025638.unk0 = 0; + gUnknown_2025638.unk1 = 0; + gUnknown_2025638.unk2 = 0; + gUnknown_2025638.unk3 = 0; + + gUnknown_202562C = 4854977; // ????? (0x4a14c1) + + gUnknown_2025600.unk16 = 0; // TODO: should be str but generates strh + gUnknown_2025600.unk0 = 0xffff; // probably a mask + gUnknown_2025600.unk1 = -1; + gUnknown_2025600.unk2 = -1; + gUnknown_2025600.unk3 = -1; + gUnknown_2025600.unk14 = -1; + gUnknown_2025600.unk15 = -1; + gUnknown_2025600.unk4 = -1; + gUnknown_2025600.unk5 = -1; + gUnknown_2025600.unk6 = -1; + gUnknown_2025600.unk7 = -1; + gUnknown_2025600.unk8 = -1; + gUnknown_2025600.unk9 = -1; + gUnknown_2025600.unk10 = -1; + gUnknown_2025600.unk11 = -1; + gUnknown_2025600.unk18 = 0; + gUnknown_2025600.unk19 = 0; + + gUnknown_2025668.unk0 = 0; + gUnknown_2025668.unk1 = 0; +#else + asm_unified("\tldr r0, =gUnknown_20255F0\n" + "\tmovs r3, 0\n" + "\tmovs r2, 0\n" + "\tstrh r2, [r0] \n" + "\tstrh r2, [r0, 0x2]\n" + "\tstrh r2, [r0, 0x4]\n" + "\tstrh r2, [r0, 0x6]\n" + "\tldr r0, =gUnknown_2025638\n" + "\tstrh r2, [r0]\n" + "\tstrh r2, [r0, 0x2]\n" + "\tstrh r2, [r0, 0x4]\n" + "\tstrh r2, [r0, 0x6]\n" + "\tldr r1, =gUnknown_202562C\n" + "\tldr r0, =0x4a14c1\n" + "\tstr r0, [r1]\n" + "\tldr r0, =gUnknown_2025600\n" + "\tstr r2, [r0, 0x20]\n" + "\tldr r1, =0xffff\n" + "\tstrh r1, [r0] \n" + "\tmovs r1, 0x1\n" + "\tnegs r1, r1\n" + "\tstrh r1, [r0, 0x2]\n" + "\tstrh r1, [r0, 0x4]\n" + "\tstrh r1, [r0, 0x6]\n" + "\tstrh r1, [r0, 0x1C]\n" + "\tstrh r1, [r0, 0x1E]\n" + "\tstrh r1, [r0, 0x8]\n" + "\tstrh r1, [r0, 0xA]\n" + "\tstrh r1, [r0, 0xC]\n" + "\tstrh r1, [r0, 0xE]\n" + "\tstrh r1, [r0, 0x10]\n" + "\tstrh r1, [r0, 0x12]\n" + "\tstrh r1, [r0, 0x14]\n" + "\tstrh r1, [r0, 0x16]\n" + "\tadds r1, r0, 0\n" + "\tadds r1, 0x28\n" + "\tstrb r3, [r1]\n" + "\tadds r0, 0x29\n" + "\tstrb r3, [r0]\n" + "\tldr r0, =gUnknown_2025668\n" + "\tstrh r2, [r0]\n" + "\tstrh r2, [r0, 0x2]\n" + "\tbx lr\n" + "\t.align 2, 0\n" + "\t.pool"); +#endif +} + +#ifndef NONMATCHING +NAKED +#endif +void sub_800485C(void) +{ +#ifdef NONMATCHING + gUnknown_20255F0 = gUnknown_2025638; + + // TODO missing: + // ldr r0, [r0] + // str r0, [r1] + + gUnknown_2025638.unk0 = 0; + gUnknown_2025638.unk1 = 0; + gUnknown_2025638.unk2 = 0; + gUnknown_2025638.unk3 = 0; + + gUnknown_2025600.unk0 = 0xffff; + gUnknown_2025600.unk1 = -1; + gUnknown_2025600.unk2 = -1; + gUnknown_2025600.unk3 = -1; + gUnknown_2025600.unk4 = -1; + gUnknown_2025600.unk5 = -1; + gUnknown_2025600.unk6 = -1; + gUnknown_2025600.unk7 = -1; + gUnknown_2025600.unk8 = -1; + gUnknown_2025600.unk9 = -1; + gUnknown_2025600.unk10 = -1; + gUnknown_2025600.unk11 = -1; + + gUnknown_2025600.unk18 = 0; + gUnknown_2025600.unk19 = 0; +#else + asm_unified("\tpush {r4,r5,lr}\n" + "\tldr r2, =gUnknown_2025638\n" + "\tldr r1, =gUnknown_20255F0\n" + "\tadds r0, r2, 0\n" + "\tldm r0!, {r3-r5}\n" + "\tstm r1!, {r3-r5}\n" + "\tldr r0, [r0]\n" + "\tstr r0, [r1]\n" + "\tmovs r3, 0\n" + "\tmovs r0, 0\n" + "\tstrh r0, [r2]\n" + "\tstrh r0, [r2, 0x2]\n" + "\tstrh r0, [r2, 0x4]\n" + "\tstrh r0, [r2, 0x6]\n" + "\tldr r0, =gUnknown_2025600\n" + "\tldr r1, =0xffff\n" + "\tstrh r1, [r0]\n" + "\tmovs r1, 0x1\n" + "\tnegs r1, r1\n" + "\tstrh r1, [r0, 0x2]\n" + "\tstrh r1, [r0, 0x4]\n" + "\tstrh r1, [r0, 0x6]\n" + "\tstrh r1, [r0, 0x8]\n" + "\tstrh r1, [r0, 0xA]\n" + "\tstrh r1, [r0, 0xC]\n" + "\tstrh r1, [r0, 0xE]\n" + "\tstrh r1, [r0, 0x10]\n" + "\tstrh r1, [r0, 0x12]\n" + "\tstrh r1, [r0, 0x14]\n" + "\tstrh r1, [r0, 0x16]\n" + "\tadds r1, r0, 0\n" + "\tadds r1, 0x28\n" + "\tstrb r3, [r1]\n" + "\tadds r0, 0x29\n" + "\tstrb r3, [r0]\n" + "\tpop {r4,r5}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "\t.pool"); +#endif +} + +// Unused +u8 sub_80048B8(void) +{ + return 0; +} + +u8 sub_80048BC(void) +{ + return 0; +} + +// Unused +u8 sub_80048C0(void) +{ + return 0; +} + +// Unused +u8 sub_80048C4(void) +{ + return 0; +} + +u8 sub_80048C8(void) +{ + return 0; +} + +// Unused +u8 sub_80048CC(void) +{ + return 0; +} -- cgit v1.2.3 From ff099968a1e6f1e6ce7c4dbd7d6cf041caf33c55 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 16 Sep 2020 17:01:21 -0500 Subject: nonmatching input be GONE. Just one func left --- src/input.c | 208 +++++++++++++++++++++--------------------------------------- 1 file changed, 73 insertions(+), 135 deletions(-) (limited to 'src') diff --git a/src/input.c b/src/input.c index 9455eb2..99d894b 100644 --- a/src/input.c +++ b/src/input.c @@ -1,174 +1,73 @@ #include "global.h" #include "input.h" -extern struct Input gUnknown_2025600; -extern struct test gUnknown_20255F0; -extern struct test gUnknown_2025638; -extern struct test gUnknown_2025648; -extern struct test3 gUnknown_2025668; -extern u32 gUnknown_202562C; - -#ifndef NONMATCHING -NAKED -#endif +EWRAM_DATA struct Input gUnknown_2025600; +EWRAM_DATA struct UnkInputStruct1 gUnknown_20255F0; +EWRAM_DATA struct UnkInputStruct1 gUnknown_2025638; +EWRAM_DATA struct UnkInputStruct1 gUnknown_2025648; +EWRAM_DATA struct UnkInputStruct2 gUnknown_2025668; +EWRAM_DATA u32 gUnknown_202562C; + void InitInput(void) { -#ifdef NONMATCHING gUnknown_20255F0.unk0 = 0; - gUnknown_20255F0.unk1 = 0; gUnknown_20255F0.unk2 = 0; - gUnknown_20255F0.unk3 = 0; + gUnknown_20255F0.unk4 = 0; + gUnknown_20255F0.unk6 = 0; gUnknown_2025638.unk0 = 0; - gUnknown_2025638.unk1 = 0; gUnknown_2025638.unk2 = 0; - gUnknown_2025638.unk3 = 0; + gUnknown_2025638.unk4 = 0; + gUnknown_2025638.unk6 = 0; gUnknown_202562C = 4854977; // ????? (0x4a14c1) - gUnknown_2025600.unk16 = 0; // TODO: should be str but generates strh + gUnknown_2025600.unk20 = 0; gUnknown_2025600.unk0 = 0xffff; // probably a mask - gUnknown_2025600.unk1 = -1; gUnknown_2025600.unk2 = -1; - gUnknown_2025600.unk3 = -1; - gUnknown_2025600.unk14 = -1; - gUnknown_2025600.unk15 = -1; gUnknown_2025600.unk4 = -1; - gUnknown_2025600.unk5 = -1; gUnknown_2025600.unk6 = -1; - gUnknown_2025600.unk7 = -1; + gUnknown_2025600.unk1C = -1; + gUnknown_2025600.unk1E = -1; gUnknown_2025600.unk8 = -1; - gUnknown_2025600.unk9 = -1; + gUnknown_2025600.unkA = -1; + gUnknown_2025600.unkC = -1; + gUnknown_2025600.unkE = -1; gUnknown_2025600.unk10 = -1; - gUnknown_2025600.unk11 = -1; - gUnknown_2025600.unk18 = 0; - gUnknown_2025600.unk19 = 0; + gUnknown_2025600.unk12 = -1; + gUnknown_2025600.unk14 = -1; + gUnknown_2025600.unk16 = -1; + gUnknown_2025600.unk28 = 0; + gUnknown_2025600.unk29 = 0; gUnknown_2025668.unk0 = 0; - gUnknown_2025668.unk1 = 0; -#else - asm_unified("\tldr r0, =gUnknown_20255F0\n" - "\tmovs r3, 0\n" - "\tmovs r2, 0\n" - "\tstrh r2, [r0] \n" - "\tstrh r2, [r0, 0x2]\n" - "\tstrh r2, [r0, 0x4]\n" - "\tstrh r2, [r0, 0x6]\n" - "\tldr r0, =gUnknown_2025638\n" - "\tstrh r2, [r0]\n" - "\tstrh r2, [r0, 0x2]\n" - "\tstrh r2, [r0, 0x4]\n" - "\tstrh r2, [r0, 0x6]\n" - "\tldr r1, =gUnknown_202562C\n" - "\tldr r0, =0x4a14c1\n" - "\tstr r0, [r1]\n" - "\tldr r0, =gUnknown_2025600\n" - "\tstr r2, [r0, 0x20]\n" - "\tldr r1, =0xffff\n" - "\tstrh r1, [r0] \n" - "\tmovs r1, 0x1\n" - "\tnegs r1, r1\n" - "\tstrh r1, [r0, 0x2]\n" - "\tstrh r1, [r0, 0x4]\n" - "\tstrh r1, [r0, 0x6]\n" - "\tstrh r1, [r0, 0x1C]\n" - "\tstrh r1, [r0, 0x1E]\n" - "\tstrh r1, [r0, 0x8]\n" - "\tstrh r1, [r0, 0xA]\n" - "\tstrh r1, [r0, 0xC]\n" - "\tstrh r1, [r0, 0xE]\n" - "\tstrh r1, [r0, 0x10]\n" - "\tstrh r1, [r0, 0x12]\n" - "\tstrh r1, [r0, 0x14]\n" - "\tstrh r1, [r0, 0x16]\n" - "\tadds r1, r0, 0\n" - "\tadds r1, 0x28\n" - "\tstrb r3, [r1]\n" - "\tadds r0, 0x29\n" - "\tstrb r3, [r0]\n" - "\tldr r0, =gUnknown_2025668\n" - "\tstrh r2, [r0]\n" - "\tstrh r2, [r0, 0x2]\n" - "\tbx lr\n" - "\t.align 2, 0\n" - "\t.pool"); -#endif + gUnknown_2025668.unk2 = 0; } -#ifndef NONMATCHING -NAKED -#endif void sub_800485C(void) { -#ifdef NONMATCHING gUnknown_20255F0 = gUnknown_2025638; - // TODO missing: - // ldr r0, [r0] - // str r0, [r1] - gUnknown_2025638.unk0 = 0; - gUnknown_2025638.unk1 = 0; gUnknown_2025638.unk2 = 0; - gUnknown_2025638.unk3 = 0; + gUnknown_2025638.unk4 = 0; + gUnknown_2025638.unk6 = 0; gUnknown_2025600.unk0 = 0xffff; - gUnknown_2025600.unk1 = -1; gUnknown_2025600.unk2 = -1; - gUnknown_2025600.unk3 = -1; gUnknown_2025600.unk4 = -1; - gUnknown_2025600.unk5 = -1; gUnknown_2025600.unk6 = -1; - gUnknown_2025600.unk7 = -1; gUnknown_2025600.unk8 = -1; - gUnknown_2025600.unk9 = -1; + gUnknown_2025600.unkA = -1; + gUnknown_2025600.unkC = -1; + gUnknown_2025600.unkE = -1; gUnknown_2025600.unk10 = -1; - gUnknown_2025600.unk11 = -1; - - gUnknown_2025600.unk18 = 0; - gUnknown_2025600.unk19 = 0; -#else - asm_unified("\tpush {r4,r5,lr}\n" - "\tldr r2, =gUnknown_2025638\n" - "\tldr r1, =gUnknown_20255F0\n" - "\tadds r0, r2, 0\n" - "\tldm r0!, {r3-r5}\n" - "\tstm r1!, {r3-r5}\n" - "\tldr r0, [r0]\n" - "\tstr r0, [r1]\n" - "\tmovs r3, 0\n" - "\tmovs r0, 0\n" - "\tstrh r0, [r2]\n" - "\tstrh r0, [r2, 0x2]\n" - "\tstrh r0, [r2, 0x4]\n" - "\tstrh r0, [r2, 0x6]\n" - "\tldr r0, =gUnknown_2025600\n" - "\tldr r1, =0xffff\n" - "\tstrh r1, [r0]\n" - "\tmovs r1, 0x1\n" - "\tnegs r1, r1\n" - "\tstrh r1, [r0, 0x2]\n" - "\tstrh r1, [r0, 0x4]\n" - "\tstrh r1, [r0, 0x6]\n" - "\tstrh r1, [r0, 0x8]\n" - "\tstrh r1, [r0, 0xA]\n" - "\tstrh r1, [r0, 0xC]\n" - "\tstrh r1, [r0, 0xE]\n" - "\tstrh r1, [r0, 0x10]\n" - "\tstrh r1, [r0, 0x12]\n" - "\tstrh r1, [r0, 0x14]\n" - "\tstrh r1, [r0, 0x16]\n" - "\tadds r1, r0, 0\n" - "\tadds r1, 0x28\n" - "\tstrb r3, [r1]\n" - "\tadds r0, 0x29\n" - "\tstrb r3, [r0]\n" - "\tpop {r4,r5}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "\t.pool"); -#endif + gUnknown_2025600.unk12 = -1; + gUnknown_2025600.unk14 = -1; + gUnknown_2025600.unk16 = -1; + + gUnknown_2025600.unk28 = 0; + gUnknown_2025600.unk29 = 0; } // Unused @@ -204,3 +103,42 @@ u8 sub_80048CC(void) { return 0; } + +void sub_80048D0(void) +{ + gUnknown_20255F0.unk4 = 0; + gUnknown_2025648.unkC = 0; + gUnknown_2025648.unk8 = 0; + gUnknown_2025668.unk0 = 0x3e7; + gUnknown_2025668.unk2 = 0x3e7; + +} + +void sub_80048F8(void) +{ + gUnknown_20255F0.unk2 = 0; + gUnknown_2025638.unk2 = 0; + gUnknown_2025648.unk2 = 0; +} + +void sub_8004914(void) +{ + gUnknown_2025600.unk20 = 0x5; + gUnknown_2025600.unk24 = 0; + gUnknown_2025600.unk0 = 0xffff; + gUnknown_2025600.unk2 = -1; + gUnknown_2025600.unk4 = -1; + gUnknown_2025600.unk6 = -1; + gUnknown_2025600.unk8 = -1; + gUnknown_2025600.unkA = -1; + gUnknown_2025600.unkC = -1; + gUnknown_2025600.unkE = -1; + gUnknown_2025600.unk10 = -1; + gUnknown_2025600.unk12 = -1; + gUnknown_2025600.unk14 = -1; + gUnknown_2025600.unk16 = -1; + + gUnknown_2025600.unk28 = 0; + gUnknown_2025600.unk29 = 0; + +} -- cgit v1.2.3 From 95b06d5d6b5ec3ba54b7d9f7a04a8df91f452606 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 17 Sep 2020 12:18:11 -0500 Subject: split to decomp type name string functions --- src/code_8092334.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/code_8092334.c (limited to 'src') diff --git a/src/code_8092334.c b/src/code_8092334.c new file mode 100644 index 0000000..cb9acff --- /dev/null +++ b/src/code_8092334.c @@ -0,0 +1,26 @@ +#include "global.h" + +extern u32 gUnformattedTypeStrings[]; // unformatted type names +extern u32 gFormattedTypeStrings[]; // formatted type names +extern u8 gUnknown_810AC7C[]; +extern u8 gUnknown_810AC6A[]; + +u32 GetUnformattedTypeString(u8 type) +{ + return gUnformattedTypeStrings[type]; +} + +u32 GetFormattedTypeString(u8 type) +{ + return gFormattedTypeStrings[type]; +} + +u8 sub_8092354(u8 r0) +{ + return gUnknown_810AC7C[r0]; +} + +u8 sub_8092364(u8 r0) +{ + return gUnknown_810AC6A[r0]; +} -- cgit v1.2.3 From 1ee2ec16ae0a597b0fb5dfb0b4f7571f58cac349 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 18 Sep 2020 00:00:39 -0500 Subject: further splitting and decompile one func --- src/code_80521D0.c | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/code_80521D0.c (limited to 'src') diff --git a/src/code_80521D0.c b/src/code_80521D0.c new file mode 100644 index 0000000..bb4bd13 --- /dev/null +++ b/src/code_80521D0.c @@ -0,0 +1,8 @@ +#include "global.h" + +extern void sub_80526D0(u8 r0); + +void sub_805229C(void) +{ + return sub_80526D0(0x50); +} -- cgit v1.2.3 From d2279294209edd9ec92e601ccb86388ff9283dbb Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 19 Sep 2020 23:28:48 -0500 Subject: more datadumping and some decomp work --- src/code_80118A4.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/code_80118A4.c (limited to 'src') diff --git a/src/code_80118A4.c b/src/code_80118A4.c new file mode 100644 index 0000000..34569d0 --- /dev/null +++ b/src/code_80118A4.c @@ -0,0 +1,13 @@ +#include "global.h" + +extern void sub_8011924(void); +extern void sub_801199C(u16 r0); +extern void sub_800BFD0(u8 r0); +extern void sub_800C3F8(u16 r0, u8 r1); + +void sub_80118A4(void) +{ + sub_8011924(); + sub_801199C(0x3e6); + sub_801199C(0x3e5); +} -- cgit v1.2.3 From 722560add4e0caaab9f65a3c49d08ad83f2ef2b2 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 20 Sep 2020 01:54:59 -0500 Subject: more decomping of functions --- src/code_8272724.c | 17 +++++++++++++++++ src/event_flag.c | 12 ++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/code_8272724.c (limited to 'src') diff --git a/src/code_8272724.c b/src/code_8272724.c new file mode 100644 index 0000000..945be97 --- /dev/null +++ b/src/code_8272724.c @@ -0,0 +1,17 @@ +#include "global.h" + +extern void sub_8272774(u32 *r0, u32 r1); +extern void sub_8272884(u32 *r0, u32 r1); + +extern u32 gUnknown_2027370; // TODO defined in text.c and join later + +void sub_8272760(u32 r0) +{ + sub_8272774(&gUnknown_2027370, r0); +} + +// TODO once sub_8272774 is decomped +//void sub_8272870(u32 r0) +//{ +// sub_8272884(&gUnknown_2027370, r0); +//} diff --git a/src/event_flag.c b/src/event_flag.c index 85c320f..0515308 100644 --- a/src/event_flag.c +++ b/src/event_flag.c @@ -1,5 +1,17 @@ #include "global.h" +extern void sub_800226C(u8 r0, u8 r1, u32* r2, u8 u3); + +void sub_8002758(u32 *r0) +{ + sub_800226C(0, 0x1, r0, 0x9); +} + +u8 sub_800276C(void) +{ + return 0; +} + void nullsub_140(void) { -- cgit v1.2.3 From 2f88c03e87af934f892e7433d385731c3f206d78 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 20 Sep 2020 20:13:04 -0500 Subject: some more decomping --- src/code_80521D0.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src') diff --git a/src/code_80521D0.c b/src/code_80521D0.c index bb4bd13..5a723c5 100644 --- a/src/code_80521D0.c +++ b/src/code_80521D0.c @@ -1,8 +1,29 @@ #include "global.h" extern void sub_80526D0(u8 r0); +extern u8 sub_8045888(u32 r0, u32 r1, u32 r2, u32 r3); +extern void sub_80523A8(u32 r0, u32 r1, u8 r2); void sub_805229C(void) { return sub_80526D0(0x50); } + +void sub_80522A8(u32 r0, u32 r1, u32 r2, u32 r3) +{ + if ((sub_8045888(r0, r1, r2, r3) << 24) != 0){ + sub_80523A8(r0, r1, 1); + } +} + +void sub_80522C8(u32 r0, u32 r1, u32 r2, u32 r3) +{ + if ((sub_8045888(r0, r1, r2, r3) << 24) != 0){ + sub_80523A8(r0, r1, 0); + } +} + +void sub_80522E8(u32 r0, u32 r1) +{ + sub_80523A8(r0, r1, 0); +} -- cgit v1.2.3 From f3845bdeddd7fce3eab967922b664c540736c829 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 21 Sep 2020 00:28:50 -0500 Subject: more decomping of funcs --- src/code_80118A4.c | 44 +++++++++++++++++++++++++++++++++++++++++--- src/save1.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/code_80118A4.c b/src/code_80118A4.c index 34569d0..3881ba8 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -1,9 +1,15 @@ #include "global.h" -extern void sub_8011924(void); +void sub_8011924(void); + +extern void sub_800BDFC(u16 r0); +extern void sub_800BE8C(u16 r0, u16 r1); +extern void sub_800BF48(u16 r0); +extern void sub_800BF80(void); +extern void sub_800BFD0(u16 r0); +extern void sub_800C3F8(u16 r0, u16 r1); extern void sub_801199C(u16 r0); -extern void sub_800BFD0(u8 r0); -extern void sub_800C3F8(u16 r0, u8 r1); +extern void sub_800C068(u16 r0); void sub_80118A4(void) { @@ -11,3 +17,35 @@ void sub_80118A4(void) sub_801199C(0x3e6); sub_801199C(0x3e5); } + +void sub_80118C4(u16 r0) +{ + sub_800BFD0(r0); + sub_800C3F8(0x3e6, r0); + sub_800C3F8(0x3e5, r0); +} + +void sub_80118F0(u16 r0) +{ + sub_800BDFC(r0); +} + +void sub_8011900(u16 r0, u16 r1) +{ + sub_800BE8C(r0, r1); +} + +void sub_8011914(u16 r0) +{ + sub_800BF48(r0); +} + +void sub_8011924() +{ + sub_800BF80(); +} + +void sub_8011930(u16 r0) +{ + sub_800BFD0(r0); +} diff --git a/src/save1.c b/src/save1.c index b7de6c6..1063c66 100644 --- a/src/save1.c +++ b/src/save1.c @@ -1,6 +1,32 @@ #include "global.h" + +struct UnkSaveStruct1 +{ + /* 0x0 */ u32 unk0; + /* 0x4 */ u32 unk4; + /* 0x8 */ u16 unk8; + /* 0xA */ u8 unkA; +}; + extern void MemoryFree(void *); +extern void sub_8011860(); +extern void xxx_draw_string_80144C4(); +extern void nullsub_8(u8); +extern void sub_8005180(); +extern void sub_80060EC(); +extern void sub_800CB20(); +extern void sub_800485C(); +extern void CopySpritesToOam(); +extern void sub_8005304(); +extern void TransferBGPaletteBuffer(); +extern void xxx_call_update_bg_vram(); +extern void sub_8009908(); +extern void xxx_call_update_bg_sound_input(); +extern void ResetSprites(u8 r0); + + +extern struct UnkSaveStruct1 *gUnknown_203B46C; extern u8 *gUnknown_203B194; @@ -11,3 +37,21 @@ void sub_80129FC() gUnknown_203B194 = NULL; } } + +void sub_8012A18() +{ + sub_8011860(); + xxx_draw_string_80144C4(); + nullsub_8(gUnknown_203B46C->unkA); + sub_8005180(); + sub_80060EC(); + sub_800CB20(); + sub_800485C(); + CopySpritesToOam(); + sub_8005304(); + TransferBGPaletteBuffer(); + xxx_call_update_bg_vram(); + sub_8009908(); + xxx_call_update_bg_sound_input(); + ResetSprites(0); +} -- cgit v1.2.3 From d5e31c8be0d82746945035f4be7d038d5536efb7 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 21 Sep 2020 01:40:48 -0500 Subject: decomp decomp decomp --- src/code.c | 27 +++++++++++++++++++++++++++ src/file_system.c | 6 ++++++ 2 files changed, 33 insertions(+) (limited to 'src') diff --git a/src/code.c b/src/code.c index 769a11d..49180c2 100644 --- a/src/code.c +++ b/src/code.c @@ -1,4 +1,31 @@ #include "global.h" + +extern void xxx_dungeon_8042F6C(u32 r0); +extern void NDS_LoadOverlay_GroundMain(); +extern u32 xxx_script_related_8098468(); + +void NDS_LoadOverlay_GroundMain() +{ + +} + +void nullsub_2(u32 r0) +{ + +} + +u32 xxx_script_related_8001334() +{ + return xxx_script_related_8098468(); +} + +void xxx_dungeon_8001340(u32 r0) +{ + nullsub_2(r0); + xxx_dungeon_8042F6C(r0); + NDS_LoadOverlay_GroundMain(); +} + void nullsub_3(void) { diff --git a/src/file_system.c b/src/file_system.c index 1555a65..81bbfef 100644 --- a/src/file_system.c +++ b/src/file_system.c @@ -7,6 +7,7 @@ extern u32 gFileCacheCursorPosition; extern u32 gUnknown_202D2A4; extern int sprintf(char *, const char *, ...); +extern u32 sub_800AAB4(u32 r0, u32 r1, u32 r2); u8 *GetSiroPtr(struct OpenedFile *); void NDS_DecompressRLE(void *); @@ -181,3 +182,8 @@ void nullsub_16(void) void nullsub_175(void) { } + +u32 sub_800AAA8(u32 r0, u32 r1, struct UnkFileStruct1 *r2) +{ + return sub_800AAB4(r0, r1, r2->unk4); +} -- cgit v1.2.3 From 1bacffd62f81e795b6309f6389ccbe55f2af4ea5 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 21 Sep 2020 12:03:19 -0500 Subject: we already decomped this func so use it from text --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index d05db7f..7dcfc4a 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,7 @@ #include "global.h" #include "random.h" #include "flash.h" +#include "text.h" extern char ewram_start[]; @@ -34,7 +35,6 @@ extern void InitInput(void); extern void InitBGPaletteBuffer(void); extern void sub_80057E8(void); extern void InitFileSystem(void); -extern void sub_8006218(void); extern void sub_80098A0(void); extern void sub_80096E0(void); extern void sub_800B6F4(int, void *); -- cgit v1.2.3 From cd050a5e7d66e28485a5b4e57ecdfb3d8c5f1e3c Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 23 Sep 2020 22:56:31 -0500 Subject: found more MonsterParameter funcs that weren't in the split and decomped a few of them --- src/pokemon.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src') diff --git a/src/pokemon.c b/src/pokemon.c index 40606df..ae2b801 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1,2 +1,25 @@ #include "global.h" #include "pokemon.h" +#include "file_system.h" + +extern u32 *gUnknown_203B45C; +extern u32 gUnknown_202F400; +extern struct FileArchive gUnknown_8300500; +extern const char gUnknown_81075F4; +extern struct OpenedFile *gMonsterParametersFile; +extern u16 gUnknown_20384E8; +extern struct gPokemon gMonsterParameters; + +void LoadMonsterParameters(void) +{ + gUnknown_203B45C = &gUnknown_202F400; + gMonsterParametersFile = OpenFileAndGetFileDataPtr(&gUnknown_81075F4, &gUnknown_8300500); + gMonsterParameters.unk0 = gMonsterParametersFile->data; + gUnknown_20384E8 = 0; +} + +u32 *sub_808CE00(void) +{ + return &gUnknown_202F400; + +} -- cgit v1.2.3 From e41b0b6a35a6aaca01e47597d9a04012df9d2362 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 24 Sep 2020 01:12:49 -0500 Subject: finally found the personality test stuff. now I can work on some of that now --- src/code_8012A18.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/code_8012A18.c (limited to 'src') diff --git a/src/code_8012A18.c b/src/code_8012A18.c new file mode 100644 index 0000000..e21400c --- /dev/null +++ b/src/code_8012A18.c @@ -0,0 +1,25 @@ +#include "global.h" + +extern u8 gUnknown_80F42D0[]; +extern u8 gUnknown_80F42F0[]; +extern u8 gUnknown_203B408; + +u8 sub_803D0D8() +{ + return gUnknown_203B408; +} + +void sub_803D0E4(u8 r0) +{ + gUnknown_203B408 = r0; +} + +u8 sub_803D0F0(u8 r0) +{ + return gUnknown_80F42F0[r0]; +} + +u8 sub_803D100(u8 r0) +{ + return gUnknown_80F42D0[r0]; +} -- cgit v1.2.3 From 1a649b9146fae34c623e8029e8effed973ea4ecb Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 25 Sep 2020 00:10:54 -0500 Subject: split, decomp, rinse, repeat --- src/code_8048480.c | 21 +++++++++++++++++++++ src/event_flag.c | 32 ++++++++++++++++++++++++++++++++ src/file_system.c | 20 ++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 src/code_8048480.c (limited to 'src') diff --git a/src/code_8048480.c b/src/code_8048480.c new file mode 100644 index 0000000..7033590 --- /dev/null +++ b/src/code_8048480.c @@ -0,0 +1,21 @@ +#include "global.h" + +extern void sub_807D148(u32 r0, u32 r1, u32 r2, u32 r3); +extern void sub_8075FCC(void); +extern void sub_8077AE4(u32 r0, u32 r1, u32 r2); +extern void sub_8072008(u32 r0, u32 r1, u32 r2, u32 r3); + +void sub_8048480(u32 r0, u32 r1) +{ + sub_807D148(r0, r1, 0, 0); +} + +void sub_8048490(void) +{ + sub_8075FCC(); +} + +void sub_804849C(u32 r0, u32 r1) +{ + sub_8077AE4(r0, r1, 1); +} diff --git a/src/event_flag.c b/src/event_flag.c index 0515308..1a4afc1 100644 --- a/src/event_flag.c +++ b/src/event_flag.c @@ -1,6 +1,38 @@ #include "global.h" +#include "memory.h" + +struct UnkEventStruct +{ + /* 0x0 */ u32 unk0; + /* 0x4 */ s16 unk4; + /* 0x6 */ u16 unk6; + /* 0x8 */ u16 unk8; + /* 0xA */ s16 unkA; +}; + +struct UnkEventStruct2 +{ + /* 0x0 */ u32 unk0; + /* 0x4 */ u32 unk4; +}; extern void sub_800226C(u8 r0, u8 r1, u32* r2, u8 u3); +extern void sub_800160C(struct UnkEventStruct2 *r0, u32 r1, u32 r2); + +extern u8 gUnknown_2000A88; + + +//u8 sub_8002718(struct UnkEventStruct *r0) +//{ +// struct UnkEventStruct2 temp; +// sub_800160C(&temp, 0, 0); +// MemoryCopy8(&gUnknown_2000A88, (u8 *)r0, (0x80 << 3)); +// +// // TODO fix this comparison to make it match +// if(r0->unkA != temp.unk4) +// return 0; +// return 1; +//} void sub_8002758(u32 *r0) { diff --git a/src/file_system.c b/src/file_system.c index 81bbfef..71b5534 100644 --- a/src/file_system.c +++ b/src/file_system.c @@ -12,6 +12,26 @@ extern u32 sub_800AAB4(u32 r0, u32 r1, u32 r2); u8 *GetSiroPtr(struct OpenedFile *); void NDS_DecompressRLE(void *); +struct UnkFileStruct +{ + /* 0x0 */ u32 unk0; + /* 0x4 */ u32 unk4; +}; + +extern u32 gUnknown_80B96E4[]; + +void sub_800A894(struct UnkFileStruct *r0, s32 r1) +{ + s32 temp; + temp = r1; + if(r1 <= 0) + temp = 1; + if(temp > 0x12b) + temp = 0x12b; + r0->unk4 = gUnknown_80B96E4[temp]; + r0->unk0 = 0; +} + void InitFileSystem(void) { s32 i; -- cgit v1.2.3 From 93ed78878789a60e9c3e7e0566f3dc8f7ed1f7d2 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 26 Sep 2020 18:30:40 -0500 Subject: more decomping --- src/code_8092334.c | 24 +++++++++++++++++ src/save1.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 98 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/code_8092334.c b/src/code_8092334.c index cb9acff..88a9c5a 100644 --- a/src/code_8092334.c +++ b/src/code_8092334.c @@ -4,6 +4,10 @@ extern u32 gUnformattedTypeStrings[]; // unformatted type names extern u32 gFormattedTypeStrings[]; // formatted type names extern u8 gUnknown_810AC7C[]; extern u8 gUnknown_810AC6A[]; +extern u8 *gUnknown_810B4C8[]; +extern u8 *gUnknown_810B988[]; +extern u32 gUnknown_2038C28; +extern u32 *gUnknown_203B468; u32 GetUnformattedTypeString(u8 type) { @@ -24,3 +28,23 @@ u8 sub_8092364(u8 r0) { return gUnknown_810AC6A[r0]; } + +void sub_8092374(char *r0, u8 r1) +{ + strncpy(r0, gUnknown_810B4C8[r1], 0x50); +} + +u8 *sub_8092390(u8 r0) +{ + return gUnknown_810B988[r0]; +} + +void sub_80923A0(void) +{ + gUnknown_203B468 = &gUnknown_2038C28; +} + +u32 *sub_80923B0(void) +{ + return &gUnknown_2038C28; +} diff --git a/src/save1.c b/src/save1.c index 1063c66..5b8ad19 100644 --- a/src/save1.c +++ b/src/save1.c @@ -9,6 +9,28 @@ struct UnkSaveStruct1 /* 0xA */ u8 unkA; }; +struct UnkStruct +{ + /* 0x0 */ u8 unk0; + /* 0x1 */ u8 unk1; + /* 0x2 */ u8 unk2; + /* 0x3 */ u8 unk3; + /* 0x4 */ u8 unk4; + /* 0x5 */ u32 unk5; + /* 0x9 */ u32 unk9; + /* 0xD */ u32 unkD; + /* 0x12 */ u32 unk11; + /* 0x16 */ u32 unk15; + /* 0x1A */ u32 unk19; + /* 0x1E */ u32 unk1D; + /* 0x24 */ u32 unk24; + /* 0x28 */ u8 unk28; + /* 0x29 */ u8 unk29; + /* 0x2A */ u8 unk2A; + /* 0x2B */ u8 unk2B; + /* 0x2C */ u8 unk2C; +}; + extern void MemoryFree(void *); extern void sub_8011860(); extern void xxx_draw_string_80144C4(); @@ -24,7 +46,8 @@ extern void xxx_call_update_bg_vram(); extern void sub_8009908(); extern void xxx_call_update_bg_sound_input(); extern void ResetSprites(u8 r0); - +extern u32 sub_8012AE8(void); +extern void nullsub_34(struct UnkStruct *r0); extern struct UnkSaveStruct1 *gUnknown_203B46C; @@ -55,3 +78,53 @@ void sub_8012A18() xxx_call_update_bg_sound_input(); ResetSprites(0); } + +u32 sub_8012A64(struct UnkStruct *r0, u32 r1) +{ + if(r0 == NULL) + { + return sub_8012AE8(); + } + if(r1 != -1) + { + nullsub_34(r0); + } + if(r0->unk1 != 0) + { + r0->unk1 = 0; + return 1; + } + if(r0->unk2 == 0) + { + return sub_8012AE8(); + } + r0->unk2 = r0->unk1; + return 2; +} + +// TODO match that one line +//u32 GetKeyPress(struct UnkStruct *r0) +//{ +// if(r0 == NULL) +// { +// return sub_8012AE8(); +// } +// // TODO it's not a struct access.. +// if(r0->unk29 != 0) +// { +// return 1; +// } +// if(r0->unk2A != 0) +// { +// return 2; +// } +// if(r0->unk2C != 0) +// { +// return 9; +// } +// if(r0->unk2B == 0) +// { +// return sub_8012AE8(); +// } +// return 0xA; +//} -- cgit v1.2.3 From a3acf2d8809e49ec5e5a800f3fcf4577228b586f Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 26 Sep 2020 20:09:32 -0500 Subject: some splittig and decomping --- src/code_80118A4_1.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/code_80118A4_1.c (limited to 'src') diff --git a/src/code_80118A4_1.c b/src/code_80118A4_1.c new file mode 100644 index 0000000..9d6bc5e --- /dev/null +++ b/src/code_80118A4_1.c @@ -0,0 +1,15 @@ +#include "global.h" + +extern u8 gUnknown_203B150; + +// unused +u8 sub_8011B3C(void) +{ + return gUnknown_203B150; +} + +// unused +void nullsub_137(void) +{ + +} -- cgit v1.2.3 From 9b6d44a63b19c238d35c1604fed3a72d737e6cf3 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 26 Sep 2020 21:43:31 -0500 Subject: split, decomp, rinse, repeat --- src/code_80A7714.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/code_80A7714.c (limited to 'src') diff --git a/src/code_80A7714.c b/src/code_80A7714.c new file mode 100644 index 0000000..0522ef1 --- /dev/null +++ b/src/code_80A7714.c @@ -0,0 +1,27 @@ +#include "global.h" + +extern void sub_80A68A0(void); +extern void sub_80A7094(u32 r0, u32 r1, u32 r2, u32 r3); +extern void sub_80A7310(u32 r0, u32 r1, u32 r2, u32 r3); +extern s16 gUnknown_2039DE0; + +void sub_80A7714(void) +{ + sub_80A68A0(); +} + +void sub_80A7720(u32 r0, u32 r1, u32 r2) +{ + sub_80A7094(r0, 0, r1, r2); + sub_80A7310(r0, r1, 0, r2); +} + +void sub_80A7744(void) +{ + gUnknown_2039DE0 = -1; +} + +void sub_80A7754(void) +{ + gUnknown_2039DE0 = -1; +} -- cgit v1.2.3 From c5d9ff48096fed3eba4b28a4f229579e694e2d63 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 27 Sep 2020 17:56:12 -0500 Subject: 1.8% functions decomped.. so close to 2% --- src/code_80428A0.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 src/code_80428A0.c (limited to 'src') diff --git a/src/code_80428A0.c b/src/code_80428A0.c new file mode 100644 index 0000000..eab25f3 --- /dev/null +++ b/src/code_80428A0.c @@ -0,0 +1,145 @@ +#include "global.h" + +extern void sub_804151C(u32 r0, u32 r1, u32 r2); +extern void sub_803E708(u32 r0, u32 r1); +extern void sub_80416A4(u32 r0, u32 r1, u32 r2); +extern void sub_80421C0(u32 r0, u32 r1); + +void sub_80428A0(u32 r0) +{ + sub_804151C(r0, 0x29, 1); +} + +void sub_80428B0(u32 r0) +{ + sub_804151C(r0, 0x1a9, 0); +} + + +void sub_80428C4(u32 r0) +{ + sub_804151C(r0, 0x1a9, 0); +} + + +void sub_80428D8(u32 r0) +{ + sub_804151C(r0, 0x1a9, 0); +} + +void sub_80428EC(u32 r0) +{ + sub_804151C(r0, 0x1a9, 0); +} + +void sub_8042900(u32 r0) +{ + sub_804151C(r0, 0xD4 << 1, 0); +} + +void sub_8042910(u32 r0) +{ + sub_804151C(r0, 0x29, 0); +} + +void sub_8042920(u32 r0) +{ + sub_804151C(r0, 0x48, 0); +} + +void sub_8042930(u32 r0) +{ + sub_804151C(r0, 0xD3 << 1, 1); +} + +void sub_8042940(u32 r0) +{ + sub_804151C(r0, 0xC7 << 1, 0); +} + +void sub_8042950(u32 r0) +{ + sub_804151C(r0, 0xD8 << 1, 1); + sub_803E708(0xA, 0x42); +} + +void sub_8042968(u32 r0) +{ + sub_804151C(r0, 0xD4 << 1, 0); +} + +void sub_8042978(u32 r0) +{ + sub_804151C(r0, 0x1a9, 0); +} + +void sub_804298C(u32 r0) +{ + sub_804151C(r0, 0x1a9, 0); +} + +void sub_80429A0(u32 r0) +{ + sub_804151C(r0, 0x199, 0); +} + +void sub_80429B4(u32 r0) +{ + sub_804151C(r0, 0x1ab, 0); +} + +void sub_80429C8(u32 r0) +{ + sub_804151C(r0, 0x4, 1); +} + +void sub_80429D8(u32 r0) +{ + sub_804151C(r0, 0x8F << 1, 1); +} + +void sub_80429E8(u32 r0) +{ + sub_804151C(r0, 0x11d, 1); +} + +void sub_80429FC(u32 r0) +{ + sub_80416A4(r0, 0xCF << 1, 1); + sub_80421C0(0, 0xD4); +} + +void sub_8042A14(u32 r0) +{ + sub_80416A4(r0, 0x36, 1); +} + +void sub_8042A24(u32 r0) +{ + sub_804151C(r0, 0x15, 1); +} + +void sub_8042A34(u32 r0) +{ + sub_80416A4(r0, 0x9F << 1, 0); +} + +void sub_8042A44(u32 r0) +{ + sub_804151C(r0, 0xDA << 1, 1); +} + +void sub_8042A54(u32 r0) +{ + sub_80416A4(r0, 0x37, 1); +} + +void sub_8042A64(u32 r0) +{ + sub_80416A4(r0, 0x29, 1); +} + +void sub_8042A74(u32 r0) +{ + sub_804151C(r0, 0x18, 1); +} -- cgit v1.2.3 From ef82d0f951daf79931cc00e47b973893861fa596 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 30 Sep 2020 14:48:13 -0500 Subject: some more dumping and one decomp --- src/code_808DAB4.c | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/code_808DAB4.c (limited to 'src') diff --git a/src/code_808DAB4.c b/src/code_808DAB4.c new file mode 100644 index 0000000..e7e7110 --- /dev/null +++ b/src/code_808DAB4.c @@ -0,0 +1,10 @@ +#include "global.h" + +extern void sub_808DE50(void* r0, void * r1, u32 r2, u32 r3); + +extern void * gUnknown_203B45C; + +void sub_808DE30(void* r0, u32 r1) +{ + sub_808DE50(r0, gUnknown_203B45C + (r1 * 0x58), r1, r1 * 0x58); +} -- cgit v1.2.3 From 70c644dfdd82dd31038faf1e2ca37b833ee8c328 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 1 Oct 2020 01:40:05 -0500 Subject: actually add both files --- src/code_80118A4.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/code_80118A4.c b/src/code_80118A4.c index 3881ba8..2ed0e9e 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -9,7 +9,19 @@ extern void sub_800BF80(void); extern void sub_800BFD0(u16 r0); extern void sub_800C3F8(u16 r0, u16 r1); extern void sub_801199C(u16 r0); -extern void sub_800C068(u16 r0); +extern u16 sub_800C068(); +extern void sub_800C074(u16 r0, u16 r1); +extern void sub_800C298(u16 r0); +extern u8 sub_800C5D0(u16 r0); + +struct UnkStructType +{ + /* 0x0 */ s16 unk0; + +}; + +extern u16 gUnknown_80D4144[]; +extern struct UnkStructType gUnknown_202DE20; void sub_80118A4(void) { @@ -49,3 +61,88 @@ void sub_8011930(u16 r0) { sub_800BFD0(r0); } + +// TODO fix this nonmatching +#ifndef NONMATCHING +NAKED +#endif +u32 sub_8011940(u16 r0) +{ +#ifdef NONMATCHING + u32 temp; + temp = sub_800C068(); + + if(r0 == 0x3e7) + { + temp ^= r0; + // TODO this OR/NEG apparently is close + temp |= -temp; + return temp >> 31; + } + + if(temp != r0) + return 0; + else + return 1; +#else + asm_unified("\tpush {r4,lr}\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tbl sub_800C068\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tldr r0, _08011960\n" + "\tcmp r4, r0\n" + "\tbne _08011964\n" + "\teors r1, r4\n" + "\tnegs r0, r1\n" + "\torrs r0, r1\n" + "\tlsrs r0, 31\n" + "\tb _0801196C\n" + "\t.align 2,0\n" + "_08011960: .4byte 0x000003e7\n" + "_08011964:\n" + "\tmovs r0, 0\n" + "\tcmp r1, r4\n" + "\tbne _0801196C\n" + "\tmovs r0, 0x1\n" + "_0801196C:\n" + "\tpop {r4}\n" + "\tpop {r1}\n" + "\tbx r1"); +#endif +} + +void sub_8011974(u16 r0, u16 r1) +{ + sub_800C074(r0, r1); +} + +void sub_8011988(u16 r0) +{ + sub_800C074(r0, 0x80 << 1); +} + +void sub_801199C(u16 r0) +{ + sub_800C298(r0); +} + +void sub_80119AC(u16 r0, u16 r1) +{ + sub_800C3F8(r0, r1); +} + +u8 sub_80119C0(u16 r0) +{ + return sub_800C5D0(r0); +} + +// TODO pretty close except r4's where should be r2's +//void sub_80119D4(u32 r0) +//{ +// if(gUnknown_202DE20.unk0 > 0) +// return; +// sub_800C074(gUnknown_80D4144[r0], 0x80 << 1); +// gUnknown_80D4144[r0] = 0x4; +//} -- cgit v1.2.3 From 96fdd3aae0ba1d923b358128012979a9a1a0eb38 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 1 Oct 2020 13:32:53 -0500 Subject: successful decomp of one pokemon data func and struct.. making headway --- src/event_flag.c | 7 +++++-- src/pokemon.c | 3 ++- src/pokemon_1.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/pokemon_1.c (limited to 'src') diff --git a/src/event_flag.c b/src/event_flag.c index 1a4afc1..501b1af 100644 --- a/src/event_flag.c +++ b/src/event_flag.c @@ -13,7 +13,9 @@ struct UnkEventStruct struct UnkEventStruct2 { /* 0x0 */ u32 unk0; - /* 0x4 */ u32 unk4; + /* 0x4 */ u32 *unk4; + /* 0x8 */ u16 unk8; + /* 0xA */ s16 unkA; }; extern void sub_800226C(u8 r0, u8 r1, u32* r2, u8 u3); @@ -22,6 +24,7 @@ extern void sub_800160C(struct UnkEventStruct2 *r0, u32 r1, u32 r2); extern u8 gUnknown_2000A88; +// TODO fix stack allocation from 0xC to 0x8 to make this match //u8 sub_8002718(struct UnkEventStruct *r0) //{ // struct UnkEventStruct2 temp; @@ -29,7 +32,7 @@ extern u8 gUnknown_2000A88; // MemoryCopy8(&gUnknown_2000A88, (u8 *)r0, (0x80 << 3)); // // // TODO fix this comparison to make it match -// if(r0->unkA != temp.unk4) +// if(temp.unkA != *(temp.unk4)) // return 0; // return 1; //} diff --git a/src/pokemon.c b/src/pokemon.c index ae2b801..55316d6 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -14,7 +14,8 @@ void LoadMonsterParameters(void) { gUnknown_203B45C = &gUnknown_202F400; gMonsterParametersFile = OpenFileAndGetFileDataPtr(&gUnknown_81075F4, &gUnknown_8300500); - gMonsterParameters.unk0 = gMonsterParametersFile->data; + // TODO verify this... other parts imply this is an array + gMonsterParameters.species = gMonsterParametersFile->data; gUnknown_20384E8 = 0; } diff --git a/src/pokemon_1.c b/src/pokemon_1.c new file mode 100644 index 0000000..6d4cf75 --- /dev/null +++ b/src/pokemon_1.c @@ -0,0 +1,31 @@ +#include "global.h" +#include "pokemon.h" +#include "file_system.h" + +extern int sprintf(char *, const char *, ...); + +extern struct gPokemon *gMonsterParameters; +extern struct FileArchive gUnknown_8510000; +extern const char gUnknown_8107684; + +//u8 sub_808DDD0(s16 r0) +//{ +// // Looks like this loads the dialogue sprite for the pokemon +// +// // TODO stack is being added instead of being substracted +// // Else this matches +// char buffer[0xC]; +// if(gMonsterParameters[r0].dialogue_sprites != 0) +// { +// sprintf(buffer, &gUnknown_8107684); +// OpenFileAndGetFileDataPtr(buffer, &gUnknown_8510000); +// return; +// } +// return 0; +//} + +bool8 sub_808DE10(s16 r0, s32 r1) +{ + // checking to see if dialogue sprite is available?? + return (gMonsterParameters[r0].dialogue_sprites >> r1) & 1; +} -- cgit v1.2.3 From 51de478e603d08b01942449f71a72801da65ede7 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 1 Oct 2020 13:48:10 -0500 Subject: changed hex boundary to decimal and format corresponding data --- src/file_system.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/file_system.c b/src/file_system.c index 71b5534..c328d6a 100644 --- a/src/file_system.c +++ b/src/file_system.c @@ -26,8 +26,8 @@ void sub_800A894(struct UnkFileStruct *r0, s32 r1) temp = r1; if(r1 <= 0) temp = 1; - if(temp > 0x12b) - temp = 0x12b; + if(temp > 299) + temp = 299; r0->unk4 = gUnknown_80B96E4[temp]; r0->unk0 = 0; } -- cgit v1.2.3 From d60e36b6b81b691585c2f231356738af704e0c7b Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 1 Oct 2020 17:40:44 -0500 Subject: decomp a number of pokemon functions --- src/pokemon_mid.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/pokemon_mid.c (limited to 'src') diff --git a/src/pokemon_mid.c b/src/pokemon_mid.c new file mode 100644 index 0000000..03a66b2 --- /dev/null +++ b/src/pokemon_mid.c @@ -0,0 +1,80 @@ +#include "global.h" +#include "pokemon.h" + +extern struct gPokemon *gMonsterParameters; + +u8 *sub_808DAB4(s16 r0) +{ + return gMonsterParameters[r0].category; +} + +u8 sub_808DACC(s16 r0) +{ + return gMonsterParameters[r0].size; +} + +u8 sub_808DAE4(s16 r0) +{ + return gMonsterParameters[r0].shadow_size; +} + +s32 sub_808DAFC(s16 r0) +{ + return gMonsterParameters[r0].move_speed; +} + +u8 sub_808DB14(s16 r0) +{ + return gMonsterParameters[r0].walkable_tiles; +} + +u8 sub_808DB2C(s16 r0) +{ + return ((u8)(gMonsterParameters[r0].unk1B) << 25) >> 24; +} + + +bool8 sub_808DB48(s16 r0) +{ + return gMonsterParameters[r0].isMoving; +} + +u8 sub_808DB60(s16 r0) +{ + return gMonsterParameters[r0].unk1D; +} + +u16 sub_808DB78(s16 r0) +{ + return gMonsterParameters[r0].lowkick_dmg; +} + +u16 sub_808DB90(s16 r0) +{ + return gMonsterParameters[r0].sizeorb_dmg; +} + +u8 sub_808DBA8(s16 r0) +{ + return gMonsterParameters[r0].friend_area; +} + +u16 sub_808DBC0(s16 r0) +{ + return gMonsterParameters[r0].base_hp; +} + +bool8 sub_808DBD8(s16 r0) +{ + return gMonsterParameters[r0].unk33; +} + +u8 sub_808DBF4(s16 r0) +{ + return gMonsterParameters[r0].unk12; +} + +s16 sub_808DC0C(s16 r0) +{ + return gMonsterParameters[r0].evolve_from; +} -- cgit v1.2.3 From 18308a119060984051cfb95a486778210dbae451 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 5 Oct 2020 22:32:47 -0500 Subject: some doc'ing and decomp work --- src/code_8092334.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/code_8092334.c b/src/code_8092334.c index 88a9c5a..9049635 100644 --- a/src/code_8092334.c +++ b/src/code_8092334.c @@ -6,7 +6,7 @@ extern u8 gUnknown_810AC7C[]; extern u8 gUnknown_810AC6A[]; extern u8 *gUnknown_810B4C8[]; extern u8 *gUnknown_810B988[]; -extern u32 gUnknown_2038C28; +extern u32 gBoughtFriendAreas; extern u32 *gUnknown_203B468; u32 GetUnformattedTypeString(u8 type) @@ -41,10 +41,10 @@ u8 *sub_8092390(u8 r0) void sub_80923A0(void) { - gUnknown_203B468 = &gUnknown_2038C28; + gUnknown_203B468 = &gBoughtFriendAreas; } u32 *sub_80923B0(void) { - return &gUnknown_2038C28; + return &gBoughtFriendAreas; } -- cgit v1.2.3 From 86d3dd67977c56d2624f3206ce8c5df4d27014b3 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 8 Oct 2020 20:18:00 -0500 Subject: massive split of file and decomp one func with an attempt on an another --- src/code_8012A18.c | 25 --------------- src/code_8027C84.c | 25 +++++++++++++++ src/code_8027C84_pre.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 25 deletions(-) delete mode 100644 src/code_8012A18.c create mode 100644 src/code_8027C84.c create mode 100644 src/code_8027C84_pre.c (limited to 'src') diff --git a/src/code_8012A18.c b/src/code_8012A18.c deleted file mode 100644 index e21400c..0000000 --- a/src/code_8012A18.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "global.h" - -extern u8 gUnknown_80F42D0[]; -extern u8 gUnknown_80F42F0[]; -extern u8 gUnknown_203B408; - -u8 sub_803D0D8() -{ - return gUnknown_203B408; -} - -void sub_803D0E4(u8 r0) -{ - gUnknown_203B408 = r0; -} - -u8 sub_803D0F0(u8 r0) -{ - return gUnknown_80F42F0[r0]; -} - -u8 sub_803D100(u8 r0) -{ - return gUnknown_80F42D0[r0]; -} diff --git a/src/code_8027C84.c b/src/code_8027C84.c new file mode 100644 index 0000000..e21400c --- /dev/null +++ b/src/code_8027C84.c @@ -0,0 +1,25 @@ +#include "global.h" + +extern u8 gUnknown_80F42D0[]; +extern u8 gUnknown_80F42F0[]; +extern u8 gUnknown_203B408; + +u8 sub_803D0D8() +{ + return gUnknown_203B408; +} + +void sub_803D0E4(u8 r0) +{ + gUnknown_203B408 = r0; +} + +u8 sub_803D0F0(u8 r0) +{ + return gUnknown_80F42F0[r0]; +} + +u8 sub_803D100(u8 r0) +{ + return gUnknown_80F42D0[r0]; +} diff --git a/src/code_8027C84_pre.c b/src/code_8027C84_pre.c new file mode 100644 index 0000000..2dbdd66 --- /dev/null +++ b/src/code_8027C84_pre.c @@ -0,0 +1,86 @@ +#include "global.h" + + +struct UnkOtherStructTemp +{ + /* 0x0 */ u32 unk0; + /* 0x4 */ u32 unk4; + /* 0x8 */ u32 unk8; + /* 0xC */ u32 unkC; + /* 0x10 */ u32 unk10; + /* 0x14 */ u32 unk14; + /* 0x18 */ u32 unk18; + /* 0x1C */ u32 unk1C; + /* 0x20 */ u16 *unk20; + /* 0x24 */ u16 unk24; + /* 0x26 */ u16 unk26; + /* 0x28 */ u16 unk28; + /* 0x2A */ u16 unk2A; +}; + +struct UnkStructTemp +{ + /* 0x0 */ u32 unk0; + /* 0x4 */ u32 unk4; + /* 0x8 */ u32 unk8; + /* 0xC */ u32 unkC; + /* 0x10 */ u32 unk10; + /* 0x14 */ u32 unk14; + /* 0x18 */ u32 unk18; + /* 0x1C */ u32 unk1C; + /* 0x20 */ struct UnkOtherStructTemp *unk20; + /* 0x24 */ u16 unk24; + /* 0x26 */ u16 unk26; + /* 0x28 */ u16 unk28; + /* 0x2A */ u16 unk2A; +}; + + +extern struct UnkStructTemp *gUnknown_203B2BC; +u32 sub_801B410(); +void sub_801B450(); +void sub_8027184(u8 r0); +u32 sub_801EF38(u8 r0); +struct UnkOtherStructTemp *sub_801F194(); +void sub_8027184(u8 r0); +void sub_801F214(); + +void sub_8027C84() +{ + u32 temp = sub_801B410(); + if(temp <= 1) + return; + if(temp > 3) + return; + sub_801B450(); + sub_8027184(0xB); +} + +//void sub_8027CA0() +//{ +// struct UnkOtherStructTemp *temp_store; +// u32 temp = sub_801EF38(1); +// if(temp > 4) +// return; +// switch(temp) +// { +// case 0: +// case 1: +// break; +// case 2: +// sub_801F214(); +// sub_8027184(0x2); +// return; +// case 3: +// case 4: +// temp_store = sub_801F194(); +// gUnknown_203B2BC->unk20 = temp_store; +// // TODO missing +// // lsls r0, 3 +// // adds r0, r1, r0 +// // Why are we shifting the pointer by 3? +// gUnknown_203B2BC->unk24 = temp_store->unk2A; +// sub_8027184(0x10); +// break; +// } +//} -- cgit v1.2.3 From ada5402dc07b2a65d647aa82aef5336c2b3c38ee Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 9 Oct 2020 01:34:01 -0500 Subject: decomp some save stuff --- src/code_8094F88.c | 35 +++++++++++++++ src/save_mid.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 src/code_8094F88.c create mode 100644 src/save_mid.c (limited to 'src') diff --git a/src/code_8094F88.c b/src/code_8094F88.c new file mode 100644 index 0000000..2a0e618 --- /dev/null +++ b/src/code_8094F88.c @@ -0,0 +1,35 @@ +#include "global.h" + +struct unkTimeStruct +{ + u16 unk0; + u8 unk2; + u8 unk3; + u8 unk4; +}; + +extern struct unkTimeStruct *gUnknown_203B47C; +extern struct unkTimeStruct gPlayTime; + +// Forward Declaration +void sub_8094FA8(struct unkTimeStruct *Time); + + +void sub_8094F88(void) +{ + gUnknown_203B47C = &gPlayTime; + sub_8094FA8(&gPlayTime); +} + +struct unkTimeStruct *sub_8094FA0(void) +{ + return &gPlayTime; +} + +void sub_8094FA8(struct unkTimeStruct *Time) +{ + Time->unk4 = 0; + Time->unk3 = 0; + Time->unk2 = 0; + Time->unk0 = 0; +} diff --git a/src/save_mid.c b/src/save_mid.c new file mode 100644 index 0000000..da96d09 --- /dev/null +++ b/src/save_mid.c @@ -0,0 +1,122 @@ +#include "global.h" + +// TODO unify with UnkStruct_203B184 in save.c +struct unkSaveStruct +{ + /* 0x0 */ u32 unk0; + /* 0x4 */ u32 unk4; + /* 0x8 */ u32 unk8; + /* 0xC */ u32 unkC; + /* 0x10 */ u32 unk10; + /* 0x14 */ u32 unk14; + /* 0x18 */ u32 unk18; + /* 0x1C */ u32 unk1C; + /* 0x20 */ u32 unk20; + /* 0x24 */ u32 unk24; + /* 0x28 */ u32 unk28; + /* 0x2C */ u32 unk2C; + /* 0x30 */ u32 unk30; +}; + +extern struct unkSaveStruct *gUnknown_203B184; + +extern u32 gUnknown_203B460; +extern u32 gUnknown_203B45C; +extern u32 gUnknown_203B480; +extern u32 gUnknown_203B484; +extern u32 gUnknown_203B488; +extern u32 gUnknown_203B48C; +extern u32 gUnknown_203B490; +extern u32 gUnknown_203B464; +extern u32 gUnknown_203B494; +extern u32 gUnknown_203B498; +extern u32 gUnknown_203B468; +extern u32 gUnknown_203B46C; +extern u32 gUnknown_203B47C; + +extern void sub_800135C(void); +extern u32 sub_808CE00(void); +extern void sub_808CE08(void); +extern u32 sub_80909D0(void); +extern void sub_80909D8(void); +extern u32 sub_809208C(void); +extern void sub_8092094(void); +extern u32 sub_80923B0(void); +extern void sub_80923B8(void); +extern u32 sub_8094990(void); +extern void sub_8094998(u8 r0); +extern u32 sub_8094FA0(void); +extern u32 sub_80950F8(void); +extern u32 sub_8095100(void); +extern u32 sub_8095108(void); +extern u32 sub_8095110(void); +extern void sub_8095118(void); +extern u32 sub_80958F8(void); +extern void sub_8095900(void); +extern u32 sub_8097680(void); +extern void sub_80972F4(void); +extern void sub_80974E8(void); +extern u32 sub_8097F6C(void); +extern void sub_8097F74(void); + +void sub_80122F4(void) +{ + sub_800135C(); +} + +void sub_8012300(void) +{ + sub_80923B8(); + sub_808CE08(); + sub_80909D8(); + sub_8092094(); + sub_80972F4(); + sub_8095118(); + sub_8095900(); + sub_80974E8(); + sub_8094998(1); + sub_8097F74(); +} + + +// Unused +void nullsub_200(u32 r0) +{ +} + +// Unused +void sub_8012334(struct unkSaveStruct *r0) +{ + gUnknown_203B184 = r0; + if(r0 != NULL) + { + gUnknown_203B460 = r0->unk0; + gUnknown_203B45C = r0->unk4; + gUnknown_203B480 = r0->unk8; + gUnknown_203B484 = r0->unkC; + gUnknown_203B488 = r0->unk10; + gUnknown_203B48C = r0->unk14; + gUnknown_203B490 = r0->unk18; + gUnknown_203B464 = r0->unk1C; + gUnknown_203B494 = r0->unk20; + gUnknown_203B498 = r0->unk24; + gUnknown_203B468 = r0->unk28; + gUnknown_203B46C = r0->unk2C; + gUnknown_203B47C = r0->unk30; + return; + } + gUnknown_203B460 = sub_80909D0(); + gUnknown_203B45C = sub_808CE00(); + gUnknown_203B480 = sub_80950F8(); + gUnknown_203B484 = sub_8095100(); + gUnknown_203B488 = sub_8095108(); + gUnknown_203B48C = sub_8095110(); + gUnknown_203B490 = sub_80958F8(); + gUnknown_203B464 = sub_809208C(); + gUnknown_203B494 = sub_8097680(); + gUnknown_203B498 = sub_8097F6C(); + gUnknown_203B468 = sub_80923B0(); + gUnknown_203B46C = sub_8094990(); + gUnknown_203B47C = sub_8094FA0(); + +} -- cgit v1.2.3 From a391aaa3f60cc0658f62c283e02cb8fbbbceb090 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 9 Oct 2020 15:16:49 -0500 Subject: unify save defines and decomp more save stuff --- src/save.c | 15 +++-------- src/save_mid.c | 80 ++++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 62 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/save.c b/src/save.c index bb73fb0..67e52d0 100644 --- a/src/save.c +++ b/src/save.c @@ -1,14 +1,7 @@ #include "global.h" #include "flash.h" #include "memory.h" - -struct UnkStruct_203B184 { - u8 fill000[0x4C]; - u8 *unk04C; - u32 unk050; - u32 unk054; - u32 unk058; -}; +#include "save.h" struct UnkStruct_sub_8011DAC { u8 fill000[0x4]; @@ -30,7 +23,7 @@ struct UnkStruct_sub_8011DAC { u8 fill448[0x538C]; }; -extern u32 gUnknown_202DE28; +extern s32 gUnknown_202DE28; extern u32 gUnknown_203B17C; extern u32 gUnknown_203B180; extern volatile struct UnkStruct_203B184 *gUnknown_203B184; @@ -61,12 +54,12 @@ void sub_8011C28(u32 in) gUnknown_203B17C = in; } -u32 sub_8011C34(void) +s32 sub_8011C34(void) { return gUnknown_202DE28; } -void sub_8011C40(u32 in) +void sub_8011C40(s32 in) { gUnknown_202DE28 = in; } diff --git a/src/save_mid.c b/src/save_mid.c index da96d09..67ad932 100644 --- a/src/save_mid.c +++ b/src/save_mid.c @@ -1,24 +1,8 @@ #include "global.h" +#include "save.h" -// TODO unify with UnkStruct_203B184 in save.c -struct unkSaveStruct -{ - /* 0x0 */ u32 unk0; - /* 0x4 */ u32 unk4; - /* 0x8 */ u32 unk8; - /* 0xC */ u32 unkC; - /* 0x10 */ u32 unk10; - /* 0x14 */ u32 unk14; - /* 0x18 */ u32 unk18; - /* 0x1C */ u32 unk1C; - /* 0x20 */ u32 unk20; - /* 0x24 */ u32 unk24; - /* 0x28 */ u32 unk28; - /* 0x2C */ u32 unk2C; - /* 0x30 */ u32 unk30; -}; - -extern struct unkSaveStruct *gUnknown_203B184; +extern struct UnkStruct_203B184 *gUnknown_203B184; +extern struct unkTimeStruct *gUnknown_203B47C; extern u32 gUnknown_203B460; extern u32 gUnknown_203B45C; @@ -32,7 +16,6 @@ extern u32 gUnknown_203B494; extern u32 gUnknown_203B498; extern u32 gUnknown_203B468; extern u32 gUnknown_203B46C; -extern u32 gUnknown_203B47C; extern void sub_800135C(void); extern u32 sub_808CE00(void); @@ -45,7 +28,6 @@ extern u32 sub_80923B0(void); extern void sub_80923B8(void); extern u32 sub_8094990(void); extern void sub_8094998(u8 r0); -extern u32 sub_8094FA0(void); extern u32 sub_80950F8(void); extern u32 sub_8095100(void); extern u32 sub_8095108(void); @@ -59,6 +41,60 @@ extern void sub_80974E8(void); extern u32 sub_8097F6C(void); extern void sub_8097F74(void); +extern void sub_8011C28(u32 r0); +extern void sub_8011C40(s32 r0); +extern void sub_8097748(void); +extern void sub_8012240(); + + +extern void sub_8094FA8(struct unkTimeStruct *Time); // defined in src/code_8094F88.c +extern struct unkTimeStruct *sub_8094FA0(void); + +void sub_80122D0(); +void sub_80122F4(); +void sub_8012300(); +void sub_80976A8(); +void sub_80122A8(); + +void sub_8012284(void) +{ + sub_80122D0(); + sub_80122F4(); + sub_8012300(); +} + +void sub_8012298(void) +{ + sub_80976A8(); + sub_80122A8(); +} + +void sub_80122A8(void) +{ + sub_80122D0(); + sub_80122F4(); + sub_8012300(); + sub_8012240(); + +} + +void nullsub_33(void) +{ +} + +void sub_80122C4(void) +{ + sub_80122A8(); +} + +void sub_80122D0(void) +{ + sub_8011C28(0); + sub_8011C40(-1); + sub_8097748(); + sub_8094FA8(gUnknown_203B47C); +} + void sub_80122F4(void) { sub_800135C(); @@ -85,7 +121,7 @@ void nullsub_200(u32 r0) } // Unused -void sub_8012334(struct unkSaveStruct *r0) +void sub_8012334(struct UnkStruct_203B184 *r0) { gUnknown_203B184 = r0; if(r0 != NULL) -- cgit v1.2.3 From 14b4ad7735e039f388c0ff14850086b402f2c447 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 10 Oct 2020 14:33:06 -0500 Subject: some doc'ing and decomping --- src/pokemon_1.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++++------ src/pokemon_mid.c | 35 ++++++------ 2 files changed, 161 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/pokemon_1.c b/src/pokemon_1.c index 6d4cf75..83a74b2 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -8,21 +8,147 @@ extern struct gPokemon *gMonsterParameters; extern struct FileArchive gUnknown_8510000; extern const char gUnknown_8107684; -//u8 sub_808DDD0(s16 r0) -//{ -// // Looks like this loads the dialogue sprite for the pokemon -// -// // TODO stack is being added instead of being substracted -// // Else this matches -// char buffer[0xC]; -// if(gMonsterParameters[r0].dialogue_sprites != 0) -// { -// sprintf(buffer, &gUnknown_8107684); -// OpenFileAndGetFileDataPtr(buffer, &gUnknown_8510000); -// return; -// } -// return 0; -//} +#ifndef NONMATCHING +NAKED +#endif +// Pretty confided args are correct yet compiler disagrees +u8 sub_808DD68(s16 r0, u32 r1) +{ +#ifdef NONMATCHING + if (r1 != 0) + { + return 0xA; + } + else + { + return gMonsterParameters[r0].overworld_sprite; + } +#else + asm_unified("\tpush {lr}\n" + "\tlsls r0, 16\n" + "\tasrs r2, r0, 16\n" + "\tcmp r1, 0\n" + "\tbne _0808DD88\n" + "\tldr r0, _0808DD84\n" + "\tldr r1, [r0]\n" + "\tlsls r0, r2, 3\n" + "\tadds r0, r2\n" + "\tlsls r0, 3\n" + "\tadds r0, r1\n" + "\tldrb r0, [r0, 0x8]\n" + "\tb _0808DD8A\n" + "\t.align 2, 0\n" +"_0808DD84: .4byte gMonsterParameters\n" +"_0808DD88:\n" + "\tmovs r0, 0xA\n" +"_0808DD8A:\n" + "\tpop {r1}\n" + "\tbx r1"); + +#endif +} + +#ifndef NONMATCHING +NAKED +#endif +struct OpenedFile *sub_808DD90(s16 r0) +{ +#ifdef NONMATCHING + // Looks like this loads the dialogue sprite for the pokemon + + // Two words: register memes... else it matches + // Fix this and then one after matches too + char buffer[0xC]; + if(gMonsterParameters[r0].dialogue_sprites == 0) + { + return NULL; + } + sprintf(buffer, &gUnknown_8107684); + return OpenFile(buffer, &gUnknown_8510000); +#else + asm_unified("\tpush {lr}\n" + "\tsub sp, 0xC\n" + "\tlsls r0, 16\n" + "\tasrs r2, r0, 16\n" + "\tldr r0, _0808DDBC\n" + "\tldr r1, [r0]\n" + "\tlsls r0, r2, 3\n" + "\tadds r0, r2\n" + "\tlsls r0, 3\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0, 0x10]\n" + "\tcmp r0, 0\n" + "\tbeq _0808DDC8\n" + "\tldr r1, _0808DDC0\n" + "\tmov r0, sp\n" + "\tbl sprintf\n" + "\tldr r1, _0808DDC4\n" + "\tmov r0, sp\n" + "\tbl OpenFile\n" + "\tb _0808DDCA\n" + "\t.align 2, 0\n" +"_0808DDBC: .4byte gMonsterParameters\n" +"_0808DDC0: .4byte gUnknown_8107684\n" +"_0808DDC4: .4byte gUnknown_8510000\n" +"_0808DDC8:\n" + "\tmovs r0, 0\n" +"_0808DDCA:\n" + "\tadd sp, 0xC\n" + "\tpop {r1}\n" + "\tbx r1"); +#endif +} + +#ifndef NONMATCHING +NAKED +#endif +struct OpenedFile *sub_808DDD0(s16 r0) +{ +#ifdef NONMATCHING + // Looks like this loads the dialogue sprite for the pokemon + + // Two words: register memes... else it matches + char buffer[0xC]; + if(gMonsterParameters[r0].dialogue_sprites == 0) + { + return NULL; + } + sprintf(buffer, &gUnknown_8107684); + return OpenFileAndGetFileDataPtr(buffer, &gUnknown_8510000); +#else + asm_unified("\tpush {lr}\n" + "\tsub sp, 0xC\n" + "\tlsls r0, 16\n" + "\tasrs r2, r0, 16\n" + "\tldr r0, _0808DDFC\n" + "\tldr r1, [r0]\n" + "\tlsls r0, r2, 3\n" + "\tadds r0, r2\n" + "\tlsls r0, 3\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0, 0x10]\n" + "\tcmp r0, 0\n" + "\tbeq _0808DE08\n" + "\tldr r1, _0808DE00\n" + "\tmov r0, sp\n" + "\tbl sprintf\n" + "\tldr r1, _0808DE04\n" + "\tmov r0, sp\n" + "\tbl OpenFileAndGetFileDataPtr\n" + "\tb _0808DE0A\n" + "\t.align 2, 0\n" + "_0808DDFC: .4byte gMonsterParameters\n" + "_0808DE00: .4byte gUnknown_8107684\n" + "_0808DE04: .4byte gUnknown_8510000\n" + "_0808DE08:\n" + "\tmovs r0, 0\n" + "_0808DE0A:\n" + "\tadd sp, 0xC\n" + "\tpop {r1}\n" + "\tbx r1"); + +#endif +} bool8 sub_808DE10(s16 r0, s32 r1) { diff --git a/src/pokemon_mid.c b/src/pokemon_mid.c index 03a66b2..e0d3f19 100644 --- a/src/pokemon_mid.c +++ b/src/pokemon_mid.c @@ -3,73 +3,72 @@ extern struct gPokemon *gMonsterParameters; -u8 *sub_808DAB4(s16 r0) +u8 *GetCategoryString(s16 r0) { return gMonsterParameters[r0].category; } -u8 sub_808DACC(s16 r0) +u8 GetPokemonSize(s16 r0) { return gMonsterParameters[r0].size; } -u8 sub_808DAE4(s16 r0) +u8 GetShadowSize(s16 r0) { return gMonsterParameters[r0].shadow_size; } -s32 sub_808DAFC(s16 r0) +s32 GetMoveSpeed(s16 r0) { return gMonsterParameters[r0].move_speed; } -u8 sub_808DB14(s16 r0) +u8 GetWalkableTiles(s16 r0) { return gMonsterParameters[r0].walkable_tiles; } -u8 sub_808DB2C(s16 r0) +u8 GetUnk1B(s16 r0) { return ((u8)(gMonsterParameters[r0].unk1B) << 25) >> 24; } - -bool8 sub_808DB48(s16 r0) +bool8 GetIsMoving(s16 r0) { return gMonsterParameters[r0].isMoving; } -u8 sub_808DB60(s16 r0) +u8 GetUnk1D(s16 r0) { return gMonsterParameters[r0].unk1D; } -u16 sub_808DB78(s16 r0) +u16 GetLowKickDmg(s16 r0) { return gMonsterParameters[r0].lowkick_dmg; } -u16 sub_808DB90(s16 r0) +u16 GetSizeOrbDmg(s16 r0) { return gMonsterParameters[r0].sizeorb_dmg; } -u8 sub_808DBA8(s16 r0) +u8 GetFriendArea(s16 r0) { return gMonsterParameters[r0].friend_area; } -u16 sub_808DBC0(s16 r0) +u16 GetBaseHP(s16 r0) { return gMonsterParameters[r0].base_hp; } -bool8 sub_808DBD8(s16 r0) +bool8 GetUnk33(s16 r0) { return gMonsterParameters[r0].unk33; } -u8 sub_808DBF4(s16 r0) +u8 GetUnk12(s16 r0) { return gMonsterParameters[r0].unk12; } @@ -78,3 +77,9 @@ s16 sub_808DC0C(s16 r0) { return gMonsterParameters[r0].evolve_from; } + +// TODO fix calculation to match +//u32 sub_808DC28(s16 r0, u32 r1) +//{ +// return gMonsterParameters[r0].base_att + (r1 << 1); +//} -- cgit v1.2.3 From 3c986032f82b895c52287374685fee880c70edb7 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 13 Oct 2020 17:30:44 -0500 Subject: docing and one decomp of a function --- src/code_80001E0.c | 8 ++++++++ src/code_8092334.c | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 src/code_80001E0.c (limited to 'src') diff --git a/src/code_80001E0.c b/src/code_80001E0.c new file mode 100644 index 0000000..417853a --- /dev/null +++ b/src/code_80001E0.c @@ -0,0 +1,8 @@ +#include "global.h" + +extern u32 gUnknown_3004000; + +u32 *sub_80001E0(void) +{ + return &gUnknown_3004000; +} diff --git a/src/code_8092334.c b/src/code_8092334.c index 9049635..d12bc44 100644 --- a/src/code_8092334.c +++ b/src/code_8092334.c @@ -4,8 +4,8 @@ extern u32 gUnformattedTypeStrings[]; // unformatted type names extern u32 gFormattedTypeStrings[]; // formatted type names extern u8 gUnknown_810AC7C[]; extern u8 gUnknown_810AC6A[]; -extern u8 *gUnknown_810B4C8[]; -extern u8 *gUnknown_810B988[]; +extern u8 *gAbilityNames[]; +extern u8 *AbilityDescriptions[]; extern u32 gBoughtFriendAreas; extern u32 *gUnknown_203B468; @@ -31,12 +31,12 @@ u8 sub_8092364(u8 r0) void sub_8092374(char *r0, u8 r1) { - strncpy(r0, gUnknown_810B4C8[r1], 0x50); + strncpy(r0, gAbilityNames[r1], 0x50); } u8 *sub_8092390(u8 r0) { - return gUnknown_810B988[r0]; + return AbilityDescriptions[r0]; } void sub_80923A0(void) -- cgit v1.2.3 From 6f63cc5f28baf344ae67984c9e698bfa5abe54af Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 13 Oct 2020 20:07:41 -0500 Subject: quick split and decomp interrupt funcs --- src/code_800B5F0.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/code_800B5F0.c (limited to 'src') diff --git a/src/code_800B5F0.c b/src/code_800B5F0.c new file mode 100644 index 0000000..4c111b0 --- /dev/null +++ b/src/code_800B5F0.c @@ -0,0 +1,71 @@ +#include "global.h" + +#include "global.h" + +extern u8 gUnknown_203B098; + +u8 sub_800B5F0(void) +{ + if(gUnknown_203B098 == 0) + { + return 0; + } + + if((REG_IME & 1) != 0) + { + return 0; + } + else + { + REG_IME = 1; + return 1; + } +} + +u8 sub_800B620(void) +{ + if(gUnknown_203B098 == 0) + { + return 0; + } + + if((REG_IME & 1) == 0) + { + return 0; + } + else + { + REG_IME = 0; + return 1; + } + +} + +u8 sub_800B650(void) +{ + if(gUnknown_203B098 == 0) + { + return 0; + } + + if((REG_IME & 1) != 0) + { + return 0; + } + else + { + return 1; + } +} + +void sub_800B67C(u16 r0) +{ + if(gUnknown_203B098 == 0) + { + return; + } + + REG_IME = 0; + INTR_CHECK |= r0; + REG_IME = 1; +} -- cgit v1.2.3 From 4409e37e7361e8731d1ac5cc1f336f13e62b28bd Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 14 Oct 2020 19:20:20 -0500 Subject: decomp two funcs --- src/code_800B5F0.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src') diff --git a/src/code_800B5F0.c b/src/code_800B5F0.c index 4c111b0..5217606 100644 --- a/src/code_800B5F0.c +++ b/src/code_800B5F0.c @@ -3,6 +3,9 @@ #include "global.h" extern u8 gUnknown_203B098; +extern u32 gIntrTable[]; +extern u32 IntrMain; +extern u8 gUnknown_202D4B8; u8 sub_800B5F0(void) { @@ -69,3 +72,15 @@ void sub_800B67C(u16 r0) INTR_CHECK |= r0; REG_IME = 1; } + +void sub_800B6B0(const u32 *r0) +{ + CpuCopy32(r0, &gIntrTable, 0x18); // 0x18 = 0x6 * 4 (0x4f00 is 32 bits) + CpuCopy32(&IntrMain, &gUnknown_202D4B8, 0x120); // 0x120 = 0x48 * 4 (0x4f00 is 32 bits) + INTR_VECTOR = &gUnknown_202D4B8; +} + +u32 *sub_800B6E8(u32 r0) +{ + return &gIntrTable[r0]; +} -- cgit v1.2.3 From 6da3c8269f2ff4940f4ccf9ebf7ce99489aae080 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 15 Oct 2020 11:50:49 -0500 Subject: decomp a few more funcs --- src/code_8095014.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/code_8095014.c (limited to 'src') diff --git a/src/code_8095014.c b/src/code_8095014.c new file mode 100644 index 0000000..7f3fb05 --- /dev/null +++ b/src/code_8095014.c @@ -0,0 +1,87 @@ +#include "global.h" + +struct unk_8094FB4 +{ + s16 unk0; + u8 unk2; + u8 unk3; + u8 unk4; +}; + + +extern u32 *gUnknown_203B480; +extern u32 *gUnknown_203B484; +extern u32 *gUnknown_203B488; +extern u32 *gUnknown_203B48C; + +extern u32 gUnknown_203B47C; +extern u32 gUnknown_2038C88; +extern u32 gUnknown_2039288; +extern u32 gUnknown_20392E8; +extern u32 gUnknown_20393C0; + +extern void sub_809488C(u32, u32, u32); +extern void sub_8094924(u32, u32, u32); + +void sub_8095014(struct unk_8094FB4 *r0, u32 *r1, u32 *r2, u32 *r3) +{ + u32 temp; + if(r0->unk0 <= 0x270f) + { + *r1 = r0->unk0; + *r2 = r0->unk2; + temp = r0->unk3; + } + else + { + *r1 = 0x270f; + *r2 = 0x3B; + temp = 0x3B; + } + *r3 = temp; +} + +void sub_8095044(u32 r0) +{ + sub_809488C(r0, gUnknown_203B47C + 4, 0x6); + sub_809488C(r0, gUnknown_203B47C + 3, 0x6); + sub_809488C(r0, gUnknown_203B47C + 2, 0x6); + sub_809488C(r0, gUnknown_203B47C, 0xE); +} + +void sub_8095080(u32 r0) +{ + sub_8094924(r0, gUnknown_203B47C + 4, 0x6); + sub_8094924(r0, gUnknown_203B47C + 3, 0x6); + sub_8094924(r0, gUnknown_203B47C + 2, 0x6); + sub_8094924(r0, gUnknown_203B47C, 0xE); +} + +void sub_80950BC(void) +{ + gUnknown_203B480 = &gUnknown_2038C88; + gUnknown_203B484 = &gUnknown_2039288; + gUnknown_203B488 = &gUnknown_20392E8; + gUnknown_203B48C = &gUnknown_20393C0; +} + +u32 *sub_80950F8(void) +{ + return &gUnknown_2038C88; +} + +u32 *sub_8095100(void) +{ + return &gUnknown_2039288; +} + +u32 *sub_8095108(void) +{ + return &gUnknown_20392E8; +} + +u32 *sub_8095110(void) +{ + return &gUnknown_20393C0; +} + -- cgit v1.2.3 From 6c9dd59b5691cd7d5a19c740e8d22779e6a101aa Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 15 Oct 2020 16:56:25 -0500 Subject: nonmatch bc I'm so close on those --- src/code_800558C.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/save1.c | 6 +-- 2 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 src/code_800558C.c (limited to 'src') diff --git a/src/code_800558C.c b/src/code_800558C.c new file mode 100644 index 0000000..773e773 --- /dev/null +++ b/src/code_800558C.c @@ -0,0 +1,151 @@ +#include "global.h" +#include "code_800558C.h" + +extern u32 gUnknown_203B47C; + +extern u32 gUnknown_2026E3C; +extern u32 gUnknown_2026E58; +extern u32 gUnknown_2026E54; +extern u32 gUnknown_2026E50; +extern u16 gUnknown_2026E4E; +extern u8 gUnknown_2026E38; + +extern void sub_800CC44(u32 r0, u32 r1); + +// Unused +#ifndef NONMATCHING +NAKED +#endif +void sub_80060A8(void) +{ +#ifdef NONMATCHING + // TODO ordering of statements is wrong but regs are good so f*** it. + // My mv/ldr stuff for temp is out of order + u32 temp; + gUnknown_2026E3C = gUnknown_2026E58; + + temp = 0; + if (gUnknown_2026E54 == 0) + { + temp = 1; + } + gUnknown_2026E54 = temp; + + temp = 0; + + if (gUnknown_2026E50 == 0) + { + temp = 1; + } + gUnknown_2026E50 = temp; + + gUnknown_2026E38 = 0; +#else + asm_unified("\tpush {lr}\n" + "\tldr r1, _080060D8\n" + "\tldr r0, _080060DC\n" + "\tldr r0, [r0]\n" + "\tstr r0, [r1]\n" + "\tldr r2, _080060E0\n" + "\tmovs r1, 0\n" + "\tldr r0, [r2]\n" + "\tcmp r0, 0\n" + "\tbne _080060BE\n" + "\tmovs r1, 0x1\n" +"_080060BE:\n" + "\tstr r1, [r2]\n" + "\tldr r2, _080060E4\n" + "\tmovs r1, 0\n" + "\tldr r0, [r2]\n" + "\tcmp r0, 0\n" + "\tbne _080060CC\n" + "\tmovs r1, 0x1\n" +"_080060CC:\n" + "\tstr r1, [r2]\n" + "\tldr r1, _080060E8\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r1]\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_080060D8: .4byte gUnknown_2026E3C\n" +"_080060DC: .4byte gUnknown_2026E58\n" +"_080060E0: .4byte gUnknown_2026E54\n" +"_080060E4: .4byte gUnknown_2026E50\n" +"_080060E8: .4byte gUnknown_2026E38"); + +#endif +} + +#ifndef NONMATCHING +NAKED +#endif +void sub_80060EC(void) +{ +#ifdef NONMATCHING + // TODO ordering of statements is wrong but regs are good so f*** it. + u32 temp; + gUnknown_2026E3C = gUnknown_2026E58; + temp = 0; + + if (gUnknown_2026E54 == 0) + { + temp = 1; + } + gUnknown_2026E54 = temp; + + temp = 0; + + if (gUnknown_2026E50 == 0) + { + temp = 1; + } + gUnknown_2026E50 = temp; + + sub_800CC44((gUnknown_2026E4E & (0xF8 << 5)) >> 8, gUnknown_2026E4E & 0x1F); + gUnknown_2026E38 = 1; +#else + asm_unified("\tpush {lr}\n" + "\tldr r1, _08006130\n" + "\tldr r0, _08006134\n" + "\tldr r0, [r0]\n" + "\tstr r0, [r1]\n" + "\tldr r2, _08006138\n" + "\tmovs r1, 0\n" + "\tldr r0, [r2]\n" + "\tcmp r0, 0\n" + "\tbne _08006102\n" + "\tmovs r1, 0x1\n" + "_08006102:\n" + "\tstr r1, [r2]\n" + "\tldr r2, _0800613C\n" + "\tmovs r1, 0\n" + "\tldr r0, [r2]\n" + "\tcmp r0, 0\n" + "\tbne _08006110\n" + "\tmovs r1, 0x1\n" + "_08006110:\n" + "\tstr r1, [r2]\n" + "\tldr r0, _08006140\n" + "\tldrh r2, [r0]\n" + "\tmovs r0, 0xF8\n" + "\tlsls r0, 5\n" + "\tands r0, r2\n" + "\tlsrs r0, 8\n" + "\tmovs r1, 0x1F\n" + "\tands r1, r2\n" + "\tbl sub_800CC44\n" + "\tldr r1, _08006144\n" + "\tmovs r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08006130: .4byte gUnknown_2026E3C\n" + "_08006134: .4byte gUnknown_2026E58\n" + "_08006138: .4byte gUnknown_2026E54\n" + "_0800613C: .4byte gUnknown_2026E50\n" + "_08006140: .4byte gUnknown_2026E4E\n" + "_08006144: .4byte gUnknown_2026E38"); +#endif +} diff --git a/src/save1.c b/src/save1.c index 5b8ad19..a194557 100644 --- a/src/save1.c +++ b/src/save1.c @@ -1,4 +1,6 @@ #include "global.h" +#include "code_800558C.h" +#include "input.h" struct UnkSaveStruct1 @@ -36,9 +38,7 @@ extern void sub_8011860(); extern void xxx_draw_string_80144C4(); extern void nullsub_8(u8); extern void sub_8005180(); -extern void sub_80060EC(); extern void sub_800CB20(); -extern void sub_800485C(); extern void CopySpritesToOam(); extern void sub_8005304(); extern void TransferBGPaletteBuffer(); @@ -69,7 +69,7 @@ void sub_8012A18() sub_8005180(); sub_80060EC(); sub_800CB20(); - sub_800485C(); + sub_800485C(); // Input related CopySpritesToOam(); sub_8005304(); TransferBGPaletteBuffer(); -- cgit v1.2.3 From 4d967dd694f106674982867263dfa5bbc16fe010 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 15 Oct 2020 17:56:52 -0500 Subject: decomp some quick funcs --- src/code_80118A4.c | 59 +++++++++++++++++++++++++++++++++++++++++++++------- src/code_80118A4_1.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/code_80118A4.c b/src/code_80118A4.c index 2ed0e9e..85782d7 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -1,6 +1,7 @@ #include "global.h" void sub_8011924(void); +void nullsub_26(void); extern void sub_800BDFC(u16 r0); extern void sub_800BE8C(u16 r0, u16 r1); @@ -14,6 +15,13 @@ extern void sub_800C074(u16 r0, u16 r1); extern void sub_800C298(u16 r0); extern u8 sub_800C5D0(u16 r0); +extern void nullsub_27(void); +extern void nullsub_29(void); +extern void nullsub_30(void); +extern void nullsub_31(void); +extern void nullsub_32(void); +extern void nullsub_28(void); + struct UnkStructType { /* 0x0 */ s16 unk0; @@ -22,6 +30,9 @@ struct UnkStructType extern u16 gUnknown_80D4144[]; extern struct UnkStructType gUnknown_202DE20; +extern struct UnkStructType gUnknown_202DE22; +extern u32 gUnknown_202DE1C; +extern u32 gUnknown_203B14C; void sub_80118A4(void) { @@ -138,11 +149,43 @@ u8 sub_80119C0(u16 r0) return sub_800C5D0(r0); } -// TODO pretty close except r4's where should be r2's -//void sub_80119D4(u32 r0) -//{ -// if(gUnknown_202DE20.unk0 > 0) -// return; -// sub_800C074(gUnknown_80D4144[r0], 0x80 << 1); -// gUnknown_80D4144[r0] = 0x4; -//} +void sub_80119D4(u32 r0) +{ + if(gUnknown_202DE20.unk0 > 0) + return; + sub_800C074(gUnknown_80D4144[r0], 0x80 << 1); + gUnknown_202DE20.unk0 = 4; +} + +void sub_8011A04(void) +{ + if(gUnknown_202DE22.unk0 > 0) + return; + gUnknown_202DE22.unk0 = 3; + sub_800C074(0x131, 0x80 << 1); +} + +void sub_8011A2C(u32 r0) +{ + gUnknown_202DE1C = r0; +} + +void NDS_DebugInit(void) +{ + nullsub_26(); + nullsub_27(); + nullsub_29(); + nullsub_30(); + nullsub_31(); + nullsub_32(); + nullsub_28(); + gUnknown_203B14C = 1; // Maybe a flag saying Debug is on? +} + +void nullsub_25(void) +{ +} + +void nullsub_26(void) +{ +} diff --git a/src/code_80118A4_1.c b/src/code_80118A4_1.c index 9d6bc5e..c2fa641 100644 --- a/src/code_80118A4_1.c +++ b/src/code_80118A4_1.c @@ -2,6 +2,60 @@ extern u8 gUnknown_203B150; +void nullsub_199(void) +{ +} + +void nullsub_27(void) +{ +} + +void sub_8011B08(void) +{ + gUnknown_203B150 = 1; +} + +void sub_8011B14(void) +{ + gUnknown_203B150 = 0; +} + +#ifndef NONMATCHING +NAKED +#endif +u8 sub_8011B20(void) +{ +#ifdef NONMATCHING + // TODO figure out why I mix up my mv/ldr for these kinds of comparisons + u8 temp; + if(gUnknown_203B150 == 0) + { + temp = 1; + } + else + { + temp = 0; + } + gUnknown_203B150 = temp; + return gUnknown_203B150; +#else + asm_unified("\tpush {lr}\n" + "\tldr r1, _08011B38\n" + "\tmovs r2, 0\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0\n" + "\tbne _08011B2E\n" + "\tmovs r2, 0x1\n" +"_08011B2E:\n" + "\tstrb r2, [r1]\n" + "\tldrb r0, [r1]\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" +"_08011B38: .4byte gUnknown_203B150"); +#endif +} + // unused u8 sub_8011B3C(void) { -- cgit v1.2.3 From ad82979bfc9cf787a39fa58911fdfdcbbd476e11 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 16 Oct 2020 20:07:03 -0500 Subject: doc interrupt funcs --- src/code_800B5F0.c | 55 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/code_800B5F0.c b/src/code_800B5F0.c index 5217606..35b5282 100644 --- a/src/code_800B5F0.c +++ b/src/code_800B5F0.c @@ -1,75 +1,74 @@ #include "global.h" -#include "global.h" - -extern u8 gUnknown_203B098; +extern bool8 gInterruptsEnabled; extern u32 gIntrTable[]; extern u32 IntrMain; extern u8 gUnknown_202D4B8; +extern u32 gUnknown_202D5F0[]; -u8 sub_800B5F0(void) +bool8 EnableInterrupts(void) { - if(gUnknown_203B098 == 0) + if(gInterruptsEnabled == FALSE) { - return 0; + return FALSE; } if((REG_IME & 1) != 0) { - return 0; + return FALSE; } else { REG_IME = 1; - return 1; + return TRUE; } } -u8 sub_800B620(void) +bool8 DisableInterrupts(void) { - if(gUnknown_203B098 == 0) + if(gInterruptsEnabled == 0) { - return 0; + return FALSE; } if((REG_IME & 1) == 0) { - return 0; + return FALSE; } else { REG_IME = 0; - return 1; + return TRUE; } } -u8 sub_800B650(void) +bool8 sub_800B650(void) { - if(gUnknown_203B098 == 0) + if(gInterruptsEnabled == FALSE) { - return 0; + return FALSE; } if((REG_IME & 1) != 0) { - return 0; + return FALSE; } else { - return 1; + return TRUE; } } -void sub_800B67C(u16 r0) +void SetInterruptFlag(u16 flag) { - if(gUnknown_203B098 == 0) + if(gInterruptsEnabled == FALSE) { return; } REG_IME = 0; - INTR_CHECK |= r0; + INTR_CHECK |= flag; REG_IME = 1; } @@ -84,3 +83,17 @@ u32 *sub_800B6E8(u32 r0) { return &gIntrTable[r0]; } + +u32 sub_800B6F4(u32 r0, u32 r1) +{ + u32 temp; + u32 interrupt_var; + + interrupt_var = DisableInterrupts(); + temp = gUnknown_202D5F0[r0]; + gUnknown_202D5F0[r0] = r1; + if(interrupt_var != FALSE){ + EnableInterrupts(); + } + return temp; +} -- cgit v1.2.3 From 3106e3010202441e6cb6672c95a7a113abcf1eac Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 17 Oct 2020 00:51:33 -0500 Subject: some more splitting and decomping --- src/code_801D760.c | 60 +++++++++++++++++++ src/code_8098BDC.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+) create mode 100644 src/code_801D760.c create mode 100644 src/code_8098BDC.c (limited to 'src') diff --git a/src/code_801D760.c b/src/code_801D760.c new file mode 100644 index 0000000..89cd661 --- /dev/null +++ b/src/code_801D760.c @@ -0,0 +1,60 @@ +#include "global.h" + +extern u32 sub_8022860(); +extern void sub_8022908(); +extern void sub_801D208(u8); +extern void sub_8027168(); +extern u32 sub_80270A4(); +extern u32 sub_8025F68(); +extern u8 sub_802604C(); +extern void sub_8026058(); + +struct unk_203B250 +{ + u32 unk0; + u16 unk4; + u8 unk6; + u8 unk7; +}; + +struct unk_203B250 *gUnknown_203B250; + +void sub_801D760() +{ + u32 temp; + temp = sub_8022860(); + if (temp <= 1) + return; + if (temp > 3) + return; + sub_8022908(); + sub_801D208(1); + +} + +void sub_801D77C() +{ + u32 temp; + temp = sub_80270A4(); + if (temp <= 1) + return; + if (temp > 3) + return; + sub_8027168(); + sub_801D208(1); + +} + +void sub_801D798(void) +{ + u32 temp; + temp = sub_8025F68(); + if (temp <= 1) + return; + if (temp > 3) + return; + if(sub_802604C() != 0) + gUnknown_203B250->unk7 = gUnknown_203B250->unk6; + sub_8026058(); + sub_801D208(2); +} diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c new file mode 100644 index 0000000..bd56fb3 --- /dev/null +++ b/src/code_8098BDC.c @@ -0,0 +1,166 @@ +#include "global.h" + +extern u32 gUnknown_203B47C; + +extern void sub_809B57C(); +extern void GroundScript_Unlock(); +extern void sub_809D25C(); +extern void sub_80A59DC(); +extern void sub_809B614(); +extern void sub_809CA20(); +extern void sub_80A6E80(); +extern void sub_8099BE4(); +extern void sub_8099744(); +extern void sub_8011860(); +extern void sub_8094FB4(u32 r0); +extern void sub_800CB20(); +extern void sub_800485C(); +extern void nullsub_120(); +extern void sub_80A5E70(); +extern void sub_809B638(); +extern void nullsub_106(); +extern void sub_80A73EC(); +extern void sub_8099750(); +extern void sub_8009908(); +extern void xxx_call_update_bg_sound_input(); +extern void sub_80A6E68(); +extern void GroundMap_Action(); +extern void nullsub_124(); +extern void GroundLives_Action(); +extern void GroundObject_Action(); +extern void GroundEffect_Action(); + +extern s32 sub_8001658(u8, u8); +extern s32 sub_8001784(u8, u8, u8); +extern void sub_809CB8C(); +extern void sub_8001D88(); +extern void sub_80015C0(u8, u8); +extern void sub_80018D8(u8, u8, u32); +extern void sub_800199C(u8, u8, u8, s32); +extern void sub_8098CC8(); +extern void sub_809674C(); +extern void sub_80961B4(); +extern void sub_8091FB4(); +extern u8 sub_8001CC4(u8, u8, u8); +extern void sub_8091980(u32); + +void sub_8098BDC(void) +{ + sub_809B57C(); + GroundScript_Unlock(); + sub_809D25C(); + sub_80A59DC(); + sub_809B614(); + sub_809CA20(); + sub_80A6E80(); + sub_8099BE4(); + sub_8099744(); + sub_8011860(); + sub_8094FB4(gUnknown_203B47C); + sub_800CB20(); + sub_800485C(); + nullsub_120(); + sub_80A5E70(); + sub_809B638(); + nullsub_106(); + sub_80A73EC(); + sub_8099750(); + sub_8009908(); + xxx_call_update_bg_sound_input(); + sub_80A6E68(); + GroundMap_Action(); + nullsub_124(); + GroundLives_Action(); + GroundObject_Action(); + GroundEffect_Action(); +} + +void sub_8098C58(void) +{ + s32 temp; + sub_80015C0(0, 0x36); + sub_80015C0(0, 0x39); + sub_809CB8C(); + sub_8001D88(); + + if(sub_8001658(0, 0x2A) != 0) + { + temp = sub_8001658(0, 0x29); + temp++; + if(temp > 0xF){ + temp = 0; + } + sub_80018D8(0, 0x29, temp); + sub_80018D8(0, 0x2A, 0); + } + + // TODO this uses r2 but it should be r3 + // Else this matches so nonmatch for now +#ifdef NONMATCHING + temp = sub_8001784(0, 0x42, 0); + if(temp <= 0) + { + temp = 1; + } + sub_800199C(0, 0x42, 0, temp - 1); +#else + asm_unified("\tmovs r0, 0\n" + "\tmovs r1, 0x42\n" + "\tmovs r2, 0\n" + "\tbl sub_8001784\n" + "\tadds r3, r0, 0\n" + "\tcmp r3, 0\n" + "\tbgt _08098CB4\n" + "\tmovs r3, 0x1\n" +"_08098CB4:\n" + "\tsubs r3, 0x1\n" + "\tmovs r0, 0\n" + "\tmovs r1, 0x42\n" + "\tmovs r2, 0\n" + "\tbl sub_800199C"); +#endif + + sub_8098CC8(); +} + +void sub_8098CC8(void) +{ + u32 temp; + if(sub_8001CC4(0x3, 0xB, 0) != 0) + { + temp = 0; + } + else if(sub_8001CC4(0x3, 0xF, 0) != 0) + { + temp = 1; + } + else if(sub_8001CC4(0x3, 0x12, 0) != 0) + { + temp = 2; + } + else + { + temp = 3; + } + sub_8091980(temp); + sub_809674C(); + sub_80961B4(); + sub_8091FB4(); +} + +// TODO lsrs should be asrs on my first arg +//u8 sub_8098D1C(u16 r0, u32 r1, s32 r2) +//{ +// if(gUnknown_20398A8 == 0) +// { +// Log(0, &gUnknown_8115F5C, r0, r2); +// gUnknown_20398A8 = 1; +// gUnknown_20398AC = 1; +// gUnknown_20398B0 = r2; +// gUnknown_20398B4 = 2; +// gUnknown_20398BE = r0; +// gUnknown_20398C0 = r1; +// return 1; +// } +// return 0; +//} -- cgit v1.2.3 From 9b8e49226f827a3314b320426c52164ab33e22f2 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 17 Oct 2020 12:27:49 -0500 Subject: start moving some data into c of personality test --- src/personality_test.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/personality_test.c (limited to 'src') diff --git a/src/personality_test.c b/src/personality_test.c new file mode 100644 index 0000000..0bec4a7 --- /dev/null +++ b/src/personality_test.c @@ -0,0 +1,17 @@ +#include "global.h" +#include "constants/species.h" + +const u16 gPartners[10] = +{ + SPECIES_CHARMANDER, + SPECIES_BULBASAUR, + SPECIES_SQUIRTLE, + SPECIES_PIKACHU, + SPECIES_CHIKORITA, + SPECIES_TOTODILE, + SPECIES_CYNDAQUIL, + SPECIES_TORCHIC, + SPECIES_TREECKO, + SPECIES_MUDKIP +}; + -- cgit v1.2.3 From 1b0fc9f3745f119e2ec363bef89e48d6edeeac41 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 18 Oct 2020 18:16:28 -0500 Subject: decomp an evolve func for pokemon --- src/pokemon_1.c | 37 +++++++++++++++++++++++++++++++++++++ src/pokemon_mid.c | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon_1.c b/src/pokemon_1.c index 83a74b2..c2434e1 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -8,6 +8,43 @@ extern struct gPokemon *gMonsterParameters; extern struct FileArchive gUnknown_8510000; extern const char gUnknown_8107684; +struct unkEvolve +{ + /* 0x0 */ struct EvolveStruct1 conditions; + /* 0x4 */ struct EvolveNeeds needs; +}; + +#ifndef NONMATCHING +NAKED +#endif +void sub_808DD48(s16 r0, struct unkEvolve *r1) +{ +#ifdef NONMATCHING + struct EvolveStruct1 temp2; + struct EvolveNeeds temp1; + temp1 = gMonsterParameters[r0].need; + temp2 = gMonsterParameters[r0].pre; // TODO should be using r2 but it uses r0 + r1->conditions = temp2; + r1->needs = temp1; +#else + asm_unified("\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tldr r2, _0808DD64\n" + "\tldr r3, [r2]\n" + "\tlsls r2, r0, 3\n" + "\tadds r2, r0\n" + "\tlsls r2, 3\n" + "\tadds r2, r3\n" + "\tldr r3, [r2, 0x38]\n" + "\tldr r2, [r2, 0x34]\n" + "\tstr r2, [r1]\n" + "\tstr r3, [r1, 0x4]\n" + "\tbx lr\n" + "\t.align 2, 0\n" +"_0808DD64: .4byte gMonsterParameters"); +#endif +} + #ifndef NONMATCHING NAKED #endif diff --git a/src/pokemon_mid.c b/src/pokemon_mid.c index e0d3f19..e348784 100644 --- a/src/pokemon_mid.c +++ b/src/pokemon_mid.c @@ -75,7 +75,7 @@ u8 GetUnk12(s16 r0) s16 sub_808DC0C(s16 r0) { - return gMonsterParameters[r0].evolve_from; + return gMonsterParameters[r0].pre.evolve_from; } // TODO fix calculation to match -- cgit v1.2.3 From 33b0b86f530d2156bd7c195e057753cf40863942 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 19 Oct 2020 22:35:02 -0500 Subject: a few more decomp'd funcs --- src/code_80521D0.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/code_80521D0.c b/src/code_80521D0.c index 5a723c5..914b02d 100644 --- a/src/code_80521D0.c +++ b/src/code_80521D0.c @@ -1,24 +1,26 @@ #include "global.h" extern void sub_80526D0(u8 r0); -extern u8 sub_8045888(u32 r0, u32 r1, u32 r2, u32 r3); +extern u8 sub_8045888(u32 r0); extern void sub_80523A8(u32 r0, u32 r1, u8 r2); +extern u8 sub_8052DC0(u32); +extern u8 sub_803F428(u32); void sub_805229C(void) { return sub_80526D0(0x50); } -void sub_80522A8(u32 r0, u32 r1, u32 r2, u32 r3) +void sub_80522A8(u32 r0, u32 r1) { - if ((sub_8045888(r0, r1, r2, r3) << 24) != 0){ + if (sub_8045888(r0) != 0){ sub_80523A8(r0, r1, 1); } } -void sub_80522C8(u32 r0, u32 r1, u32 r2, u32 r3) +void sub_80522C8(u32 r0, u32 r1) { - if ((sub_8045888(r0, r1, r2, r3) << 24) != 0){ + if (sub_8045888(r0) != 0){ sub_80523A8(r0, r1, 0); } } @@ -27,3 +29,62 @@ void sub_80522E8(u32 r0, u32 r1) { sub_80523A8(r0, r1, 0); } + +void sub_80522F4(u32 r0, u32 r1, u32 r2) +{ + u8 temp; + u32 temp_reg; + u32 temp2; + temp = sub_8045888(r0); + temp_reg = (-temp | temp); + temp2 = temp_reg >> 31; + if(sub_8052DC0(r1) != 0) + { + temp2 = 1; + } + if(temp2 != 0) + { + sub_80523A8(r0, r2, 1); + } +} + +void sub_805232C(u32 r0, u32 r1, u32 r2) +{ + u8 temp; + u32 temp_reg; + u32 temp2; + temp = sub_8045888(r0); + temp_reg = (-temp | temp); + temp2 = temp_reg >> 31; + if(sub_8052DC0(r1) != 0) + { + temp2 = 1; + } + if(temp2 != 0) + { + sub_80523A8(r0, r2, 0); + } +} + +void sub_8052364(u32 r0, u32 r1, u32 r2) +{ + u8 temp; + u32 temp_reg; + u32 temp2; + temp = sub_8045888(r0); + temp_reg = (-temp | temp); + temp2 = temp_reg >> 31; + if(sub_803F428(r1) != 0) + { + temp2 = 1; + } + if(temp2 != 0) + { + sub_80523A8(r0, r2, 1); + } +} + +void sub_805239C(u32 r0, u32 r1) +{ + sub_80523A8(r0, r1, 1); +} -- cgit v1.2.3 From 184d3819ab381c54821b157770d015c0dce8d82a Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 20 Oct 2020 18:05:01 -0500 Subject: more decomping of funcs --- src/code_800558C.c | 8 ++--- src/code_80118A4.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/save_mid.c | 17 ++++++++++ 3 files changed, 113 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/code_800558C.c b/src/code_800558C.c index 773e773..4cc90e9 100644 --- a/src/code_800558C.c +++ b/src/code_800558C.c @@ -3,12 +3,12 @@ extern u32 gUnknown_203B47C; +extern u8 gUnknown_2026E38; extern u32 gUnknown_2026E3C; -extern u32 gUnknown_2026E58; -extern u32 gUnknown_2026E54; -extern u32 gUnknown_2026E50; extern u16 gUnknown_2026E4E; -extern u8 gUnknown_2026E38; +extern u32 gUnknown_2026E50; +extern u32 gUnknown_2026E54; +extern u32 gUnknown_2026E58; extern void sub_800CC44(u32 r0, u32 r1); diff --git a/src/code_80118A4.c b/src/code_80118A4.c index 85782d7..c809bdb 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -3,6 +3,7 @@ void sub_8011924(void); void nullsub_26(void); +extern u8 sub_80023E4(u8); extern void sub_800BDFC(u16 r0); extern void sub_800BE8C(u16 r0, u16 r1); extern void sub_800BF48(u16 r0); @@ -13,7 +14,9 @@ extern void sub_801199C(u16 r0); extern u16 sub_800C068(); extern void sub_800C074(u16 r0, u16 r1); extern void sub_800C298(u16 r0); +extern void sub_800C93C(); extern u8 sub_800C5D0(u16 r0); +extern void sub_800C9CC(); extern void nullsub_27(void); extern void nullsub_29(void); @@ -31,9 +34,98 @@ struct UnkStructType extern u16 gUnknown_80D4144[]; extern struct UnkStructType gUnknown_202DE20; extern struct UnkStructType gUnknown_202DE22; +extern struct UnkStructType gUnknown_202DE24; extern u32 gUnknown_202DE1C; extern u32 gUnknown_203B14C; +void sub_8011760(void) +{ + if(sub_80023E4(0xD) != 0) + { + sub_800BDFC(0x13); + return; + } + if(sub_80023E4(0xC) != 0) + { + sub_800BDFC(0x7); + } +} + +void sub_801178C(void) +{ + if(sub_80023E4(0xD) != 0) + { + sub_800BDFC(0x13); + return; + } + sub_800BDFC(0x7); +} + +void sub_80117AC(void) +{ + if(sub_80023E4(0xD) == 0) + { + sub_800BFD0(0x1E); + } +} + +void sub_80117C4(void) +{ + sub_800BFD0(0x1E); +} + +void sub_80117D0(void) +{ + sub_800C074(0x97 << 1, 0x80 << 1); +} + +void sub_80117E4(void) +{ + sub_800C074(0x12f, 0x80 << 1); +} + +void sub_80117F8(void) +{ + sub_800C074(0x12d, 0x80 << 1); +} + +void sub_801180C(void) +{ + gUnknown_202DE1C = 0; + gUnknown_202DE20.unk0 = 0; + gUnknown_202DE22.unk0 = 0; + gUnknown_202DE24.unk0 = 0; +} + +void sub_8011830(void) +{ + sub_800C93C(); + gUnknown_202DE20.unk0 = 0; + gUnknown_202DE22.unk0 = 0; + gUnknown_202DE24.unk0 = 0; +} + +void sub_8011854(void) +{ + sub_800C9CC(); +} + +void sub_8011860(void) +{ + if(gUnknown_202DE20.unk0 > 0) + { + gUnknown_202DE20.unk0--; + } + if(gUnknown_202DE22.unk0 > 0) + { + gUnknown_202DE22.unk0--; + } + if(gUnknown_202DE24.unk0 > 0) + { + gUnknown_202DE24.unk0--; + } +} + void sub_80118A4(void) { sub_8011924(); diff --git a/src/save_mid.c b/src/save_mid.c index 67ad932..d401ec3 100644 --- a/src/save_mid.c +++ b/src/save_mid.c @@ -4,6 +4,14 @@ extern struct UnkStruct_203B184 *gUnknown_203B184; extern struct unkTimeStruct *gUnknown_203B47C; +struct unk_203B188 +{ + u32 unk0; + u32 unk4; +}; + +extern struct unk_203B188 *gUnknown_203B188; + extern u32 gUnknown_203B460; extern u32 gUnknown_203B45C; extern u32 gUnknown_203B480; @@ -50,6 +58,8 @@ extern void sub_8012240(); extern void sub_8094FA8(struct unkTimeStruct *Time); // defined in src/code_8094F88.c extern struct unkTimeStruct *sub_8094FA0(void); +extern void* MemoryAlloc(u32 a, u32 b); + void sub_80122D0(); void sub_80122F4(); void sub_8012300(); @@ -156,3 +166,10 @@ void sub_8012334(struct UnkStruct_203B184 *r0) gUnknown_203B47C = sub_8094FA0(); } + +void sub_8012468(void) +{ + gUnknown_203B188 = MemoryAlloc(sizeof(struct unk_203B188), 5); + gUnknown_203B188->unk0 = 1; + +} -- cgit v1.2.3 From e1f9c17e3569e666d81f9d20fb9d57d4cd614eb0 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 21 Oct 2020 17:48:40 -0500 Subject: further splitting and decomping --- src/code_8040094.c | 26 ++++++++ src/code_8041AD0.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/memory.c | 33 ++++++++++ 3 files changed, 242 insertions(+) create mode 100644 src/code_8040094.c create mode 100644 src/code_8041AD0.c (limited to 'src') diff --git a/src/code_8040094.c b/src/code_8040094.c new file mode 100644 index 0000000..c384b51 --- /dev/null +++ b/src/code_8040094.c @@ -0,0 +1,26 @@ +#include "global.h" + +extern u8 *gUnknown_203B418; +extern u32 gUnknown_203B47C; + +extern void sub_803F7BC(void); +extern void sub_80060EC(void); +extern void sub_8094FB4(u32); +extern void sub_800CB20(void); +extern void sub_800485C(void); +extern void xxx_call_update_bg_sound_input(void); +extern void sub_8083F58(void); +extern void sub_8011860(void); + +void sub_8040094(u8 r0) +{ + gUnknown_203B418[0x18217] = r0; + sub_803F7BC(); + sub_80060EC(); + sub_8094FB4(gUnknown_203B47C); + sub_800CB20(); + sub_800485C(); + xxx_call_update_bg_sound_input(); + sub_8083F58(); + sub_8011860(); +} diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c new file mode 100644 index 0000000..050f756 --- /dev/null +++ b/src/code_8041AD0.c @@ -0,0 +1,183 @@ +#include "global.h" + +extern void sub_804151C(u32 r0, u32 r1, u32 r2); +extern void sub_80421C0(u32 r0, u32 r1); +extern void sub_806CDD4(u32 r0, u8, u8); + +void sub_8041AD0(u32 r0) +{ + sub_804151C(r0, 0xA2 << 1, 1); +} + +void sub_8041AE0(u32 r0) +{ + sub_804151C(r0, 0x143, 1); +} + +void sub_8041AF4(u32 r0) +{ + sub_804151C(r0, 0x25, 1); + sub_80421C0(r0, 0x197); +} + +void nullsub_57(void) +{ +} + +void sub_8041B18(u32 r0) +{ + sub_804151C(r0, 0x141, 1); +} + +void nullsub_58(void) +{ +} + +void nullsub_59(void) +{ +} + +void sub_8041B34(u32 r0) +{ + sub_804151C(r0, 7, 1); +} + +void nullsub_60(void) +{ +} + +void sub_8041B48(u32 r0) +{ + sub_804151C(r0, 4, 0); +} + +void nullsub_61(void) +{ +} + +void sub_8041B5C(u32 r0) +{ + sub_804151C(r0, 0x171, 1); +} + +void nullsub_62(void) +{ +} + +void sub_8041B74(u32 r0) +{ + sub_804151C(r0, 0x171, 0); +} + +void nullsub_63(void) +{ +} + +void nullsub_64(void) +{ +} + +void sub_8041B90(u32 r0) +{ + sub_804151C(r0, 0xD6 << 1, 0); +} + +void nullsub_65(void) +{ +} + +void nullsub_66(void) +{ +} + +void sub_8041BA8(u32 r0) +{ + sub_804151C(r0, 4, 1); +} + +void nullsub_67(void) +{ +} + +void sub_8041BBC(u32 r0) +{ + sub_804151C(r0, 0xD4 << 1, 1); +} + +void nullsub_68(void) +{ +} + +void sub_8041BD0(u32 r0, u8 r1) +{ + if(r1 == 0) + { + return; + } + sub_80421C0(r0, 0x1a5); +} + +void sub_8041BE8(u32 r0) +{ + sub_80421C0(r0, 0xCB << 1); +} + +void sub_8041BF8(u32 r0) +{ + sub_806CDD4(r0, 0xA, 8); +} + +void sub_8041C08(u32 r0) +{ + sub_804151C(r0, 0x1a7, 1); +} + +void sub_8041C1C(u32 r0) +{ + sub_804151C(r0, 0x1a7, 1); +} + +void nullsub_69(void) +{ +} + +void sub_8041C34(u32 r0) +{ + sub_804151C(r0, 0x4C, 1); +} + +void nullsub_70(void) +{ +} + +void nullsub_71(void) +{ +} + +void sub_8041C4C(u32 r0, u32 r1) +{ + sub_804151C(r0, r1, 1); +} + +void sub_8041C58(u32 r0) +{ + sub_804151C(r0, 0x1a9, 1); +} + +void sub_8041C6C(u32 r0) +{ + sub_804151C(r0, 0x9D << 1, 1); +} + +void sub_8041C7C(u32 r0) +{ + sub_804151C(r0, 0x9D << 1, 1); +} + +void nullsub_72(void) +{ +} + +void nullsub_73(void) +{ +} diff --git a/src/memory.c b/src/memory.c index 05c89a2..3ac8772 100644 --- a/src/memory.c +++ b/src/memory.c @@ -143,3 +143,36 @@ void InitSubHeap(struct HeapDescriptor *parentHeap, struct HeapMemoryBlock *bloc settings.size = aligned_size; DoInitHeap(parentHeap, &settings, freeList, freeListMax); } + +u8 xxx_memory_attr_related(u32 r0) +{ + u32 temp; + u32 return_var; + if(r0 == 0) + { + return 0; + } + if((r0 & 8) != 0) + { + return 4; + } + + temp = r0 & 7; + if(temp == 7) + { + return_var = 1;; + } + else if(temp == 1) + { + return_var = 2; + } + else if(temp == 3) + { + return_var = 3; + } + else + { + return_var = 5; + } + return return_var; +} -- cgit v1.2.3 From ba5da3812f851b4c7ee2830705b7854d4318200e Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 21 Oct 2020 23:08:58 -0500 Subject: pretty simple decomp of funcs --- src/code_8041AD0.c | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/code_80428A0.c | 2 +- 2 files changed, 264 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index 050f756..6cf8ae0 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -1,8 +1,18 @@ #include "global.h" -extern void sub_804151C(u32 r0, u32 r1, u32 r2); +struct unkStruct_8041D5C +{ + u8 padding[0x70]; + u8 *unk70[100]; +}; + +extern void sub_803ED30(u8, struct unkStruct_8041D5C *r0, u8, u8); +extern void sub_804151C(u32 r0, u32 r1, u8 r2); extern void sub_80421C0(u32 r0, u32 r1); -extern void sub_806CDD4(u32 r0, u8, u8); +extern u8 sub_8042768(void); +extern void sub_806CDD4(u32 r0, u8, u32); +extern u8 sub_8071858(u32, u8); + void sub_8041AD0(u32 r0) { @@ -181,3 +191,254 @@ void nullsub_72(void) void nullsub_73(void) { } + +void sub_8041C94(u32 r0) +{ + sub_804151C(r0, 0x171, 1); +} + +void sub_8041CA8(u32 r0) +{ + sub_804151C(r0, 7, 1); +} + +void sub_8041CB8(u32 r0) +{ + sub_804151C(r0, 0x18b, 1); +} + +void sub_8041CCC(u32 r0) +{ + sub_804151C(r0, 0xC5 << 1, 1); +} + +void sub_8041CDC(u32 r0) +{ + sub_804151C(r0, 5, 1); +} + +void sub_8041CEC(u32 r0) +{ + sub_80421C0(r0, 0x19d); +} + +void nullsub_74(void) +{ +} + +void sub_8041D00(u32 r0, u32 r1) +{ + sub_804151C(r1, 0x2F, 1); + sub_804151C(r0, 0x30, 1); +} + +void nullsub_75(void) +{ +} + +void nullsub_76(void) +{ +} + +void nullsub_77(void) +{ +} + +void nullsub_78(void) +{ +} + +void nullsub_79(void) +{ +} + +void nullsub_80(void) +{ +} + +void sub_8041D38(u32 r0) +{ + sub_804151C(r0, 0x21, 1); +} + +void sub_8041D48(u32 r0) +{ + sub_80421C0(r0, 0x191); +} + +void nullsub_81(void) +{ +} + +void sub_8041D5C(struct unkStruct_8041D5C *r0) +{ + u8 *temp; + if(sub_8042768() == 0) + { + return; + } + temp = *r0->unk70; + sub_803ED30(temp[0x89 << 1] , r0, 1, 0xB); +} + +void sub_8041D84(u32 r0) +{ + sub_80421C0(r0, 0x19f); +} + +void nullsub_82(void) +{ +} + +void nullsub_83(void) +{ +} + +void sub_8041D9C(u32 r0) +{ + sub_804151C(r0, 0x131, 1); +} + +void sub_8041DB0(u32 r0) +{ + sub_804151C(r0, 0x30, 1); +} + +void nullsub_84(void) +{ +} + +void nullsub_85(void) +{ +} + +void nullsub_204(void) +{ +} + +void nullsub_86(void) +{ +} + +void nullsub_87(void) +{ +} + +void nullsub_88(void) +{ +} + +#ifndef NONMATCHING +NAKED +#endif +// TODO r1 is doing an lsr instead of an asr... maybe a signed arg? +void sub_8041DD8(u32 r0, u16 r1) +{ +#ifdef NONMATCHING + if(sub_8071858(r0, 0xE) != 0) + { + sub_804151C(r0, r1, 1); + return; + } + sub_804151C(r0, 0xE, 1); +#else + asm_unified("\tpush {r4,r5,lr}\n" + "\tadds r4, r0, 0\n" + "\tlsls r1, 16\n" + "\tasrs r5, r1, 16\n" + "\tmovs r1, 0xE\n" + "\tbl sub_8071858\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _08041DF8\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r5, 0\n" + "\tmovs r2, 0x1\n" + "\tbl sub_804151C\n" + "\tb _08041E02\n" +"_08041DF8:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0xE\n" + "\tmovs r2, 0x1\n" + "\tbl sub_804151C\n" +"_08041E02:\n" + "\tpop {r4,r5}\n" + "\tpop {r0}\n" + "\tbx r0"); +#endif +} + +void nullsub_89(void) +{ +} + +void sub_8041E0C(u32 r0) +{ + sub_804151C(r0, 0x41, 1); +} + +void sub_8041E1C(u32 r0) +{ + sub_804151C(r0, 0x8F << 1, 1); + sub_80421C0(r0, 0xCE << 1); +} + +void sub_8041E3C(u32 r0) +{ + sub_804151C(r0, 0xD7 << 1, 1); +} + +void sub_8041E4C(u32 r0) +{ + sub_804151C(r0, 0x1b1, 1); +} + +void sub_8041E60(u32 r0) +{ + sub_804151C(r0, 0x1a9, 1); +} + +void sub_8041E74(u32 r0) +{ + sub_804151C(r0, 0xC9 << 1, 1); +} + +void sub_8041E84(u32 r0) +{ + sub_804151C(r0, 0xC7 << 1, 1); +} + +void sub_8041E94(u32 r0) +{ + sub_804151C(r0, 0xC8 << 1, 1); +} + +void sub_8041EA4(u32 r0) +{ + sub_804151C(r0, 0x15, 1); +} + +void sub_8041EB4(u32 r0) +{ + sub_804151C(r0, 0x171, 1); +} + +void sub_8041EC8(u32 r0) +{ + sub_80421C0(r0, 0x197); +} + +void sub_8041ED8(u32 r0) +{ + sub_80421C0(r0, 0x197); +} + +void sub_8041EE8(u32 r0) +{ + sub_804151C(r0, 0x15, 1); +} + +void sub_8041EF8(u32 r0) +{ + sub_804151C(r0, 0xF, 1); +} diff --git a/src/code_80428A0.c b/src/code_80428A0.c index eab25f3..08599b7 100644 --- a/src/code_80428A0.c +++ b/src/code_80428A0.c @@ -1,6 +1,6 @@ #include "global.h" -extern void sub_804151C(u32 r0, u32 r1, u32 r2); +extern void sub_804151C(u32 r0, u32 r1, u8 r2); extern void sub_803E708(u32 r0, u32 r1); extern void sub_80416A4(u32 r0, u32 r1, u32 r2); extern void sub_80421C0(u32 r0, u32 r1); -- cgit v1.2.3 From a448bf4fdb0339f887b0dc7d26364a7a76803430 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 23 Oct 2020 21:03:52 -0500 Subject: split and decomp some more --- src/code_808EAB0.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/code_808EAB0.c (limited to 'src') diff --git a/src/code_808EAB0.c b/src/code_808EAB0.c new file mode 100644 index 0000000..bf80687 --- /dev/null +++ b/src/code_808EAB0.c @@ -0,0 +1,134 @@ +#include "global.h" + +extern u32 gIQSkillNames[]; +extern u32 gIQSkillDescriptions[]; +extern u32 gTacticsDescriptions[]; +extern u8 *gTactics[]; +extern u8 gUnknown_810A36B[]; + +extern s16 gUnknown_810A378[]; +extern s32 gUnknown_810A390[]; + +u32 sub_808EAB0(u8 r0) +{ + return gIQSkillNames[r0]; +} + +void sub_808EAC0(char *r0, u8 r1) +{ + strncpy(r0, gTactics[r1], 0x14); +} + +u32 sub_808EADC(u8 r0) +{ + return gIQSkillDescriptions[r0]; +} + +u32 sub_808EAEC(u8 r0) +{ + return gTacticsDescriptions[r0]; +} + +u8 sub_808EAFC(u8 r0) +{ + return gUnknown_810A36B[r0]; +} + +void sub_808EB0C(u8 *r0, s32 r1) +{ + s32 counter; + s32 storage; + u32 index; + storage = 0; + index = 0; + for(counter = 0; counter <= 0xB; counter++) + { + if(gUnknown_810A378[index] <= r1) + { + r0[storage] = counter; + storage++; + } + index++; + } + if(storage > 0xB) + { + return; + } + while(storage <= 0xB) + { + r0[storage] = 0xB; + storage++; + } +} + +#ifndef NONMATCHING +NAKED +#endif +void sub_808EB48(u8 *r0, s32 r1) +{ +#ifdef NONMATCHING + // TODO array access and counter are mixed up in the regs.. so close + s32 counter; + u32 index; + + index = 0; + counter = 0xB; + while(counter >= 0) + { + if(gUnknown_810A378[index] <= r1) + { + r0[index] = TRUE; + } + else + { + r0[index] = FALSE; + } + index++; + counter--; + } +#else + asm_unified("\tpush {r4-r7,lr}\n" + "\tadds r4, r1, 0\n" + "\tmovs r6, 0x1\n" + "\tmovs r5, 0\n" + "\tadds r2, r0, 0\n" + "\tldr r1, _0808EB64\n" + "\tmovs r3, 0xB\n" +"_0808EB56:\n" + "\tmovs r7, 0\n" + "\tldrsh r0, [r1, r7]\n" + "\tcmp r0, r4\n" + "\tbgt _0808EB68\n" + "\tstrb r6, [r2]\n" + "\tb _0808EB6A\n" + "\t.align 2, 0\n" +"_0808EB64: .4byte gUnknown_810A378\n" +"_0808EB68:\n" + "\tstrb r5, [r2]\n" +"_0808EB6A:\n" + "\tadds r2, 0x1\n" + "\tadds r1, 0x2\n" + "\tsubs r3, 0x1\n" + "\tcmp r3, 0\n" + "\tbge _0808EB56\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +#endif +} + +bool8 sub_808EB7C(s32 r0, u8 r1) +{ + u8 return_var; + if(r1 == 0) + { + return FALSE; + } + + return_var = FALSE; + if(gUnknown_810A390[r1] <= r0) + { + return_var = TRUE; + } + return return_var; +} -- cgit v1.2.3 From bad9c1bf1f0260db29a2762f92ea21b3280ca114 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 25 Oct 2020 22:52:36 -0500 Subject: some more func work --- src/code_8048480.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/code_8048480.c b/src/code_8048480.c index 7033590..13415f5 100644 --- a/src/code_8048480.c +++ b/src/code_8048480.c @@ -3,7 +3,11 @@ extern void sub_807D148(u32 r0, u32 r1, u32 r2, u32 r3); extern void sub_8075FCC(void); extern void sub_8077AE4(u32 r0, u32 r1, u32 r2); -extern void sub_8072008(u32 r0, u32 r1, u32 r2, u32 r3); +extern void sub_8072008(u32 r0, u32 r1, u32 r2, u8 r3); +extern void sub_8076D10(void); +extern void sub_80522F4(u32 r0, u32 r1, u32 r2); +extern void sub_807232C(u32 r0, u32 r1, u32 r2); +extern u32 gUnknown_80F89F4; void sub_8048480(u32 r0, u32 r1) { @@ -19,3 +23,41 @@ void sub_804849C(u32 r0, u32 r1) { sub_8077AE4(r0, r1, 1); } + +#ifndef NONMATCHING +NAKED +#endif +void sub_80484A8(u32 r0, u32 r1) +{ +#ifdef NONMATCHING + // TODO missing something on the stack + u32 *temp; + *temp = 1; + sub_8072008(r0, r1, 1, 1); +#else + asm_unified("\tpush {lr}\n" + "\tsub sp, 0x4\n" + "\tmovs r2, 0x1\n" + "\tstr r2, [sp]\n" + "\tmovs r3, 0x1\n" + "\tbl sub_8072008\n" + "\tadd sp, 0x4\n" + "\tpop {r0}\n" + "\tbx r0"); +#endif +} + +void sub_80484BC(void) +{ + sub_8076D10(); +} + +void sub_80484C8(u32 r0, u32 r1) +{ + sub_80522F4(r0, r1, gUnknown_80F89F4); +} + +void sub_80484DC(u32 r0, u32 r1) +{ + sub_807232C(r0, r1, 1); +} -- cgit v1.2.3 From 1c07455019d6dde3a00f8d6efba7329eba86bcec Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 29 Oct 2020 23:47:55 -0500 Subject: backport pokeemerald #1232 for m4a --- src/m4a.c | 61 ++++++++++++++++++------------------------------------------- 1 file changed, 18 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/m4a.c b/src/m4a.c index 42e6d9d..e34c303 100644 --- a/src/m4a.c +++ b/src/m4a.c @@ -353,7 +353,7 @@ void SampleFreqSet(u32 freq) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; - freq = (freq & 0xF0000) >> 16; + freq = (freq & SOUND_MODE_FREQ) >> SOUND_MODE_FREQ_SHIFT; soundInfo->freq = freq; soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; @@ -642,28 +642,18 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) { s32 i; struct MusicPlayerTrack *track; - u16 fadeOI = mplayInfo->fadeOI; - register u32 temp asm("r3"); - register u16 mask asm("r2"); + u16 fadeOV; - if (fadeOI == 0) + if (mplayInfo->fadeOI == 0) return; - - mplayInfo->fadeOC--; - - temp = 0xFFFF; - mask = temp; - - if (mplayInfo->fadeOC != 0) + if (--mplayInfo->fadeOC != 0) return; - mplayInfo->fadeOC = fadeOI; + mplayInfo->fadeOC = mplayInfo->fadeOI; if (mplayInfo->fadeOV & FADE_IN) { - mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); - - if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) + if ((u16)(mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT)) >= (64 << FADE_VOL_SHIFT)) { mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); mplayInfo->fadeOI = 0; @@ -671,16 +661,10 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) } else { - mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); - - if ((s16)(mplayInfo->fadeOV & mask) <= 0) + 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++) { - register u32 fadeOV asm("r7"); u32 val; TrackStop(mplayInfo, track); @@ -691,9 +675,6 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) if (!val) track->flags = 0; - - i--; - track++; } if (mplayInfo->fadeOV & TEMPORARY_FADE) @@ -706,27 +687,22 @@ 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) { - track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); + fadeOV = mplayInfo->fadeOV; + + track->volX = (fadeOV >> FADE_VOL_SHIFT); track->flags |= MPT_FLG_VOLCHG; } - - i--; - track++; } } - void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { if (track->flags & MPT_FLG_VOLSET) { - s32 x; + u32 x; s32 y; x = (u32)(track->vol * track->volX) >> 5; @@ -751,12 +727,11 @@ void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tr if (track->flags & MPT_FLG_PITSET) { s32 bend = track->bend * track->bendRange; - register s32 x asm("r1") = track->tune; - x += bend; - x *= 4; - x += (track->keyShift << 8); - x += (track->keyShiftX << 8); - x += track->pitX; + s32 x = (track->tune + bend) + * 4 + + (track->keyShift << 8) + + (track->keyShiftX << 8) + + track->pitX; if (track->modT == 0) x += 16 * track->modM; -- cgit v1.2.3 From 90655520b3593915179c02e91f1d69cf3c26c252 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 31 Oct 2020 20:36:22 -0500 Subject: decomp a little more of save --- src/save.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'src') diff --git a/src/save.c b/src/save.c index 67e52d0..50a682f 100644 --- a/src/save.c +++ b/src/save.c @@ -23,6 +23,19 @@ struct UnkStruct_sub_8011DAC { u8 fill448[0x538C]; }; + +struct unk_struct +{ + u32 unk0; + u32 unk4; + u32 unk8; + u32 unkC; + u32 unk10; + u32 unk14; + u32 unk18; + u32 padding[505]; +}; + extern s32 gUnknown_202DE28; extern u32 gUnknown_203B17C; extern u32 gUnknown_203B180; @@ -267,3 +280,47 @@ u32 sub_8011F9C(s32 *r0, u8 *r1, s32 r2) { return ReadSaveSector(r0, r1, r2); } + +u32 sub_8011FA8(void) +{ + u32 temp2; + u32 temp3; + u32 temp; + struct unk_struct *r5 = MemoryAlloc(sizeof(struct unk_struct), 5); + temp = 0x1F; + temp2 = ReadSaveSector(&temp, (u8 *)r5, sizeof(struct unk_struct)); + if( temp2 == 0) + { + if(r5->unk14 != 0x5071412) + { + temp2 = 4; + } + } + temp3 = 0xf1209; + if(temp2 == 0) + { + temp3 = r5->unk18; + } + MemoryFree(r5); + return temp3; +} + +bool8 sub_8011FF8(void) +{ + u32 temp2; + u32 temp; + bool8 r6; + struct unk_struct *r5 = MemoryAlloc(sizeof(struct unk_struct), 5); + temp = 0x1F; + r6 = FALSE; + temp2 = ReadSaveSector(&temp, (u8 *)r5, sizeof(struct unk_struct)); + if(temp2 == 0) + { + if(r5->unk14 == 0x5071412) + { + r6 = TRUE; + } + } + MemoryFree(r5); + return r6; +} -- cgit v1.2.3 From a0d2d8e9519a7cc9075950c5eec211008fbe0463 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 1 Nov 2020 11:12:39 -0600 Subject: some more work on decomping funcs --- src/code_8041AD0.c | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/save_mid.c | 67 +++++++++++++++++++- 2 files changed, 245 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index 6cf8ae0..be254ef 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -6,6 +6,13 @@ struct unkStruct_8041D5C u8 *unk70[100]; }; +struct unk_struct_8041F08 +{ + u32 unk0; + u32 unk4; +}; + + extern void sub_803ED30(u8, struct unkStruct_8041D5C *r0, u8, u8); extern void sub_804151C(u32 r0, u32 r1, u8 r2); extern void sub_80421C0(u32 r0, u32 r1); @@ -13,6 +20,8 @@ extern u8 sub_8042768(void); extern void sub_806CDD4(u32 r0, u8, u32); extern u8 sub_8071858(u32, u8); +extern void sub_8041550(u32 r0, u32, u32, u32); + void sub_8041AD0(u32 r0) { @@ -442,3 +451,173 @@ void sub_8041EF8(u32 r0) { sub_804151C(r0, 0xF, 1); } + +void sub_8041F08(u32 r0) +{ + volatile struct unk_struct_8041F08 temp; + temp.unk0 = 2; + temp.unk4 = 0; + sub_8041550(r0, 0x15, 1, 3); +} + +void nullsub_90(void) +{ +} + +void sub_8041F28(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0xCA << 1, 1); + } + else + { + sub_804151C(r0, 0x193, 1); + } +} + +void sub_8041F4C(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0x18f, 1); + } + else + { + sub_804151C(r0, 0x191, 1); + } +} + +void sub_8041F70(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0x1a9, 1); + } + else + { + sub_804151C(r0, 0xC9 << 1, 1); + } +} + +void sub_8041F94(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0xC7 << 1, 1); + } + else + { + sub_804151C(r0, 0xC8 << 1, 1); + } +} + +void sub_8041FB4(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0x1a9, 1); + } + else + { + sub_804151C(r0, 0xC9 << 1, 1); + } +} + +void sub_8041FD8(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0xCA << 1, 1); + } + else + { + sub_804151C(r0, 0x193, 1); + } +} + +void sub_8041FFC(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0xC7 << 1, 1); + } + else + { + sub_804151C(r0, 0xC8 << 1, 1); + } +} + +void sub_804201C(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0x18f, 1); + } + else + { + sub_804151C(r0, 0x191, 1); + } +} + +void sub_8042040(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0xC6 << 1, 1); + } + else + { + sub_804151C(r0, 0xD, 1); + } +} + +void sub_8042060(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0x18d, 1); + } + else + { + sub_804151C(r0, 0xE, 1); + } +} + +void sub_8042080(u32 r0, u32 r1) +{ + if(r1 == 0) + { + sub_804151C(r0, 0xC6 << 1, 1); + } + else + { + sub_804151C(r0, 0xD, 1); + } +} + +void sub_80420A0(u32 r0, u32 r1) +{ + sub_804151C(r0, 0x143, 1); +} + +void nullsub_91(void) +{ +} + +void sub_80420B8(u32 r0, u32 r1) +{ + sub_804151C(r0, 0x19, 1); +} + +void sub_80420C8(u32 r0) +{ + volatile struct unk_struct_8041F08 temp; + temp.unk0 = 2; + temp.unk4 = 0; + sub_8041550(r0, 0x15, 1, 3); +} + +void nullsub_92(void) +{ +} diff --git a/src/save_mid.c b/src/save_mid.c index d401ec3..43f8aaf 100644 --- a/src/save_mid.c +++ b/src/save_mid.c @@ -10,6 +10,19 @@ struct unk_203B188 u32 unk4; }; +struct unk_struct +{ + u32 unk0; + u32 unk4; + u32 unk8; + u32 unkC; + u32 unk10; + u32 unk14; + u32 unk18; + u32 unk1C; + u32 padding[504]; +}; + extern struct unk_203B188 *gUnknown_203B188; extern u32 gUnknown_203B460; @@ -52,13 +65,21 @@ extern void sub_8097F74(void); extern void sub_8011C28(u32 r0); extern void sub_8011C40(s32 r0); extern void sub_8097748(void); -extern void sub_8012240(); extern void sub_8094FA8(struct unkTimeStruct *Time); // defined in src/code_8094F88.c extern struct unkTimeStruct *sub_8094FA0(void); extern void* MemoryAlloc(u32 a, u32 b); +extern void MemoryFree(void* a); +extern void MemoryFill8(u8 *dest, u8 value, s32 size); +extern void sub_8011830(void); +extern s32 WriteFlashData(s32 sector, u8 *src, s32 size); +extern void sub_8011854(void); +extern u32 *sub_809769C(void); +u32 *sub_8011C4C(void); +extern void sub_80958E4(u8 *a, u32 b); +extern s32 WriteSaveSector(s32 *a, u8 *src, s32 size); void sub_80122D0(); void sub_80122F4(); @@ -66,6 +87,50 @@ void sub_8012300(); void sub_80976A8(); void sub_80122A8(); +s32 sub_80121D4(s32 *a, u8 *src, s32 size) +{ + return WriteSaveSector(a, src, size); +} + +u32 sub_80121E0(u32 r0) +{ + u32 temp; + u32 *temp2; + u32 temp3; + struct unk_struct *r4 = MemoryAlloc(sizeof(struct unk_struct), 5); + temp = 0x1F; + + r4->unk18 = r0; + r4->unk1C = *sub_809769C(); + r4->unk14 = 0x5071412; + + temp2 = sub_8011C4C(); + strncpy((u8 *)r4 + 4, (u8*)temp2, 16); + sub_80958E4((u8 *)r4 + 32, 0); + temp3 = WriteSaveSector(&temp, (u8 *)r4, sizeof(struct unk_struct)); + MemoryFree(r4); + return temp3; +} + +u32 sub_8012240(void) +{ + s32 temp; + struct unk_struct *r5 = MemoryAlloc(sizeof(struct unk_struct), 5); + MemoryFill8((u8 *)r5, 0xFF, 0x4); + sub_8011830(); + temp = WriteFlashData(0x1F, (u8 *)r5, sizeof(struct unk_struct)); + sub_8011854(); + MemoryFree(r5); + if(temp != 0) + { + return 2; + } + else + { + return 0; + } +} + void sub_8012284(void) { sub_80122D0(); -- cgit v1.2.3 From 22f19f8d55bdc749775438b34cdaa209d07bd8c1 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 1 Nov 2020 12:27:21 -0600 Subject: more work on funcs --- src/code_80118A4.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pokemon.c | 17 +++++++++++++++ 2 files changed, 79 insertions(+) (limited to 'src') diff --git a/src/code_80118A4.c b/src/code_80118A4.c index c809bdb..aedcb2e 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -25,18 +25,31 @@ extern void nullsub_31(void); extern void nullsub_32(void); extern void nullsub_28(void); +extern int sprintf(char *, const char *, ...); + struct UnkStructType { /* 0x0 */ s16 unk0; }; + +struct unkFileStruct +{ + u32 unk0; + u32 unk4; + u32 unk8; +}; + + extern u16 gUnknown_80D4144[]; extern struct UnkStructType gUnknown_202DE20; extern struct UnkStructType gUnknown_202DE22; extern struct UnkStructType gUnknown_202DE24; extern u32 gUnknown_202DE1C; extern u32 gUnknown_203B14C; +extern const char gNotEntryText; +extern const char gUnknown_80D418C; void sub_8011760(void) { @@ -281,3 +294,52 @@ void nullsub_25(void) void nullsub_26(void) { } + +#ifndef NONMATCHING +NAKED +#endif +// Unused +void PrintFuncFileLineOrNotEntry(char * r0, struct unkFileStruct *r1) +{ +#ifdef NONMATCHING + u32 temp; + if(r1 != 0) + { + // TODO fix regswap here.. otherwise looks good + temp = r1->unk4; + sprintf(r0, &gUnknown_80D418C, r1->unk8, r1->unk0, temp); + } + else + { + sprintf(r0, &gNotEntryText); + } +#else + asm_unified("\tpush {r4,lr}\n" + "\tsub sp, 0x4\n" + "\tadds r4, r0, 0\n" + "\tadds r0, r1, 0\n" + "\tcmp r0, 0\n" + "\tbeq _08011A90\n" + "\tldr r1, _08011A8C\n" + "\tldr r2, [r0, 0x8]\n" + "\tldr r3, [r0]\n" + "\tldr r0, [r0, 0x4]\n" + "\tstr r0, [sp]\n" + "\tadds r0, r4, 0\n" + "\tbl sprintf\n" + "\tb _08011A98\n" + "\t.align 2, 0\n" +"_08011A8C: .4byte gUnknown_80D418C\n" +"_08011A90:\n" + "\tldr r1, _08011AA0\n" + "\tadds r0, r4, 0\n" + "\tbl sprintf\n" +"_08011A98:\n" + "\tadd sp, 0x4\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_08011AA0: .4byte gNotEntryText"); +#endif +} diff --git a/src/pokemon.c b/src/pokemon.c index 55316d6..454751e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -10,6 +10,22 @@ extern struct OpenedFile *gMonsterParametersFile; extern u16 gUnknown_20384E8; extern struct gPokemon gMonsterParameters; +extern u64 gUnknown_8107544[]; +extern u32 gUnknown_810697C; +extern void sub_8086448(); +extern void sub_80866C4(u32 *r0); + +void sub_808CD9C(u8 r0) +{ + sub_8086448(); + sub_80866C4(&gUnknown_810697C); +} + +u64 *sub_808CDB0(u8 r0) +{ + return &gUnknown_8107544[r0]; +} + void LoadMonsterParameters(void) { gUnknown_203B45C = &gUnknown_202F400; @@ -24,3 +40,4 @@ u32 *sub_808CE00(void) return &gUnknown_202F400; } + -- cgit v1.2.3 From 9d383609e21adfc35004cdf87f9231039c701b23 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 1 Nov 2020 23:23:32 -0600 Subject: some splitting and sync'ing declarations/vars --- src/code_8097F40.c | 28 ++++++++++++++++++++++++++++ src/save_mid.c | 32 ++++++++++++++++---------------- 2 files changed, 44 insertions(+), 16 deletions(-) create mode 100644 src/code_8097F40.c (limited to 'src') diff --git a/src/code_8097F40.c b/src/code_8097F40.c new file mode 100644 index 0000000..94d271c --- /dev/null +++ b/src/code_8097F40.c @@ -0,0 +1,28 @@ +#include "global.h" + +extern u8 gUnknown_810ACC0[]; +extern u8 *gUnknown_203B498; +extern u8 gUnknown_2039840; + +bool8 sub_8097F40(u32 r0) +{ + bool8 temp; + temp = FALSE; + if(gUnknown_810ACC0[r0] == 2) + { + temp = TRUE; + } + return temp; + +} + +void sub_8097F5C(void) +{ + gUnknown_203B498 = &gUnknown_2039840; +} + +u8 *sub_8097F6C(void) +{ + return &gUnknown_2039840; +} + diff --git a/src/save_mid.c b/src/save_mid.c index 43f8aaf..a124d66 100644 --- a/src/save_mid.c +++ b/src/save_mid.c @@ -25,41 +25,41 @@ struct unk_struct extern struct unk_203B188 *gUnknown_203B188; -extern u32 gUnknown_203B460; -extern u32 gUnknown_203B45C; -extern u32 gUnknown_203B480; -extern u32 gUnknown_203B484; -extern u32 gUnknown_203B488; -extern u32 gUnknown_203B48C; +extern u32 *gUnknown_203B460; +extern u32 *gUnknown_203B45C; +extern u32 *gUnknown_203B480; +extern u32 *gUnknown_203B484; +extern u32 *gUnknown_203B488; +extern u32 *gUnknown_203B48C; extern u32 gUnknown_203B490; extern u32 gUnknown_203B464; extern u32 gUnknown_203B494; -extern u32 gUnknown_203B498; -extern u32 gUnknown_203B468; +extern u8 *gUnknown_203B498; +extern u32 *gUnknown_203B468; extern u32 gUnknown_203B46C; extern void sub_800135C(void); -extern u32 sub_808CE00(void); +extern u32 *sub_808CE00(void); extern void sub_808CE08(void); -extern u32 sub_80909D0(void); +extern u32 *sub_80909D0(void); extern void sub_80909D8(void); extern u32 sub_809208C(void); extern void sub_8092094(void); -extern u32 sub_80923B0(void); +extern u32 *sub_80923B0(void); extern void sub_80923B8(void); extern u32 sub_8094990(void); extern void sub_8094998(u8 r0); -extern u32 sub_80950F8(void); -extern u32 sub_8095100(void); -extern u32 sub_8095108(void); -extern u32 sub_8095110(void); +extern u32 *sub_80950F8(void); +extern u32 *sub_8095100(void); +extern u32 *sub_8095108(void); +extern u32 *sub_8095110(void); extern void sub_8095118(void); extern u32 sub_80958F8(void); extern void sub_8095900(void); extern u32 sub_8097680(void); extern void sub_80972F4(void); extern void sub_80974E8(void); -extern u32 sub_8097F6C(void); +extern u8 *sub_8097F6C(void); extern void sub_8097F74(void); extern void sub_8011C28(u32 r0); -- cgit v1.2.3 From 4dee2a71d4085a15fc2b01371b060e08e2745970 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 2 Nov 2020 10:47:57 -0600 Subject: fix nonmatching.. needed a volatile --- src/code_8048480.c | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/code_8048480.c b/src/code_8048480.c index 13415f5..aac957a 100644 --- a/src/code_8048480.c +++ b/src/code_8048480.c @@ -24,27 +24,11 @@ void sub_804849C(u32 r0, u32 r1) sub_8077AE4(r0, r1, 1); } -#ifndef NONMATCHING -NAKED -#endif void sub_80484A8(u32 r0, u32 r1) { -#ifdef NONMATCHING - // TODO missing something on the stack - u32 *temp; - *temp = 1; + volatile u32 temp; + temp = 1; sub_8072008(r0, r1, 1, 1); -#else - asm_unified("\tpush {lr}\n" - "\tsub sp, 0x4\n" - "\tmovs r2, 0x1\n" - "\tstr r2, [sp]\n" - "\tmovs r3, 0x1\n" - "\tbl sub_8072008\n" - "\tadd sp, 0x4\n" - "\tpop {r0}\n" - "\tbx r0"); -#endif } void sub_80484BC(void) -- cgit v1.2.3 From 65720e556d95a1a7153fbf8590fe63faedabf080 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 2 Nov 2020 11:15:37 -0600 Subject: some work on fatal system decomping --- src/fatal_system.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/fatal_system.c (limited to 'src') diff --git a/src/fatal_system.c b/src/fatal_system.c new file mode 100644 index 0000000..920712d --- /dev/null +++ b/src/fatal_system.c @@ -0,0 +1,28 @@ +#include "global.h" + +extern const char gNotMountText; +extern void Hang(); + +void nullsub_28(void) +{ +} + +u32 sub_8011BA4(void) +{ + return 0; +} + +u32 sub_8011BA8(void) +{ + return 0; +} + +const char *sub_8011BAC(void) +{ + return &gNotMountText; +} + +void sub_8011BB4(void) +{ + Hang(); +} -- cgit v1.2.3 From b81c54d2ce06ca42660a9f62d82cd45b01706baf Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 2 Nov 2020 11:19:59 -0600 Subject: comment unused funcs --- src/fatal_system.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/fatal_system.c b/src/fatal_system.c index 920712d..2079a38 100644 --- a/src/fatal_system.c +++ b/src/fatal_system.c @@ -12,16 +12,19 @@ u32 sub_8011BA4(void) return 0; } +// Unused u32 sub_8011BA8(void) { return 0; } +// Unused const char *sub_8011BAC(void) { return &gNotMountText; } +// Unused void sub_8011BB4(void) { Hang(); -- cgit v1.2.3 From c6cef4c839f7c87da9fa90cf0e51249fccac06d5 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 3 Nov 2020 14:03:13 -0600 Subject: start converting personality descriptions --- src/personality_test.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src') diff --git a/src/personality_test.c b/src/personality_test.c index 0bec4a7..bac1b89 100644 --- a/src/personality_test.c +++ b/src/personality_test.c @@ -1,6 +1,19 @@ #include "global.h" #include "constants/species.h" +// TODO convert this... maybe a script? +const u8 gUnknown_80F4244[32] = +{ + 0, 0, 0, 0, + 5, 0, 0, 0, + 0xC, 0, 6, 0, + 5, 0, 5, 0, + 5, 0, 0, 0, + 0, 0, 0, 0, + + 'p', 'k', 's', 'd', 'i', 'r', '0', 0 +}; + const u16 gPartners[10] = { SPECIES_CHARMANDER, -- cgit v1.2.3 From 799fa82c1aede6d33778bfb6e69a5faf5ef98781 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 5 Nov 2020 18:11:47 -0600 Subject: finally figured out fatal error func and another func --- src/code_80118A4_1.c | 16 ++++++++++++++++ src/code_80A7714.c | 19 +++++++++++++++++++ 2 files changed, 35 insertions(+) (limited to 'src') diff --git a/src/code_80118A4_1.c b/src/code_80118A4_1.c index c2fa641..9d57d7d 100644 --- a/src/code_80118A4_1.c +++ b/src/code_80118A4_1.c @@ -2,6 +2,9 @@ extern u8 gUnknown_203B150; +void PrintFuncFileLine(char *r0, const char *r1, ...); +extern const char gUnknown_80D421C; + void nullsub_199(void) { } @@ -67,3 +70,16 @@ void nullsub_137(void) { } + +// TODO merge with fatal_system +void FatalErrorPrintFuncFileLine(const char *r0, const char *r1) +{ + char buf[0x100]; + if(r0 != 0){ + PrintFuncFileLine(buf, r1, r0); + } + else + { + PrintFuncFileLine(buf, r1, &gUnknown_80D421C); + } +} diff --git a/src/code_80A7714.c b/src/code_80A7714.c index 0522ef1..ae8798a 100644 --- a/src/code_80A7714.c +++ b/src/code_80A7714.c @@ -3,6 +3,7 @@ extern void sub_80A68A0(void); extern void sub_80A7094(u32 r0, u32 r1, u32 r2, u32 r3); extern void sub_80A7310(u32 r0, u32 r1, u32 r2, u32 r3); +extern void sub_80A7784(); extern s16 gUnknown_2039DE0; void sub_80A7714(void) @@ -25,3 +26,21 @@ void sub_80A7754(void) { gUnknown_2039DE0 = -1; } + +void sub_80A7764(s16 r0) +{ + s32 temp = r0; + sub_80A7784(); + if(temp != -1) + { + gUnknown_2039DE0 = temp; + } +} + +void sub_80A7784(void) +{ + if(gUnknown_2039DE0 != -1) + { + gUnknown_2039DE0 = -1; + } +} -- cgit v1.2.3 From 9df5bb1bcb7d7a2b2c919a18a6a91e4b336e55af Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 5 Nov 2020 22:27:43 -0600 Subject: more decomp work on some funcs --- src/code_8098BDC.c | 83 ++++++++++++---- src/code_809D148.c | 277 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 344 insertions(+), 16 deletions(-) create mode 100644 src/code_809D148.c (limited to 'src') diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c index bd56fb3..23aa716 100644 --- a/src/code_8098BDC.c +++ b/src/code_8098BDC.c @@ -1,6 +1,15 @@ #include "global.h" extern u32 gUnknown_203B47C; +extern u32 gUnknown_20398A8; +extern u32 gUnknown_8115F5C; +extern u32 gUnknown_20398AC; +extern u32 gUnknown_20398B0; +extern u32 gUnknown_20398B4; +extern u32 gUnknown_20398C0; +extern u16 gUnknown_20398BE; + +extern void Log(u32, u32*, s32, u32); extern void sub_809B57C(); extern void GroundScript_Unlock(); @@ -44,6 +53,10 @@ extern void sub_8091FB4(); extern u8 sub_8001CC4(u8, u8, u8); extern void sub_8091980(u32); +extern u8 sub_80023E4(u32); +extern void sub_80118C4(u32); +extern void sub_809C730(); + void sub_8098BDC(void) { sub_809B57C(); @@ -148,19 +161,57 @@ void sub_8098CC8(void) sub_8091FB4(); } -// TODO lsrs should be asrs on my first arg -//u8 sub_8098D1C(u16 r0, u32 r1, s32 r2) -//{ -// if(gUnknown_20398A8 == 0) -// { -// Log(0, &gUnknown_8115F5C, r0, r2); -// gUnknown_20398A8 = 1; -// gUnknown_20398AC = 1; -// gUnknown_20398B0 = r2; -// gUnknown_20398B4 = 2; -// gUnknown_20398BE = r0; -// gUnknown_20398C0 = r1; -// return 1; -// } -// return 0; -//} +bool8 sub_8098D1C(s16 r0, u32 r1, u32 r2) +{ + s32 temp; + temp = r0; // force a asr shift + if(gUnknown_20398A8 == 0) + { + Log(0, &gUnknown_8115F5C, temp, r2); + gUnknown_20398A8 = 1; + gUnknown_20398AC = 1; + gUnknown_20398B0 = r2; + gUnknown_20398B4 = 2; + gUnknown_20398BE = temp; + gUnknown_20398C0 = r1; + return TRUE; + } + return FALSE; +} + +bool8 sub_8098D80(u32 r0) +{ + if(gUnknown_20398A8 == 0) + { + gUnknown_20398A8 = 3; + gUnknown_20398AC = 1; + gUnknown_20398B0 = r0; + sub_809C730(); + if(sub_80023E4(0xD) == 0) + { + // Terrible hack but meh + sub_80118C4((r0 << 16) >> 16); + } + return TRUE; + } + return FALSE; +} + +bool8 sub_8098DCC(u32 r0) +{ + if(gUnknown_20398A8 == 0) + { + gUnknown_20398A8 = 4; + gUnknown_20398AC = 1; + gUnknown_20398B0 = r0; + sub_809C730(); + if(sub_80023E4(0xD) == 0) + { + // Terrible hack but meh + sub_80118C4((r0 << 16) >> 16); + } + return TRUE; + } + return FALSE; +} + diff --git a/src/code_809D148.c b/src/code_809D148.c new file mode 100644 index 0000000..965ca12 --- /dev/null +++ b/src/code_809D148.c @@ -0,0 +1,277 @@ +#include "global.h" + +struct unkStruct_20399E8 +{ + u32 unk0; + u32 unk4; + u32 unk8; + u32 unkC; + u32 unk10; + u32 unk14; + u32 unk18; + u32 unk1C; + u32 unk20; + + u32 unk24; + u32 unk28; + u32 unk2C; + u32 unk30; + u32 unk34; + u32 unk38; +}; + +struct unkStruct_809D158 +{ + u32 unk0; + u32 unk4; +}; + +extern struct unkStruct_20399E8 gUnknown_20399E8; + +void sub_809D0BC(void); + + +void sub_809D0AC(void) +{ + sub_809D0BC(); +} + +void nullsub_119(void) +{ +} + +#ifndef NONMATCHING +NAKED +#endif +void sub_809D0BC(void) +{ +#ifdef NONMATCHING + struct unkStruct_20399E8 *pre_load_203; + + u32 temp; + u32 temp1; + + pre_load_203 = &gUnknown_20399E8; + + // TODO regswap.. should be r2/r3, not r0, r1 + temp = gUnknown_8116478.unk0; + temp1 = gUnknown_8116478.unk4; + + pre_load_203->unk3C = temp; + pre_load_203->unk40 = temp1; + pre_load_203->unk44 = 0; + sub_809D158(0); + pre_load_203->unk8 = 0; + pre_load_203->unkC = 0; + pre_load_203->unk10 = 0; + pre_load_203->unk4 = -1; + pre_load_203->unk24 = 0; + pre_load_203->unk28 = 0; + pre_load_203->unk2C = 0; + pre_load_203->unk30 = 0; + pre_load_203->unk34 = 0; + pre_load_203->unk38 = 0; +#else + asm_unified("\tpush {r4,r5,lr}\n" + "\tldr r5, _0809D0F8\n" + "\tldr r1, _0809D0FC\n" + "\tldr r2, [r1]\n" + "\tldr r3, [r1, 0x4]\n" + "\tstr r2, [r5, 0x3C]\n" + "\tstr r3, [r5, 0x40]\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x44\n" + "\tmovs r4, 0\n" + "\tstrb r4, [r0]\n" + "\tmovs r0, 0\n" + "\tbl sub_809D158\n" + "\tstr r4, [r5, 0x8]\n" + "\tstr r4, [r5, 0xC]\n" + "\tstr r4, [r5, 0x10]\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" + "\tstr r0, [r5, 0x4]\n" + "\tstr r4, [r5, 0x24]\n" + "\tstr r4, [r5, 0x28]\n" + "\tstr r4, [r5, 0x2C]\n" + "\tstr r4, [r5, 0x30]\n" + "\tstr r4, [r5, 0x34]\n" + "\tstr r4, [r5, 0x38]\n" + "\tpop {r4,r5}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0809D0F8: .4byte gUnknown_20399E8\n" +"_0809D0FC: .4byte gUnknown_8116478\n"); +#endif +} + +void sub_809D100(u32 r0) +{ + if(gUnknown_20399E8.unk24 != r0) + { + gUnknown_20399E8.unk24 = r0; + gUnknown_20399E8.unk28 = 0; + gUnknown_20399E8.unk2C = 0; + gUnknown_20399E8.unk30 = 0; + gUnknown_20399E8.unk34 = 0; + gUnknown_20399E8.unk38 = 0; + } +} + +void sub_809D124(u32 r0, u32 r1, u32 r2) +{ + if(gUnknown_20399E8.unk24 != r0) + { + gUnknown_20399E8.unk24 = r0; + gUnknown_20399E8.unk30 = 0; + gUnknown_20399E8.unk34 = 0; + gUnknown_20399E8.unk38 = 0; + } + gUnknown_20399E8.unk28 = r1; + gUnknown_20399E8.unk2C = r2; +} + +void sub_809D148(u32 r0) +{ + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 0; + +} + +void sub_809D158(u32 r0, struct unkStruct_809D158 *r1) +{ + u32 temp; + u32 temp1; + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 0; + + // Load both first and then store + temp = r1->unk0; + temp1 = r1->unk4; + gUnknown_20399E8.unk1C = temp; + gUnknown_20399E8.unk20 = temp1; +} + +void sub_809D170(u32 r0, u32 r1) +{ + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 0; + gUnknown_20399E8.unk4 = r1; +} + +void sub_809D180(u32 r0, u32 r1) +{ + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 1; + gUnknown_20399E8.unkC = r1; +} + +void sub_809D190(u32 r0, struct unkStruct_809D158 *r1, u32 r2) +{ + u32 temp; + u32 temp1; + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 1; + gUnknown_20399E8.unkC = r2; + + // Load both first and then store + temp = r1->unk0; + temp1 = r1->unk4; + gUnknown_20399E8.unk14 = temp; + gUnknown_20399E8.unk18 = temp1; +} + +void sub_809D1A8(u32 r0, u32 r1, u32 r2) +{ + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 1; + gUnknown_20399E8.unkC = r2; + gUnknown_20399E8.unk4 = r1; +} + +void sub_809D1BC(u32 r0, u32 r1) +{ + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 2; + gUnknown_20399E8.unk10 = r1; +} + +void sub_809D1CC(u32 r0, struct unkStruct_809D158 *r1, u32 r2) +{ + u32 temp; + u32 temp1; + + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 2; + gUnknown_20399E8.unk10 = r2; + + // Load both first and then store + temp = r1->unk0; + temp1 = r1->unk4; + gUnknown_20399E8.unk14 = temp; + gUnknown_20399E8.unk18 = temp1; +} + +void sub_809D1E4(u32 r0, u32 r1, u32 r2) +{ + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 2; + gUnknown_20399E8.unk10 = r2; + gUnknown_20399E8.unk4 = r1; +} + +void sub_809D1F8(u32 r0, u32 r1) +{ + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 3; + gUnknown_20399E8.unkC = r1; +} + +void sub_809D208(u32 r0, struct unkStruct_809D158 *r1, u32 r2) +{ + u32 temp; + u32 temp1; + + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 3; + gUnknown_20399E8.unkC = r2; + + // Load both first and then store + temp = r1->unk0; + temp1 = r1->unk4; + gUnknown_20399E8.unk14 = temp; + gUnknown_20399E8.unk18 = temp1; +} + +void sub_809D220(u32 r0, u32 r1, u32 r2) +{ + gUnknown_20399E8.unk0 = r0; + gUnknown_20399E8.unk8 = 3; + gUnknown_20399E8.unkC = r2; + gUnknown_20399E8.unk4 = r1; +} + +u32 sub_809D234(void) +{ + u32 temp; + temp = gUnknown_20399E8.unk8; + if(temp != 0) + { + temp = 1; + } + return temp; +} + +// TODO regswap but matches otherwise +//u8 sub_809D248(struct unkStruct_809D158 *r0) +//{ +// u32 temp; +// u32 temp1; +// +// temp = gUnknown_20399E8.unk3C; +// temp1 = gUnknown_20399E8.unk40; +// r0->unk0 = temp; +// r0->unk4 = temp1; +// return gUnknown_20399E8.unk44; +//} -- cgit v1.2.3 From 31d0b3255386da62a95fcf9d89c8b6540a05406d Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 6 Nov 2020 22:34:48 -0600 Subject: Should be casting to u16 there.. Thx Kermalis for the spot --- src/code_8098BDC.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c index 23aa716..e35500a 100644 --- a/src/code_8098BDC.c +++ b/src/code_8098BDC.c @@ -54,7 +54,7 @@ extern u8 sub_8001CC4(u8, u8, u8); extern void sub_8091980(u32); extern u8 sub_80023E4(u32); -extern void sub_80118C4(u32); +extern void sub_80118C4(u16); extern void sub_809C730(); void sub_8098BDC(void) @@ -189,8 +189,7 @@ bool8 sub_8098D80(u32 r0) sub_809C730(); if(sub_80023E4(0xD) == 0) { - // Terrible hack but meh - sub_80118C4((r0 << 16) >> 16); + sub_80118C4(r0); } return TRUE; } @@ -207,8 +206,7 @@ bool8 sub_8098DCC(u32 r0) sub_809C730(); if(sub_80023E4(0xD) == 0) { - // Terrible hack but meh - sub_80118C4((r0 << 16) >> 16); + sub_80118C4(r0); } return TRUE; } -- cgit v1.2.3 From df9385ed9e221a5a59b03b14e32988d8bd31fe3b Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 7 Nov 2020 17:29:46 -0600 Subject: continue my slow pace --- src/code_8092334.c | 19 ++++++++++++++----- src/save_mid.c | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/code_8092334.c b/src/code_8092334.c index d12bc44..f68e59b 100644 --- a/src/code_8092334.c +++ b/src/code_8092334.c @@ -6,8 +6,8 @@ extern u8 gUnknown_810AC7C[]; extern u8 gUnknown_810AC6A[]; extern u8 *gAbilityNames[]; extern u8 *AbilityDescriptions[]; -extern u32 gBoughtFriendAreas; -extern u32 *gUnknown_203B468; +extern u8 gBoughtFriendAreas[]; +extern u8 *gUnknown_203B468; u32 GetUnformattedTypeString(u8 type) { @@ -41,10 +41,19 @@ u8 *sub_8092390(u8 r0) void sub_80923A0(void) { - gUnknown_203B468 = &gBoughtFriendAreas; + gUnknown_203B468 = gBoughtFriendAreas; } -u32 *sub_80923B0(void) +u8 *sub_80923B0(void) { - return &gBoughtFriendAreas; + return gBoughtFriendAreas; +} + +void sub_80923B8(void) +{ + s32 counter; + for(counter = 0; counter <= 0x39; counter++) + { + gUnknown_203B468[counter] = 0; + } } diff --git a/src/save_mid.c b/src/save_mid.c index a124d66..ce1b378 100644 --- a/src/save_mid.c +++ b/src/save_mid.c @@ -35,7 +35,7 @@ extern u32 gUnknown_203B490; extern u32 gUnknown_203B464; extern u32 gUnknown_203B494; extern u8 *gUnknown_203B498; -extern u32 *gUnknown_203B468; +extern u8 *gUnknown_203B468; extern u32 gUnknown_203B46C; extern void sub_800135C(void); @@ -45,7 +45,7 @@ extern u32 *sub_80909D0(void); extern void sub_80909D8(void); extern u32 sub_809208C(void); extern void sub_8092094(void); -extern u32 *sub_80923B0(void); +extern u8 *sub_80923B0(void); extern void sub_80923B8(void); extern u32 sub_8094990(void); extern void sub_8094998(u8 r0); -- cgit v1.2.3 From a1cd2ce87fd9281dbea59520b8f5160c1bdeae28 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 7 Nov 2020 19:01:11 -0600 Subject: some data dumping and doc # of friend areas --- src/code_8092334.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/code_8092334.c b/src/code_8092334.c index f68e59b..d5d17ee 100644 --- a/src/code_8092334.c +++ b/src/code_8092334.c @@ -1,14 +1,20 @@ #include "global.h" +#define NUM_FRIEND_AREAS 58 + extern u32 gUnformattedTypeStrings[]; // unformatted type names extern u32 gFormattedTypeStrings[]; // formatted type names + extern u8 gUnknown_810AC7C[]; extern u8 gUnknown_810AC6A[]; + extern u8 *gAbilityNames[]; extern u8 *AbilityDescriptions[]; -extern u8 gBoughtFriendAreas[]; + +extern u8 gBoughtFriendAreas[NUM_FRIEND_AREAS]; extern u8 *gUnknown_203B468; + u32 GetUnformattedTypeString(u8 type) { return gUnformattedTypeStrings[type]; @@ -52,7 +58,7 @@ u8 *sub_80923B0(void) void sub_80923B8(void) { s32 counter; - for(counter = 0; counter <= 0x39; counter++) + for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) { gUnknown_203B468[counter] = 0; } -- cgit v1.2.3 From b426b333f7dd6cdf3e6babc052526e53c996f07d Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 8 Nov 2020 15:27:37 -0600 Subject: used m4a2s from ipatix to do an initial dump of audio and started working on audio part of pmd --- src/music.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/music.c (limited to 'src') diff --git a/src/music.c b/src/music.c new file mode 100644 index 0000000..b6fed30 --- /dev/null +++ b/src/music.c @@ -0,0 +1,100 @@ +#include "global.h" +#include "gba/m4a_internal.h" + +extern u8 sub_80023E4(u32); +extern void sub_80118C4(u16); +extern void sub_809C730(); + +extern bool8 DisableInterrupts(); +extern bool8 EnableInterrupts(); +extern void m4aSoundVSyncOn(); +extern void m4aSongNumStart(u16); +extern void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo); +extern void m4aSoundVSyncOff(); +extern void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); + +extern u16 sub_800CAE0(u16); +extern u8 sub_800CACC(u32); +extern u8 sub_800CAAC(u32); +extern void sub_800C3F8(u16, u16); + + +extern u16 gUnknown_202D690; +extern u16 gUnknown_202D68A; +extern u16 gUnknown_202D688; +extern u8 gUnknown_202D694; +extern struct MusicPlayerInfo gUnknown_20008F0; + + +void sub_800C93C(void) +{ + bool8 interrupt_flag; + u16 temp; + + sub_800C3F8(0x3e5, 0x10); + sub_800C3F8(0x3e6, 0x10); + + interrupt_flag = DisableInterrupts(); + if(gUnknown_202D690 == 0) + { + if(gUnknown_202D68A != 0x3e7) + { + temp = gUnknown_202D688 - 1; + if(temp <= 1) + { + if(gUnknown_202D688 == 2) + { + gUnknown_202D694 = gUnknown_202D690; + } + else + { + if(gUnknown_202D688 == 1) + { + gUnknown_202D694 = 1; + } + } + gUnknown_202D688 = 4; + } + } + } + m4aMPlayStop(&gUnknown_20008F0); + m4aSoundVSyncOff(); + if(interrupt_flag) + { + EnableInterrupts(); + } +} + +void sub_800C9CC(void) +{ + bool8 interrupt_flag = DisableInterrupts(); + m4aSoundVSyncOn(); + if(gUnknown_202D690 == 0) + { + if(gUnknown_202D68A != 0x3e7) + { + if(gUnknown_202D688 == 4) + { + gUnknown_202D688 = 1; + if(gUnknown_202D694 != 0) + { + m4aSongNumStart(gUnknown_202D68A); + } + else + { + m4aMPlayContinue(&gUnknown_20008F0); + } + } + } + } + if(interrupt_flag) + { + EnableInterrupts(); + } + +} + +void nullsub_179(void) +{ +} + -- cgit v1.2.3 From 0578f4a0623b0e3078f922c37a587d6bbafdbf4d Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 10 Nov 2020 13:54:27 -0600 Subject: more work on music.c and few more funcs --- src/code_800558C.c | 142 ++++++++------------------------ src/code_800C9CC.c | 237 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/music.c | 184 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 449 insertions(+), 114 deletions(-) create mode 100644 src/code_800C9CC.c (limited to 'src') diff --git a/src/code_800558C.c b/src/code_800558C.c index 4cc90e9..13e3255 100644 --- a/src/code_800558C.c +++ b/src/code_800558C.c @@ -6,146 +6,68 @@ extern u32 gUnknown_203B47C; extern u8 gUnknown_2026E38; extern u32 gUnknown_2026E3C; extern u16 gUnknown_2026E4E; -extern u32 gUnknown_2026E50; -extern u32 gUnknown_2026E54; +extern bool32 gUnknown_2026E50; +extern bool32 gUnknown_2026E54; extern u32 gUnknown_2026E58; -extern void sub_800CC44(u32 r0, u32 r1); +extern void sub_800CC44(s32 r0, s32 r1); // Unused -#ifndef NONMATCHING -NAKED -#endif void sub_80060A8(void) { -#ifdef NONMATCHING - // TODO ordering of statements is wrong but regs are good so f*** it. - // My mv/ldr stuff for temp is out of order - u32 temp; + + bool32 temp; + bool32 preload; + bool32 preload2; + gUnknown_2026E3C = gUnknown_2026E58; - temp = 0; - if (gUnknown_2026E54 == 0) + preload = gUnknown_2026E54; + temp = FALSE; + if (!gUnknown_2026E54) { - temp = 1; + temp = TRUE; } gUnknown_2026E54 = temp; - temp = 0; - - if (gUnknown_2026E50 == 0) + preload2 = gUnknown_2026E50; + temp = FALSE; + if (!gUnknown_2026E50) { - temp = 1; + temp = TRUE; } gUnknown_2026E50 = temp; - gUnknown_2026E38 = 0; -#else - asm_unified("\tpush {lr}\n" - "\tldr r1, _080060D8\n" - "\tldr r0, _080060DC\n" - "\tldr r0, [r0]\n" - "\tstr r0, [r1]\n" - "\tldr r2, _080060E0\n" - "\tmovs r1, 0\n" - "\tldr r0, [r2]\n" - "\tcmp r0, 0\n" - "\tbne _080060BE\n" - "\tmovs r1, 0x1\n" -"_080060BE:\n" - "\tstr r1, [r2]\n" - "\tldr r2, _080060E4\n" - "\tmovs r1, 0\n" - "\tldr r0, [r2]\n" - "\tcmp r0, 0\n" - "\tbne _080060CC\n" - "\tmovs r1, 0x1\n" -"_080060CC:\n" - "\tstr r1, [r2]\n" - "\tldr r1, _080060E8\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r1]\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" -"_080060D8: .4byte gUnknown_2026E3C\n" -"_080060DC: .4byte gUnknown_2026E58\n" -"_080060E0: .4byte gUnknown_2026E54\n" -"_080060E4: .4byte gUnknown_2026E50\n" -"_080060E8: .4byte gUnknown_2026E38"); - -#endif + gUnknown_2026E38 = FALSE; } -#ifndef NONMATCHING -NAKED -#endif void sub_80060EC(void) { -#ifdef NONMATCHING - // TODO ordering of statements is wrong but regs are good so f*** it. - u32 temp; + bool32 temp; + bool32 preload; + bool32 preload2; + gUnknown_2026E3C = gUnknown_2026E58; - temp = 0; - if (gUnknown_2026E54 == 0) + preload = gUnknown_2026E54; + temp = FALSE; + + if (!gUnknown_2026E54) { - temp = 1; + temp = TRUE; } gUnknown_2026E54 = temp; - temp = 0; + + preload2 = gUnknown_2026E50; + temp = FALSE; - if (gUnknown_2026E50 == 0) + if (!gUnknown_2026E50) { - temp = 1; + temp = TRUE; } gUnknown_2026E50 = temp; sub_800CC44((gUnknown_2026E4E & (0xF8 << 5)) >> 8, gUnknown_2026E4E & 0x1F); - gUnknown_2026E38 = 1; -#else - asm_unified("\tpush {lr}\n" - "\tldr r1, _08006130\n" - "\tldr r0, _08006134\n" - "\tldr r0, [r0]\n" - "\tstr r0, [r1]\n" - "\tldr r2, _08006138\n" - "\tmovs r1, 0\n" - "\tldr r0, [r2]\n" - "\tcmp r0, 0\n" - "\tbne _08006102\n" - "\tmovs r1, 0x1\n" - "_08006102:\n" - "\tstr r1, [r2]\n" - "\tldr r2, _0800613C\n" - "\tmovs r1, 0\n" - "\tldr r0, [r2]\n" - "\tcmp r0, 0\n" - "\tbne _08006110\n" - "\tmovs r1, 0x1\n" - "_08006110:\n" - "\tstr r1, [r2]\n" - "\tldr r0, _08006140\n" - "\tldrh r2, [r0]\n" - "\tmovs r0, 0xF8\n" - "\tlsls r0, 5\n" - "\tands r0, r2\n" - "\tlsrs r0, 8\n" - "\tmovs r1, 0x1F\n" - "\tands r1, r2\n" - "\tbl sub_800CC44\n" - "\tldr r1, _08006144\n" - "\tmovs r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08006130: .4byte gUnknown_2026E3C\n" - "_08006134: .4byte gUnknown_2026E58\n" - "_08006138: .4byte gUnknown_2026E54\n" - "_0800613C: .4byte gUnknown_2026E50\n" - "_08006140: .4byte gUnknown_2026E4E\n" - "_08006144: .4byte gUnknown_2026E38"); -#endif + gUnknown_2026E38 = TRUE; } diff --git a/src/code_800C9CC.c b/src/code_800C9CC.c new file mode 100644 index 0000000..27445f0 --- /dev/null +++ b/src/code_800C9CC.c @@ -0,0 +1,237 @@ +#include "global.h" +#include "input.h" + +struct unkStruct_809CC88 +{ + u16 padding; + u16 unk2; + u16 unk4; + u16 unk6; +}; + +extern u16 gUnknown_203B0BC; +extern u8 gUnknown_202D6B8; +extern u8 gUnknown_202D6B9; +extern u16 gUnknown_202D7FA; + +extern struct unkStruct_809CC88 gUnknown_202D698; +extern struct unkStruct_809CC88 gUnknown_202D6A0; +extern struct unkStruct_809CC88 gUnknown_202D6A8; +extern struct unkStruct_809CC88 gUnknown_202D6B0; + +void ReadKeyInput(struct UnkInputStruct1 *r0) +{ + u16 keyInput = REG_KEYINPUT ^ KEYS_MASK; + r0->unk0 = 0; + + if((keyInput & DPAD_UP) != 0) + { + r0->unk0 = DPAD_UP; + } + + if((keyInput & DPAD_DOWN) != 0) + { + r0->unk0 |= DPAD_DOWN; + } + + if((keyInput & DPAD_LEFT) != 0) + { + r0->unk0 |= DPAD_LEFT; + } + + if((keyInput & DPAD_RIGHT) != 0) + { + r0->unk0 |= DPAD_RIGHT; + } + + if((keyInput & A_BUTTON) != 0) + { + r0->unk0 |= A_BUTTON; + } + + if((keyInput & B_BUTTON) != 0) + { + r0->unk0 |= B_BUTTON; + } + + if((keyInput & START_BUTTON) != 0) + { + r0->unk0 |= START_BUTTON; + } + + if((keyInput & SELECT_BUTTON) != 0) + { + r0->unk0 |= SELECT_BUTTON; + } + + if((keyInput & R_BUTTON) != 0) + { + r0->unk0 |= R_BUTTON; + } + + if((keyInput & L_BUTTON) != 0) + { + r0->unk0 |= L_BUTTON; + } + gUnknown_203B0BC = keyInput; +} + +void sub_800CC44(s32 r0, s32 r1) +{ + u32 preload1; + u8 preload2; + u8 preload3; + + if(r0 < 0) + { + r0 = 0; + } + else + { + if(r0 > 0x10) + { + r0 = 0x10; + } + } + if(r1 < 0) + { + r1 = 0; + } + else + { + if(r1 > 0x10) + { + r1 = 0x10; + } + } + gUnknown_202D6B8 = r0; + gUnknown_202D6B9 = r1; + + // Forcing the correct loads + preload1 = gUnknown_202D7FA; + preload2 = gUnknown_202D6B8; + preload3 = gUnknown_202D6B9; + + gUnknown_202D7FA = (gUnknown_202D6B9 << 8) | gUnknown_202D6B8; + +} + +void sub_800CC88(u32 r0, u32 r1) +{ + gUnknown_202D698.unk4 = r0; + gUnknown_202D698.unk6 = r1; +} + +void sub_800CC94(u32 r0, u32 r1) +{ + gUnknown_202D6A0.unk4 = r0; + gUnknown_202D6A0.unk6 = r1; +} + +void sub_800CCA0(u32 r0, u32 r1) +{ + gUnknown_202D6A8.unk4 = r0; + gUnknown_202D6A8.unk6 = r1; +} + +void sub_800CCAC(u32 r0, u32 r1) +{ + gUnknown_202D6B0.unk4 = r0; + gUnknown_202D6B0.unk6 = r1; +} + +void sub_800CCB8(s32 r0, u32 r1, u32 r2) +{ + if(r0 == 1) + { + goto _0800CCD4; + } + if(r0 <= 1) + { + goto _0800CCCA; + } + if(r0 == 2) + { + goto _0800CCDE; + } + if(r0 == 3) + { + goto _0800CCE8; + } + + _0800CCCA: + sub_800CC88(r1, r2); + return; + _0800CCD4: + sub_800CC94(r1, r2); + return; + _0800CCDE: + sub_800CCA0(r1, r2); + return; + _0800CCE8: + sub_800CCAC(r1, r2); +} + +void sub_800CCF4(s32 r0, u32 r1) +{ + if(r0 == 1) + { + goto _0800CD10; + } + if(r0 <= 1) + { + goto _0800CD06; + } + if(r0 == 2) + { + goto _0800CD18; + } + if(r0 == 3) + { + goto _0800CD20; + } + + _0800CD06: + gUnknown_202D698.unk4 = r1; + return; + _0800CD10: + gUnknown_202D6A0.unk4 = r1; + return; + _0800CD18: + gUnknown_202D6A8.unk4 = r1; + return; + _0800CD20: + gUnknown_202D6B0.unk4 = r1; +} + +void sub_800CD2C(s32 r0, u32 r1) +{ + if(r0 == 1) + { + goto _0800CD48; + } + if(r0 <= 1) + { + goto _0800CD3E; + } + if(r0 == 2) + { + goto _0800CD50; + } + if(r0 == 3) + { + goto _0800CD58; + } + + _0800CD3E: + gUnknown_202D698.unk6 = r1; + return; + _0800CD48: + gUnknown_202D6A0.unk6 = r1; + return; + _0800CD50: + gUnknown_202D6A8.unk6 = r1; + return; + _0800CD58: + gUnknown_202D6B0.unk6 = r1; +} diff --git a/src/music.c b/src/music.c index b6fed30..7767f16 100644 --- a/src/music.c +++ b/src/music.c @@ -1,6 +1,8 @@ #include "global.h" #include "gba/m4a_internal.h" +#define NUM_BG_SONGS 128 + extern u8 sub_80023E4(u32); extern void sub_80118C4(u16); extern void sub_809C730(); @@ -13,18 +15,23 @@ extern void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo); extern void m4aSoundVSyncOff(); extern void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); -extern u16 sub_800CAE0(u16); -extern u8 sub_800CACC(u32); -extern u8 sub_800CAAC(u32); extern void sub_800C3F8(u16, u16); - +extern void Random(); +extern void sub_800BA5C(); +extern void xxx_update_bg_sound_input(); extern u16 gUnknown_202D690; extern u16 gUnknown_202D68A; extern u16 gUnknown_202D688; extern u8 gUnknown_202D694; +extern u32 gUnknown_203B0B8; +extern u16 gUnknown_203B0BC; extern struct MusicPlayerInfo gUnknown_20008F0; +bool8 IsBGSong(u32); +bool8 sub_800CAAC(u32); +bool8 sub_800CACC(u32); +u16 sub_800CAE0(u16); void sub_800C93C(void) { @@ -98,3 +105,172 @@ void nullsub_179(void) { } +#ifndef NONMATCHING +NAKED +#endif +u8 sub_800CA38(u32 songIndex) +{ +#ifdef NONMATCHING + if(IsBGSong(songIndex)) + { + if(sub_800CAE0(songIndex) == 0) + { + return 1; + } + } + if(sub_800CACC(songIndex)) + { + // TODO compiler gets weird here wanted to skip to next check + if(sub_800CAE0(songIndex) == 1) + { + _0800CA70: + return 1; + } + } + if(sub_800CAAC(songIndex)) + { + if((sub_800CAE0(songIndex) > 1)) + { + goto _0800CA70; + } + } + return 0; +#else + asm_unified("\tpush {r4,lr}\n" + "\tadds r4, r0, 0\n" + "\tbl IsBGSong\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0800CA54\n" + "\tlsls r0, r4, 16\n" + "\tlsrs r0, 16\n" + "\tbl sub_800CAE0\n" + "\tlsls r0, 16\n" + "\tcmp r0, 0\n" + "\tbeq _0800CA70\n" +"_0800CA54:\n" + "\tadds r0, r4, 0\n" + "\tbl sub_800CACC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0800CA74\n" + "\tlsls r0, r4, 16\n" + "\tlsrs r0, 16\n" + "\tbl sub_800CAE0\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x1\n" + "\tbne _0800CA90\n" +"_0800CA70:\n" + "\tmovs r0, 0x1\n" + "\tb _0800CA92\n" +"_0800CA74:\n" + "\tadds r0, r4, 0\n" + "\tbl sub_800CAAC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0800CA90\n" + "\tlsls r0, r4, 16\n" + "\tlsrs r0, 16\n" + "\tbl sub_800CAE0\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x1\n" + "\tbhi _0800CA70\n" +"_0800CA90:\n" + "\tmovs r0, 0\n" +"_0800CA92:\n" + "\tpop {r4}\n" + "\tpop {r1}\n" + "\tbx r1"); +#endif +} + +void nullsub_19(void) +{ +} + +bool8 IsBGSong(u32 songIndex) +{ + if(songIndex <= NUM_BG_SONGS) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_800CAAC(u32 songIndex) +{ + if(songIndex - 300 <= 639) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_800CACC(u32 songIndex) +{ + if(songIndex - 200 <= 19) + { + return TRUE; + } + return FALSE; +} + +u16 sub_800CAE0(u16 songIndex) +{ + return gSongTable[songIndex].ms; +} + +bool8 sub_800CAF0(u16 songIndex) +{ + // Had to cast this.. m4a_internal header has this as u32 + if((u16)gMPlayTable[songIndex].info->status == 0) + { + return 0; + } + return 1; +} + +void nullsub_20(void) +{ +} + +void nullsub_21(void) +{ +} + +void sub_800CB20(void) +{ + sub_800BA5C(); + gUnknown_203B0B8++; + if((gUnknown_203B0BC & 5) != 0) + { + Random(); + } + Random(); +} + +u32 sub_800CB50(void) +{ + return gUnknown_203B0B8; +} + +void nullsub_180(void) +{ +} + +void xxx_call_update_bg_sound_input(void) +{ + xxx_update_bg_sound_input(); +} + +void nullsub_181(void) +{ +} + +u32 sub_800CB70(void) +{ + return 0; +} + -- cgit v1.2.3 From 9237db777e49204e8f09ec6607caefedb469da05 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 12 Nov 2020 18:26:02 -0600 Subject: 3% decompiled woo --- src/code_801D760.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/code_8092334.c | 19 ++++++++++ 2 files changed, 120 insertions(+) (limited to 'src') diff --git a/src/code_801D760.c b/src/code_801D760.c index 89cd661..e2e6617 100644 --- a/src/code_801D760.c +++ b/src/code_801D760.c @@ -8,6 +8,19 @@ extern u32 sub_80270A4(); extern u32 sub_8025F68(); extern u8 sub_802604C(); extern void sub_8026058(); +extern u32 sub_8025354(void); +extern u8 sub_802540C(void); +extern void sub_8025418(void); +extern u32 sub_80244E4(void); +extern void sub_802453C(void); +extern u32 sub_801BF48(void); +extern void sub_801BF98(void); +extern u32 sub_80217EC(void); +extern void sub_8021830(void); +extern u32 sub_802C898(void); +extern void sub_802C8F4(void); +extern u32 sub_801DCE8(void); +extern void sub_801DD50(void); struct unk_203B250 { @@ -58,3 +71,91 @@ void sub_801D798(void) sub_8026058(); sub_801D208(2); } + +void sub_801D7CC() +{ + u32 check; + u32 temp2; + + check = sub_8025354(); + if(check <= 1) + return; + if(check > 3) + return; + + temp2 = sub_802540C(); + gUnknown_203B250->unk7 = temp2; + + sub_8025418(); + + if(gUnknown_203B250->unk7 != 0) + { + sub_801D208(2); + } + else + { + sub_801D208(1); + } +} + +void sub_801D808(void) +{ + u32 check; + + check = sub_80244E4(); + if(check <= 1) + return; + if(check > 3) + return; + + sub_802453C(); + sub_801D208(1); +} + +void sub_801D824(void) +{ + u32 check; + check = sub_801BF48(); + if(check <= 1) + return; + if(check > 3) + return; + sub_801BF98(); + sub_801D208(1); +} + +void sub_801D840(void) +{ + u32 check; + check = sub_80217EC(); + if(check <= 1) + return; + if(check > 3) + return; + sub_8021830(); + sub_801D208(1); +} + +void sub_801D85C(void) +{ + u32 check; + check = sub_802C898(); + if(check <= 1) + return; + if(check > 3) + return; + sub_802C8F4(); + sub_801D208(1); +} + +void sub_801D878(void) +{ + u32 check; + check = sub_801DCE8(); + if(check <= 1) + return; + if(check > 3) + return; + sub_801DD50(); + sub_801D208(1); +} diff --git a/src/code_8092334.c b/src/code_8092334.c index d5d17ee..1fba58e 100644 --- a/src/code_8092334.c +++ b/src/code_8092334.c @@ -14,6 +14,7 @@ extern u8 *AbilityDescriptions[]; extern u8 gBoughtFriendAreas[NUM_FRIEND_AREAS]; extern u8 *gUnknown_203B468; +extern s16 gUnknown_810AA90[]; u32 GetUnformattedTypeString(u8 type) { @@ -63,3 +64,21 @@ void sub_80923B8(void) gUnknown_203B468[counter] = 0; } } + +u8 sub_80923D4(s32 target) +{ + s32 counter; + s32 index; + s32 sum = 0; + index = 0; + for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) + { + sum += gUnknown_810AA90[index]; + if(sum > target) + { + return counter; + } + index += 4; + } + return 0; +} -- cgit v1.2.3 From 3b75b10bbbc99fbbba573142a3f027c3c0492593 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 14 Nov 2020 17:44:04 -0600 Subject: more decomping and some data dumping --- src/code_800D090.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/code_801D760.c | 28 +++++++++++------------ src/code_809D148.c | 42 ++++++++++++++++++++++++++--------- 3 files changed, 110 insertions(+), 25 deletions(-) create mode 100644 src/code_800D090.c (limited to 'src') diff --git a/src/code_800D090.c b/src/code_800D090.c new file mode 100644 index 0000000..1031a2d --- /dev/null +++ b/src/code_800D090.c @@ -0,0 +1,65 @@ +#include "global.h" + +extern void SoundBiasReset(void); +extern void SoundBiasSet(void); + +void Hang(void) +{ + while(1) + { + asm("swi 0x2"); + } +} + + +// Unused +void sub_800D098(void) +{ + u32 dispcnt_save; + u32 ie_store; + + while(REG_VCOUNT <= 159) + ; + + // Save DISPCNT and set to 0 + dispcnt_save = REG_DISPCNT; + REG_DISPCNT = 0; + + *(u16 *)BG_PLTT = 0xefff; + + while(REG_KEYINPUT != 0x3ff) // 0011 1111 1111 (all buttons) + ; + + + REG_IME = 0; + + // Save IE Register + ie_store = REG_IE; + REG_IE = INTR_FLAG_KEYPAD | INTR_FLAG_GAMEPAK; + + REG_KEYCNT = 0xC304; // TODO 1100 0011 0000 0100 + // Select: + // * Select button + // * L/R Button + // Enable IRQ + // Logical AND + // So do something when all buttons above are pressed + + REG_IME = 1; + + SoundBiasReset(); + asm("swi 0x3"); + SoundBiasSet(); + + REG_IME = 0; + + REG_IE = ie_store; // restore IE + REG_KEYCNT = 0; // reset KEYCNT + + REG_IME = 1; + + // Good after here + while(REG_VCOUNT <= 159){} + REG_DISPCNT = dispcnt_save; // restore DISPCNT + while(REG_KEYINPUT != 0x3ff){} // All buttons +} diff --git a/src/code_801D760.c b/src/code_801D760.c index e2e6617..c2266ec 100644 --- a/src/code_801D760.c +++ b/src/code_801D760.c @@ -1,26 +1,26 @@ #include "global.h" +extern u32 sub_801BF48(void); +extern void sub_801BF98(void); +extern void sub_801D208(u8); +extern u32 sub_801DCE8(void); +extern void sub_801DD50(void); +extern u32 sub_80217EC(void); +extern void sub_8021830(void); extern u32 sub_8022860(); extern void sub_8022908(); -extern void sub_801D208(u8); -extern void sub_8027168(); -extern u32 sub_80270A4(); -extern u32 sub_8025F68(); -extern u8 sub_802604C(); -extern void sub_8026058(); +extern u32 sub_80244E4(void); +extern void sub_802453C(void); extern u32 sub_8025354(void); extern u8 sub_802540C(void); extern void sub_8025418(void); -extern u32 sub_80244E4(void); -extern void sub_802453C(void); -extern u32 sub_801BF48(void); -extern void sub_801BF98(void); -extern u32 sub_80217EC(void); -extern void sub_8021830(void); +extern u32 sub_8025F68(); +extern u8 sub_802604C(); +extern void sub_8026058(); +extern void sub_8027168(); +extern u32 sub_80270A4(); extern u32 sub_802C898(void); extern void sub_802C8F4(void); -extern u32 sub_801DCE8(void); -extern void sub_801DD50(void); struct unk_203B250 { diff --git a/src/code_809D148.c b/src/code_809D148.c index 965ca12..5d3c908 100644 --- a/src/code_809D148.c +++ b/src/code_809D148.c @@ -18,6 +18,9 @@ struct unkStruct_20399E8 u32 unk30; u32 unk34; u32 unk38; + u32 unk3C; + u32 unk40; + u8 unk44; }; struct unkStruct_809D158 @@ -264,14 +267,31 @@ u32 sub_809D234(void) } // TODO regswap but matches otherwise -//u8 sub_809D248(struct unkStruct_809D158 *r0) -//{ -// u32 temp; -// u32 temp1; -// -// temp = gUnknown_20399E8.unk3C; -// temp1 = gUnknown_20399E8.unk40; -// r0->unk0 = temp; -// r0->unk4 = temp1; -// return gUnknown_20399E8.unk44; -//} +// Loads struct into R1... should be R3 +#ifndef NONMATCHING +NAKED +#endif +u8 sub_809D248(struct unkStruct_809D158 *r0) +{ +#ifdef NONMATCHING + u32 temp; + u32 temp1; + + temp = gUnknown_20399E8.unk3C; + temp1 = gUnknown_20399E8.unk40; + r0->unk0 = temp; + r0->unk4 = temp1; + return gUnknown_20399E8.unk44; +#else + asm_unified("\tldr r3, _0809D258\n" + "\tldr r1, [r3, 0x3C]\n" + "\tldr r2, [r3, 0x40]\n" + "\tstr r1, [r0]\n" + "\tstr r2, [r0, 0x4]\n" + "\tadds r3, 0x44\n" + "\tldrb r0, [r3]\n" + "\tbx lr\n" + "\t.align 2, 0\n" +"_0809D258: .4byte gUnknown_20399E8"); +#endif +} -- cgit v1.2.3 From 6e33dcb93724d51d7f3db1eac0adbfb3cb4f4128 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 17 Nov 2020 22:20:28 -0600 Subject: more work on music functions --- src/music.c | 14 +-- src/music_pre.c | 281 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 285 insertions(+), 10 deletions(-) create mode 100644 src/music_pre.c (limited to 'src') diff --git a/src/music.c b/src/music.c index 7767f16..13544d9 100644 --- a/src/music.c +++ b/src/music.c @@ -1,5 +1,5 @@ #include "global.h" -#include "gba/m4a_internal.h" +#include "m4a.h" #define NUM_BG_SONGS 128 @@ -9,24 +9,18 @@ extern void sub_809C730(); extern bool8 DisableInterrupts(); extern bool8 EnableInterrupts(); -extern void m4aSoundVSyncOn(); -extern void m4aSongNumStart(u16); -extern void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo); -extern void m4aSoundVSyncOff(); -extern void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); extern void sub_800C3F8(u16, u16); extern void Random(); extern void sub_800BA5C(); extern void xxx_update_bg_sound_input(); -extern u16 gUnknown_202D690; -extern u16 gUnknown_202D68A; extern u16 gUnknown_202D688; +extern u16 gUnknown_202D68A; +extern u16 gUnknown_202D690; extern u8 gUnknown_202D694; extern u32 gUnknown_203B0B8; extern u16 gUnknown_203B0BC; -extern struct MusicPlayerInfo gUnknown_20008F0; bool8 IsBGSong(u32); bool8 sub_800CAAC(u32); @@ -232,7 +226,7 @@ bool8 sub_800CAF0(u16 songIndex) return 1; } -void nullsub_20(void) +void nullsub_20(u16 songIndex) { } diff --git a/src/music_pre.c b/src/music_pre.c new file mode 100644 index 0000000..e8caf12 --- /dev/null +++ b/src/music_pre.c @@ -0,0 +1,281 @@ +#include "global.h" +#include "gba/io_reg.h" +#include "m4a.h" + +extern void nullsub_19(void); +extern void nullsub_20(u16 songIndex); +extern bool8 EnableInterrupts(void); +extern bool8 DisableInterrupts(void); +extern bool8 IsBGSong(u32); + +extern void sub_800C298(u16 r0); +extern u16 sub_800CAE0(u16); + +extern u32 gUnknown_202D5F0[]; +extern u16 gUnknown_202D688; +extern u16 gUnknown_202D68A; +extern u16 gUnknown_202D68C; +extern u16 gUnknown_202D68E; +extern u16 gUnknown_202D690; +extern u16 gUnknown_202D692; +extern u8 gUnknown_202D694; + +struct unkStruct_3000FD8 +{ + u16 unk0; + u16 unk2; + u16 unk4; + u8 unk6; + u8 padding; +}; + +extern struct unkStruct_3000FD8 gUnknown_3000FD8[]; + +void sub_800BF80(void); + +void sub_800BD08(void) +{ + s32 counter; + u16 zero; + u16 zero2; + + struct unkStruct_3000FD8 *preload; + + DmaStop(0); + DmaStop(1); + DmaStop(2); + DmaStop(3); + + m4aSoundInit(); + + gUnknown_202D688 = 0; + gUnknown_202D68A = 0x3e7; + gUnknown_202D68C = 0x3e7; + gUnknown_202D68E = 0x3e5; + gUnknown_202D690 = 0; + gUnknown_202D692 = 0; + gUnknown_202D694 = 0; + + // Kinda hacky but makes things match + preload = gUnknown_3000FD8; + zero = 0; + zero2 = 0; + counter = 7; + + while(counter >= 0) + { + preload->unk0 = zero2; + preload->unk2 = 0x3e5; + preload->unk4 = zero2; + preload->unk6 = zero; + counter--; + preload++; + } + nullsub_19(); +} + +void sub_800BDDC(void) +{ + sub_800BF80(); + sub_800C298(0x3e6); + sub_800C298(0x3e5); +} + + +void sub_800BDFC(u16 songIndex) +{ + bool8 interrupt_flag; + u16 temp_store; + + if(!IsBGSong(songIndex)) + return; + if(songIndex == 0x3e7) + return; + if(songIndex == gUnknown_202D68A) + { + temp_store = gUnknown_202D688 - 1; + if(temp_store <= 1) + return; + } + if(sub_800CAE0(songIndex)) + { + nullsub_20(songIndex); + return; + } + interrupt_flag = DisableInterrupts(); + gUnknown_202D68A = songIndex; + gUnknown_202D694 = 1; + + if(gUnknown_202D690 == 0) + { + gUnknown_202D688 = 1; + m4aSongNumStart(songIndex); + } + if(interrupt_flag) + EnableInterrupts(); +} + +#ifndef NONMATCHING +NAKED +#endif +void sub_800BE8C(u16 SongIndex, u16 r1) +{ +#ifdef NONMATCHING + // TODO regswap memes + bool8 interrupt_flag; + u16 temp_store; + + if(!IsBGSong(SongIndex)) + return; + if(SongIndex == 0x3e7) + return; + if(SongIndex == gUnknown_202D68A) + { + temp_store = gUnknown_202D688 - 1; + if((temp_store) <= 1) + return; + } + + if((r1 > 0x80 << 1)) + { + r1 = 0x10; + + } + else + { + if(r1 >> 4 == 0) + { + r1 = 1; + } + } + + interrupt_flag = DisableInterrupts(); + gUnknown_202D68A = SongIndex; + gUnknown_202D694 = 1; + + if(gUnknown_202D690 == 0) + { + gUnknown_202D688 = 1; + m4aSongNumStart(SongIndex); + m4aMPlayImmInit(&gUnknown_20008F0); + m4aMPlayVolumeControl(&gUnknown_20008F0, 0xFF, 0); + m4aSongNumStop(SongIndex); + m4aMPlayFadeIn(&gUnknown_20008F0, r1); + } + if(interrupt_flag) + EnableInterrupts(); +#else + asm_unified("\tpush {r4-r7,lr}\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tlsls r4, r1, 16\n" + "\tlsrs r5, r4, 16\n" + "\tadds r0, r6, 0\n" + "\tbl IsBGSong\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0800BF2E\n" + "\tldr r0, _0800BECC\n" + "\tcmp r6, r0\n" + "\tbeq _0800BF2E\n" + "\tldr r0, _0800BED0\n" + "\tldrh r0, [r0]\n" + "\tcmp r6, r0\n" + "\tbne _0800BEBE\n" + "\tldr r0, _0800BED4\n" + "\tldrh r0, [r0]\n" + "\tsubs r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x1\n" + "\tbls _0800BF2E\n" +"_0800BEBE:\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 1\n" + "\tcmp r5, r0\n" + "\tbls _0800BED8\n" + "\tmovs r5, 0x10\n" + "\tb _0800BEE0\n" + "\t.align 2, 0\n" +"_0800BECC: .4byte 0x000003e7\n" +"_0800BED0: .4byte gUnknown_202D68A\n" +"_0800BED4: .4byte gUnknown_202D688\n" +"_0800BED8:\n" + "\tlsrs r5, r4, 20\n" + "\tcmp r5, 0\n" + "\tbne _0800BEE0\n" + "\tmovs r5, 0x1\n" +"_0800BEE0:\n" + "\tbl DisableInterrupts\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r0, _0800BF34\n" + "\tstrh r6, [r0]\n" + "\tldr r1, _0800BF38\n" + "\tmovs r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tldr r0, _0800BF3C\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _0800BF26\n" + "\tldr r0, _0800BF40\n" + "\tmovs r1, 0x1\n" + "\tstrh r1, [r0]\n" + "\tadds r0, r6, 0\n" + "\tbl m4aSongNumStart\n" + "\tldr r4, _0800BF44\n" + "\tadds r0, r4, 0\n" + "\tbl m4aMPlayImmInit\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0xFF\n" + "\tmovs r2, 0\n" + "\tbl m4aMPlayVolumeControl\n" + "\tadds r0, r6, 0\n" + "\tbl m4aSongNumStop\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r5, 0\n" + "\tbl m4aMPlayFadeIn\n" +"_0800BF26:\n" + "\tcmp r7, 0\n" + "\tbeq _0800BF2E\n" + "\tbl EnableInterrupts\n" +"_0800BF2E:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0800BF34: .4byte gUnknown_202D68A\n" +"_0800BF38: .4byte gUnknown_202D694\n" +"_0800BF3C: .4byte gUnknown_202D690\n" +"_0800BF40: .4byte gUnknown_202D688\n" +"_0800BF44: .4byte gUnknown_20008F0"); +#endif +} + +void sub_800BF48(u16 SongIndex) +{ + u16 preload = gUnknown_202D68A; + if(preload == 0x3e7) + { + sub_800BDFC(SongIndex); + gUnknown_202D68C = preload; + return; + } + gUnknown_202D68C = SongIndex; +} + +void sub_800BF80(void) +{ + bool8 interrupt_flag = DisableInterrupts(); + if(gUnknown_202D690 == 0) + { + if(gUnknown_202D68A != 0x3e7) + { + m4aMPlayStop(&gUnknown_20008F0); + } + } + gUnknown_202D68A = 0x3e7; + gUnknown_202D68C = 0x3e7; + if(interrupt_flag) + EnableInterrupts(); +} -- cgit v1.2.3 From 1b46057bb8a3e8e04484c14eebf26f2f7126b940 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 17 Nov 2020 22:57:16 -0600 Subject: doc a music function --- src/code_80118A4.c | 6 +++--- src/music_pre.c | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/code_80118A4.c b/src/code_80118A4.c index aedcb2e..eca4558 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -5,7 +5,7 @@ void nullsub_26(void); extern u8 sub_80023E4(u8); extern void sub_800BDFC(u16 r0); -extern void sub_800BE8C(u16 r0, u16 r1); +extern void FadeInNewBGM(u16 r0, u16 r1); extern void sub_800BF48(u16 r0); extern void sub_800BF80(void); extern void sub_800BFD0(u16 r0); @@ -158,9 +158,9 @@ void sub_80118F0(u16 r0) sub_800BDFC(r0); } -void sub_8011900(u16 r0, u16 r1) +void sub_8011900(u16 songIndex, u16 speed) { - sub_800BE8C(r0, r1); + FadeInNewBGM(songIndex, speed); } void sub_8011914(u16 r0) diff --git a/src/music_pre.c b/src/music_pre.c index e8caf12..54f60d3 100644 --- a/src/music_pre.c +++ b/src/music_pre.c @@ -118,7 +118,7 @@ void sub_800BDFC(u16 songIndex) #ifndef NONMATCHING NAKED #endif -void sub_800BE8C(u16 SongIndex, u16 r1) +void FadeInNewBGM(u16 SongIndex, u16 speed) { #ifdef NONMATCHING // TODO regswap memes @@ -136,16 +136,16 @@ void sub_800BE8C(u16 SongIndex, u16 r1) return; } - if((r1 > 0x80 << 1)) + if((speed > 0x80 << 1)) { - r1 = 0x10; + speed = 0x10; } else { - if(r1 >> 4 == 0) + if(speed >> 4 == 0) { - r1 = 1; + speed = 1; } } @@ -160,7 +160,7 @@ void sub_800BE8C(u16 SongIndex, u16 r1) m4aMPlayImmInit(&gUnknown_20008F0); m4aMPlayVolumeControl(&gUnknown_20008F0, 0xFF, 0); m4aSongNumStop(SongIndex); - m4aMPlayFadeIn(&gUnknown_20008F0, r1); + m4aMPlayFadeIn(&gUnknown_20008F0, speed); } if(interrupt_flag) EnableInterrupts(); -- cgit v1.2.3 From 578522b3d344866c38e6e2e01e6b26ba6a5c0107 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 18 Nov 2020 00:44:35 -0600 Subject: match another function and fix nonmatching --- src/music_pre.c | 147 ++++++++++++++++++++------------------------------------ 1 file changed, 53 insertions(+), 94 deletions(-) (limited to 'src') diff --git a/src/music_pre.c b/src/music_pre.c index 54f60d3..45afc01 100644 --- a/src/music_pre.c +++ b/src/music_pre.c @@ -115,13 +115,8 @@ void sub_800BDFC(u16 songIndex) EnableInterrupts(); } -#ifndef NONMATCHING -NAKED -#endif void FadeInNewBGM(u16 SongIndex, u16 speed) { -#ifdef NONMATCHING - // TODO regswap memes bool8 interrupt_flag; u16 temp_store; @@ -136,14 +131,14 @@ void FadeInNewBGM(u16 SongIndex, u16 speed) return; } - if((speed > 0x80 << 1)) + if((speed > 256)) { - speed = 0x10; + speed = 16; } else { - if(speed >> 4 == 0) + if((speed >>= 4) == 0) { speed = 1; } @@ -164,92 +159,6 @@ void FadeInNewBGM(u16 SongIndex, u16 speed) } if(interrupt_flag) EnableInterrupts(); -#else - asm_unified("\tpush {r4-r7,lr}\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tlsls r4, r1, 16\n" - "\tlsrs r5, r4, 16\n" - "\tadds r0, r6, 0\n" - "\tbl IsBGSong\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _0800BF2E\n" - "\tldr r0, _0800BECC\n" - "\tcmp r6, r0\n" - "\tbeq _0800BF2E\n" - "\tldr r0, _0800BED0\n" - "\tldrh r0, [r0]\n" - "\tcmp r6, r0\n" - "\tbne _0800BEBE\n" - "\tldr r0, _0800BED4\n" - "\tldrh r0, [r0]\n" - "\tsubs r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x1\n" - "\tbls _0800BF2E\n" -"_0800BEBE:\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 1\n" - "\tcmp r5, r0\n" - "\tbls _0800BED8\n" - "\tmovs r5, 0x10\n" - "\tb _0800BEE0\n" - "\t.align 2, 0\n" -"_0800BECC: .4byte 0x000003e7\n" -"_0800BED0: .4byte gUnknown_202D68A\n" -"_0800BED4: .4byte gUnknown_202D688\n" -"_0800BED8:\n" - "\tlsrs r5, r4, 20\n" - "\tcmp r5, 0\n" - "\tbne _0800BEE0\n" - "\tmovs r5, 0x1\n" -"_0800BEE0:\n" - "\tbl DisableInterrupts\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r0, _0800BF34\n" - "\tstrh r6, [r0]\n" - "\tldr r1, _0800BF38\n" - "\tmovs r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tldr r0, _0800BF3C\n" - "\tldrh r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _0800BF26\n" - "\tldr r0, _0800BF40\n" - "\tmovs r1, 0x1\n" - "\tstrh r1, [r0]\n" - "\tadds r0, r6, 0\n" - "\tbl m4aSongNumStart\n" - "\tldr r4, _0800BF44\n" - "\tadds r0, r4, 0\n" - "\tbl m4aMPlayImmInit\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0xFF\n" - "\tmovs r2, 0\n" - "\tbl m4aMPlayVolumeControl\n" - "\tadds r0, r6, 0\n" - "\tbl m4aSongNumStop\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0\n" - "\tbl m4aMPlayFadeIn\n" -"_0800BF26:\n" - "\tcmp r7, 0\n" - "\tbeq _0800BF2E\n" - "\tbl EnableInterrupts\n" -"_0800BF2E:\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" -"_0800BF34: .4byte gUnknown_202D68A\n" -"_0800BF38: .4byte gUnknown_202D694\n" -"_0800BF3C: .4byte gUnknown_202D690\n" -"_0800BF40: .4byte gUnknown_202D688\n" -"_0800BF44: .4byte gUnknown_20008F0"); -#endif } void sub_800BF48(u16 SongIndex) @@ -279,3 +188,53 @@ void sub_800BF80(void) if(interrupt_flag) EnableInterrupts(); } + +void sub_800BFD0(u16 speed) +{ + + u32 comparison; + bool8 interrupt_flag; + + // TODO clean this comparison up + comparison = 0x80 << 17; // 16777216 + if((speed * 65536) > comparison) + { + speed = 16; + } + else + { + if((speed >>= 4) == 0) + { + speed = 1; + } + } + interrupt_flag = DisableInterrupts(); + if(gUnknown_202D690 == 0) + { + if(gUnknown_202D68A != 0x3e7) + { + if(gUnknown_202D688 == 2) + { + gUnknown_202D688 = 3; + m4aMPlayFadeOut(&gUnknown_20008F0, speed); + } + else + { + gUnknown_202D68A = 0x3e7; + m4aMPlayStop(&gUnknown_20008F0); + } + } + } + else + { + gUnknown_202D68A = 0x3e7; + } + gUnknown_202D68C = 0x3e7; + if(interrupt_flag) + EnableInterrupts(); +} + +u16 sub_800C068(void) +{ + return gUnknown_202D68A; +} -- cgit v1.2.3 From 5f8105180b15f04d48c72df2953d267c87d6148c Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 19 Nov 2020 11:27:18 -0600 Subject: combining and doc'ing of playtime things --- src/code_8094F88.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++------- src/code_8095014.c | 87 ---------------------------------- src/save_mid.c | 20 ++++---- 3 files changed, 131 insertions(+), 113 deletions(-) delete mode 100644 src/code_8095014.c (limited to 'src') diff --git a/src/code_8094F88.c b/src/code_8094F88.c index 2a0e618..dea2561 100644 --- a/src/code_8094F88.c +++ b/src/code_8094F88.c @@ -1,35 +1,140 @@ #include "global.h" +#include "time.h" + +extern struct PlayTimeStruct *gUnknown_203B47C; +extern struct PlayTimeStruct gPlayTime; + +extern u8 gUnknown_2038C88; +extern u8 gUnknown_2039288; +extern u32 gUnknown_20392E8; +extern u32 gUnknown_20393C0; +extern u8 *gUnknown_203B480; +extern u8 *gUnknown_203B484; +extern u32 *gUnknown_203B488; +extern u32 *gUnknown_203B48C; -struct unkTimeStruct -{ - u16 unk0; - u8 unk2; - u8 unk3; - u8 unk4; -}; -extern struct unkTimeStruct *gUnknown_203B47C; -extern struct unkTimeStruct gPlayTime; +extern void sub_809488C(u32, u32, u32); +extern void sub_8094924(u32, u32, u32); + // Forward Declaration -void sub_8094FA8(struct unkTimeStruct *Time); +void ResetPlayTime(struct PlayTimeStruct *Time); void sub_8094F88(void) { gUnknown_203B47C = &gPlayTime; - sub_8094FA8(&gPlayTime); + ResetPlayTime(&gPlayTime); } -struct unkTimeStruct *sub_8094FA0(void) +struct PlayTimeStruct *sub_8094FA0(void) { return &gPlayTime; } -void sub_8094FA8(struct unkTimeStruct *Time) +void ResetPlayTime(struct PlayTimeStruct *Time) { - Time->unk4 = 0; - Time->unk3 = 0; - Time->unk2 = 0; + Time->seconds = 0; + Time->minutes = 0; + Time->hours = 0; Time->unk0 = 0; } + +void sub_8094FB4(struct PlayTimeStruct *Time) +{ + u16 temp_store16; + + Time->seconds++; + if(Time->seconds <= 59) + return; + Time->seconds = 0; + + Time->minutes++; + if(Time->minutes <= 59) + return; + Time->minutes = 0; + + Time->hours++; + if(Time->hours <= 59) + return; + Time->hours = 0; + + // ??? + temp_store16 = Time->unk0; + if(Time->unk0 <= 9998) + { + temp_store16++; + Time->unk0 = temp_store16; + } + else + { + Time->minutes = 59; + Time->hours = 59; + Time->unk0 = 9999; + } +} + +void sub_8095014(struct PlayTimeStruct *r0, u32 *r1, u32 *r2, u32 *r3) +{ + u32 temp; + if(r0->unk0 <= 9999) + { + *r1 = r0->unk0; + *r2 = r0->hours; + temp = r0->minutes; + } + else + { + *r1 = 9999; + *r2 = 59; + temp = 59; + } + *r3 = temp; +} + +void sub_8095044(u32 r0) +{ + sub_809488C(r0, (u32)(gUnknown_203B47C) + 4, 0x6); + sub_809488C(r0, (u32)(gUnknown_203B47C) + 3, 0x6); + sub_809488C(r0, (u32)(gUnknown_203B47C) + 2, 0x6); + sub_809488C(r0, (u32)(gUnknown_203B47C), 0xE); +} + +void sub_8095080(u32 r0) +{ + sub_8094924(r0, (u32)(gUnknown_203B47C) + 4, 0x6); + sub_8094924(r0, (u32)(gUnknown_203B47C) + 3, 0x6); + sub_8094924(r0, (u32)(gUnknown_203B47C) + 2, 0x6); + sub_8094924(r0, (u32)(gUnknown_203B47C), 0xE); +} + +void sub_80950BC(void) +{ + gUnknown_203B480 = &gUnknown_2038C88; + gUnknown_203B484 = &gUnknown_2039288; + gUnknown_203B488 = &gUnknown_20392E8; + gUnknown_203B48C = &gUnknown_20393C0; +} + +u8 *sub_80950F8(void) +{ + return &gUnknown_2038C88; +} + +u8 *sub_8095100(void) +{ + return &gUnknown_2039288; +} + +u32 *sub_8095108(void) +{ + return &gUnknown_20392E8; +} + +u32 *sub_8095110(void) +{ + return &gUnknown_20393C0; +} + + diff --git a/src/code_8095014.c b/src/code_8095014.c deleted file mode 100644 index 7f3fb05..0000000 --- a/src/code_8095014.c +++ /dev/null @@ -1,87 +0,0 @@ -#include "global.h" - -struct unk_8094FB4 -{ - s16 unk0; - u8 unk2; - u8 unk3; - u8 unk4; -}; - - -extern u32 *gUnknown_203B480; -extern u32 *gUnknown_203B484; -extern u32 *gUnknown_203B488; -extern u32 *gUnknown_203B48C; - -extern u32 gUnknown_203B47C; -extern u32 gUnknown_2038C88; -extern u32 gUnknown_2039288; -extern u32 gUnknown_20392E8; -extern u32 gUnknown_20393C0; - -extern void sub_809488C(u32, u32, u32); -extern void sub_8094924(u32, u32, u32); - -void sub_8095014(struct unk_8094FB4 *r0, u32 *r1, u32 *r2, u32 *r3) -{ - u32 temp; - if(r0->unk0 <= 0x270f) - { - *r1 = r0->unk0; - *r2 = r0->unk2; - temp = r0->unk3; - } - else - { - *r1 = 0x270f; - *r2 = 0x3B; - temp = 0x3B; - } - *r3 = temp; -} - -void sub_8095044(u32 r0) -{ - sub_809488C(r0, gUnknown_203B47C + 4, 0x6); - sub_809488C(r0, gUnknown_203B47C + 3, 0x6); - sub_809488C(r0, gUnknown_203B47C + 2, 0x6); - sub_809488C(r0, gUnknown_203B47C, 0xE); -} - -void sub_8095080(u32 r0) -{ - sub_8094924(r0, gUnknown_203B47C + 4, 0x6); - sub_8094924(r0, gUnknown_203B47C + 3, 0x6); - sub_8094924(r0, gUnknown_203B47C + 2, 0x6); - sub_8094924(r0, gUnknown_203B47C, 0xE); -} - -void sub_80950BC(void) -{ - gUnknown_203B480 = &gUnknown_2038C88; - gUnknown_203B484 = &gUnknown_2039288; - gUnknown_203B488 = &gUnknown_20392E8; - gUnknown_203B48C = &gUnknown_20393C0; -} - -u32 *sub_80950F8(void) -{ - return &gUnknown_2038C88; -} - -u32 *sub_8095100(void) -{ - return &gUnknown_2039288; -} - -u32 *sub_8095108(void) -{ - return &gUnknown_20392E8; -} - -u32 *sub_8095110(void) -{ - return &gUnknown_20393C0; -} - diff --git a/src/save_mid.c b/src/save_mid.c index ce1b378..13e9cbf 100644 --- a/src/save_mid.c +++ b/src/save_mid.c @@ -25,18 +25,18 @@ struct unk_struct extern struct unk_203B188 *gUnknown_203B188; -extern u32 *gUnknown_203B460; extern u32 *gUnknown_203B45C; -extern u32 *gUnknown_203B480; -extern u32 *gUnknown_203B484; +extern u32 *gUnknown_203B460; +extern u32 gUnknown_203B464; +extern u8 *gUnknown_203B468; +extern u32 gUnknown_203B46C; +extern u8 *gUnknown_203B480; +extern u8 *gUnknown_203B484; extern u32 *gUnknown_203B488; extern u32 *gUnknown_203B48C; extern u32 gUnknown_203B490; -extern u32 gUnknown_203B464; extern u32 gUnknown_203B494; extern u8 *gUnknown_203B498; -extern u8 *gUnknown_203B468; -extern u32 gUnknown_203B46C; extern void sub_800135C(void); extern u32 *sub_808CE00(void); @@ -49,8 +49,8 @@ extern u8 *sub_80923B0(void); extern void sub_80923B8(void); extern u32 sub_8094990(void); extern void sub_8094998(u8 r0); -extern u32 *sub_80950F8(void); -extern u32 *sub_8095100(void); +extern u8 *sub_80950F8(void); +extern u8 *sub_8095100(void); extern u32 *sub_8095108(void); extern u32 *sub_8095110(void); extern void sub_8095118(void); @@ -67,7 +67,7 @@ extern void sub_8011C40(s32 r0); extern void sub_8097748(void); -extern void sub_8094FA8(struct unkTimeStruct *Time); // defined in src/code_8094F88.c +extern void ResetPlayTime(struct unkTimeStruct *Time); // defined in src/code_8094F88.c extern struct unkTimeStruct *sub_8094FA0(void); extern void* MemoryAlloc(u32 a, u32 b); @@ -167,7 +167,7 @@ void sub_80122D0(void) sub_8011C28(0); sub_8011C40(-1); sub_8097748(); - sub_8094FA8(gUnknown_203B47C); + ResetPlayTime(gUnknown_203B47C); } void sub_80122F4(void) -- cgit v1.2.3 From cbfab08a06d7f9deca21b510b1bbdb80c05ea662 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 20 Nov 2020 10:33:21 -0600 Subject: finish docing PlayTime and fix function - Kermalis --- src/code_8040094.c | 6 +++--- src/code_8094F88.c | 44 +++++++++++++++++++++----------------------- src/code_8098BDC.c | 7 ++++--- 3 files changed, 28 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/code_8040094.c b/src/code_8040094.c index c384b51..547569c 100644 --- a/src/code_8040094.c +++ b/src/code_8040094.c @@ -1,11 +1,11 @@ #include "global.h" +#include "time.h" extern u8 *gUnknown_203B418; -extern u32 gUnknown_203B47C; +extern struct PlayTimeStruct *gUnknown_203B47C; extern void sub_803F7BC(void); extern void sub_80060EC(void); -extern void sub_8094FB4(u32); extern void sub_800CB20(void); extern void sub_800485C(void); extern void xxx_call_update_bg_sound_input(void); @@ -17,7 +17,7 @@ void sub_8040094(u8 r0) gUnknown_203B418[0x18217] = r0; sub_803F7BC(); sub_80060EC(); - sub_8094FB4(gUnknown_203B47C); + IncrementPlayTime(gUnknown_203B47C); sub_800CB20(); sub_800485C(); xxx_call_update_bg_sound_input(); diff --git a/src/code_8094F88.c b/src/code_8094F88.c index dea2561..95854d3 100644 --- a/src/code_8094F88.c +++ b/src/code_8094F88.c @@ -35,16 +35,21 @@ struct PlayTimeStruct *sub_8094FA0(void) void ResetPlayTime(struct PlayTimeStruct *Time) { + Time->frames = 0; Time->seconds = 0; Time->minutes = 0; Time->hours = 0; - Time->unk0 = 0; } -void sub_8094FB4(struct PlayTimeStruct *Time) +void IncrementPlayTime(struct PlayTimeStruct *Time) { u16 temp_store16; + Time->frames++; + if(Time->frames <= 59) + return; + Time->frames = 0; + Time->seconds++; if(Time->seconds <= 59) return; @@ -55,42 +60,35 @@ void sub_8094FB4(struct PlayTimeStruct *Time) return; Time->minutes = 0; - Time->hours++; - if(Time->hours <= 59) - return; - Time->hours = 0; - - // ??? - temp_store16 = Time->unk0; - if(Time->unk0 <= 9998) + // Casting here for unsigned comparison + temp_store16 = Time->hours; + if(Time->hours <= 9998) { temp_store16++; - Time->unk0 = temp_store16; + Time->hours = temp_store16; } else { + Time->seconds = 59; Time->minutes = 59; - Time->hours = 59; - Time->unk0 = 9999; + Time->hours= 9999; } } -void sub_8095014(struct PlayTimeStruct *r0, u32 *r1, u32 *r2, u32 *r3) +void DeconstructPlayTime(struct PlayTimeStruct *r0, u32 *outHours, u32 *outMinutes, u32 *outSeconds) { - u32 temp; - if(r0->unk0 <= 9999) + if(r0->hours <= 9999) { - *r1 = r0->unk0; - *r2 = r0->hours; - temp = r0->minutes; + *outHours = r0->hours; + *outMinutes = r0->minutes; + *outSeconds = r0->seconds; } else { - *r1 = 9999; - *r2 = 59; - temp = 59; + *outHours = 9999; + *outMinutes = 59; + *outSeconds = 59; } - *r3 = temp; } void sub_8095044(u32 r0) diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c index e35500a..b47d39c 100644 --- a/src/code_8098BDC.c +++ b/src/code_8098BDC.c @@ -1,6 +1,7 @@ #include "global.h" +#include "time.h" -extern u32 gUnknown_203B47C; +extern struct PlayTimeStruct *gUnknown_203B47C; extern u32 gUnknown_20398A8; extern u32 gUnknown_8115F5C; extern u32 gUnknown_20398AC; @@ -21,7 +22,7 @@ extern void sub_80A6E80(); extern void sub_8099BE4(); extern void sub_8099744(); extern void sub_8011860(); -extern void sub_8094FB4(u32 r0); +extern void IncrementPlayTime(struct PlayTimeStruct *Time); extern void sub_800CB20(); extern void sub_800485C(); extern void nullsub_120(); @@ -69,7 +70,7 @@ void sub_8098BDC(void) sub_8099BE4(); sub_8099744(); sub_8011860(); - sub_8094FB4(gUnknown_203B47C); + IncrementPlayTime(gUnknown_203B47C); sub_800CB20(); sub_800485C(); nullsub_120(); -- cgit v1.2.3 From 0709caccc472e3fee369b923a2a9d04ca06df02d Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 20 Nov 2020 10:34:11 -0600 Subject: few more decomp funcs --- src/code_80A26CC.c | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 src/code_80A26CC.c (limited to 'src') diff --git a/src/code_80A26CC.c b/src/code_80A26CC.c new file mode 100644 index 0000000..4baeb5d --- /dev/null +++ b/src/code_80A26CC.c @@ -0,0 +1,165 @@ +#include "global.h" + +struct unkStruct_80A2608 +{ + s16 unk0; + /*0x2*/ u16 padding; + /*0x4*/ u32 padding2; + /*0x8*/ u16 padding3; + /*0xA*/ u16 padding4; + u8 unkC; + /* 0xD */ u8 padding5; + s16 unkE; + u8 unk11; +}; + +extern u8 sub_80023E4(u32); +extern u8 sub_80973F4(s16); +extern struct unkStruct_80A2608 *sub_80A2608(s32); +extern struct unkStruct_80A2608 *sub_80A2620(u32); +extern u8 sub_8097384(u32); +extern s16 gUnknown_8116F9A[]; + +s16 sub_80A26CC(s16 r0) +{ + return (0xDC >> 2) + r0; +} + + +#ifndef NONMATCHING +NAKED +#endif +s32 sub_80A26D8(u8 r0) +{ +#ifdef NONMATCHING + s32 counter; + s32 counter2; + struct unkStruct_80A2608 *temp; + for(counter = 0; counter <= 0x52; counter++) + { + // Forcing a shift here.. but does it to R4 instead of R0 + counter2 = counter << 0x10; + counter2 >>= 0x10; + temp = sub_80A2608(counter2); + if(temp->unk11 != 0) + { + if(temp->unkC == r0) + { + return counter2; + } + } + } + return -1; +#else + asm_unified("\tpush {r4-r6,lr}\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tmovs r5, 0\n" +"_080A26E0:\n" + "\tlsls r0, r5, 16\n" + "\tasrs r4, r0, 16\n" + "\tadds r0, r4, 0\n" + "\tbl sub_80A2608\n" + "\tadds r1, r0, 0\n" + "\tldrb r0, [r1, 0x11]\n" + "\tcmp r0, 0\n" + "\tbeq _080A26FC\n" + "\tldrb r0, [r1, 0xC]\n" + "\tcmp r0, r6\n" + "\tbne _080A26FC\n" + "\tadds r0, r4, 0\n" + "\tb _080A2706\n" +"_080A26FC:\n" + "\tadds r5, 0x1\n" + "\tcmp r5, 0x52\n" + "\tble _080A26E0\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" +"_080A2706:\n" + "\tpop {r4-r6}\n" + "\tpop {r1}\n" + "\tbx r1\n"); +#endif +} + +u8 sub_80A270C(s16 r0) +{ + struct unkStruct_80A2608 *temp; + s32 temp_number; + + temp_number = r0; // forcing a shift before addressing + temp = sub_80A2608(gUnknown_8116F9A[temp_number]); + return temp->unkC; +} + +u8 sub_80A2728(s16 r0) +{ + struct unkStruct_80A2608 *temp; + s16 temp_number = (0xDC >> 2) + r0; + temp = sub_80A2608(temp_number); + return temp->unkC; +} + +u8 sub_80A2740(s16 r0) +{ + struct unkStruct_80A2608 *temp; + temp = sub_80A2608(r0); + return temp->unkC; +} + +u32 sub_80A2750(s16 r0) +{ + struct unkStruct_80A2608 *temp; + s32 temp_32; + s32 temp_2; + + // so dumb but it matches + temp_32 = r0; + temp_2 = temp_32; + + if(r0 == 0x50) + return 3; + if(r0 == 0x51) + return 2; + if(r0 == 0x52) + return 4; + if((u16)(r0 - 0x28) <= 0xE) + return 2; + if((u16)(r0 - 0x37) <= 0x18) + return 4; + + temp = sub_80A2608(temp_2); + if(temp->unkE == -1) + return 1; + if(sub_80023E4(5) != 0) + return 1; + if(sub_80973F4(temp->unkE) == 0) + return 1; + if(sub_80023E4(1) == 0) + return 1; + return 2; +} + +u32 sub_80A27CC(s16 r0) +{ + s32 temp; + s32 temp2; + struct unkStruct_80A2608 *return_var; + + // Same dumbness as above to get a match + temp2 = r0; + temp = temp2; + + return_var = sub_80A2620(r0); + if(return_var->unk0 == -1) + return 0; + if(sub_80023E4(5) != 0) + return 0; + if(sub_8097384(r0) != 0) + return 1; + if(sub_80023E4(1) == 0) + return 0; + if(sub_80973F4(temp) == 0) + return 0; + return 1; +} -- cgit v1.2.3 From db6ed3e526baf0018b47dda5a1f6a802c7763a6e Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 20 Nov 2020 18:57:36 -0600 Subject: some more work on decomping funcs --- src/code_8098BDC.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/code_80A26CC.c | 9 +++ 2 files changed, 231 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c index b47d39c..2d04bf4 100644 --- a/src/code_8098BDC.c +++ b/src/code_8098BDC.c @@ -3,12 +3,22 @@ extern struct PlayTimeStruct *gUnknown_203B47C; extern u32 gUnknown_20398A8; -extern u32 gUnknown_8115F5C; extern u32 gUnknown_20398AC; extern u32 gUnknown_20398B0; extern u32 gUnknown_20398B4; +extern u8 gUnknown_20398B9; +extern u8 gUnknown_20398BA; extern u32 gUnknown_20398C0; +extern s16 gUnknown_20398C4; extern u16 gUnknown_20398BE; +extern u8 gUnknown_203B49D; +extern u8 gUnknown_203B49C; + +extern u32 gUnknown_8115F5C; +extern u32 gUnknown_8115F80; +extern u32 gUnknown_8115FA4; +extern u32 gUnknown_8115FC8; +extern u32 gUnknown_8115FE8; extern void Log(u32, u32*, s32, u32); @@ -22,7 +32,6 @@ extern void sub_80A6E80(); extern void sub_8099BE4(); extern void sub_8099744(); extern void sub_8011860(); -extern void IncrementPlayTime(struct PlayTimeStruct *Time); extern void sub_800CB20(); extern void sub_800485C(); extern void nullsub_120(); @@ -51,12 +60,13 @@ extern void sub_8098CC8(); extern void sub_809674C(); extern void sub_80961B4(); extern void sub_8091FB4(); +extern s32 sub_80A2B18(s16); extern u8 sub_8001CC4(u8, u8, u8); extern void sub_8091980(u32); extern u8 sub_80023E4(u32); extern void sub_80118C4(u16); -extern void sub_809C730(); +extern u8 sub_809C730(); void sub_8098BDC(void) { @@ -214,3 +224,212 @@ bool8 sub_8098DCC(u32 r0) return FALSE; } +#ifndef NONMATCHING +NAKED +#endif +bool8 sub_8098E18(s16 r0, u32 r1, u32 r2) +{ +#ifdef NONMATCHING + // Had to nonmatch because the prologue statements of add/lsls/lsrs didn't match + s32 temp; + s16 return_var; + temp = r0; + if(gUnknown_20398A8 == 0) + { + Log(0, &gUnknown_8115F80, temp, r2); + if(gUnknown_203B49D != 0) + { + gUnknown_20398A8 = 7; + } + else + { + if(gUnknown_203B49C == 0) + { + gUnknown_20398C4 = r2; + } + return_var = sub_80A2750(gUnknown_20398C4); + // TODO so ugly but it works.. nested if statements aren't my thing in decomping + if(return_var == 2) + { + goto _08098E88; + } + if(return_var > 2) + { + goto _08098E7C; + } + if(return_var == 1) + { + goto _08098E84; + } + else + { + goto _08098E8C; + } +_08098E7C: + if(return_var == 4) + { + gUnknown_20398A8 = 8; + goto _08098E8C; + } + else + { + goto _08098E8C; + } +_08098E84: + gUnknown_20398A8 = 5; + goto _08098E8C; +_08098E88: + gUnknown_20398A8 = 6; + } +_08098E8C: + gUnknown_20398AC = 1; + gUnknown_20398B0 = r1; + sub_809C730(); + return TRUE; + } + return FALSE; +#else + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r6, r1, 0\n" + "\tlsls r0, 16\n" + "\tasrs r2, r0, 16\n" + "\tadds r5, r2, 0\n" + "\tldr r4, _08098E40\n" + "\tldr r0, [r4]\n" + "\tcmp r0, 0\n" + "\tbne _08098EA8\n" + "\tldr r1, _08098E44\n" + "\tmovs r0, 0\n" + "\tadds r3, r6, 0\n" + "\tbl Log\n" + "\tldr r0, _08098E48\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _08098E4C\n" + "\tmovs r0, 0x7\n" + "\tb _08098E8A\n" + "\t.align 2, 0\n" +"_08098E40: .4byte gUnknown_20398A8\n" +"_08098E44: .4byte gUnknown_8115F80\n" +"_08098E48: .4byte gUnknown_203B49D\n" +"_08098E4C:\n" + "\tldr r0, _08098E74\n" + "\tldrb r0, [r0]\n" + "\tldr r1, _08098E78\n" + "\tcmp r0, 0\n" + "\tbne _08098E58\n" + "\tstrh r5, [r1]\n" +"_08098E58:\n" + "\tmovs r2, 0\n" + "\tldrsh r0, [r1, r2]\n" + "\tbl sub_80A2750\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, 0x2\n" + "\tbeq _08098E88\n" + "\tcmp r0, 0x2\n" + "\tbgt _08098E7C\n" + "\tcmp r0, 0x1\n" + "\tbeq _08098E84\n" + "\tb _08098E8C\n" + "\t.align 2, 0\n" +"_08098E74: .4byte gUnknown_203B49C\n" +"_08098E78: .4byte gUnknown_20398C4\n" +"_08098E7C:\n" + "\tcmp r0, 0x4\n" + "\tbne _08098E8C\n" + "\tmovs r0, 0x8\n" + "\tb _08098E8A\n" +"_08098E84:\n" + "\tmovs r0, 0x5\n" + "\tb _08098E8A\n" +"_08098E88:\n" + "\tmovs r0, 0x6\n" +"_08098E8A:\n" + "\tstr r0, [r4]\n" +"_08098E8C:\n" + "\tldr r0, _08098EA0\n" + "\tmovs r1, 0x1\n" + "\tstr r1, [r0]\n" + "\tldr r0, _08098EA4\n" + "\tstr r6, [r0]\n" + "\tbl sub_809C730\n" + "\tmovs r0, 0x1\n" + "\tb _08098EAA\n" + "\t.align 2, 0\n" +"_08098EA0: .4byte gUnknown_20398AC\n" +"_08098EA4: .4byte gUnknown_20398B0\n" +"_08098EA8:\n" + "\tmovs r0, 0\n" +"_08098EAA:\n" + "\tpop {r4-r6}\n" + "\tpop {r1}\n" + "\tbx r1"); +#endif +} + +// Unused +u32 sub_8098EB0(u32 r0, u32 r1, u32 r2, u32 r3) +{ + if(gUnknown_20398A8 == 0) + { + if(gUnknown_203B49D != 0) + { + Log(0, &gUnknown_8115FA4, r0, r3); + gUnknown_20398A8 = 7; + gUnknown_20398AC = 1; + gUnknown_20398B0 = r0; + sub_809C730(); + return 1; + } + } + return 0; +} + +u32 sub_8098F00(u32 r0, u32 r1, u32 r2, u32 r3) +{ + if(gUnknown_20398A8 == 0) + { + Log(0, &gUnknown_8115FC8, r0, r3); + gUnknown_20398A8 = 9; + gUnknown_20398AC = 1; + gUnknown_20398B0 = r0; + sub_809C730(); + return 1; + } + return 0; +} + +u32 sub_8098F44(u32 r0, u32 r1, u32 r2, u32 r3) +{ + if(gUnknown_20398A8 == 0) + { + Log(0, &gUnknown_8115FE8, r0, r3); + gUnknown_20398A8 = 0xA; + gUnknown_20398AC = 1; + gUnknown_20398B0 = r0; + sub_809C730(); + return 1; + } + return 0; +} + +u32 sub_8098F88(void) +{ + return gUnknown_20398B9; +} + +u32 sub_8098F94(void) +{ + return gUnknown_20398BA; +} + +s16 sub_8098FA0(void) +{ + return sub_8001658(0, 0x11); +} + +s32 sub_8098FB4(void) +{ + return sub_80A2B18(sub_8001658(0, 0x11)); +} diff --git a/src/code_80A26CC.c b/src/code_80A26CC.c index 4baeb5d..7be1bbb 100644 --- a/src/code_80A26CC.c +++ b/src/code_80A26CC.c @@ -20,6 +20,15 @@ extern struct unkStruct_80A2608 *sub_80A2620(u32); extern u8 sub_8097384(u32); extern s16 gUnknown_8116F9A[]; +s16 sub_80A26B8(s16 r0) +{ + // Useless cast that forces correct ordering + s32 temp; + temp = r0; + + return gUnknown_8116F9A[r0]; +} + s16 sub_80A26CC(s16 r0) { return (0xDC >> 2) + r0; -- cgit v1.2.3 From ae9e96ec43001cd942ad23b0d3394c400100d686 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 21 Nov 2020 18:05:56 -0600 Subject: Fix sub_8098E18 - jiang/Kermalis --- src/code_8098BDC.c | 130 ++++------------------------------------------------- 1 file changed, 9 insertions(+), 121 deletions(-) (limited to 'src') diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c index 2d04bf4..491fdc9 100644 --- a/src/code_8098BDC.c +++ b/src/code_8098BDC.c @@ -67,6 +67,7 @@ extern void sub_8091980(u32); extern u8 sub_80023E4(u32); extern void sub_80118C4(u16); extern u8 sub_809C730(); +extern s16 sub_80A2750(s16); void sub_8098BDC(void) { @@ -224,19 +225,12 @@ bool8 sub_8098DCC(u32 r0) return FALSE; } -#ifndef NONMATCHING -NAKED -#endif -bool8 sub_8098E18(s16 r0, u32 r1, u32 r2) +bool8 sub_8098E18(s16 r0, u32 r1) { -#ifdef NONMATCHING - // Had to nonmatch because the prologue statements of add/lsls/lsrs didn't match - s32 temp; - s16 return_var; - temp = r0; + s32 r2 = r0, r5 = r2; if(gUnknown_20398A8 == 0) { - Log(0, &gUnknown_8115F80, temp, r2); + Log(0, &gUnknown_8115F80, r2, r1); if(gUnknown_203B49D != 0) { gUnknown_20398A8 = 7; @@ -245,127 +239,21 @@ bool8 sub_8098E18(s16 r0, u32 r1, u32 r2) { if(gUnknown_203B49C == 0) { - gUnknown_20398C4 = r2; - } - return_var = sub_80A2750(gUnknown_20398C4); - // TODO so ugly but it works.. nested if statements aren't my thing in decomping - if(return_var == 2) - { - goto _08098E88; - } - if(return_var > 2) - { - goto _08098E7C; + gUnknown_20398C4 = r5; } - if(return_var == 1) + switch(sub_80A2750(gUnknown_20398C4)) { - goto _08098E84; + case 4: gUnknown_20398A8 = 8; break; + case 1: gUnknown_20398A8 = 5; break; + case 2: gUnknown_20398A8 = 6; break; } - else - { - goto _08098E8C; - } -_08098E7C: - if(return_var == 4) - { - gUnknown_20398A8 = 8; - goto _08098E8C; - } - else - { - goto _08098E8C; - } -_08098E84: - gUnknown_20398A8 = 5; - goto _08098E8C; -_08098E88: - gUnknown_20398A8 = 6; } -_08098E8C: gUnknown_20398AC = 1; gUnknown_20398B0 = r1; sub_809C730(); return TRUE; } return FALSE; -#else - asm_unified("\tpush {r4-r6,lr}\n" - "\tadds r6, r1, 0\n" - "\tlsls r0, 16\n" - "\tasrs r2, r0, 16\n" - "\tadds r5, r2, 0\n" - "\tldr r4, _08098E40\n" - "\tldr r0, [r4]\n" - "\tcmp r0, 0\n" - "\tbne _08098EA8\n" - "\tldr r1, _08098E44\n" - "\tmovs r0, 0\n" - "\tadds r3, r6, 0\n" - "\tbl Log\n" - "\tldr r0, _08098E48\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbeq _08098E4C\n" - "\tmovs r0, 0x7\n" - "\tb _08098E8A\n" - "\t.align 2, 0\n" -"_08098E40: .4byte gUnknown_20398A8\n" -"_08098E44: .4byte gUnknown_8115F80\n" -"_08098E48: .4byte gUnknown_203B49D\n" -"_08098E4C:\n" - "\tldr r0, _08098E74\n" - "\tldrb r0, [r0]\n" - "\tldr r1, _08098E78\n" - "\tcmp r0, 0\n" - "\tbne _08098E58\n" - "\tstrh r5, [r1]\n" -"_08098E58:\n" - "\tmovs r2, 0\n" - "\tldrsh r0, [r1, r2]\n" - "\tbl sub_80A2750\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tcmp r0, 0x2\n" - "\tbeq _08098E88\n" - "\tcmp r0, 0x2\n" - "\tbgt _08098E7C\n" - "\tcmp r0, 0x1\n" - "\tbeq _08098E84\n" - "\tb _08098E8C\n" - "\t.align 2, 0\n" -"_08098E74: .4byte gUnknown_203B49C\n" -"_08098E78: .4byte gUnknown_20398C4\n" -"_08098E7C:\n" - "\tcmp r0, 0x4\n" - "\tbne _08098E8C\n" - "\tmovs r0, 0x8\n" - "\tb _08098E8A\n" -"_08098E84:\n" - "\tmovs r0, 0x5\n" - "\tb _08098E8A\n" -"_08098E88:\n" - "\tmovs r0, 0x6\n" -"_08098E8A:\n" - "\tstr r0, [r4]\n" -"_08098E8C:\n" - "\tldr r0, _08098EA0\n" - "\tmovs r1, 0x1\n" - "\tstr r1, [r0]\n" - "\tldr r0, _08098EA4\n" - "\tstr r6, [r0]\n" - "\tbl sub_809C730\n" - "\tmovs r0, 0x1\n" - "\tb _08098EAA\n" - "\t.align 2, 0\n" -"_08098EA0: .4byte gUnknown_20398AC\n" -"_08098EA4: .4byte gUnknown_20398B0\n" -"_08098EA8:\n" - "\tmovs r0, 0\n" -"_08098EAA:\n" - "\tpop {r4-r6}\n" - "\tpop {r1}\n" - "\tbx r1"); -#endif } // Unused -- cgit v1.2.3 From fc7f14ab66ff8e23cd758a9435f8ac48e99ae75f Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 22 Nov 2020 17:37:48 -0600 Subject: random assortment of decomp work and fix of nonmatchings --- src/code_80118A4.c | 18 ++++++++++++++ src/code_80A7714.c | 38 +++++++++++++++++++++++++++++ src/pokemon_1.c | 33 +++---------------------- src/save_mid.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 131 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/code_80118A4.c b/src/code_80118A4.c index eca4558..3229ea5 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -50,6 +50,7 @@ extern u32 gUnknown_202DE1C; extern u32 gUnknown_203B14C; extern const char gNotEntryText; extern const char gUnknown_80D418C; +extern char gUnknown_80D41C4; void sub_8011760(void) { @@ -343,3 +344,20 @@ void PrintFuncFileLineOrNotEntry(char * r0, struct unkFileStruct *r1) "_08011AA0: .4byte gNotEntryText"); #endif } + +void PrintFuncFileLine(char *r0, struct unkFileStruct *r1, u32 r2) +{ + volatile u32 temp; + volatile u32 temp2; + u32 r3; + u32 r4; + char *preload; + + preload = &gUnknown_80D41C4; + r3 = r1->unk8; + r4 = r1->unk0; + temp = r4; + temp2 = r1->unk4; + + sprintf(r0, preload, r2, r3); +} diff --git a/src/code_80A7714.c b/src/code_80A7714.c index ae8798a..035f58b 100644 --- a/src/code_80A7714.c +++ b/src/code_80A7714.c @@ -6,6 +6,9 @@ extern void sub_80A7310(u32 r0, u32 r1, u32 r2, u32 r3); extern void sub_80A7784(); extern s16 gUnknown_2039DE0; +extern u32 gUnknown_8117EFC; +extern u32 *gUnknown_811E258[]; + void sub_80A7714(void) { sub_80A68A0(); @@ -44,3 +47,38 @@ void sub_80A7784(void) gUnknown_2039DE0 = -1; } } + +u8 sub_80A77A0(s16 r0, u32 r1) +{ + s32 temp; + s32 temp2; + temp = r0; + temp2 = temp; + if(gUnknown_2039DE0 != temp) + { + if(temp < 0) + { + sub_80A7784(); + + } + else + { + sub_80A7764(temp2); + } + return 1; + } + return 0; +} + +// TODO review this later +u32 *sub_80A77D0(s16 r0) +{ + if(r0 != -1) + { + return gUnknown_811E258[r0]; + } + else + { + return &gUnknown_8117EFC; + } +} diff --git a/src/pokemon_1.c b/src/pokemon_1.c index c2434e1..5a1eb88 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -45,44 +45,19 @@ void sub_808DD48(s16 r0, struct unkEvolve *r1) #endif } -#ifndef NONMATCHING -NAKED -#endif -// Pretty confided args are correct yet compiler disagrees u8 sub_808DD68(s16 r0, u32 r1) { -#ifdef NONMATCHING + // Had to have this cast to match + u32 temp; + temp = r0; if (r1 != 0) { return 0xA; } else { - return gMonsterParameters[r0].overworld_sprite; + return gMonsterParameters[temp].overworld_sprite; } -#else - asm_unified("\tpush {lr}\n" - "\tlsls r0, 16\n" - "\tasrs r2, r0, 16\n" - "\tcmp r1, 0\n" - "\tbne _0808DD88\n" - "\tldr r0, _0808DD84\n" - "\tldr r1, [r0]\n" - "\tlsls r0, r2, 3\n" - "\tadds r0, r2\n" - "\tlsls r0, 3\n" - "\tadds r0, r1\n" - "\tldrb r0, [r0, 0x8]\n" - "\tb _0808DD8A\n" - "\t.align 2, 0\n" -"_0808DD84: .4byte gMonsterParameters\n" -"_0808DD88:\n" - "\tmovs r0, 0xA\n" -"_0808DD8A:\n" - "\tpop {r1}\n" - "\tbx r1"); - -#endif } #ifndef NONMATCHING diff --git a/src/save_mid.c b/src/save_mid.c index 13e9cbf..ddf6d4d 100644 --- a/src/save_mid.c +++ b/src/save_mid.c @@ -37,6 +37,7 @@ extern u32 *gUnknown_203B48C; extern u32 gUnknown_203B490; extern u32 gUnknown_203B494; extern u8 *gUnknown_203B498; +extern u32 gUnknown_80D4354; extern void sub_800135C(void); extern u32 *sub_808CE00(void); @@ -80,13 +81,19 @@ extern u32 *sub_809769C(void); u32 *sub_8011C4C(void); extern void sub_80958E4(u8 *a, u32 b); extern s32 WriteSaveSector(s32 *a, u8 *src, s32 size); +extern u32 sub_8011DAC(u32 *a); +extern u32 sub_80144A4(u32 *a); +extern bool8 sub_8011FF8(void); +extern void sub_80141B4(u32 *r0, u32 r1, u32 r2, u16 r3); +void sub_8012298(); void sub_80122D0(); void sub_80122F4(); void sub_8012300(); void sub_80976A8(); void sub_80122A8(); + s32 sub_80121D4(s32 *a, u8 *src, s32 size) { return WriteSaveSector(a, src, size); @@ -238,3 +245,67 @@ void sub_8012468(void) gUnknown_203B188->unk0 = 1; } + +u8 sub_8012484(void) +{ + u32 temp; + u32 temp2; + switch(gUnknown_203B188->unk0) + { + case 0: + gUnknown_203B188->unk0 = 1; + break; + case 1: + temp = 0; + gUnknown_203B188->unk4 = sub_8011DAC(&temp); + gUnknown_203B188->unk0 = 2; + break; + case 2: + if(gUnknown_203B188->unk4 != 0) + { + if(sub_8011FF8()) + { + sub_80141B4(&gUnknown_80D4354, 0, 0, 0x301); + gUnknown_203B188->unk0 = 3; + break; + } + else + { + gUnknown_203B188->unk0 = 4; + break; + } + } + else + { + gUnknown_203B188->unk0 = 6; + break; + } + case 3: + if(sub_80144A4(&temp2) == 0) + { + gUnknown_203B188->unk0 = 4; + break; + } + else + { + break; + } + case 4: + sub_8012298(); + gUnknown_203B188->unk0 = 6; + case 5: + break; + case 6: + return 0; + } + return 1; +} + +void sub_8012558(void) +{ + if(gUnknown_203B188 != NULL) + { + MemoryFree(gUnknown_203B188); + gUnknown_203B188 = NULL; + } +} -- cgit v1.2.3 From 2582d7a8680e32493403d484c1990e1a63fb2015 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 23 Nov 2020 15:22:16 -0600 Subject: isemi-identified VRAM and split personality test funcs --- src/code_8027C84.c | 25 ---------------- src/code_809747C.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/personality_test.c | 25 ++++++++++++++++ 3 files changed, 106 insertions(+), 25 deletions(-) delete mode 100644 src/code_8027C84.c create mode 100644 src/code_809747C.c (limited to 'src') diff --git a/src/code_8027C84.c b/src/code_8027C84.c deleted file mode 100644 index e21400c..0000000 --- a/src/code_8027C84.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "global.h" - -extern u8 gUnknown_80F42D0[]; -extern u8 gUnknown_80F42F0[]; -extern u8 gUnknown_203B408; - -u8 sub_803D0D8() -{ - return gUnknown_203B408; -} - -void sub_803D0E4(u8 r0) -{ - gUnknown_203B408 = r0; -} - -u8 sub_803D0F0(u8 r0) -{ - return gUnknown_80F42F0[r0]; -} - -u8 sub_803D100(u8 r0) -{ - return gUnknown_80F42D0[r0]; -} diff --git a/src/code_809747C.c b/src/code_809747C.c new file mode 100644 index 0000000..56e057e --- /dev/null +++ b/src/code_809747C.c @@ -0,0 +1,81 @@ +#include "global.h" +#include "dungeon.h" + +extern u32 *gStoryMissionText[]; +extern const u8 gDummyScenarioText; +extern u32 gUnknown_8109CC0; +extern u8 sub_80A270C(); +extern void sub_80015C0(u8, u8); + +const u8 *sub_809747C(s16 r0) +{ + if(r0 == 0xD) + { + return &gDummyScenarioText; + } + else + { + return GetDungeonName1(sub_80A270C()); + } +} + +const u8 *sub_80974A0(s16 r0) +{ + if(r0 == 0xD) + { + return &gDummyScenarioText; + } + else + { + return GetDungeonName1(sub_80A270C()); + } +} + +#ifndef NONMATCHING +NAKED +#endif +u32 *sub_80974C4(s16 r0) +{ +#ifdef NONMATCHING + // TODO fix regswap memes of r0/r1 + if(r0 <= 0x1E) + { + return gStoryMissionText[(r0 << 1)]; + } + else + { + return &gUnknown_8109CC0; + } +#else + asm_unified("\tpush {lr}\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, 0x1E\n" + "\tble _080974D8\n" + "\tldr r0, _080974D4\n" + "\tb _080974E0\n" + "\t.align 2, 0\n" +"_080974D4: .4byte gUnknown_8109CC0\n" +"_080974D8:\n" + "\tlsls r0, 3\n" + "\tldr r1, _080974E4\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" +"_080974E0:\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" +"_080974E4: .4byte gStoryMissionText"); + +#endif +} + +void sub_80974E8(void) +{ + sub_80015C0(0, 0x2E); + sub_80015C0(0, 0x2F); +} + +void nullsub_208(void) +{ +} diff --git a/src/personality_test.c b/src/personality_test.c index bac1b89..c0562e4 100644 --- a/src/personality_test.c +++ b/src/personality_test.c @@ -28,3 +28,28 @@ const u16 gPartners[10] = SPECIES_MUDKIP }; +extern u8 gUnknown_80F42D0[]; +extern u8 gUnknown_80F42F0[]; +extern u8 gUnknown_203B408; + +u8 sub_803D0D8() +{ + return gUnknown_203B408; +} + +void sub_803D0E4(u8 r0) +{ + gUnknown_203B408 = r0; +} + +u8 sub_803D0F0(u8 r0) +{ + return gUnknown_80F42F0[r0]; +} + +u8 sub_803D100(u8 r0) +{ + return gUnknown_80F42D0[r0]; +} + + -- cgit v1.2.3 From a4fdac9553403f4ed7e56a598d5ecd5a6936edf5 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 2 Dec 2020 15:13:09 -0600 Subject: slight cleanup Found a few things when I attempted to decompile GameLoop. --- src/code.c | 6 +++--- src/code_80118A4.c | 49 +++++++++++++++++++++---------------------------- src/music_pre.c | 3 ++- 3 files changed, 26 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/code.c b/src/code.c index 49180c2..649f81c 100644 --- a/src/code.c +++ b/src/code.c @@ -2,7 +2,7 @@ extern void xxx_dungeon_8042F6C(u32 r0); extern void NDS_LoadOverlay_GroundMain(); -extern u32 xxx_script_related_8098468(); +extern u32 xxx_script_related_8098468(u32); void NDS_LoadOverlay_GroundMain() { @@ -14,9 +14,9 @@ void nullsub_2(u32 r0) } -u32 xxx_script_related_8001334() +u32 xxx_script_related_8001334(u32 r0) { - return xxx_script_related_8098468(); + return xxx_script_related_8098468(r0); } void xxx_dungeon_8001340(u32 r0) diff --git a/src/code_80118A4.c b/src/code_80118A4.c index 3229ea5..c8ba82b 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -27,13 +27,6 @@ extern void nullsub_28(void); extern int sprintf(char *, const char *, ...); -struct UnkStructType -{ - /* 0x0 */ s16 unk0; - -}; - - struct unkFileStruct { u32 unk0; @@ -43,9 +36,9 @@ struct unkFileStruct extern u16 gUnknown_80D4144[]; -extern struct UnkStructType gUnknown_202DE20; -extern struct UnkStructType gUnknown_202DE22; -extern struct UnkStructType gUnknown_202DE24; +extern s16 gUnknown_202DE20; +extern s16 gUnknown_202DE22; +extern s16 gUnknown_202DE24; extern u32 gUnknown_202DE1C; extern u32 gUnknown_203B14C; extern const char gNotEntryText; @@ -61,7 +54,7 @@ void sub_8011760(void) } if(sub_80023E4(0xC) != 0) { - sub_800BDFC(0x7); + sub_800BDFC(0x7); // Pokemon Square Theme } } @@ -72,7 +65,7 @@ void sub_801178C(void) sub_800BDFC(0x13); return; } - sub_800BDFC(0x7); + sub_800BDFC(0x7); // Pokemon Square Theme } void sub_80117AC(void) @@ -106,17 +99,17 @@ void sub_80117F8(void) void sub_801180C(void) { gUnknown_202DE1C = 0; - gUnknown_202DE20.unk0 = 0; - gUnknown_202DE22.unk0 = 0; - gUnknown_202DE24.unk0 = 0; + gUnknown_202DE20 = 0; + gUnknown_202DE22 = 0; + gUnknown_202DE24 = 0; } void sub_8011830(void) { sub_800C93C(); - gUnknown_202DE20.unk0 = 0; - gUnknown_202DE22.unk0 = 0; - gUnknown_202DE24.unk0 = 0; + gUnknown_202DE20 = 0; + gUnknown_202DE22 = 0; + gUnknown_202DE24 = 0; } void sub_8011854(void) @@ -126,17 +119,17 @@ void sub_8011854(void) void sub_8011860(void) { - if(gUnknown_202DE20.unk0 > 0) + if(gUnknown_202DE20 > 0) { - gUnknown_202DE20.unk0--; + gUnknown_202DE20--; } - if(gUnknown_202DE22.unk0 > 0) + if(gUnknown_202DE22 > 0) { - gUnknown_202DE22.unk0--; + gUnknown_202DE22--; } - if(gUnknown_202DE24.unk0 > 0) + if(gUnknown_202DE24 > 0) { - gUnknown_202DE24.unk0--; + gUnknown_202DE24--; } } @@ -257,17 +250,17 @@ u8 sub_80119C0(u16 r0) void sub_80119D4(u32 r0) { - if(gUnknown_202DE20.unk0 > 0) + if(gUnknown_202DE20 > 0) return; sub_800C074(gUnknown_80D4144[r0], 0x80 << 1); - gUnknown_202DE20.unk0 = 4; + gUnknown_202DE20 = 4; } void sub_8011A04(void) { - if(gUnknown_202DE22.unk0 > 0) + if(gUnknown_202DE22 > 0) return; - gUnknown_202DE22.unk0 = 3; + gUnknown_202DE22 = 3; sub_800C074(0x131, 0x80 << 1); } diff --git a/src/music_pre.c b/src/music_pre.c index 45afc01..292f0a8 100644 --- a/src/music_pre.c +++ b/src/music_pre.c @@ -29,10 +29,11 @@ struct unkStruct_3000FD8 u8 padding; }; -extern struct unkStruct_3000FD8 gUnknown_3000FD8[]; +extern struct unkStruct_3000FD8 gUnknown_3000FD8[8]; void sub_800BF80(void); +// Some kind of initializer for music? void sub_800BD08(void) { s32 counter; -- cgit v1.2.3 From 90891b5da7a8949ec5067e0333b27dafdc268adf Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 3 Dec 2020 14:19:07 -0600 Subject: split a little and decomped a few more funcs --- src/code_8028DE8.c | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 src/code_8028DE8.c (limited to 'src') diff --git a/src/code_8028DE8.c b/src/code_8028DE8.c new file mode 100644 index 0000000..91f5ae1 --- /dev/null +++ b/src/code_8028DE8.c @@ -0,0 +1,201 @@ +#include "global.h" + +extern u32 sub_80144A4(s32 *r0); +extern void sub_8028B04(u32); +extern void sub_8011C28(u32); +extern void sub_8012574(u32); +extern u8 sub_8012600(); +extern void sub_8012750(); +extern void sub_8095240(u8); + +extern void sub_809927C(u8); +extern u32 *gUnknown_203B2C0; + +void sub_8028DE8(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(r0); +} + +void sub_8028E08(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x12); +} + +void sub_8028E24(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 0x8: + sub_8028B04(0x13); + break; + case 0xA: + sub_8028B04(1); + break; + default: + break; + } +} + +void sub_8028E54(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 0x8: + sub_8028B04(0x14); + break; + case 0xA: + sub_8028B04(1); + break; + default: + break; + } +} + +void sub_8028E84(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x18); + sub_8011C28(1); + sub_8012574(0); +} + +void sub_8028EAC(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + if(sub_8012600() == 0) + { + sub_8012750(); + sub_8028B04(0x19); + } +} + +void sub_8028ED4(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + if(temp == 8) + { + sub_8028B04(0xB); + } + else + { + switch(temp){ + case 0x8: + sub_8028B04(0x2); + break; + case 0x9: + case 0xA: + sub_8028B04(0x2); + break; + default: + break; + } + } +} + +void sub_8028F04(u32 r0) +{ + s32 temp; + s32 counter; + + if(sub_80144A4(&temp) != 0) + { + return; + } + for(counter = 0; counter <= 0x1F; counter++) + { + sub_8095240(counter); + } + sub_8028B04(0x15); +} + +void sub_8028F30(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x16); + sub_8011C28(1); + sub_8012574(0); +} + +void sub_8028F58(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + if(sub_8012600() == 0) + { + sub_8012750(); + sub_8028B04(2); + } +} + +void sub_8028F80(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_809927C(gUnknown_203B2C0[0x86]); + gUnknown_203B2C0[335] = 1; + sub_8028B04(3); +} + +void sub_8028FC0(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(1); +} + -- cgit v1.2.3 From 195eb49aa85f75baf70190734e840e0dd45dccea Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 4 Dec 2020 15:05:07 -0600 Subject: more decomping of funcs --- src/code_8028DE8.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 104 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/code_8028DE8.c b/src/code_8028DE8.c index 91f5ae1..f65fecb 100644 --- a/src/code_8028DE8.c +++ b/src/code_8028DE8.c @@ -10,6 +10,99 @@ extern void sub_8095240(u8); extern void sub_809927C(u8); extern u32 *gUnknown_203B2C0; +extern u8 sub_8030C20(u32); +extern u32 sub_8031050(); +extern void sub_80310B4(); +extern u32 sub_8095350(); + +void sub_8028CE0() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(3); +} + +void sub_8028CFC() +{ + s32 temp; + u32 temp2; + + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(sub_8031050()) + { + case 2: + case 3: + temp2 = sub_8095350(); + sub_80310B4(); + if(temp2 != gUnknown_203B2C0[0xA8 << 1]) + { + sub_8028B04(0x17); + } + else + { + sub_8028B04(0x19); + } + break; + default: + break; + } +} + +void sub_8028D4C() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + gUnknown_203B2C0[0xA7 << 1] = temp; + switch((s32)gUnknown_203B2C0[0xA7 << 1]) + { + case 5: + if(sub_8030C20(2) != 0) + { + sub_8028B04(12); + } + else + { + sub_8028B04(13); + } + break; + case 6: + if(sub_8030C20(4) != 0) + { + sub_8028B04(14); + } + else + { + sub_8028B04(15); + } + break; + case 7: + if(sub_8030C20(0) != 0) + { + sub_8028B04(16); + } + else + { + sub_8028B04(17); + } + break; + case 0xA: + sub_8028B04(1); + break; + default: + break; + } +} void sub_8028DE8(u32 r0) { @@ -22,7 +115,7 @@ void sub_8028DE8(u32 r0) sub_8028B04(r0); } -void sub_8028E08(u32 r0) +void sub_8028E08() { s32 temp; @@ -33,7 +126,7 @@ void sub_8028E08(u32 r0) sub_8028B04(0x12); } -void sub_8028E24(u32 r0) +void sub_8028E24() { s32 temp; @@ -54,7 +147,7 @@ void sub_8028E24(u32 r0) } } -void sub_8028E54(u32 r0) +void sub_8028E54() { s32 temp; @@ -75,7 +168,7 @@ void sub_8028E54(u32 r0) } } -void sub_8028E84(u32 r0) +void sub_8028E84() { s32 temp; @@ -88,7 +181,7 @@ void sub_8028E84(u32 r0) sub_8012574(0); } -void sub_8028EAC(u32 r0) +void sub_8028EAC() { s32 temp; @@ -103,7 +196,7 @@ void sub_8028EAC(u32 r0) } } -void sub_8028ED4(u32 r0) +void sub_8028ED4() { s32 temp; @@ -131,7 +224,7 @@ void sub_8028ED4(u32 r0) } } -void sub_8028F04(u32 r0) +void sub_8028F04() { s32 temp; s32 counter; @@ -147,7 +240,7 @@ void sub_8028F04(u32 r0) sub_8028B04(0x15); } -void sub_8028F30(u32 r0) +void sub_8028F30() { s32 temp; @@ -160,7 +253,7 @@ void sub_8028F30(u32 r0) sub_8012574(0); } -void sub_8028F58(u32 r0) +void sub_8028F58() { s32 temp; @@ -175,7 +268,7 @@ void sub_8028F58(u32 r0) } } -void sub_8028F80(u32 r0) +void sub_8028F80() { s32 temp; @@ -188,7 +281,7 @@ void sub_8028F80(u32 r0) sub_8028B04(3); } -void sub_8028FC0(u32 r0) +void sub_8028FC0() { s32 temp; -- cgit v1.2.3 From 72aa91c7f8075f85a252d2a5db589ce640f94bef Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 8 Dec 2020 13:17:08 -0600 Subject: code_80A26CC: fix nonmatching and decomp a few more --- src/code_80A26CC.c | 177 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 129 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/code_80A26CC.c b/src/code_80A26CC.c index 7be1bbb..0217d51 100644 --- a/src/code_80A26CC.c +++ b/src/code_80A26CC.c @@ -2,22 +2,23 @@ struct unkStruct_80A2608 { - s16 unk0; - /*0x2*/ u16 padding; - /*0x4*/ u32 padding2; - /*0x8*/ u16 padding3; - /*0xA*/ u16 padding4; - u8 unkC; + /* 0x0 */ s16 unk0; + /* 0x2 */ u16 padding; + /* 0x4 */ u32 padding2; + /* 0x8 */ u16 padding3; + /* 0xA */ u16 padding4; + /* 0xC */ u8 unkC; /* 0xD */ u8 padding5; - s16 unkE; - u8 unk11; + /* 0xE */ s16 unkE; + /* 0x10 */ u8 unk10; + /* 0x11 */ u8 unk11; }; -extern u8 sub_80023E4(u32); -extern u8 sub_80973F4(s16); extern struct unkStruct_80A2608 *sub_80A2608(s32); extern struct unkStruct_80A2608 *sub_80A2620(u32); -extern u8 sub_8097384(u32); +extern u8 sub_80023E4(u32); +extern u8 sub_80973F4(s16); +extern u8 sub_8097384(s16); extern s16 gUnknown_8116F9A[]; s16 sub_80A26B8(s16 r0) @@ -35,20 +36,16 @@ s16 sub_80A26CC(s16 r0) } -#ifndef NONMATCHING -NAKED -#endif s32 sub_80A26D8(u8 r0) { -#ifdef NONMATCHING s32 counter; s32 counter2; + s32 temp2; struct unkStruct_80A2608 *temp; for(counter = 0; counter <= 0x52; counter++) { - // Forcing a shift here.. but does it to R4 instead of R0 - counter2 = counter << 0x10; - counter2 >>= 0x10; + temp2 = counter << 0x10; + counter2 = temp2 >> 0x10; temp = sub_80A2608(counter2); if(temp->unk11 != 0) { @@ -59,36 +56,6 @@ s32 sub_80A26D8(u8 r0) } } return -1; -#else - asm_unified("\tpush {r4-r6,lr}\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tmovs r5, 0\n" -"_080A26E0:\n" - "\tlsls r0, r5, 16\n" - "\tasrs r4, r0, 16\n" - "\tadds r0, r4, 0\n" - "\tbl sub_80A2608\n" - "\tadds r1, r0, 0\n" - "\tldrb r0, [r1, 0x11]\n" - "\tcmp r0, 0\n" - "\tbeq _080A26FC\n" - "\tldrb r0, [r1, 0xC]\n" - "\tcmp r0, r6\n" - "\tbne _080A26FC\n" - "\tadds r0, r4, 0\n" - "\tb _080A2706\n" -"_080A26FC:\n" - "\tadds r5, 0x1\n" - "\tcmp r5, 0x52\n" - "\tble _080A26E0\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" -"_080A2706:\n" - "\tpop {r4-r6}\n" - "\tpop {r1}\n" - "\tbx r1\n"); -#endif } u8 sub_80A270C(s16 r0) @@ -172,3 +139,117 @@ u32 sub_80A27CC(s16 r0) return 0; return 1; } + +u32 sub_80A2824(u8 r0) +{ + s32 counter; + s32 counter2; + s32 temp2; + struct unkStruct_80A2608 *temp; + + if(sub_80023E4(5) != 0) + { + return 0; + } + if(sub_80023E4(1) != 0) + { + for(counter = 0; counter <= 0x2D; counter++) + { + temp2 = counter << 0x10; + counter2 = temp2 >> 0x10; + temp = sub_80A2620(counter2); + if(temp->unk11 != 0) + { + if(temp->unkC == r0) + { + if(sub_8097384(counter2) != 0) + { + return 1; + } + if(sub_80973F4(counter2) != 0) + { + return 1; + } + } + } + } + } + else + { + for(counter = 0; counter <= 0x2D; counter++) + { + temp2 = counter << 0x10; + counter2 = temp2 >> 0x10; + temp = sub_80A2620(counter2); + if(temp->unk11 != 0) + { + if(temp->unkC == r0) + { + if(sub_8097384(counter2) != 0) + { + return 1; + } + } + } + } + } + return 0; + +} + +u32 sub_80A28B4(s16 r0) +{ + s32 counter2; + s32 temp2; + struct unkStruct_80A2608 *temp; + + temp2 = r0 << 0x10; + counter2 = temp2 >> 0x10; + temp = sub_80A2620(counter2); + if(temp->unk0 != -1) + { + if(sub_8097384(counter2) == 0) + { + if(sub_80973F4(counter2) == 0) + { + return 0; + } + } + else + { + return 1; + } + return 1; + } + return 0; +} + +u32 sub_80A28F0(u8 r0) +{ + s32 counter; + s32 counter2; + s32 temp2; + struct unkStruct_80A2608 *temp; + + for(counter = 0; counter <= 0x2D; counter++) + { + temp2 = counter << 0x10; + counter2 = temp2 >> 0x10; + temp = sub_80A2620(counter2); + if(temp->unk11 != 0) + { + if(temp->unkC == r0) + { + if(sub_8097384(counter2) != 0) + { + return 1; + } + if(sub_80973F4(counter2) != 0) + { + return 1; + } + } + } + } + return 0; +} -- cgit v1.2.3 From 2c64b5692f3df0c46cfa1610a51cd7de7a0017fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Na=C5=9Bciszewski?= Date: Sun, 13 Dec 2020 19:50:37 +0100 Subject: Fix a lot of nonmatchings, some were plain wrong code --- src/code_80118A4.c | 123 ++++++++------------------------------------------- src/code_80118A4_1.c | 32 +------------- src/music.c | 61 ++----------------------- src/pokemon_1.c | 109 +++------------------------------------------ 4 files changed, 30 insertions(+), 295 deletions(-) (limited to 'src') diff --git a/src/code_80118A4.c b/src/code_80118A4.c index c8ba82b..c05a8db 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -27,11 +27,11 @@ extern void nullsub_28(void); extern int sprintf(char *, const char *, ...); -struct unkFileStruct +struct DebugLocation { - u32 unk0; - u32 unk4; - u32 unk8; + char *file; + u32 line; + char *func; }; @@ -41,9 +41,9 @@ extern s16 gUnknown_202DE22; extern s16 gUnknown_202DE24; extern u32 gUnknown_202DE1C; extern u32 gUnknown_203B14C; -extern const char gNotEntryText; -extern const char gUnknown_80D418C; -extern char gUnknown_80D41C4; +extern const char gNotEntryText[]; +extern const char gUnknown_80D418C[]; +extern const char gUnknown_80D41C4[]; void sub_8011760(void) { @@ -172,55 +172,18 @@ void sub_8011930(u16 r0) sub_800BFD0(r0); } -// TODO fix this nonmatching -#ifndef NONMATCHING -NAKED -#endif u32 sub_8011940(u16 r0) { -#ifdef NONMATCHING u32 temp; temp = sub_800C068(); - if(r0 == 0x3e7) + if(r0 == 999) { - temp ^= r0; - // TODO this OR/NEG apparently is close - temp |= -temp; - return temp >> 31; + temp ^= 999; + return (-temp | temp) >> 31; } - if(temp != r0) - return 0; - else - return 1; -#else - asm_unified("\tpush {r4,lr}\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tbl sub_800C068\n" - "\tlsls r0, 16\n" - "\tlsrs r1, r0, 16\n" - "\tldr r0, _08011960\n" - "\tcmp r4, r0\n" - "\tbne _08011964\n" - "\teors r1, r4\n" - "\tnegs r0, r1\n" - "\torrs r0, r1\n" - "\tlsrs r0, 31\n" - "\tb _0801196C\n" - "\t.align 2,0\n" - "_08011960: .4byte 0x000003e7\n" - "_08011964:\n" - "\tmovs r0, 0\n" - "\tcmp r1, r4\n" - "\tbne _0801196C\n" - "\tmovs r0, 0x1\n" - "_0801196C:\n" - "\tpop {r4}\n" - "\tpop {r1}\n" - "\tbx r1"); -#endif + return temp == r0; } void sub_8011974(u16 r0, u16 r1) @@ -289,68 +252,20 @@ void nullsub_26(void) { } -#ifndef NONMATCHING -NAKED -#endif // Unused -void PrintFuncFileLineOrNotEntry(char * r0, struct unkFileStruct *r1) +void PrintFuncFileLineOrNotEntry(char * r0, struct DebugLocation *r1) { -#ifdef NONMATCHING - u32 temp; if(r1 != 0) { - // TODO fix regswap here.. otherwise looks good - temp = r1->unk4; - sprintf(r0, &gUnknown_80D418C, r1->unk8, r1->unk0, temp); + sprintf(r0, gUnknown_80D418C, r1->func, r1->file, r1->line); } else { - sprintf(r0, &gNotEntryText); + sprintf(r0, gNotEntryText); } -#else - asm_unified("\tpush {r4,lr}\n" - "\tsub sp, 0x4\n" - "\tadds r4, r0, 0\n" - "\tadds r0, r1, 0\n" - "\tcmp r0, 0\n" - "\tbeq _08011A90\n" - "\tldr r1, _08011A8C\n" - "\tldr r2, [r0, 0x8]\n" - "\tldr r3, [r0]\n" - "\tldr r0, [r0, 0x4]\n" - "\tstr r0, [sp]\n" - "\tadds r0, r4, 0\n" - "\tbl sprintf\n" - "\tb _08011A98\n" - "\t.align 2, 0\n" -"_08011A8C: .4byte gUnknown_80D418C\n" -"_08011A90:\n" - "\tldr r1, _08011AA0\n" - "\tadds r0, r4, 0\n" - "\tbl sprintf\n" -"_08011A98:\n" - "\tadd sp, 0x4\n" - "\tpop {r4}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" -"_08011AA0: .4byte gNotEntryText"); -#endif -} - -void PrintFuncFileLine(char *r0, struct unkFileStruct *r1, u32 r2) -{ - volatile u32 temp; - volatile u32 temp2; - u32 r3; - u32 r4; - char *preload; - - preload = &gUnknown_80D41C4; - r3 = r1->unk8; - r4 = r1->unk0; - temp = r4; - temp2 = r1->unk4; - - sprintf(r0, preload, r2, r3); +} + +void PrintFuncFileLine(char *buf, struct DebugLocation *loc, char* prefix) +{ + sprintf(buf, gUnknown_80D41C4, prefix, loc->func, loc->file, loc->line); } diff --git a/src/code_80118A4_1.c b/src/code_80118A4_1.c index 9d57d7d..89f4db5 100644 --- a/src/code_80118A4_1.c +++ b/src/code_80118A4_1.c @@ -23,40 +23,10 @@ void sub_8011B14(void) gUnknown_203B150 = 0; } -#ifndef NONMATCHING -NAKED -#endif u8 sub_8011B20(void) { -#ifdef NONMATCHING - // TODO figure out why I mix up my mv/ldr for these kinds of comparisons - u8 temp; - if(gUnknown_203B150 == 0) - { - temp = 1; - } - else - { - temp = 0; - } - gUnknown_203B150 = temp; + gUnknown_203B150 = !gUnknown_203B150; return gUnknown_203B150; -#else - asm_unified("\tpush {lr}\n" - "\tldr r1, _08011B38\n" - "\tmovs r2, 0\n" - "\tldrb r0, [r1]\n" - "\tcmp r0, 0\n" - "\tbne _08011B2E\n" - "\tmovs r2, 0x1\n" -"_08011B2E:\n" - "\tstrb r2, [r1]\n" - "\tldrb r0, [r1]\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.align 2, 0\n" -"_08011B38: .4byte gUnknown_203B150"); -#endif } // unused diff --git a/src/music.c b/src/music.c index 13544d9..8997887 100644 --- a/src/music.c +++ b/src/music.c @@ -99,12 +99,8 @@ void nullsub_179(void) { } -#ifndef NONMATCHING -NAKED -#endif u8 sub_800CA38(u32 songIndex) { -#ifdef NONMATCHING if(IsBGSong(songIndex)) { if(sub_800CAE0(songIndex) == 0) @@ -114,70 +110,19 @@ u8 sub_800CA38(u32 songIndex) } if(sub_800CACC(songIndex)) { - // TODO compiler gets weird here wanted to skip to next check if(sub_800CAE0(songIndex) == 1) { - _0800CA70: return 1; } } - if(sub_800CAAC(songIndex)) + else if(sub_800CAAC(songIndex)) { - if((sub_800CAE0(songIndex) > 1)) + if(sub_800CAE0(songIndex) > 1) { - goto _0800CA70; + return 1; } } return 0; -#else - asm_unified("\tpush {r4,lr}\n" - "\tadds r4, r0, 0\n" - "\tbl IsBGSong\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _0800CA54\n" - "\tlsls r0, r4, 16\n" - "\tlsrs r0, 16\n" - "\tbl sub_800CAE0\n" - "\tlsls r0, 16\n" - "\tcmp r0, 0\n" - "\tbeq _0800CA70\n" -"_0800CA54:\n" - "\tadds r0, r4, 0\n" - "\tbl sub_800CACC\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _0800CA74\n" - "\tlsls r0, r4, 16\n" - "\tlsrs r0, 16\n" - "\tbl sub_800CAE0\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x1\n" - "\tbne _0800CA90\n" -"_0800CA70:\n" - "\tmovs r0, 0x1\n" - "\tb _0800CA92\n" -"_0800CA74:\n" - "\tadds r0, r4, 0\n" - "\tbl sub_800CAAC\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _0800CA90\n" - "\tlsls r0, r4, 16\n" - "\tlsrs r0, 16\n" - "\tbl sub_800CAE0\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x1\n" - "\tbhi _0800CA70\n" -"_0800CA90:\n" - "\tmovs r0, 0\n" -"_0800CA92:\n" - "\tpop {r4}\n" - "\tpop {r1}\n" - "\tbx r1"); -#endif } void nullsub_19(void) diff --git a/src/pokemon_1.c b/src/pokemon_1.c index 5a1eb88..ebb24d7 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -6,7 +6,7 @@ extern int sprintf(char *, const char *, ...); extern struct gPokemon *gMonsterParameters; extern struct FileArchive gUnknown_8510000; -extern const char gUnknown_8107684; +extern const char gUnknown_8107684[]; struct unkEvolve { @@ -14,35 +14,16 @@ struct unkEvolve /* 0x4 */ struct EvolveNeeds needs; }; -#ifndef NONMATCHING -NAKED -#endif -void sub_808DD48(s16 r0, struct unkEvolve *r1) +s16 sub_808DD48(s16 r0, struct unkEvolve *r1) { -#ifdef NONMATCHING struct EvolveStruct1 temp2; struct EvolveNeeds temp1; temp1 = gMonsterParameters[r0].need; - temp2 = gMonsterParameters[r0].pre; // TODO should be using r2 but it uses r0 + temp2 = gMonsterParameters[r0].pre; r1->conditions = temp2; r1->needs = temp1; -#else - asm_unified("\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tldr r2, _0808DD64\n" - "\tldr r3, [r2]\n" - "\tlsls r2, r0, 3\n" - "\tadds r2, r0\n" - "\tlsls r2, 3\n" - "\tadds r2, r3\n" - "\tldr r3, [r2, 0x38]\n" - "\tldr r2, [r2, 0x34]\n" - "\tstr r2, [r1]\n" - "\tstr r3, [r1, 0x4]\n" - "\tbx lr\n" - "\t.align 2, 0\n" -"_0808DD64: .4byte gMonsterParameters"); -#endif + // The return value is not used anywhere, but necessary for the function to match. + return r0; } u8 sub_808DD68(s16 r0, u32 r1) @@ -60,106 +41,30 @@ u8 sub_808DD68(s16 r0, u32 r1) } } -#ifndef NONMATCHING -NAKED -#endif struct OpenedFile *sub_808DD90(s16 r0) { -#ifdef NONMATCHING // Looks like this loads the dialogue sprite for the pokemon - // Two words: register memes... else it matches - // Fix this and then one after matches too char buffer[0xC]; if(gMonsterParameters[r0].dialogue_sprites == 0) { return NULL; } - sprintf(buffer, &gUnknown_8107684); + sprintf(buffer, gUnknown_8107684, r0); // "kao%03d" return OpenFile(buffer, &gUnknown_8510000); -#else - asm_unified("\tpush {lr}\n" - "\tsub sp, 0xC\n" - "\tlsls r0, 16\n" - "\tasrs r2, r0, 16\n" - "\tldr r0, _0808DDBC\n" - "\tldr r1, [r0]\n" - "\tlsls r0, r2, 3\n" - "\tadds r0, r2\n" - "\tlsls r0, 3\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0, 0x10]\n" - "\tcmp r0, 0\n" - "\tbeq _0808DDC8\n" - "\tldr r1, _0808DDC0\n" - "\tmov r0, sp\n" - "\tbl sprintf\n" - "\tldr r1, _0808DDC4\n" - "\tmov r0, sp\n" - "\tbl OpenFile\n" - "\tb _0808DDCA\n" - "\t.align 2, 0\n" -"_0808DDBC: .4byte gMonsterParameters\n" -"_0808DDC0: .4byte gUnknown_8107684\n" -"_0808DDC4: .4byte gUnknown_8510000\n" -"_0808DDC8:\n" - "\tmovs r0, 0\n" -"_0808DDCA:\n" - "\tadd sp, 0xC\n" - "\tpop {r1}\n" - "\tbx r1"); -#endif } -#ifndef NONMATCHING -NAKED -#endif struct OpenedFile *sub_808DDD0(s16 r0) { -#ifdef NONMATCHING // Looks like this loads the dialogue sprite for the pokemon - // Two words: register memes... else it matches char buffer[0xC]; if(gMonsterParameters[r0].dialogue_sprites == 0) { return NULL; } - sprintf(buffer, &gUnknown_8107684); + sprintf(buffer, gUnknown_8107684, r0); // "kao%03d" return OpenFileAndGetFileDataPtr(buffer, &gUnknown_8510000); -#else - asm_unified("\tpush {lr}\n" - "\tsub sp, 0xC\n" - "\tlsls r0, 16\n" - "\tasrs r2, r0, 16\n" - "\tldr r0, _0808DDFC\n" - "\tldr r1, [r0]\n" - "\tlsls r0, r2, 3\n" - "\tadds r0, r2\n" - "\tlsls r0, 3\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0, 0x10]\n" - "\tcmp r0, 0\n" - "\tbeq _0808DE08\n" - "\tldr r1, _0808DE00\n" - "\tmov r0, sp\n" - "\tbl sprintf\n" - "\tldr r1, _0808DE04\n" - "\tmov r0, sp\n" - "\tbl OpenFileAndGetFileDataPtr\n" - "\tb _0808DE0A\n" - "\t.align 2, 0\n" - "_0808DDFC: .4byte gMonsterParameters\n" - "_0808DE00: .4byte gUnknown_8107684\n" - "_0808DE04: .4byte gUnknown_8510000\n" - "_0808DE08:\n" - "\tmovs r0, 0\n" - "_0808DE0A:\n" - "\tadd sp, 0xC\n" - "\tpop {r1}\n" - "\tbx r1"); - -#endif } bool8 sub_808DE10(s16 r0, s32 r1) -- cgit v1.2.3 From b02a392e94e05d98a6c8fa2b20bdca99861c7df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Na=C5=9Bciszewski?= Date: Sun, 13 Dec 2020 20:30:30 +0100 Subject: Make sub_8011940 more comprehensible --- src/code_80118A4.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src') diff --git a/src/code_80118A4.c b/src/code_80118A4.c index c05a8db..73cb8b2 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -178,10 +178,7 @@ u32 sub_8011940(u16 r0) temp = sub_800C068(); if(r0 == 999) - { - temp ^= 999; - return (-temp | temp) >> 31; - } + return temp != 999; return temp == r0; } -- cgit v1.2.3 From efdaf621cbebae7d73800cfb2def92a5466127ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Na=C5=9Bciszewski?= Date: Tue, 15 Dec 2020 00:00:08 +0100 Subject: Translating Decompression Hopefully part one of many, some NONMATCHINGs in the larger functions, sadly. --- src/file_system.c | 1431 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1428 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/file_system.c b/src/file_system.c index c328d6a..b2aad05 100644 --- a/src/file_system.c +++ b/src/file_system.c @@ -6,9 +6,22 @@ extern struct OpenedFile gFileCache[64]; extern u32 gFileCacheCursorPosition; extern u32 gUnknown_202D2A4; +extern const u32 gByteShiftLookup[4]; + +extern u32 *gDecompressBufferPtr; +extern u32 *gDecompressBufferStart; +extern u32 gDecompressBufferCurrent; +extern u32 gDecompressBufferByteInInt; + extern int sprintf(char *, const char *, ...); -extern u32 sub_800AAB4(u32 r0, u32 r1, u32 r2); +void DecompressAT_Init(u32 *buffer); +void DecompressAT_AppendByte(char value); +void DecompressAT_Finish(void); +char DecompressAT_GetByte(int index); + +u32 DecompressAT(char *result, u32 resultLength, const char *compressedData); +u32 DecompressATGlobal(u32 *result, u32 resultLength, const char *compressedData); u8 *GetSiroPtr(struct OpenedFile *); void NDS_DecompressRLE(void *); @@ -203,7 +216,1419 @@ void nullsub_175(void) { } -u32 sub_800AAA8(u32 r0, u32 r1, struct UnkFileStruct1 *r2) +u32 DecompressATFile(char *result, u32 resultLength, struct OpenedFile *file) +{ + return DecompressAT(result, resultLength, file->data); +} + +// 800AAB4 +#ifndef NONMATCHING +NAKED +#endif +u32 DecompressAT(char *result, u32 resultLength, const char *compressedData) +{ +#ifdef NONMATCHING + + // This function is an absolute mess, the compiler does some extremely weird things + // which makes matching it difficult. + + // As-is, it's likely that this implementation is nonfunctional + // as I've shuffled things around a lot while trying to make some parts match. + + int flags1; + int flags2; + int flags3; + int flags4; + int flags5; + int flags6; + int flags7; + int flags8; + int flags9; + int compressedLength; + char c10; + char c11; + u32 curIndex; + int v12; + char c13; + const char *p; + int command; + int resultIndex; + int v16; + int cmdBit; + int currentByte; + + compressedLength = compressedData[5] + (compressedData[6] << 8); + resultIndex = 0; + currentByte = 0; + cmdBit = 8; + + if (compressedData[0] == 'A' + && compressedData[1] == 'T' + && compressedData[2] == '4' + && compressedData[3] == 'P') { + if (resultLength != compressedData[0x10] + (compressedData[0x11] << 8) && resultLength != 0) + return 0; + curIndex = 0x12; + } else if (compressedData[0] == 'A' + && compressedData[1] == 'T' + && compressedData[2] == '3' + && compressedData[3] == 'P') { + // Can't get this to match - compiler chooses beq, b pairs instead of bne + // I tried multiple if (... != 'x') return 0; + // I tried != chained with || + // I tried == chained with && + // I tried nested if (... == 'x') + // None of that produced matching code. + curIndex = 0x10; + } else { + return 0; + } + + if (compressedData[5] == 'N') { + // uncompressed mode, unused + int i; + for (i = 0; i < compressedLength; i++) + result[i] = compressedData[i + 7]; + return i; + } + + flags1 = compressedData[0x7] + 3; + flags2 = compressedData[0x8] + 3; + flags3 = compressedData[0x9] + 3; + flags4 = compressedData[0xa] + 3; + flags5 = compressedData[0xb] + 3; + flags6 = compressedData[0xc] + 3; + flags7 = compressedData[0xd] + 3; + flags8 = compressedData[0xe] + 3; + flags9 = compressedData[0xf] + 3; + + // Some mismatches regarding the signedness of these two conditionals, extremely fragile + if (curIndex < compressedLength) { + while (resultLength == 0 || resultIndex < resultLength) { + if (cmdBit == 8) { + currentByte = compressedData[curIndex++]; + cmdBit = 0; + } + if (currentByte & 0x80) { // some weird reordering happens here, couldn't figure it out + result[resultIndex++] = compressedData[curIndex++]; + goto end_800AE08; + } + p = &compressedData[curIndex]; + command = (*p >> 4) + 3; + if (command == flags1) command = 0x1f; + if (command == flags2) command = 0x1e; + if (command == flags3) command = 0x1d; + if (command == flags4) command = 0x1c; + if (command == flags5) command = 0x1b; + if (command == flags6) command = 0x1a; + if (command == flags7) command = 0x19; + if (command == flags8) command = 0x18; + if (command == flags9) command = 0x17; + + switch (command) { + case 0x1f: + c10 = *p & 0xf; + c10 = c10 | (c10 << 4); + result[resultIndex++] = c10; + result[resultIndex++] = c10; + curIndex++; + // if curIndex is incremented inside each case, the compiler leaves them inside, but if curIndex is moved after the switch + // then it moves the second result assignment (just the 'strb' instruction) after the switch. + // Can't figure out how to make the compiler move only one without the other. + break; + case 0x1e: + v12 = *p & 0xf; + v12 = (v12 + 1) & 0xf; + c10 = v12; + result[resultIndex++] = ((*p & 0xf) << 4) | c10; + result[resultIndex++] = (v12 << 4) | c10; + curIndex++; + break; + case 0x1d: + c11 = *p & 0xf; + c10 = c11 << 4; + result[resultIndex++] = ((c11 - 1) & 0xf) | c10; + result[resultIndex++] = c10 | c11; + curIndex++; + break; + case 0x1c: + v12 = *p & 0xf; + c10 = v12; + result[resultIndex++] = (v12 << 4) | c10; + result[resultIndex++] = ((v12 & 0xf) << 4) | c10; + v12--; + curIndex++; + break; + case 0x1b: + c10 = *p; + c11 = c10 & 0xf; + c13 = c11 << 4; + result[resultIndex++] = c13 | c11; + c10 = (c10 & 0xf) - 1; + result[resultIndex++] = c13 | (c10 & 0xf); + curIndex++; + break; + case 0x1a: + v12 = ((*p & 0xf) - 1) & 0xf; + c10 = v12; + result[resultIndex++] = ((*p & 0xf) << 4) | c10; + result[resultIndex++] = (v12 << 4) | c10; + curIndex++; + break; + case 0x19: + c11 = *p & 0xf; + c10 = c11 << 4; + result[resultIndex++] = ((c11 + 1) & 0xf) | c10; + result[resultIndex++] = c10 | c11; + curIndex++; + break; + case 0x18: + v12 = *p & 0xf; + c10 = v12; + result[resultIndex++] = (v12 << 4) | c10; + v12++; + curIndex++; + result[resultIndex++] = ((v12 & 0xf) << 4) | c10; + break; + case 0x17: + c10 = *p; + c11 = c10 & 0xf; + c13 = c11 << 4; + result[resultIndex++] = c11 | c13; + c10 = (c10 & 0xf) + 1; + result[resultIndex++] = c13 | (c10 & 0xf); + curIndex++; + break; + default: + v16 = curIndex + 1; + curIndex += 2; + v16 = ((*p & 0xf) << 8) + compressedData[v16] + (-0x1000) + resultIndex; + while (command) { + result[resultIndex++] = result[v16++]; + command--; + } + break; + } +end_800AE08: + cmdBit++; + currentByte <<= 1; + if (curIndex > compressedLength) + return resultIndex; + } + } + + return 0; +#else + asm_unified( + "DecompressAT:\n" + " push {r4-r7,lr}\n" + " mov r7, r10\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5-r7}\n" + " sub sp, 0x2C\n" + " mov r12, r0\n" + " str r1, [sp, 0x24]\n" + " mov r8, r2\n" + " ldrb r0, [r2, 0x5]\n" + " ldrb r1, [r2, 0x6]\n" + " lsls r1, 8\n" + " adds r0, r1\n" + " str r0, [sp, 0x28]\n" + " movs r6, 0\n" + " mov r10, r6\n" + " movs r0, 0x8\n" + " mov r9, r0\n" + " ldrb r0, [r2]\n" + " cmp r0, 0x41\n" + " bne _0800AB04\n" + " ldrb r0, [r2, 0x1]\n" + " adds r1, r0, 0\n" + " cmp r1, 0x54\n" + " bne _0800AB0C\n" + " ldrb r0, [r2, 0x2]\n" + " cmp r0, 0x34\n" + " bne _0800AB0C\n" + " ldrb r0, [r2, 0x3]\n" + " cmp r0, 0x50\n" + " bne _0800AB0C\n" + " ldrb r1, [r2, 0x10]\n" + " ldrb r0, [r2, 0x11]\n" + " lsls r0, 8\n" + " adds r1, r0\n" + " ldr r2, [sp, 0x24]\n" + " cmp r2, 0\n" + " beq _0800AB08\n" + " cmp r2, r1\n" + " beq _0800AB08\n" + "_0800AB04:\n" + " movs r0, 0\n" + " b _0800AE16\n" + "_0800AB08:\n" + " movs r1, 0x12\n" + " b _0800AB26\n" + "_0800AB0C:\n" + " mov r3, r8\n" + " ldrb r0, [r3]\n" + " cmp r0, 0x41\n" + " bne _0800AB04\n" + " cmp r1, 0x54\n" + " bne _0800AB04\n" + " ldrb r0, [r3, 0x2]\n" + " cmp r0, 0x33\n" + " bne _0800AB04\n" + " ldrb r0, [r3, 0x3]\n" + " cmp r0, 0x50\n" + " bne _0800AB04\n" + " movs r1, 0x10\n" + "_0800AB26:\n" + " mov r2, r8\n" + " ldrb r0, [r2, 0x4]\n" + " cmp r0, 0x4E\n" + " bne _0800AB4A\n" + " movs r7, 0\n" + " b _0800AB40\n" + "_0800AB32:\n" + " mov r1, r12\n" + " adds r0, r1, r7\n" + " mov r2, r8\n" + " adds r1, r7, r2\n" + " ldrb r1, [r1, 0x7]\n" + " strb r1, [r0]\n" + " adds r7, 0x1\n" + "_0800AB40:\n" + " ldr r3, [sp, 0x28]\n" + " cmp r7, r3\n" + " blt _0800AB32\n" + " adds r0, r7, 0\n" + " b _0800AE16\n" + "_0800AB4A:\n" + " mov r2, r8\n" + " ldrb r0, [r2, 0x7]\n" + " adds r0, 0x3\n" + " str r0, [sp]\n" + " ldrb r0, [r2, 0x8]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x4]\n" + " ldrb r0, [r2, 0x9]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x8]\n" + " ldrb r0, [r2, 0xA]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0xC]\n" + " ldrb r0, [r2, 0xB]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x10]\n" + " ldrb r0, [r2, 0xC]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x14]\n" + " ldrb r0, [r2, 0xD]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x18]\n" + " ldrb r0, [r2, 0xE]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x1C]\n" + " ldrb r0, [r2, 0xF]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x20]\n" + " adds r7, r1, 0\n" + " ldr r3, [sp, 0x28]\n" + " cmp r7, r3\n" + " blt _0800AB8C\n" + " b _0800AE14\n" + "_0800AB8C:\n" + " ldr r0, [sp, 0x24]\n" + " cmp r0, 0\n" + " beq _0800AB96\n" + " cmp r6, r0\n" + " bge _0800AB04\n" + "_0800AB96:\n" + " mov r1, r9\n" + " cmp r1, 0x8\n" + " bne _0800ABAA\n" + " mov r2, r8\n" + " adds r0, r2, r7\n" + " ldrb r0, [r0]\n" + " mov r10, r0\n" + " adds r7, 0x1\n" + " movs r3, 0\n" + " mov r9, r3\n" + "_0800ABAA:\n" + " movs r0, 0x80\n" + " mov r1, r10\n" + " ands r0, r1\n" + " cmp r0, 0\n" + " beq _0800ABB6\n" + " b _0800ADF0\n" + "_0800ABB6:\n" + " mov r3, r8\n" + " adds r2, r3, r7\n" + " ldrb r1, [r2]\n" + " lsrs r0, r1, 4\n" + " adds r3, r0, 0x3\n" + " movs r0, 0xF\n" + " ands r0, r1\n" + " lsls r5, r0, 8\n" + " ldr r0, [sp]\n" + " cmp r3, r0\n" + " bne _0800ABCE\n" + " movs r3, 0x1F\n" + "_0800ABCE:\n" + " ldr r0, [sp, 0x4]\n" + " cmp r3, r0\n" + " bne _0800ABD6\n" + " movs r3, 0x1E\n" + "_0800ABD6:\n" + " ldr r0, [sp, 0x8]\n" + " cmp r3, r0\n" + " bne _0800ABDE\n" + " movs r3, 0x1D\n" + "_0800ABDE:\n" + " ldr r0, [sp, 0xC]\n" + " cmp r3, r0\n" + " bne _0800ABE6\n" + " movs r3, 0x1C\n" + "_0800ABE6:\n" + " ldr r0, [sp, 0x10]\n" + " cmp r3, r0\n" + " bne _0800ABEE\n" + " movs r3, 0x1B\n" + "_0800ABEE:\n" + " ldr r0, [sp, 0x14]\n" + " cmp r3, r0\n" + " bne _0800ABF6\n" + " movs r3, 0x1A\n" + "_0800ABF6:\n" + " ldr r0, [sp, 0x18]\n" + " cmp r3, r0\n" + " bne _0800ABFE\n" + " movs r3, 0x19\n" + "_0800ABFE:\n" + " ldr r0, [sp, 0x1C]\n" + " cmp r3, r0\n" + " bne _0800AC06\n" + " movs r3, 0x18\n" + "_0800AC06:\n" + " ldr r0, [sp, 0x20]\n" + " cmp r3, r0\n" + " bne _0800AC0E\n" + " movs r3, 0x17\n" + "_0800AC0E:\n" + " adds r0, r3, 0\n" + " subs r0, 0x17\n" + " cmp r0, 0x8\n" + " bls _0800AC18\n" + " b _0800ADB0\n" + "_0800AC18:\n" + " lsls r0, 2\n" + " ldr r1, _0800AC24\n" + " adds r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + " .align 2, 0\n" + "_0800AC24: .4byte _0800AC28\n" + " .align 2, 0\n" + "_0800AC28:\n" + " .4byte _0800AD7C\n" + " .4byte _0800AD48\n" + " .4byte _0800AD20\n" + " .4byte _0800ACFA\n" + " .4byte _0800ACD6\n" + " .4byte _0800ACB4\n" + " .4byte _0800AC8C\n" + " .4byte _0800AC66\n" + " .4byte _0800AC4C\n" + "_0800AC4C:\n" + " ldrb r1, [r2]\n" + " movs r0, 0xF\n" + " adds r7, 0x1\n" + " mov r3, r12\n" + " adds r2, r3, r6\n" + " ands r0, r1\n" + " lsls r1, r0, 4\n" + " orrs r1, r0\n" + " strb r1, [r2]\n" + " adds r6, 0x1\n" + " adds r0, r3, r6\n" + " strb r1, [r0]\n" + " b _0800ADA4\n" + "_0800AC66:\n" + " ldrb r0, [r2]\n" + " movs r5, 0xF\n" + " ands r5, r0\n" + " adds r7, 0x1\n" + " mov r1, r12\n" + " adds r3, r1, r6\n" + " movs r2, 0xF\n" + " lsls r0, r5, 4\n" + " adds r1, r5, 0x1\n" + " ands r1, r2\n" + " orrs r0, r1\n" + " strb r0, [r3]\n" + " adds r6, 0x1\n" + " mov r3, r12\n" + " adds r2, r3, r6\n" + " lsls r0, r1, 4\n" + " orrs r0, r1\n" + " strb r0, [r2]\n" + " b _0800ADA4\n" + "_0800AC8C:\n" + " ldrb r0, [r2]\n" + " movs r3, 0xF\n" + " movs r5, 0xF\n" + " ands r5, r0\n" + " adds r7, 0x1\n" + " mov r1, r12\n" + " adds r4, r1, r6\n" + " adds r2, r5, 0\n" + " ands r2, r3\n" + " lsls r1, r2, 4\n" + " subs r0, r5, 0x1\n" + " ands r0, r3\n" + " orrs r0, r1\n" + " strb r0, [r4]\n" + " adds r6, 0x1\n" + " mov r3, r12\n" + " adds r0, r3, r6\n" + " orrs r1, r2\n" + " strb r1, [r0]\n" + " b _0800ADA4\n" + "_0800ACB4:\n" + " ldrb r0, [r2]\n" + " movs r3, 0xF\n" + " movs r5, 0xF\n" + " ands r5, r0\n" + " adds r7, 0x1\n" + " mov r1, r12\n" + " adds r2, r1, r6\n" + " adds r1, r5, 0\n" + " ands r1, r3\n" + " lsls r0, r1, 4\n" + " orrs r0, r1\n" + " strb r0, [r2]\n" + " adds r6, 0x1\n" + " mov r0, r12\n" + " adds r2, r0, r6\n" + " subs r0, r5, 0x1\n" + " b _0800AD68\n" + "_0800ACD6:\n" + " ldrb r0, [r2]\n" + " movs r4, 0xF\n" + " movs r5, 0xF\n" + " ands r5, r0\n" + " adds r7, 0x1\n" + " mov r2, r12\n" + " adds r3, r2, r6\n" + " adds r1, r5, 0\n" + " ands r1, r4\n" + " lsls r2, r1, 4\n" + " adds r0, r2, 0\n" + " orrs r0, r1\n" + " strb r0, [r3]\n" + " adds r6, 0x1\n" + " mov r3, r12\n" + " adds r1, r3, r6\n" + " subs r0, r5, 0x1\n" + " b _0800AD9E\n" + "_0800ACFA:\n" + " ldrb r0, [r2]\n" + " movs r5, 0xF\n" + " ands r5, r0\n" + " adds r7, 0x1\n" + " mov r1, r12\n" + " adds r3, r1, r6\n" + " movs r2, 0xF\n" + " lsls r0, r5, 4\n" + " subs r1, r5, 0x1\n" + " ands r1, r2\n" + " orrs r0, r1\n" + " strb r0, [r3]\n" + " adds r6, 0x1\n" + " mov r3, r12\n" + " adds r2, r3, r6\n" + " lsls r0, r1, 4\n" + " orrs r0, r1\n" + " strb r0, [r2]\n" + " b _0800ADA4\n" + "_0800AD20:\n" + " ldrb r0, [r2]\n" + " movs r3, 0xF\n" + " movs r5, 0xF\n" + " ands r5, r0\n" + " adds r7, 0x1\n" + " mov r1, r12\n" + " adds r4, r1, r6\n" + " adds r2, r5, 0\n" + " ands r2, r3\n" + " lsls r1, r2, 4\n" + " adds r0, r5, 0x1\n" + " ands r0, r3\n" + " orrs r0, r1\n" + " strb r0, [r4]\n" + " adds r6, 0x1\n" + " mov r3, r12\n" + " adds r0, r3, r6\n" + " orrs r1, r2\n" + " strb r1, [r0]\n" + " b _0800ADA4\n" + "_0800AD48:\n" + " ldrb r0, [r2]\n" + " movs r3, 0xF\n" + " movs r5, 0xF\n" + " ands r5, r0\n" + " adds r7, 0x1\n" + " mov r1, r12\n" + " adds r2, r1, r6\n" + " adds r1, r5, 0\n" + " ands r1, r3\n" + " lsls r0, r1, 4\n" + " orrs r0, r1\n" + " strb r0, [r2]\n" + " adds r6, 0x1\n" + " mov r0, r12\n" + " adds r2, r0, r6\n" + " adds r0, r5, 0x1\n" + "_0800AD68:\n" + " ands r0, r3\n" + " lsls r0, 4\n" + " orrs r0, r1\n" + " strb r0, [r2]\n" + " adds r6, 0x1\n" + " mov r4, r9\n" + " adds r4, 0x1\n" + " mov r1, r10\n" + " lsls r2, r1, 1\n" + " b _0800AE08\n" + "_0800AD7C:\n" + " ldrb r0, [r2]\n" + " movs r4, 0xF\n" + " movs r5, 0xF\n" + " ands r5, r0\n" + " adds r7, 0x1\n" + " mov r2, r12\n" + " adds r3, r2, r6\n" + " adds r1, r5, 0\n" + " ands r1, r4\n" + " lsls r2, r1, 4\n" + " adds r0, r2, 0\n" + " orrs r0, r1\n" + " strb r0, [r3]\n" + " adds r6, 0x1\n" + " mov r3, r12\n" + " adds r1, r3, r6\n" + " adds r0, r5, 0x1\n" + "_0800AD9E:\n" + " ands r0, r4\n" + " orrs r2, r0\n" + " strb r2, [r1]\n" + "_0800ADA4:\n" + " adds r6, 0x1\n" + " mov r4, r9\n" + " adds r4, 0x1\n" + " mov r0, r10\n" + " lsls r2, r0, 1\n" + " b _0800AE08\n" + "_0800ADB0:\n" + " adds r7, 0x1\n" + " mov r1, r8\n" + " adds r0, r1, r7\n" + " ldrb r0, [r0]\n" + " adds r5, r0\n" + " adds r7, 0x1\n" + " ldr r2, _0800ADEC\n" + " adds r0, r5, r2\n" + " adds r5, r0, r6\n" + " mov r4, r9\n" + " adds r4, 0x1\n" + " mov r0, r10\n" + " lsls r2, r0, 1\n" + " cmp r3, 0\n" + " beq _0800AE08\n" + "_0800ADCE:\n" + " mov r1, r12\n" + " adds r1, r6\n" + " mov r10, r1\n" + " mov r0, r12\n" + " adds r0, r5\n" + " ldrb r1, [r0]\n" + " mov r0, r10\n" + " strb r1, [r0]\n" + " adds r6, 0x1\n" + " adds r5, 0x1\n" + " subs r3, 0x1\n" + " cmp r3, 0\n" + " bne _0800ADCE\n" + " b _0800AE08\n" + " .align 2, 0\n" + "_0800ADEC: .4byte 0xfffff000\n" + "_0800ADF0:\n" + " mov r1, r12\n" + " adds r0, r1, r6\n" + " mov r2, r8\n" + " adds r1, r2, r7\n" + " ldrb r1, [r1]\n" + " strb r1, [r0]\n" + " adds r6, 0x1\n" + " adds r7, 0x1\n" + " mov r4, r9\n" + " adds r4, 0x1\n" + " mov r3, r10\n" + " lsls r2, r3, 1\n" + "_0800AE08:\n" + " mov r9, r4\n" + " mov r10, r2\n" + " ldr r0, [sp, 0x28]\n" + " cmp r7, r0\n" + " bge _0800AE14\n" + " b _0800AB8C\n" + "_0800AE14:\n" + " adds r0, r6, 0\n" + "_0800AE16:\n" + " add sp, 0x2C\n" + " pop {r3-r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov r10, r5\n" + " pop {r4-r7}\n" + " pop {r1}\n" + " bx r1"); +#endif +} + +u32 DecompressATGlobalFile(u32 *result, u32 resultLength, struct OpenedFile *file) +{ + return DecompressATGlobal(result, resultLength, file->data); +} + +// 800AE34 +#ifndef NONMATCHING +NAKED +#endif +u32 DecompressATGlobal(u32 *result, u32 resultLength, const char *compressedData) { - return sub_800AAB4(r0, r1, r2->unk4); +#ifdef NONMATCHING + + // This function has the same issues as above, except is possibly a bit nicer due to the function calls + // I'd say this one is more likely to be at least correct + + int flags1; + int flags2; + int flags3; + int flags4; + int flags5; + int flags6; + int flags7; + int flags8; + int flags9; + int compressedLength; + u32 c10; + char c11; + u32 curIndex; + const char *p; + int command; + int bytesWritten; + int v16; + int cmdBit; + int currentByte; + + compressedLength = compressedData[5] + (compressedData[6] << 8); + bytesWritten = 0; + currentByte = 0; + cmdBit = 8; + + DecompressAT_Init(result); + + if (compressedData[0] == 'A' + && compressedData[1] == 'T' + && compressedData[2] == '4' + && compressedData[3] == 'P') { + if (resultLength != compressedData[0x10] + (compressedData[0x11] << 8) && resultLength != 0) + return 0; + curIndex = 0x12; + } else if (compressedData[0] == 'A' + && compressedData[1] == 'T' + && compressedData[2] == '3' + && compressedData[3] == 'P') { + curIndex = 0x10; + } else { + return 0; + } + + if (compressedData[5] == 'N') { + // uncompressed mode, unused + int i; + for (i = 0; i < compressedLength; i++) + DecompressAT_AppendByte(compressedData[i + 7]); + DecompressAT_Finish(); + return i; + } + + flags1 = compressedData[0x7] + 3; + flags2 = compressedData[0x8] + 3; + flags3 = compressedData[0x9] + 3; + flags4 = compressedData[0xa] + 3; + flags5 = compressedData[0xb] + 3; + flags6 = compressedData[0xc] + 3; + flags7 = compressedData[0xd] + 3; + flags8 = compressedData[0xe] + 3; + flags9 = compressedData[0xf] + 3; + + // Some mismatches regarding the signedness of these two conditionals, extremely fragile + if (curIndex < compressedLength) { + while (resultLength == 0 || bytesWritten < resultLength) { + if (cmdBit == 8) { + currentByte = compressedData[curIndex++]; + cmdBit = 0; + } + if (currentByte & 0x80) { // some weird reordering happens here, couldn't figure it out + DecompressAT_AppendByte(compressedData[curIndex++]); + goto end_800B198; + } + p = &compressedData[curIndex]; + command = (*p >> 4) + 3; + if (command == flags1) command = 0x1f; + if (command == flags2) command = 0x1e; + if (command == flags3) command = 0x1d; + if (command == flags4) command = 0x1c; + if (command == flags5) command = 0x1b; + if (command == flags6) command = 0x1a; + if (command == flags7) command = 0x19; + if (command == flags8) command = 0x18; + if (command == flags9) command = 0x17; + + switch (command) { + case 0x1f: + c10 = *p & 0xf; + c10 = c10 | (c10 << 4); + DecompressAT_AppendByte(c10); + break; + case 0x1e: + c10 = ((*p & 0xf) + 1) & 0xf; + DecompressAT_AppendByte(((*p & 0xf) << 4) | c10); + c10 |= c10 << 4; + break; + case 0x1d: + c10 = *p & 0xf; + DecompressAT_AppendByte(((c10 - 1) & 0xf) | (c10 << 4)); + c10 |= c10 << 4; + break; + case 0x1c: + c10 = *p & 0xf; + DecompressAT_AppendByte((c10 << 4) | c10); + c10 |= ((c10 - 1) & 0xf) << 4; + break; + case 0x1b: + c11 = *p & 0xf; + c10 = c11 << 4; + DecompressAT_AppendByte(c10 | c11); + c11--; + c10 |= c11 & 0xf; + break; + case 0x1a: + c10 = ((*p & 0xf) - 1) & 0xf; + DecompressAT_AppendByte(((*p & 0xf) << 4) | c10); + c10 |= c10 << 4; + break; + case 0x19: + c10 = *p & 0xf; + DecompressAT_AppendByte(((c10 + 1) & 0xf) | (c10 << 4)); + c10 |= c10 << 4; + break; + case 0x18: + c10 = *p & 0xf; + DecompressAT_AppendByte((c10 << 4) | c10); + c10 |= ((c10 + 1) & 0xf) << 4; + break; + case 0x17: + c11 = *p & 0xf; + c10 = c11 << 4; + DecompressAT_AppendByte(c10 | c11); + c11++; + c10 |= c11 & 0xf; + break; + default: + v16 = curIndex + 1; + curIndex += 2; + v16 = ((*p & 0xf) << 8) + compressedData[v16] + (-0x1000) + bytesWritten; + while (command) { + char c = DecompressAT_GetByte(v16); + DecompressAT_AppendByte(c); + bytesWritten++; + v16++; + command--; + } + goto end_800B198; + } + curIndex++; + DecompressAT_AppendByte(c10); + bytesWritten += 2; +end_800B198: + cmdBit++; + currentByte <<= 1; + if (curIndex > compressedLength) + break; + } + DecompressAT_Finish(); + return bytesWritten; + } + + return 0; +#else + asm_unified( + "DecompressATGlobal:\n" + " push {r4-r7,lr}\n" + " mov r7, r10\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5-r7}\n" + " sub sp, 0x34\n" + " str r1, [sp, 0x24]\n" + " mov r10, r2\n" + " ldrb r2, [r2, 0x5]\n" + " mov r3, r10\n" + " ldrb r1, [r3, 0x6]\n" + " lsls r1, 8\n" + " adds r2, r1\n" + " str r2, [sp, 0x28]\n" + " movs r1, 0\n" + " mov r9, r1\n" + " movs r2, 0\n" + " str r2, [sp, 0x2C]\n" + " movs r3, 0x8\n" + " str r3, [sp, 0x30]\n" + " bl DecompressAT_Init\n" + " mov r1, r10\n" + " ldrb r0, [r1]\n" + " cmp r0, 0x41\n" + " bne _0800AE90\n" + " ldrb r0, [r1, 0x1]\n" + " adds r1, r0, 0\n" + " cmp r1, 0x54\n" + " bne _0800AE98\n" + " mov r2, r10\n" + " ldrb r0, [r2, 0x2]\n" + " cmp r0, 0x34\n" + " bne _0800AE98\n" + " ldrb r0, [r2, 0x3]\n" + " cmp r0, 0x50\n" + " bne _0800AE98\n" + " ldrb r1, [r2, 0x10]\n" + " ldrb r0, [r2, 0x11]\n" + " lsls r0, 8\n" + " adds r1, r0\n" + " ldr r3, [sp, 0x24]\n" + " cmp r3, 0\n" + " beq _0800AE94\n" + " cmp r3, r1\n" + " beq _0800AE94\n" + "_0800AE90:\n" + " movs r0, 0\n" + " b _0800B1AA\n" + "_0800AE94:\n" + " movs r1, 0x12\n" + " b _0800AEB2\n" + "_0800AE98:\n" + " mov r2, r10\n" + " ldrb r0, [r2]\n" + " cmp r0, 0x41\n" + " bne _0800AE90\n" + " cmp r1, 0x54\n" + " bne _0800AE90\n" + " ldrb r0, [r2, 0x2]\n" + " cmp r0, 0x33\n" + " bne _0800AE90\n" + " ldrb r0, [r2, 0x3]\n" + " cmp r0, 0x50\n" + " bne _0800AE90\n" + " movs r1, 0x10\n" + "_0800AEB2:\n" + " mov r3, r10\n" + " ldrb r0, [r3, 0x4]\n" + " cmp r0, 0x4E\n" + " bne _0800AEE0\n" + " movs r0, 0\n" + " mov r8, r0\n" + " ldr r1, [sp, 0x28]\n" + " cmp r8, r1\n" + " bge _0800AED8\n" + "_0800AEC4:\n" + " mov r0, r8\n" + " add r0, r10\n" + " ldrb r0, [r0, 0x7]\n" + " bl DecompressAT_AppendByte\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " ldr r3, [sp, 0x28]\n" + " cmp r8, r3\n" + " blt _0800AEC4\n" + "_0800AED8:\n" + " bl DecompressAT_Finish\n" + " mov r0, r8\n" + " b _0800B1AA\n" + "_0800AEE0:\n" + " mov r2, r10\n" + " ldrb r0, [r2, 0x7]\n" + " adds r0, 0x3\n" + " str r0, [sp]\n" + " ldrb r0, [r2, 0x8]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x4]\n" + " ldrb r0, [r2, 0x9]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x8]\n" + " ldrb r0, [r2, 0xA]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0xC]\n" + " ldrb r0, [r2, 0xB]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x10]\n" + " ldrb r0, [r2, 0xC]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x14]\n" + " ldrb r0, [r2, 0xD]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x18]\n" + " ldrb r0, [r2, 0xE]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x1C]\n" + " ldrb r0, [r2, 0xF]\n" + " adds r0, 0x3\n" + " str r0, [sp, 0x20]\n" + " mov r8, r1\n" + " ldr r3, [sp, 0x28]\n" + " cmp r8, r3\n" + " blt _0800AF22\n" + " b _0800B1A4\n" + "_0800AF22:\n" + " ldr r0, [sp, 0x24]\n" + " cmp r0, 0\n" + " beq _0800AF2C\n" + " cmp r9, r0\n" + " bge _0800AE90\n" + "_0800AF2C:\n" + " ldr r1, [sp, 0x30]\n" + " cmp r1, 0x8\n" + " bne _0800AF42\n" + " mov r0, r10\n" + " add r0, r8\n" + " ldrb r0, [r0]\n" + " str r0, [sp, 0x2C]\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " movs r3, 0\n" + " str r3, [sp, 0x30]\n" + "_0800AF42:\n" + " movs r0, 0x80\n" + " ldr r1, [sp, 0x2C]\n" + " ands r0, r1\n" + " cmp r0, 0\n" + " beq _0800AF4E\n" + " b _0800B180\n" + "_0800AF4E:\n" + " mov r2, r10\n" + " add r2, r8\n" + " ldrb r1, [r2]\n" + " lsrs r0, r1, 4\n" + " adds r3, r0, 0x3\n" + " movs r0, 0xF\n" + " ands r0, r1\n" + " lsls r7, r0, 8\n" + " ldr r0, [sp]\n" + " cmp r3, r0\n" + " bne _0800AF66\n" + " movs r3, 0x1F\n" + "_0800AF66:\n" + " ldr r0, [sp, 0x4]\n" + " cmp r3, r0\n" + " bne _0800AF6E\n" + " movs r3, 0x1E\n" + "_0800AF6E:\n" + " ldr r0, [sp, 0x8]\n" + " cmp r3, r0\n" + " bne _0800AF76\n" + " movs r3, 0x1D\n" + "_0800AF76:\n" + " ldr r0, [sp, 0xC]\n" + " cmp r3, r0\n" + " bne _0800AF7E\n" + " movs r3, 0x1C\n" + "_0800AF7E:\n" + " ldr r0, [sp, 0x10]\n" + " cmp r3, r0\n" + " bne _0800AF86\n" + " movs r3, 0x1B\n" + "_0800AF86:\n" + " ldr r0, [sp, 0x14]\n" + " cmp r3, r0\n" + " bne _0800AF8E\n" + " movs r3, 0x1A\n" + "_0800AF8E:\n" + " ldr r0, [sp, 0x18]\n" + " cmp r3, r0\n" + " bne _0800AF96\n" + " movs r3, 0x19\n" + "_0800AF96:\n" + " ldr r0, [sp, 0x1C]\n" + " cmp r3, r0\n" + " bne _0800AF9E\n" + " movs r3, 0x18\n" + "_0800AF9E:\n" + " ldr r0, [sp, 0x20]\n" + " cmp r3, r0\n" + " bne _0800AFA6\n" + " movs r3, 0x17\n" + "_0800AFA6:\n" + " adds r0, r3, 0\n" + " subs r0, 0x17\n" + " cmp r0, 0x8\n" + " bls _0800AFB0\n" + " b _0800B13C\n" + "_0800AFB0:\n" + " lsls r0, 2\n" + " ldr r1, _0800AFBC\n" + " adds r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + " .align 2, 0\n" + "_0800AFBC: .4byte _0800AFC0\n" + " .align 2, 0\n" + "_0800AFC0:\n" + " .4byte _0800B104\n" + " .4byte _0800B0DE\n" + " .4byte _0800B0BA\n" + " .4byte _0800B090\n" + " .4byte _0800B06E\n" + " .4byte _0800B048\n" + " .4byte _0800B024\n" + " .4byte _0800AFFE\n" + " .4byte _0800AFE4\n" + "_0800AFE4:\n" + " ldrb r0, [r2]\n" + " movs r1, 0xF\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " ands r1, r0\n" + " lsls r4, r1, 4\n" + " orrs r4, r1\n" + " adds r0, r4, 0\n" + " bl DecompressAT_AppendByte\n" + " movs r3, 0x1\n" + " add r9, r3\n" + " b _0800B128\n" + "_0800AFFE:\n" + " ldrb r0, [r2]\n" + " movs r6, 0xF\n" + " ands r6, r0\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " movs r1, 0xF\n" + " lsls r0, r6, 4\n" + " adds r4, r6, 0x1\n" + " ands r4, r1\n" + " orrs r0, r4\n" + " bl DecompressAT_AppendByte\n" + " movs r3, 0x1\n" + " add r9, r3\n" + " lsls r0, r4, 4\n" + " orrs r0, r4\n" + " lsls r0, 24\n" + " lsrs r0, 24\n" + " b _0800B12A\n" + "_0800B024:\n" + " ldrb r0, [r2]\n" + " movs r1, 0xF\n" + " movs r6, 0xF\n" + " ands r6, r0\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " adds r5, r6, 0\n" + " ands r5, r1\n" + " lsls r4, r5, 4\n" + " subs r0, r6, 0x1\n" + " ands r0, r1\n" + " orrs r0, r4\n" + " bl DecompressAT_AppendByte\n" + " movs r3, 0x1\n" + " add r9, r3\n" + " orrs r4, r5\n" + " b _0800B128\n" + "_0800B048:\n" + " ldrb r0, [r2]\n" + " movs r5, 0xF\n" + " movs r6, 0xF\n" + " ands r6, r0\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " adds r4, r6, 0\n" + " ands r4, r5\n" + " lsls r0, r4, 4\n" + " orrs r0, r4\n" + " bl DecompressAT_AppendByte\n" + " movs r3, 0x1\n" + " add r9, r3\n" + " subs r0, r6, 0x1\n" + " ands r0, r5\n" + " lsls r0, 4\n" + " orrs r0, r4\n" + " b _0800B12A\n" + "_0800B06E:\n" + " ldrb r0, [r2]\n" + " movs r5, 0xF\n" + " movs r6, 0xF\n" + " ands r6, r0\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " adds r1, r6, 0\n" + " ands r1, r5\n" + " lsls r4, r1, 4\n" + " adds r0, r4, 0\n" + " orrs r0, r1\n" + " bl DecompressAT_AppendByte\n" + " movs r3, 0x1\n" + " add r9, r3\n" + " subs r0, r6, 0x1\n" + " b _0800B124\n" + "_0800B090:\n" + " ldrb r0, [r2]\n" + " movs r6, 0xF\n" + " ands r6, r0\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " movs r1, 0xF\n" + " lsls r0, r6, 4\n" + " subs r4, r6, 0x1\n" + " ands r4, r1\n" + " orrs r0, r4\n" + " lsls r0, 24\n" + " lsrs r0, 24\n" + " bl DecompressAT_AppendByte\n" + " movs r3, 0x1\n" + " add r9, r3\n" + " lsls r0, r4, 4\n" + " orrs r0, r4\n" + " lsls r0, 24\n" + " lsrs r0, 24\n" + " b _0800B12A\n" + "_0800B0BA:\n" + " ldrb r0, [r2]\n" + " movs r1, 0xF\n" + " movs r6, 0xF\n" + " ands r6, r0\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " adds r5, r6, 0\n" + " ands r5, r1\n" + " lsls r4, r5, 4\n" + " adds r0, r6, 0x1\n" + " ands r0, r1\n" + " orrs r0, r4\n" + " bl DecompressAT_AppendByte\n" + " movs r3, 0x1\n" + " add r9, r3\n" + " orrs r4, r5\n" + " b _0800B128\n" + "_0800B0DE:\n" + " ldrb r0, [r2]\n" + " movs r5, 0xF\n" + " movs r6, 0xF\n" + " ands r6, r0\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " adds r4, r6, 0\n" + " ands r4, r5\n" + " lsls r0, r4, 4\n" + " orrs r0, r4\n" + " bl DecompressAT_AppendByte\n" + " movs r3, 0x1\n" + " add r9, r3\n" + " adds r0, r6, 0x1\n" + " ands r0, r5\n" + " lsls r0, 4\n" + " orrs r0, r4\n" + " b _0800B12A\n" + "_0800B104:\n" + " ldrb r0, [r2]\n" + " movs r5, 0xF\n" + " movs r6, 0xF\n" + " ands r6, r0\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " adds r1, r6, 0\n" + " ands r1, r5\n" + " lsls r4, r1, 4\n" + " adds r0, r4, 0\n" + " orrs r0, r1\n" + " bl DecompressAT_AppendByte\n" + " movs r3, 0x1\n" + " add r9, r3\n" + " adds r0, r6, 0x1\n" + "_0800B124:\n" + " ands r0, r5\n" + " orrs r4, r0\n" + "_0800B128:\n" + " adds r0, r4, 0\n" + "_0800B12A:\n" + " bl DecompressAT_AppendByte\n" + " movs r0, 0x1\n" + " add r9, r0\n" + " ldr r5, [sp, 0x30]\n" + " adds r5, 0x1\n" + " ldr r1, [sp, 0x2C]\n" + " lsls r4, r1, 1\n" + " b _0800B198\n" + "_0800B13C:\n" + " movs r2, 0x1\n" + " add r8, r2\n" + " mov r0, r10\n" + " add r0, r8\n" + " ldrb r0, [r0]\n" + " adds r7, r0\n" + " add r8, r2\n" + " ldr r1, _0800B17C\n" + " adds r0, r7, r1\n" + " mov r2, r9\n" + " adds r7, r0, r2\n" + " ldr r5, [sp, 0x30]\n" + " adds r5, 0x1\n" + " ldr r0, [sp, 0x2C]\n" + " lsls r4, r0, 1\n" + " cmp r3, 0\n" + " beq _0800B198\n" + " adds r6, r3, 0\n" + "_0800B160:\n" + " adds r0, r7, 0\n" + " bl DecompressAT_GetByte\n" + " lsls r0, 24\n" + " lsrs r0, 24\n" + " bl DecompressAT_AppendByte\n" + " movs r1, 0x1\n" + " add r9, r1\n" + " adds r7, 0x1\n" + " subs r6, 0x1\n" + " cmp r6, 0\n" + " bne _0800B160\n" + " b _0800B198\n" + " .align 2, 0\n" + "_0800B17C: .4byte 0xfffff000\n" + "_0800B180:\n" + " mov r0, r10\n" + " add r0, r8\n" + " ldrb r0, [r0]\n" + " bl DecompressAT_AppendByte\n" + " movs r2, 0x1\n" + " add r9, r2\n" + " add r8, r2\n" + " ldr r5, [sp, 0x30]\n" + " adds r5, 0x1\n" + " ldr r3, [sp, 0x2C]\n" + " lsls r4, r3, 1\n" + "_0800B198:\n" + " str r5, [sp, 0x30]\n" + " str r4, [sp, 0x2C]\n" + " ldr r0, [sp, 0x28]\n" + " cmp r8, r0\n" + " bge _0800B1A4\n" + " b _0800AF22\n" + "_0800B1A4:\n" + " bl DecompressAT_Finish\n" + " mov r0, r9\n" + "_0800B1AA:\n" + " add sp, 0x34\n" + " pop {r3-r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov r10, r5\n" + " pop {r4-r7}\n" + " pop {r1}\n" + " bx r1"); +#endif +} + +// 800B1BC +void DecompressAT_Init(u32 *buffer) { + gDecompressBufferPtr = buffer; + gDecompressBufferStart = buffer; + gDecompressBufferCurrent = 0; + gDecompressBufferByteInInt = 0; +} + +// 800B1E0 +#ifndef NONMATCHING +NAKED +#endif +char DecompressAT_GetByte(int index) { +#ifdef NONMATCHING + char result; + u32 data; + int offset; + + offset = index < 0 ? index + 3 : index; + + data = gDecompressBufferStart[offset >> 2]; + // compiler inserts a ldrb here for some reason? + result = data; + index &= 3; + // Need to reorder these somehow to match + if (index == 1) result = data >> 8; + else if (index == 2) result = data >> 16; + else if (index == 3) return data >> 24; + return result; +#else + asm_unified( + "DecompressAT_GetByte:\n" + " push {lr}\n" + " adds r2, r0, 0\n" + " cmp r2, 0\n" + " bge _0800B1EA\n" + " adds r0, r2, 0x3\n" + "_0800B1EA:\n" + " asrs r0, 2\n" + " ldr r1, _0800B20C\n" + " ldr r1, [r1]\n" + " lsls r0, 2\n" + " adds r0, r1\n" + " ldr r0, [r0]\n" + " movs r1, 0x3\n" + " ands r1, r2\n" + " cmp r1, 0x1\n" + " beq _0800B210\n" + " cmp r1, 0x1\n" + " ble _0800B216\n" + " cmp r1, 0x2\n" + " beq _0800B214\n" + " cmp r1, 0x3\n" + " beq _0800B218\n" + " b _0800B216\n" + " .align 2, 0\n" + "_0800B20C: .4byte gDecompressBufferStart\n" + "_0800B210:\n" + " lsrs r0, 8\n" + " b _0800B216\n" + "_0800B214:\n" + " lsrs r0, 16\n" + "_0800B216:\n" + " lsls r0, 24\n" + "_0800B218:\n" + " lsrs r0, 24\n" + " pop {r1}\n" + " bx r1"); +#endif +} + +// 800B220 +void DecompressAT_AppendByte(char value) { + gDecompressBufferCurrent |= value << gByteShiftLookup[gDecompressBufferByteInInt]; + *gDecompressBufferPtr = gDecompressBufferCurrent; + gDecompressBufferByteInInt++; + if (gDecompressBufferByteInInt == 4) { + gDecompressBufferPtr++; + gDecompressBufferCurrent = 0; + gDecompressBufferByteInInt = 0; + } +} + +// 800B270 +void DecompressAT_Finish(void) { + if (gDecompressBufferByteInInt) + *gDecompressBufferPtr = gDecompressBufferCurrent; } -- cgit v1.2.3 From 75b09a819a7dbb51d42aacd31ecc85a5c233d8a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Na=C5=9Bciszewski?= Date: Tue, 15 Dec 2020 02:37:00 +0100 Subject: Finish translating code_800AAA0 to C! --- src/file_system.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src') diff --git a/src/file_system.c b/src/file_system.c index b2aad05..cd1bf83 100644 --- a/src/file_system.c +++ b/src/file_system.c @@ -1632,3 +1632,28 @@ void DecompressAT_Finish(void) { if (gDecompressBufferByteInInt) *gDecompressBufferPtr = gDecompressBufferCurrent; } + +// 800B294 +bool32 IsATxPCompressed_unused(char *data) { + if ((data[0] == 'A' && data[1] == 'T' && data[2] == '4' && data[3] == 'P')) return TRUE; + if ((data[0] == 'A' && data[1] == 'T' && data[2] == '3' && data[3] == 'P')) return TRUE; + return FALSE; +} + +// 800B2D4 +bool32 sub_800B2D4(char *arg0, char *arg1, int length) { + int i; + char a, b; + for (i = 0; i < length; i++) { + a = arg0[i]; + b = arg1[i]; + // convert to lowercase + if ('A' <= a && a <= 'Z') a += 0x20; + if ('A' <= b && b <= 'Z') b += 0x20; + if (a != b) + return TRUE; + if (a == '\0') + break; + } + return FALSE; +} -- cgit v1.2.3 From 7c524958798f66e09d254228b14af004d56ead53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Na=C5=9Bciszewski?= Date: Tue, 15 Dec 2020 04:40:18 +0100 Subject: Fix GetByte NONMATCHING --- src/file_system.c | 63 ++++++++----------------------------------------------- 1 file changed, 9 insertions(+), 54 deletions(-) (limited to 'src') diff --git a/src/file_system.c b/src/file_system.c index cd1bf83..b10b207 100644 --- a/src/file_system.c +++ b/src/file_system.c @@ -1553,66 +1553,21 @@ void DecompressAT_Init(u32 *buffer) { } // 800B1E0 -#ifndef NONMATCHING -NAKED -#endif char DecompressAT_GetByte(int index) { -#ifdef NONMATCHING - char result; u32 data; int offset; offset = index < 0 ? index + 3 : index; - data = gDecompressBufferStart[offset >> 2]; - // compiler inserts a ldrb here for some reason? - result = data; - index &= 3; - // Need to reorder these somehow to match - if (index == 1) result = data >> 8; - else if (index == 2) result = data >> 16; - else if (index == 3) return data >> 24; - return result; -#else - asm_unified( - "DecompressAT_GetByte:\n" - " push {lr}\n" - " adds r2, r0, 0\n" - " cmp r2, 0\n" - " bge _0800B1EA\n" - " adds r0, r2, 0x3\n" - "_0800B1EA:\n" - " asrs r0, 2\n" - " ldr r1, _0800B20C\n" - " ldr r1, [r1]\n" - " lsls r0, 2\n" - " adds r0, r1\n" - " ldr r0, [r0]\n" - " movs r1, 0x3\n" - " ands r1, r2\n" - " cmp r1, 0x1\n" - " beq _0800B210\n" - " cmp r1, 0x1\n" - " ble _0800B216\n" - " cmp r1, 0x2\n" - " beq _0800B214\n" - " cmp r1, 0x3\n" - " beq _0800B218\n" - " b _0800B216\n" - " .align 2, 0\n" - "_0800B20C: .4byte gDecompressBufferStart\n" - "_0800B210:\n" - " lsrs r0, 8\n" - " b _0800B216\n" - "_0800B214:\n" - " lsrs r0, 16\n" - "_0800B216:\n" - " lsls r0, 24\n" - "_0800B218:\n" - " lsrs r0, 24\n" - " pop {r1}\n" - " bx r1"); -#endif + + switch (index & 3) { + case 0: return data; + case 1: return data >> 8; + case 2: return data >> 16; + case 3: return data >> 24; + } + + return data; } // 800B220 -- cgit v1.2.3 From f90f3affeb9b0a66aa7df68f5fdecd692033faf9 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Tue, 15 Dec 2020 16:28:03 -0600 Subject: Wonder mail Pt. 1 (#11) Some work on decomping/labeling wonder mail. Renamed corresponding assembly/C files. Labeled a few strings in data too. --- src/code_8028DE8.c | 294 ----------- src/wonder_mail.c | 1444 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1444 insertions(+), 294 deletions(-) delete mode 100644 src/code_8028DE8.c create mode 100644 src/wonder_mail.c (limited to 'src') diff --git a/src/code_8028DE8.c b/src/code_8028DE8.c deleted file mode 100644 index f65fecb..0000000 --- a/src/code_8028DE8.c +++ /dev/null @@ -1,294 +0,0 @@ -#include "global.h" - -extern u32 sub_80144A4(s32 *r0); -extern void sub_8028B04(u32); -extern void sub_8011C28(u32); -extern void sub_8012574(u32); -extern u8 sub_8012600(); -extern void sub_8012750(); -extern void sub_8095240(u8); - -extern void sub_809927C(u8); -extern u32 *gUnknown_203B2C0; -extern u8 sub_8030C20(u32); -extern u32 sub_8031050(); -extern void sub_80310B4(); -extern u32 sub_8095350(); - -void sub_8028CE0() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - sub_8028B04(3); -} - -void sub_8028CFC() -{ - s32 temp; - u32 temp2; - - if(sub_80144A4(&temp) != 0) - { - return; - } - switch(sub_8031050()) - { - case 2: - case 3: - temp2 = sub_8095350(); - sub_80310B4(); - if(temp2 != gUnknown_203B2C0[0xA8 << 1]) - { - sub_8028B04(0x17); - } - else - { - sub_8028B04(0x19); - } - break; - default: - break; - } -} - -void sub_8028D4C() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - gUnknown_203B2C0[0xA7 << 1] = temp; - switch((s32)gUnknown_203B2C0[0xA7 << 1]) - { - case 5: - if(sub_8030C20(2) != 0) - { - sub_8028B04(12); - } - else - { - sub_8028B04(13); - } - break; - case 6: - if(sub_8030C20(4) != 0) - { - sub_8028B04(14); - } - else - { - sub_8028B04(15); - } - break; - case 7: - if(sub_8030C20(0) != 0) - { - sub_8028B04(16); - } - else - { - sub_8028B04(17); - } - break; - case 0xA: - sub_8028B04(1); - break; - default: - break; - } -} - -void sub_8028DE8(u32 r0) -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - sub_8028B04(r0); -} - -void sub_8028E08() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - sub_8028B04(0x12); -} - -void sub_8028E24() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - switch(temp) - { - case 0x8: - sub_8028B04(0x13); - break; - case 0xA: - sub_8028B04(1); - break; - default: - break; - } -} - -void sub_8028E54() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - switch(temp) - { - case 0x8: - sub_8028B04(0x14); - break; - case 0xA: - sub_8028B04(1); - break; - default: - break; - } -} - -void sub_8028E84() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - sub_8028B04(0x18); - sub_8011C28(1); - sub_8012574(0); -} - -void sub_8028EAC() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - if(sub_8012600() == 0) - { - sub_8012750(); - sub_8028B04(0x19); - } -} - -void sub_8028ED4() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - if(temp == 8) - { - sub_8028B04(0xB); - } - else - { - switch(temp){ - case 0x8: - sub_8028B04(0x2); - break; - case 0x9: - case 0xA: - sub_8028B04(0x2); - break; - default: - break; - } - } -} - -void sub_8028F04() -{ - s32 temp; - s32 counter; - - if(sub_80144A4(&temp) != 0) - { - return; - } - for(counter = 0; counter <= 0x1F; counter++) - { - sub_8095240(counter); - } - sub_8028B04(0x15); -} - -void sub_8028F30() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - sub_8028B04(0x16); - sub_8011C28(1); - sub_8012574(0); -} - -void sub_8028F58() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - if(sub_8012600() == 0) - { - sub_8012750(); - sub_8028B04(2); - } -} - -void sub_8028F80() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - sub_809927C(gUnknown_203B2C0[0x86]); - gUnknown_203B2C0[335] = 1; - sub_8028B04(3); -} - -void sub_8028FC0() -{ - s32 temp; - - if(sub_80144A4(&temp) != 0) - { - return; - } - sub_8028B04(1); -} - diff --git a/src/wonder_mail.c b/src/wonder_mail.c new file mode 100644 index 0000000..c3fa39b --- /dev/null +++ b/src/wonder_mail.c @@ -0,0 +1,1444 @@ +#include "global.h" + +// Wonder Mail Related +struct WonderMailStruct_203B2C0 +{ + u32 unk0; + u32 unk4; + u8 padding2[0x38]; + u32 unk40; + u32 unk44; + u16 unk48[232]; + u8 unk218; + u8 padding7[3]; + u32 unk21C; + u8 padding[0x7C]; + u32 unk29C; + u8 padding6[0x6C]; + u32 unk30C; + u8 padding8[0x4C]; + u32 unk35C; + u8 padding5[0x5C]; + u32 unk3BC; + u8 padding4[0x60]; + u32 unk420; + u8 padding3[0x110]; + u32 unk534; + s32 unk538; // A7 << 3 + u32 unk53C; + u32 unk540; // A8 << 4 + s16 unk544; +}; + +struct unkStruct_8095228 +{ + u32 unk0; + u8 unk4; + u8 padding[0x27]; + s8 unk30; +}; + +struct unkStruct_80293F4 +{ + // size of 0x44 + u32 unk0; + u32 unk4; + u32 unk8; + u32 *unkC; + u32 unk10; + u8 unk14[0xA]; // very unsure about this one + u32 unk20; + u32 unk24; + u32 padding[7]; +}; + + +extern struct WonderMailStruct_203B2C0 *gUnknown_203B2C0; + +extern u32 sub_80144A4(s32 *r0); +extern void sub_8011C28(u32); +extern void sub_8012574(u32); +extern u8 sub_8012600(); +extern void sub_8012750(); +extern void sub_8095240(u8); + +extern void sub_809927C(u8); +extern u8 sub_8030C20(u32); +extern u32 sub_8031050(); +extern void sub_80310B4(); +extern u32 sub_8095350(); + +extern struct unkStruct_8095228 *sub_8095228(u8); +extern u8 sub_80A2824(u32); + +extern u32 gWonderMailErrorText; +extern u32 gWonderMailNumGBAsText; +extern u32 gWonderMailWrongModeText; +extern u32 gWonderMailStorageFullText; +extern u32 gWonderMailDuplicateText; +extern u32 gWonderMailNotEligibleReceiveText; +extern u32 gWonderMailNoRoomText; +extern u32 gWonderMailFriendErrorText; +extern u32 gWonderMailPasswordIncorrectText; +extern u32 gWonderMailSOSPasswordIncorrectText; +extern u32 gWonderMailDuplicateText; +extern u32 gWonderMailAOKMailReceivedText; + +extern s32 sub_8095190(void); +extern u32 sub_8095324(u32); +extern void sub_80141B4(u32 *r0, u32, u32 *r1, u32); +extern void nullsub_130(void); +extern void sub_8028348(void); +extern void sub_800641C(void *r0, u8, u8); +extern void sub_8004914(); +extern void sub_803084C(); +extern u32 sub_8030768(u32); +extern u8 sub_80307EC(); +extern void sub_8030D40(u8, u32); +extern void sub_8006518(u32 *r0); +extern u8 sub_8012FD8(u32 *r0); +extern void sub_8030810(u32); +extern void sub_8035CC0(u32 *r0, u32); +extern void sub_8035CF4(u32 *r0, u32, u32); +extern u32 sub_8030DA0(void); +extern void sub_8030DE4(void); +extern void sub_803092C(void); +extern void sub_8011C28(u32); +extern void sub_8012574(u32); +extern u8 sub_8012600(); +extern u32 sub_8012744(); +extern void sub_8012750(); + + +extern u32 sub_80154F0(); +void MemoryFill8(u8 *dest, u8 value, s32 size); +extern u32 sub_8039068(u32, u32 *r1, u8 *r0); +extern u32 gUnknown_80DDA48; +extern void sub_8014248(u32 *r0, u32, u32, u32 *r1); +extern void sub_8095274(u32); +extern void sub_80155F0(); +extern void sub_80951BC(u8 *r0); +extern void sub_8013114(u32 *r0, s32 *r1); +extern void sub_8035CC0(u32 *r0, u32); +extern void sub_8023C60(); +extern u32 sub_8023A94(u32); +extern void sub_8024458(s16, u32); +extern u16 sub_8023B44(); +extern void sub_8023B7C(u32); +extern u32 sub_80244E4(); +extern void sub_802452C(); +extern void sub_802453C(); +extern u8 sub_8024108(u32); +extern u32 sub_8031DCC(); +extern void sub_8031E10(); +extern void sub_8031E00(); + +void sub_8028B04(u32 r0) +{ + gUnknown_203B2C0->unk4 = r0; + nullsub_130(); + sub_8028348(); +} + +// Wonder Mail Linking... +void sub_8028B1C(u32 r0) +{ + switch(r0) + { + case 0: + break; + case 1: + case 2: + sub_80141B4(&gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 3: + sub_80141B4(&gWonderMailNumGBAsText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 4: + sub_80141B4(&gWonderMailWrongModeText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 5: + sub_80141B4(&gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 6: + sub_80141B4(&gWonderMailStorageFullText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 7: + sub_80141B4(&gWonderMailDuplicateText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 8: + break; + case 9: + sub_80141B4(&gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 10: + break; + case 11: + sub_80141B4(&gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 12: + break; + case 13: + sub_80141B4(&gWonderMailNoRoomText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 14: + sub_80141B4(&gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + case 15: + sub_80141B4(&gWonderMailFriendErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d); + break; + default: + break; + } +} + +void sub_8028BF0(void) +{ + u32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + gUnknown_203B2C0->unk40 = 8; + gUnknown_203B2C0->unk544 = 0xffff; + switch(temp) + { + case 0: + gUnknown_203B2C0->unk40 = 3; + gUnknown_203B2C0->unk538 = 0; + if(sub_8095190() != -1) + { + sub_8028B04(8); + } + else + { + sub_8028B04(9); + } + break; + case 1: + if(sub_8095324(2) != 0) + { + sub_8028B04(30); + } + else + { + sub_8028B04(26); + } + break; + case 2: + gUnknown_203B2C0->unk40 = 4; + gUnknown_203B2C0->unk538 = 2; + if(sub_8095324(4) != 0) + { + sub_8028B04(41); + } + else + { + sub_8028B04(47); + } + break; + case 3: + sub_8028B04(11); + break; + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + break; + case 10: + sub_8028B04(2); + break; + default: + break; + } +} + + +void sub_8028CE0() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(3); +} + +void sub_8028CFC() +{ + s32 temp; + u32 temp2; + + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(sub_8031050()) + { + case 2: + case 3: + temp2 = sub_8095350(); + sub_80310B4(); + if(temp2 != gUnknown_203B2C0->unk540) + { + sub_8028B04(23); + } + else + { + sub_8028B04(25); + } + break; + default: + break; + } +} + +void sub_8028D4C() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + gUnknown_203B2C0->unk538 = temp; + switch(gUnknown_203B2C0->unk538) + { + case 5: + if(sub_8030C20(2) != 0) + { + sub_8028B04(12); + } + else + { + sub_8028B04(13); + } + break; + case 6: + if(sub_8030C20(4) != 0) + { + sub_8028B04(14); + } + else + { + sub_8028B04(15); + } + break; + case 7: + if(sub_8030C20(0) != 0) + { + sub_8028B04(16); + } + else + { + sub_8028B04(17); + } + break; + case 10: + sub_8028B04(1); + break; + default: + break; + } +} + +void sub_8028DE8(u32 r0) +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(r0); +} + +void sub_8028E08() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(18); +} + +void sub_8028E24() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 8: + sub_8028B04(19); + break; + case 10: + sub_8028B04(1); + break; + default: + break; + } +} + +void sub_8028E54() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 8: + sub_8028B04(20); + break; + case 10: + sub_8028B04(1); + break; + default: + break; + } +} + +void sub_8028E84() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(24); + sub_8011C28(1); + sub_8012574(0); +} + +void sub_8028EAC() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + if(sub_8012600() == 0) + { + sub_8012750(); + sub_8028B04(25); + } +} + +void sub_8028ED4() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + if(temp == 8) + { + sub_8028B04(11); + } + else + { + switch(temp){ + case 8: + sub_8028B04(2); + break; + case 9: + case 10: + sub_8028B04(2); + break; + default: + break; + } + } +} + +void sub_8028F04() +{ + s32 temp; + s32 counter; + + if(sub_80144A4(&temp) != 0) + { + return; + } + for(counter = 0; counter <= 31; counter++) + { + sub_8095240(counter); + } + sub_8028B04(21); +} + +void sub_8028F30() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(22); + sub_8011C28(1); + sub_8012574(0); +} + +void sub_8028F58() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + if(sub_8012600() == 0) + { + sub_8012750(); + sub_8028B04(2); + } +} + +void sub_8028F80() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_809927C(gUnknown_203B2C0->unk218); + gUnknown_203B2C0->unk53C = 1; + sub_8028B04(3); +} + +void sub_8028FC0() +{ + s32 temp; + + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(1); +} + +void sub_8028FDC(void) +{ + s32 temp; + struct unkStruct_8095228 *return_var; + + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 8: + return_var = sub_8095228(gUnknown_203B2C0->unk218); + if(sub_80A2824(return_var->unk4) == 0) + { + sub_8028B04(0x1C); + } + else + { + if(return_var->unk30 <= 0) + { + sub_8028B04(0x1D); + } + else + { + sub_8028B04(0x1B); + } + } + break; + case 9: + case 10: + sub_8028B04(1); + break; + default: + break; + } +} + +void sub_8029044(void) +{ + switch(sub_8030768(1)) + { + case 2: + sub_803084C(); + sub_8028B04(1); + break; + case 3: + gUnknown_203B2C0->unk218 = sub_80307EC(); + sub_8028B04(32); + break; + case 4: + gUnknown_203B2C0->unk0 = 0x1F; + gUnknown_203B2C0->unk218 = sub_80307EC(); + sub_8006518(&(gUnknown_203B2C0->unk3BC)); + sub_8004914(); + sub_800641C(0, 1, 1); + sub_8030D40(gUnknown_203B2C0->unk218, 0); + sub_8028B04(33); + break; + } +} + +void sub_80290D4(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(31); +} + +void sub_80290F0(void) +{ + s32 temp; + temp = -1; + sub_8030768(0); + if(sub_8012FD8(&(gUnknown_203B2C0->unk30C)) == 0) + { + sub_8013114(&(gUnknown_203B2C0->unk30C), &temp); + } + switch(temp) + { + case 11: + sub_803084C(); + sub_8028B04(34); + break; + case 12: + gUnknown_203B2C0->unk0 = 0x3D; + sub_8006518(&(gUnknown_203B2C0->unk3BC)); + sub_8004914(); + sub_800641C(0, 1, 1); + sub_8030D40(gUnknown_203B2C0->unk218, 0); + sub_8028B04(33); + break; + case 4: + case 10: + sub_8035CC0(&(gUnknown_203B2C0->unk35C), 2); + sub_8030810(1); + sub_8028B04(31); + break; + default: + break; + } +} + +void sub_80291AC(void) +{ + switch(sub_8030DA0()) + { + case 2: + case 3: + sub_8030DE4(); + sub_8004914(); + sub_800641C(&(gUnknown_203B2C0->unk3BC), 1, 1); + sub_803092C(); + if(gUnknown_203B2C0->unk0 == 0x3D) + { + sub_8035CF4(&(gUnknown_203B2C0->unk21C), 3, 1); + sub_8028B04(0x20); + } + else + { + sub_8028B04(gUnknown_203B2C0->unk0); + } + default: + break; + } +} + +void sub_8029208(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + + case 13: + case 14: + gUnknown_203B2C0->unk534 = 0xD; + switch(gUnknown_203B2C0->unk538) + { + case 0: + sub_8028B04(4); + break; + case 2: + sub_8028B04(0x30); + break; + default: + return; + } + break; + case 15: + gUnknown_203B2C0->unk534 = temp; + switch(gUnknown_203B2C0->unk538) + { + case 0: + sub_8028B04(0x26); + break; + case 2: + sub_8028B04(0x3A); + break; + default: + return; + } + break; + case 10: + sub_8028B04(1); + break; + } +} + +void sub_80292A4(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 8: + switch(gUnknown_203B2C0->unk538) + { + case 0: + case 2: + sub_8028B04(5); + break; + } + break; + case 10: + sub_8028B04(1); + break; + } +} + +void sub_80292EC(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + if(gUnknown_203B2C0->unk44 == 0) + { + switch(gUnknown_203B2C0->unk538) + { + case 0: + sub_8028B04(0x23); + break; + case 2: + sub_8028B04(0x37); + break; + } + } + else + { + sub_8028B1C(gUnknown_203B2C0->unk44); + sub_8028B04(0x7); + } +} + +void sub_802933C(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(1); +} + +void sub_8029358(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(1); +} + +void sub_8029374(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x24); + sub_8011C28(1); + sub_8012574(0); +} + +void sub_802939C(void) +{ + s32 temp; + u32 return_var; + if(sub_80144A4(&temp) != 0) + { + return; + } + if(sub_8012600() == 0) + { + return_var = sub_8012744(); + sub_8012750(); + if(return_var == 0) + { + sub_8028B04(0x25); + } + else + { + sub_8028B04(0x2); + } + } +} + +void sub_80293D8(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x27); +} + +#ifndef NONMATCHING +NAKED +#endif +void sub_80293F4(void) +{ +#ifdef NONMATCHING + u32 return_var; + u32 temp_var; + struct unkStruct_80293F4 temp; + return_var = sub_80154F0(); + MemoryFill8(temp.unk14, 0, 0x30); + switch(return_var) + { + case 3: + return_var = sub_8039068(0x1C, &(gUnknown_203B2C0->unk8), temp.unk14) - 7; + if(return_var <= 0x11) + { + switch(return_var) + { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + break; + case 10: + // TODO one register off from matching + temp.unk0 = 0; + temp.unk4 = 4; + temp.unk8 = 0; + temp.unkC = &(gUnknown_203B2C0->unk420); + temp.unk10 = 0xC; + sub_8014248(&gWonderMailPasswordIncorrectText, 0, 8, &gUnknown_80DDA48); + sub_8028B04(0x28); + break; + case 11: + sub_80141B4(&gWonderMailSOSPasswordIncorrectText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_8028B04(7); + break; + case 0: + sub_80141B4(&gWonderMailDuplicateText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_8028B04(7); + break; + case 12: + case 13: + case 14: + break; + case 15: + sub_8095274(temp.unk24); + // This one is iffy.. not sure + temp.unk14[0] = 2; + sub_80951BC(temp.unk14); + sub_80141B4(&gWonderMailAOKMailReceivedText, 0, &gUnknown_203B2C0->unk420, 0x101); + sub_8028B04(0x23); + break; + case 16: + case 17: + default: + break; + } + } + sub_80155F0(); + break; + case 2: + sub_80155F0(); + sub_8004914(); + sub_800641C(&(gUnknown_203B2C0->unk3BC), 1, 1); + sub_8028B04(1); + break; + default: + break; + } +#else + asm_unified("\tpush {r4,lr}\n" + "\tsub sp, 0x44\n" + "\tbl sub_80154F0\n" + "\tadds r4, r0, 0\n" + "\tadd r0, sp, 0x14\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0x30\n" + "\tbl MemoryFill8\n" + "\tcmp r4, 0x2\n" + "\tbne _0802940E\n" + "\tb _08029530\n" +"_0802940E:\n" + "\tcmp r4, 0x3\n" + "\tbeq _08029414\n" + "\tb _08029550\n" +"_08029414:\n" + "\tldr r0, _08029434\n" + "\tldr r1, [r0]\n" + "\tadds r1, 0x8\n" + "\tmovs r0, 0x1C\n" + "\tadd r2, sp, 0x14\n" + "\tbl sub_8039068\n" + "\tsubs r0, 0x7\n" + "\tcmp r0, 0x11\n" + "\tbls _0802942A\n" + "\tb _0802951C\n" +"_0802942A:\n" + "\tlsls r0, 2\n" + "\tldr r1, _08029438\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" +"_08029434: .4byte gUnknown_203B2C0\n" +"_08029438: .4byte _0802943C\n" + "\t.align 2, 0\n" +"_0802943C:\n" + "\t.4byte _080294C8\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _08029484\n" + "\t.4byte _080294C0\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" + "\t.4byte _080294F0\n" + "\t.4byte _0802951C\n" + "\t.4byte _0802951C\n" +"_08029484:\n" + "\tldr r0, _080294B4\n" + "\tldr r3, _080294B8\n" + "\tmovs r2, 0\n" + "\tstr r2, [sp]\n" + "\tmovs r1, 0x4\n" + "\tstr r1, [sp, 0x4]\n" + "\tstr r2, [sp, 0x8]\n" + "\tldr r1, _080294BC\n" + "\tldr r1, [r1]\n" + "\tmovs r2, 0x84\n" + "\tlsls r2, 3\n" + "\tadds r1, r2\n" + "\tstr r1, [sp, 0xC]\n" + "\tmovs r1, 0xC\n" + "\tstr r1, [sp, 0x10]\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0x8\n" + "\tbl sub_8014248\n" + "\tmovs r0, 0x28\n" + "\tbl sub_8028B04\n" + "\tb _0802951C\n" + "\t.align 2, 0\n" +"_080294B4: .4byte gWonderMailPasswordIncorrectText\n" +"_080294B8: .4byte gUnknown_80DDA48\n" +"_080294BC: .4byte gUnknown_203B2C0\n" +"_080294C0:\n" + "\tldr r0, _080294C4\n" + "\tb _080294CA\n" + "\t.align 2, 0\n" +"_080294C4: .4byte gWonderMailSOSPasswordIncorrectText\n" +"_080294C8:\n" + "\tldr r0, _080294E4\n" +"_080294CA:\n" + "\tldr r1, _080294E8\n" + "\tldr r2, [r1]\n" + "\tmovs r1, 0x84\n" + "\tlsls r1, 3\n" + "\tadds r2, r1\n" + "\tldr r3, _080294EC\n" + "\tmovs r1, 0\n" + "\tbl sub_80141B4\n" + "\tmovs r0, 0x7\n" + "\tbl sub_8028B04\n" + "\tb _0802951C\n" + "\t.align 2, 0\n" +"_080294E4: .4byte gWonderMailDuplicateText\n" +"_080294E8: .4byte gUnknown_203B2C0\n" +"_080294EC: .4byte 0x0000010d\n" +"_080294F0:\n" + "\tldr r0, [sp, 0x24]\n" + "\tbl sub_8095274\n" + "\tadd r1, sp, 0x14\n" + "\tmovs r0, 0x2\n" + "\tstrb r0, [r1]\n" + "\tadds r0, r1, 0\n" + "\tbl sub_80951BC\n" + "\tldr r0, _08029524\n" + "\tldr r1, _08029528\n" + "\tldr r2, [r1]\n" + "\tmovs r1, 0x84\n" + "\tlsls r1, 3\n" + "\tadds r2, r1\n" + "\tldr r3, _0802952C\n" + "\tmovs r1, 0\n" + "\tbl sub_80141B4\n" + "\tmovs r0, 0x23\n" + "\tbl sub_8028B04\n" +"_0802951C:\n" + "\tbl sub_80155F0\n" + "\tb _08029550\n" + "\t.align 2, 0\n" +"_08029524: .4byte gWonderMailAOKMailReceivedText\n" +"_08029528: .4byte gUnknown_203B2C0\n" +"_0802952C: .4byte 0x00000101\n" +"_08029530:\n" + "\tbl sub_80155F0\n" + "\tbl sub_8004914\n" + "\tldr r0, _08029558\n" + "\tldr r0, [r0]\n" + "\tmovs r2, 0xEF\n" + "\tlsls r2, 2\n" + "\tadds r0, r2\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tmovs r0, 0x1\n" + "\tbl sub_8028B04\n" +"_08029550:\n" + "\tadd sp, 0x44\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_08029558: .4byte gUnknown_203B2C0\n"); +#endif +} + +void sub_802955C(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 8: + sub_8028B04(0x26); + break; + case 10: + sub_8028B04(1); + break; + } +} + +void sub_802958C(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(6); +} + +void sub_80295A8(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 8: + sub_8028B04(0x8); + break; + case 9: + case 10: + sub_8028B04(1); + break; + + } +} + +void sub_80295D8(void) +{ + switch(sub_8030768(1)) + { + case 2: + sub_803084C(); + sub_8028B04(1); + break; + case 3: + gUnknown_203B2C0->unk218 = sub_80307EC(); + sub_8028B04(0x2B); + break; + case 4: + gUnknown_203B2C0->unk0 = 0x2A; + gUnknown_203B2C0->unk218 = sub_80307EC(); + sub_8006518(&(gUnknown_203B2C0->unk3BC)); + sub_8004914(); + sub_800641C(0, 1, 1); + sub_8030D40(gUnknown_203B2C0->unk218, 0); + sub_8028B04(0x2C); + break; + } +} + +void sub_8029668(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x2A); +} + +void sub_8029684(void) +{ + s32 temp; + temp = -1; + sub_8030768(0); + if(sub_8012FD8(&(gUnknown_203B2C0->unk30C)) == 0) + { + sub_8013114(&(gUnknown_203B2C0->unk30C), &temp); + } + switch(temp) + { + case 0xB: + sub_803084C(); + sub_8028B04(0x2D); + break; + case 0xC: + gUnknown_203B2C0->unk0 = 0x3D; + sub_8006518(&(gUnknown_203B2C0->unk3BC)); + sub_8004914(); + sub_800641C(0, 1, 1); + sub_8030D40(gUnknown_203B2C0->unk218, 0); + sub_8028B04(0x2C); + break; + case 0x4: + case 0xA: + sub_8035CC0(&(gUnknown_203B2C0->unk35C),2); + sub_8030810(1); + sub_8028B04(0x2A); + break; + } +} + +void sub_8029740(void) +{ + switch(sub_8030DA0()) + { + case 2: + case 3: + sub_8030DE4(); + sub_8004914(); + sub_800641C(&(gUnknown_203B2C0->unk3BC), 1, 1); + sub_803092C(); + if(gUnknown_203B2C0->unk0 == 0x3D) + { + sub_8035CF4(&(gUnknown_203B2C0->unk21C), 3, 1); + sub_8028B04(0x2B); + } + else + { + sub_8028B04(gUnknown_203B2C0->unk0); + } + break; + } +} + +void sub_802979C(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(1); +} + +void sub_80297B8(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x33); +} + +void sub_80297D4(void) +{ + switch(sub_8023A94(1)) + { + case 2: + sub_8023C60(); + sub_8028B04(1); + gUnknown_203B2C0->unk544 = 0xffff; + break; + case 3: + gUnknown_203B2C0->unk544 = sub_8023B44(); + sub_8028B04(0x34); + break; + case 4: + gUnknown_203B2C0->unk0 = 0x33; + gUnknown_203B2C0->unk544 = sub_8023B44(); + sub_8006518(&(gUnknown_203B2C0->unk3BC)); + sub_8004914(); + sub_800641C(0, 1, 1); + sub_8024458(gUnknown_203B2C0->unk544, 0); + sub_8028B04(0x35); + break; + } +} + +void sub_8029884(void) +{ + s32 temp; + temp = -1; + sub_8023A94(0); + if(sub_8012FD8(&(gUnknown_203B2C0->unk30C)) == 0) + { + sub_8013114(&(gUnknown_203B2C0->unk30C), &temp); + } + switch(temp) + { + case 0xB: + sub_8023C60(); + sub_8028B04(4); + break; + case 0xC: + gUnknown_203B2C0->unk0 = 0x3D; + sub_8006518(&(gUnknown_203B2C0->unk3BC)); + sub_8004914(); + sub_800641C(0, 1, 1); + sub_8024458(gUnknown_203B2C0->unk544, 0); + sub_8028B04(0x35); + break; + case 0x4: + case 0xA: + sub_8035CC0(&(gUnknown_203B2C0->unk35C), 3); + sub_8023B7C(1); + sub_8028B04(0x33); + break; + } +} + +void sub_8029944(void) +{ + u32 temp; + temp = sub_80244E4(); + if(temp == 1) + { + sub_802452C(); + return; + } + switch(temp) + { + case 1: + break; + case 2: + case 3: + sub_802453C(); + sub_8004914(); + sub_800641C(&(gUnknown_203B2C0->unk3BC), 1, 1); + sub_8023B7C(1); + if(gUnknown_203B2C0->unk0 == 0x3D) + { + sub_8035CF4(&(gUnknown_203B2C0->unk21C), 3, 1); + sub_8028B04(0x34); + } + else + { + sub_8028B04(gUnknown_203B2C0->unk0); + } + + } +} + +void sub_80299AC(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 0x12: + sub_8028B04(4); + break; + case 0xA: + sub_8028B04(1); + break; + default: + break; + } +} + +void sub_80299D8(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + + case 8: + sub_8028B04(4); + break; + case 9: + sub_8028B04(0x32); + break; + case 0xA: + sub_8028B04(1); + break; + } +} + +void sub_8029A18(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + switch(temp) + { + case 0x11: + if(sub_8024108(3) != 0) + { + sub_8028B04(0x31); + } + else + { + sub_8028B04(0x32); + } + break; + case 0x12: + sub_8028B04(0x4); + break; + case 0xA: + sub_8028B04(1); + break; + } +} + +void sub_8029A6C(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x2E); +} + +void sub_8029A88(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + if(sub_8012600() == 0) + { + sub_8012750(); + sub_8028B04(0x39); + } +} + +void sub_8029AB0(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x38); + sub_8011C28(1); + sub_8012574(0); +} + +void sub_8029AD8(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(0x3B); +} + +void sub_8029AF4(void) +{ + switch(sub_8031DCC()) + { + + case 2: + case 3: + sub_8031E10(); + sub_8004914(); + sub_800641C(&(gUnknown_203B2C0->unk3BC), 1, 1); + sub_8028B04(0x3C); + break; + case 1: + sub_8031E00(); + break; + } +} + +void sub_8029B34(void) +{ + s32 temp; + if(sub_80144A4(&temp) != 0) + { + return; + } + sub_8028B04(3); +} -- cgit v1.2.3