summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPokeCodec <doremylover456@gmail.com>2020-08-20 18:27:35 -0400
committerPokeCodec <doremylover456@gmail.com>2020-08-22 00:52:45 -0400
commitcbb94035e37a99979b62d3492abfd113d8b9232f (patch)
treed4fbeedaf4afc3db3994a49712881be30a4ece4e
parentd2c7a862c7535bc9f44254fa0230e09e8598324a (diff)
Cleaned up the libraries.
-rw-r--r--berry_fix/asm/loader.s2
-rw-r--r--berry_fix/payload/include/gba/m4a_internal.h34
-rw-r--r--constants/gba_constants.inc6
-rw-r--r--constants/m4a_constants.inc350
-rw-r--r--include/gba/m4a_internal.h92
-rw-r--r--libagbsyscall/libagbsyscall.s19
-rw-r--r--src/AgbRfu_LinkManager.c4
-rw-r--r--src/m4a.c111
8 files changed, 283 insertions, 335 deletions
diff --git a/berry_fix/asm/loader.s b/berry_fix/asm/loader.s
index a78014078..24eb2df55 100644
--- a/berry_fix/asm/loader.s
+++ b/berry_fix/asm/loader.s
@@ -109,7 +109,7 @@ _1a0:
strh r1, [r0, 0xa] @ SIOMLT_SEND
ldr r0, =_data_2f0
ldr r1, =gCode
- swi 0x11 << 16
+ svc 0x11 << 16
ldr lr, =gCode
bx lr
.pool
diff --git a/berry_fix/payload/include/gba/m4a_internal.h b/berry_fix/payload/include/gba/m4a_internal.h
index 339a0774e..494d31f93 100644
--- a/berry_fix/payload/include/gba/m4a_internal.h
+++ b/berry_fix/payload/include/gba/m4a_internal.h
@@ -100,12 +100,12 @@ struct CgbChannel
u8 le;
u8 sw;
u32 fr;
- u32 wp;
- u32 cp;
- u32 tp;
- u32 pp;
- u32 np;
- u8 d4[8];
+ u32 *wp;
+ u32 *cp;
+ void *tp;
+ void *pp;
+ void *np;
+ u32 d4[2];
};
struct MusicPlayerTrack;
@@ -138,10 +138,10 @@ struct SoundChannel
u32 fw;
u32 freq;
struct WaveData *wav;
- u32 cp;
+ s8 *cp;
struct MusicPlayerTrack *track;
- u32 pp;
- u32 np;
+ void *pp;
+ void *np;
u32 d4;
u16 xpi;
u16 xpc;
@@ -172,11 +172,11 @@ struct SoundInfo
u8 pcmDmaPeriod; // number of V-blanks per PCM DMA
u8 maxLines;
u8 gap[3];
- s32 pcmSamplesPerVBlank;
- s32 pcmFreq;
- s32 divFreq;
+ u32 pcmSamplesPerVBlank;
+ u32 pcmFreq;
+ u32 divFreq;
struct CgbChannel *cgbChans;
- u32 func;
+ void (*func)();
u32 intp;
void (*CgbSound)(void);
void (*CgbOscOff)(u8);
@@ -184,7 +184,7 @@ struct SoundInfo
u32 MPlayJumpTable;
u32 plynote;
u32 ExtVolPit;
- u8 gap2[16];
+ u32 gap2[4];
struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];
s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];
};
@@ -248,7 +248,7 @@ struct MusicPlayerTrack
u8 key;
u8 velocity;
u8 runningStatus;
- u8 keyM;
+ s8 keyM;
u8 pitM;
s8 keyShift;
s8 keyShiftX;
@@ -312,7 +312,7 @@ struct MusicPlayerInfo
struct MusicPlayerTrack *tracks;
struct ToneData *tone;
u32 ident;
- u32 func;
+ void (*func)();
u32 intp;
};
@@ -447,7 +447,7 @@ void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_note(u8, struct MusicPlayerInfo *, struct MusicPlayerTrack *);
// extended sound command handler functions
void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
diff --git a/constants/gba_constants.inc b/constants/gba_constants.inc
index 3ff857ee8..13cbadf80 100644
--- a/constants/gba_constants.inc
+++ b/constants/gba_constants.inc
@@ -26,9 +26,9 @@
.set OAM, 0x7000000
- .set SOUND_INFO_PTR, 0x3007FF0
- .set INTR_CHECK, 0x3007FF8
- .set INTR_VECTOR, 0x3007FFC
+ .set SOUND_INFO_PTR, IWRAM_END - 0x10
+ .set INTR_CHECK, IWRAM_END - 0x8
+ .set INTR_VECTOR, IWRAM_END - 0x4
.set INTR_FLAG_VBLANK, 1 << 0
.set INTR_FLAG_HBLANK, 1 << 1
diff --git a/constants/m4a_constants.inc b/constants/m4a_constants.inc
index 62ca5bb55..d57b5b5c2 100644
--- a/constants/m4a_constants.inc
+++ b/constants/m4a_constants.inc
@@ -6,194 +6,178 @@
.equiv TONEDATA_TYPE_FIX, 0x08
.equiv TONEDATA_TYPE_SPL, 0x40 @ key split
.equiv TONEDATA_TYPE_RHY, 0x80 @ rhythm
+ .equiv TONEDATA_P_S_PAN, 0xc0
- .macro struct_begin
- .struct 0
- .endm
+ .equiv o_SoundChannel_status, 0
+ .equiv o_SoundChannel_type, 1
+ .equiv o_SoundChannel_rightVolume, 2
+ .equiv o_SoundChannel_leftVolume, 3
+ .equiv o_SoundChannel_attack, 4
+ .equiv o_SoundChannel_decay, 5
+ .equiv o_SoundChannel_sustain, 6
+ .equiv o_SoundChannel_release, 7
+ .equiv o_SoundChannel_ky, 8
+ .equiv o_SoundChannel_ev, 9
+ .equiv o_SoundChannel_er, 10
+ .equiv o_SoundChannel_el, 11
+ .equiv o_SoundChannel_iev, 12
+ .equiv o_SoundChannel_iel, 13
+ .equiv o_SoundChannel_d1, 14
+ .equiv o_SoundChannel_d2, 15
+ .equiv o_SoundChannel_gt, 16
+ .equiv o_SoundChannel_mk, 17
+ .equiv o_SoundChannel_ve, 18
+ .equiv o_SoundChannel_pr, 19
+ .equiv o_SoundChannel_d3, 20
+ .equiv o_SoundChannel_ct, 24
+ .equiv o_SoundChannel_fw, 28
+ .equiv o_SoundChannel_freq, 32
+ .equiv o_SoundChannel_wav, 36
+ .equiv o_SoundChannel_cp, 40
+ .equiv o_SoundChannel_track, 44
+ .equiv o_SoundChannel_pp, 48
+ .equiv o_SoundChannel_np, 52
+ .equiv o_SoundChannel_d4, 56
+ .equiv o_SoundChannel_xpi, 60
+ .equiv o_SoundChannel_xpc, 62
- .macro struct_field name, size
-\name:
- .struct \name + \size
- .endm
+ .equiv SoundChannel_size, 64
- struct_begin
- struct_field o_SoundInfo_ident, 4
- struct_field o_SoundInfo_pcmDmaCounter, 1
- struct_field o_SoundInfo_reverb, 1
- struct_field o_SoundInfo_maxChans, 1
- struct_field o_SoundInfo_masterVolume, 1
- struct_field o_SoundInfo_freq, 1
- struct_field o_SoundInfo_mode, 1
- struct_field o_SoundInfo_c15, 1
- struct_field o_SoundInfo_pcmDmaPeriod, 1
- struct_field o_SoundInfo_maxLines, 1
- struct_field o_SoundInfo_gap, 3
- struct_field o_SoundInfo_pcmSamplesPerVBlank, 4
- struct_field o_SoundInfo_pcmFreq, 4
- struct_field o_SoundInfo_divFreq, 4
- struct_field o_SoundInfo_cgbChans, 4
- struct_field o_SoundInfo_func, 4
- struct_field o_SoundInfo_intp, 4
- struct_field o_SoundInfo_CgbSound, 4
- struct_field o_SoundInfo_CgbOscOff, 4
- struct_field o_SoundInfo_MidiKeyToCgbFreq, 4
- struct_field o_SoundInfo_MPlayJumpTable, 4
- struct_field o_SoundInfo_plynote, 4
- struct_field o_SoundInfo_ExtVolPit, 4
- struct_field o_SoundInfo_gap2, 16
- struct_field o_SoundInfo_chans, 768
- struct_field o_SoundInfo_pcmBuffer, PCM_DMA_BUF_SIZE * 2
- struct_field SoundInfo_size, 0
+ .equiv o_SoundInfo_ident, 0
+ .equiv o_SoundInfo_pcmDmaCounter, 4
+ .equiv o_SoundInfo_reverb, 5
+ .equiv o_SoundInfo_maxChans, 6
+ .equiv o_SoundInfo_masterVolume, 7
+ .equiv o_SoundInfo_freq, 8
+ .equiv o_SoundInfo_mode, 9
+ .equiv o_SoundInfo_c15, 10
+ .equiv o_SoundInfo_pcmDmaPeriod, 11
+ .equiv o_SoundInfo_maxLines, 12
+ .equiv o_SoundInfo_gap, 13
+ .equiv o_SoundInfo_pcmSamplesPerVBlank, 16
+ .equiv o_SoundInfo_pcmFreq, 20
+ .equiv o_SoundInfo_divFreq, 24
+ .equiv o_SoundInfo_cgbChans, 28
+ .equiv o_SoundInfo_func, 32
+ .equiv o_SoundInfo_intp, 36
+ .equiv o_SoundInfo_CgbSound, 40
+ .equiv o_SoundInfo_CgbOscOff, 44
+ .equiv o_SoundInfo_MidiKeyToCgbFreq, 48
+ .equiv o_SoundInfo_MPlayJumpTable, 52
+ .equiv o_SoundInfo_plynote, 56
+ .equiv o_SoundInfo_ExtVolPit, 60
+ .equiv o_SoundInfo_gap2, 64
+ .equiv o_SoundInfo_chans, 80
+ .equiv o_SoundInfo_pcmBuffer, o_SoundInfo_chans + (SoundChannel_size * 12)
- struct_begin
- struct_field o_SoundChannel_status, 1
- struct_field o_SoundChannel_type, 1
- struct_field o_SoundChannel_rightVolume, 1
- struct_field o_SoundChannel_leftVolume, 1
- struct_field o_SoundChannel_attack, 1
- struct_field o_SoundChannel_decay, 1
- struct_field o_SoundChannel_sustain, 1
- struct_field o_SoundChannel_release, 1
- struct_field o_SoundChannel_ky, 1
- struct_field o_SoundChannel_ev, 1
- struct_field o_SoundChannel_er, 1
- struct_field o_SoundChannel_el, 1
- struct_field o_SoundChannel_iev, 1
- struct_field o_SoundChannel_iel, 1
- struct_field o_SoundChannel_d1, 1
- struct_field o_SoundChannel_d2, 1
- struct_field o_SoundChannel_gt, 1
- struct_field o_SoundChannel_mk, 1
- struct_field o_SoundChannel_ve, 1
- struct_field o_SoundChannel_pr, 1
- struct_field o_SoundChannel_rp, 1
- struct_field o_SoundChannel_d3, 3
- struct_field o_SoundChannel_ct, 4
- struct_field o_SoundChannel_fw, 4
- struct_field o_SoundChannel_freq, 4
- struct_field o_SoundChannel_wav, 4
- struct_field o_SoundChannel_cp, 4
- struct_field o_SoundChannel_track, 4
- struct_field o_SoundChannel_pp, 4
- struct_field o_SoundChannel_np, 4
- struct_field o_SoundChannel_d4, 4
- struct_field o_SoundChannel_xpi, 2
- struct_field o_SoundChannel_xpc, 2
- struct_field SoundChannel_size, 0
-
- struct_begin
- struct_field o_MusicPlayerTrack_flags, 1
- struct_field o_MusicPlayerTrack_wait, 1
- struct_field o_MusicPlayerTrack_patternLevel, 1
- struct_field o_MusicPlayerTrack_repN, 1
- struct_field o_MusicPlayerTrack_gateTime, 1
- struct_field o_MusicPlayerTrack_key, 1
- struct_field o_MusicPlayerTrack_velocity, 1
- struct_field o_MusicPlayerTrack_runningStatus, 1
- struct_field o_MusicPlayerTrack_keyM, 1
- struct_field o_MusicPlayerTrack_pitM, 1
- struct_field o_MusicPlayerTrack_keyShift, 1
- struct_field o_MusicPlayerTrack_keyShiftX, 1
- struct_field o_MusicPlayerTrack_tune, 1
- struct_field o_MusicPlayerTrack_pitX, 1
- struct_field o_MusicPlayerTrack_bend, 1
- struct_field o_MusicPlayerTrack_bendRange, 1
- struct_field o_MusicPlayerTrack_volMR, 1
- struct_field o_MusicPlayerTrack_volML, 1
- struct_field o_MusicPlayerTrack_vol, 1
- struct_field o_MusicPlayerTrack_volX, 1
- struct_field o_MusicPlayerTrack_pan, 1
- struct_field o_MusicPlayerTrack_panX, 1
- struct_field o_MusicPlayerTrack_modM, 1
- struct_field o_MusicPlayerTrack_mod, 1
- struct_field o_MusicPlayerTrack_modT, 1
- struct_field o_MusicPlayerTrack_lfoSpeed, 1
- struct_field o_MusicPlayerTrack_lfoSpeedC, 1
- struct_field o_MusicPlayerTrack_lfoDelay, 1
- struct_field o_MusicPlayerTrack_lfoDelayC, 1
- struct_field o_MusicPlayerTrack_priority, 1
- struct_field o_MusicPlayerTrack_echoVolume, 1
- struct_field o_MusicPlayerTrack_echoLength, 1
- struct_field o_MusicPlayerTrack_chan, 4
- struct_field o_MusicPlayerTrack_ToneData_type, 1
- struct_field o_MusicPlayerTrack_ToneData_key, 1
- struct_field o_MusicPlayerTrack_ToneData_length, 1
- struct_field o_MusicPlayerTrack_ToneData_pan_sweep, 1
- struct_field o_MusicPlayerTrack_ToneData_wav, 4
- struct_field o_MusicPlayerTrack_ToneData_attack, 1
- struct_field o_MusicPlayerTrack_ToneData_decay, 1
- struct_field o_MusicPlayerTrack_ToneData_sustain, 1
- struct_field o_MusicPlayerTrack_ToneData_release, 1
- struct_field o_MusicPlayerTrack_gap, 10
- struct_field o_MusicPlayerTrack_unk_3A, 2
- struct_field o_MusicPlayerTrack_unk_3C, 4
- struct_field o_MusicPlayerTrack_cmdPtr, 4
- struct_field o_MusicPlayerTrack_patternStack, 12
- struct_field MusicPlayerTrack_size, 0
+ .equiv o_MusicPlayerTrack_flags, 0
+ .equiv o_MusicPlayerTrack_wait, 1
+ .equiv o_MusicPlayerTrack_patternLevel, 2
+ .equiv o_MusicPlayerTrack_repN, 3
+ .equiv o_MusicPlayerTrack_gateTime, 4
+ .equiv o_MusicPlayerTrack_key, 5
+ .equiv o_MusicPlayerTrack_velocity, 6
+ .equiv o_MusicPlayerTrack_runningStatus, 7
+ .equiv o_MusicPlayerTrack_keyM, 8
+ .equiv o_MusicPlayerTrack_pitM, 9
+ .equiv o_MusicPlayerTrack_keyShift, 10
+ .equiv o_MusicPlayerTrack_keyShiftX, 11
+ .equiv o_MusicPlayerTrack_tune, 12
+ .equiv o_MusicPlayerTrack_pitX, 13
+ .equiv o_MusicPlayerTrack_bend, 14
+ .equiv o_MusicPlayerTrack_bendRange, 15
+ .equiv o_MusicPlayerTrack_volMR, 16
+ .equiv o_MusicPlayerTrack_volML, 17
+ .equiv o_MusicPlayerTrack_vol, 18
+ .equiv o_MusicPlayerTrack_volX, 19
+ .equiv o_MusicPlayerTrack_pan, 20
+ .equiv o_MusicPlayerTrack_panX, 21
+ .equiv o_MusicPlayerTrack_modM, 22
+ .equiv o_MusicPlayerTrack_mod, 23
+ .equiv o_MusicPlayerTrack_modT, 24
+ .equiv o_MusicPlayerTrack_lfoSpeed, 25
+ .equiv o_MusicPlayerTrack_lfoSpeedC, 26
+ .equiv o_MusicPlayerTrack_lfoDelay, 27
+ .equiv o_MusicPlayerTrack_lfoDelayC, 28
+ .equiv o_MusicPlayerTrack_priority, 29
+ .equiv o_MusicPlayerTrack_echoVolume, 30
+ .equiv o_MusicPlayerTrack_echoLength, 31
+ .equiv o_MusicPlayerTrack_chan, 32
+ .equiv o_MusicPlayerTrack_ToneData_type, 36
+ .equiv o_MusicPlayerTrack_ToneData_key, 37
+ .equiv o_MusicPlayerTrack_ToneData_length, 38
+ .equiv o_MusicPlayerTrack_ToneData_pan_sweep, 39
+ .equiv o_MusicPlayerTrack_ToneData_wav, 40
+ .equiv o_MusicPlayerTrack_ToneData_attack, 44
+ .equiv o_MusicPlayerTrack_ToneData_decay, 45
+ .equiv o_MusicPlayerTrack_ToneData_sustain, 46
+ .equiv o_MusicPlayerTrack_ToneData_release, 47
+ .equiv o_MusicPlayerTrack_gap, 48
+ .equiv o_MusicPlayerTrack_unk_3A, 58
+ .equiv o_MusicPlayerTrack_unk_3C, 60
+ .equiv o_MusicPlayerTrack_cmdPtr, 64
+ .equiv o_MusicPlayerTrack_patternStack, 68
+ .equiv MusicPlayerTrack_size, 80
.equiv o_MusicPlayerTrack_ToneData_keySplitTable, o_MusicPlayerTrack_ToneData_attack
- struct_begin
- struct_field o_MusicPlayerInfo_songHeader, 4
- struct_field o_MusicPlayerInfo_status, 4
- struct_field o_MusicPlayerInfo_trackCount, 1
- struct_field o_MusicPlayerInfo_priority, 1
- struct_field o_MusicPlayerInfo_cmd, 1
- struct_field o_MusicPlayerInfo_unk_B, 1
- struct_field o_MusicPlayerInfo_clock, 4
- struct_field o_MusicPlayerInfo_gap, 8
- struct_field o_MusicPlayerInfo_memAccArea, 4
- struct_field o_MusicPlayerInfo_tempoD, 2
- struct_field o_MusicPlayerInfo_tempoU, 2
- struct_field o_MusicPlayerInfo_tempoI, 2
- struct_field o_MusicPlayerInfo_tempoC, 2
- struct_field o_MusicPlayerInfo_fadeOI, 2
- struct_field o_MusicPlayerInfo_fadeOC, 2
- struct_field o_MusicPlayerInfo_fadeOV, 2
- struct_field o_MusicPlayerInfo_padding, 2
- struct_field o_MusicPlayerInfo_tracks, 4
- struct_field o_MusicPlayerInfo_tone, 4
- struct_field o_MusicPlayerInfo_ident, 4
- struct_field o_MusicPlayerInfo_func, 4
- struct_field o_MusicPlayerInfo_intp, 4
- struct_field MusicPlayerInfo_size, 0
+ .equiv o_MusicPlayerInfo_songHeader, 0
+ .equiv o_MusicPlayerInfo_status, 4
+ .equiv o_MusicPlayerInfo_trackCount, 8
+ .equiv o_MusicPlayerInfo_priority, 9
+ .equiv o_MusicPlayerInfo_cmd, 10
+ .equiv o_MusicPlayerInfo_unk_B, 11
+ .equiv o_MusicPlayerInfo_clock, 12
+ .equiv o_MusicPlayerInfo_memAccArea, 16
+ .equiv o_MusicPlayerInfo_tempoD, 28
+ .equiv o_MusicPlayerInfo_tempoU, 30
+ .equiv o_MusicPlayerInfo_tempoI, 32
+ .equiv o_MusicPlayerInfo_tempoC, 34
+ .equiv o_MusicPlayerInfo_fadeOI, 36
+ .equiv o_MusicPlayerInfo_fadeOC, 38
+ .equiv o_MusicPlayerInfo_fadeOV, 40
+ .equiv o_MusicPlayerInfo_padding, 42
+ .equiv o_MusicPlayerInfo_tracks, 44
+ .equiv o_MusicPlayerInfo_tone, 48
+ .equiv o_MusicPlayerInfo_ident, 52
+ .equiv o_MusicPlayerInfo_func, 56
+ .equiv o_MusicPlayerInfo_intp, 60
+ .equiv MusicPlayerInfo_size, 64
- struct_begin
- struct_field o_CgbChannel_sf, 1
- struct_field o_CgbChannel_ty, 1
- struct_field o_CgbChannel_rightVolume, 1
- struct_field o_CgbChannel_leftVolume, 1
- struct_field o_CgbChannel_at, 1
- struct_field o_CgbChannel_de, 1
- struct_field o_CgbChannel_su, 1
- struct_field o_CgbChannel_re, 1
- struct_field o_CgbChannel_ky, 1
- struct_field o_CgbChannel_ev, 1
- struct_field o_CgbChannel_eg, 1
- struct_field o_CgbChannel_ec, 1
- struct_field o_CgbChannel_echoVolume, 1
- struct_field o_CgbChannel_echoLength, 1
- struct_field o_CgbChannel_d1, 1
- struct_field o_CgbChannel_d2, 1
- struct_field o_CgbChannel_gt, 1
- struct_field o_CgbChannel_mk, 1
- struct_field o_CgbChannel_ve, 1
- struct_field o_CgbChannel_pr, 1
- struct_field o_CgbChannel_rp, 1
- struct_field o_CgbChannel_d3, 3
- struct_field o_CgbChannel_d5, 1
- struct_field o_CgbChannel_sg, 1
- struct_field o_CgbChannel_n4, 1
- struct_field o_CgbChannel_pan, 1
- struct_field o_CgbChannel_panMask, 1
- struct_field o_CgbChannel_mo, 1
- struct_field o_CgbChannel_le, 1
- struct_field o_CgbChannel_sw, 1
- struct_field o_CgbChannel_fr, 4
- struct_field o_CgbChannel_wp, 4
- struct_field o_CgbChannel_cp, 4
- struct_field o_CgbChannel_tp, 4
- struct_field o_CgbChannel_pp, 4
- struct_field o_CgbChannel_np, 4
- struct_field o_CgbChannel_d4, 8
- struct_field CgbChannel_size, 0
+ .equiv o_CgbChannel_sf, 0
+ .equiv o_CgbChannel_ty, 1
+ .equiv o_CgbChannel_rightVolume, 2
+ .equiv o_CgbChannel_leftVolume, 3
+ .equiv o_CgbChannel_at, 4
+ .equiv o_CgbChannel_de, 5
+ .equiv o_CgbChannel_su, 6
+ .equiv o_CgbChannel_re, 7
+ .equiv o_CgbChannel_ky, 8
+ .equiv o_CgbChannel_ev, 9
+ .equiv o_CgbChannel_eg, 10
+ .equiv o_CgbChannel_ec, 11
+ .equiv o_CgbChannel_echoVolume, 12
+ .equiv o_CgbChannel_echoLength, 13
+ .equiv o_CgbChannel_d1, 14
+ .equiv o_CgbChannel_d2, 15
+ .equiv o_CgbChannel_gt, 16
+ .equiv o_CgbChannel_mk, 17
+ .equiv o_CgbChannel_ve, 18
+ .equiv o_CgbChannel_pr, 19
+ .equiv o_CgbChannel_d3, 20
+ .equiv o_CgbChannel_d5, 24
+ .equiv o_CgbChannel_sg, 25
+ .equiv o_CgbChannel_n4, 26
+ .equiv o_CgbChannel_pan, 27
+ .equiv o_CgbChannel_panMask, 28
+ .equiv o_CgbChannel_mo, 29
+ .equiv o_CgbChannel_le, 30
+ .equiv o_CgbChannel_sw, 31
+ .equiv o_CgbChannel_fr, 32
+ .equiv o_CgbChannel_wp, 36
+ .equiv o_CgbChannel_cp, 40
+ .equiv o_CgbChannel_tp, 44
+ .equiv o_CgbChannel_pp, 48
+ .equiv o_CgbChannel_np, 52
+ .equiv o_CgbChannel_d4, 56
+ .equiv CgbChannel_size, 64
diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h
index e2836c6f6..58b258a1a 100644
--- a/include/gba/m4a_internal.h
+++ b/include/gba/m4a_internal.h
@@ -140,55 +140,13 @@ struct SoundChannel
struct WaveData *wav;
u32 cp;
struct MusicPlayerTrack *track;
- u32 pp;
- u32 np;
- u32 d4;
+ void* pp;
+ void* np;
+ void* d4;
u16 xpi;
u16 xpc;
};
-#define MAX_DIRECTSOUND_CHANNELS 12
-
-#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer
-
-struct SoundInfo
-{
- // This field is normally equal to ID_NUMBER but it is set to other
- // values during sensitive operations for locking purposes.
- // This field should be volatile but isn't. This could potentially cause
- // race conditions.
- u32 ident;
-
- vu8 pcmDmaCounter;
-
- // Direct Sound
- u8 reverb;
- u8 maxChans;
- u8 masterVolume;
- u8 freq;
-
- u8 mode;
- u8 c15;
- u8 pcmDmaPeriod; // number of V-blanks per PCM DMA
- u8 maxLines;
- u8 gap[3];
- s32 pcmSamplesPerVBlank;
- s32 pcmFreq;
- s32 divFreq;
- struct CgbChannel *cgbChans;
- u32 func;
- u32 intp;
- void (*CgbSound)(void);
- void (*CgbOscOff)(u8);
- u32 (*MidiKeyToCgbFreq)(u8, u8, u8);
- u32 MPlayJumpTable;
- u32 plynote;
- u32 ExtVolPit;
- u8 gap2[16];
- struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];
- s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];
-};
-
struct SongHeader
{
u8 trackCount;
@@ -312,7 +270,7 @@ struct MusicPlayerInfo
struct MusicPlayerTrack *tracks;
struct ToneData *tone;
u32 ident;
- u32 func;
+ void (*func)();
u32 intp;
};
@@ -334,7 +292,47 @@ struct Song
extern const struct MusicPlayer gMPlayTable[];
extern const struct Song gSongTable[];
+#define MAX_DIRECTSOUND_CHANNELS 12
+
+#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer
+
+struct SoundInfo
+{
+ // This field is normally equal to ID_NUMBER but it is set to other
+ // values during sensitive operations for locking purposes.
+ // This field should be volatile but isn't. This could potentially cause
+ // race conditions.
+ u32 ident;
+
+ vu8 pcmDmaCounter;
+
+ // Direct Sound
+ u8 reverb;
+ u8 maxChans;
+ u8 masterVolume;
+ u8 freq;
+ u8 mode;
+ u8 c15;
+ u8 pcmDmaPeriod; // number of V-blanks per PCM DMA
+ u8 maxLines;
+ u8 gap[3];
+ s32 pcmSamplesPerVBlank;
+ s32 pcmFreq;
+ s32 divFreq;
+ struct CgbChannel *cgbChans;
+ void (*func)();
+ u32 intp;
+ void (*CgbSound)();
+ void (*CgbOscOff)(u8);
+ u32 (*MidiKeyToCgbFreq)(u8, u8, u8);
+ void (**MPlayJumpTable)();
+ void (*plynote)(u8, struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+ void (*ExtVolPit)(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+ u32 gap2[4];
+ struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];
+ s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];
+};
extern u8 gMPlayMemAccArea[];
@@ -448,7 +446,7 @@ void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_note(u8, struct MusicPlayerInfo *, struct MusicPlayerTrack *);
// extended sound command handler functions
void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
diff --git a/libagbsyscall/libagbsyscall.s b/libagbsyscall/libagbsyscall.s
index 00c40d08e..b30b586ee 100644
--- a/libagbsyscall/libagbsyscall.s
+++ b/libagbsyscall/libagbsyscall.s
@@ -1,9 +1,12 @@
.include "../constants/gba_constants.inc"
.include "../asm/macros/function.inc"
+
+ .syntax unified
.text
.set SOFT_RESET_DIRECT_BUF, 0x03007FFA
+ .set USER_STACK, 0x03007F00
.set RESET_EX_WRAM_FLAG, 0x1
.ifdef NO_GRANULAR_AGBSYSCALL
@@ -106,7 +109,7 @@ SoundDriverVSyncOn:
thumb_func_start Mod
Mod:
svc #6
- mov r0, r1
+ adds r0, r1, #0
bx lr
thumb_func_end Mod
.endif
@@ -145,7 +148,7 @@ HuffUnComp:
.endif
.ifdef L_SoftResetExram
- arm_func_start SoftResetExram
+ thumb_func_start SoftResetExram
SoftResetExram:
ldr r3, =REG_IME
movs r2, #0
@@ -153,14 +156,14 @@ SoftResetExram:
ldr r3, =SOFT_RESET_DIRECT_BUF
movs r2, #1
strb r2, [r3, #0]
- subs r3, #SOFT_RESET_DIRECT_BUF - 0x3007f00
+ subs r3, #SOFT_RESET_DIRECT_BUF - USER_STACK
mov sp, r3
movs r2, #RESET_EX_WRAM_FLAG
bics r0, r2
svc #1
svc #0
.pool
- arm_func_end SoftResetExram
+ thumb_func_end SoftResetExram
.endif
.ifdef L_MusicPlayerFadeOut
@@ -231,7 +234,7 @@ DivArm:
thumb_func_start ModArm
ModArm:
svc #7
- mov r0, r1
+ adds r0, r1, #0
bx lr
thumb_func_end ModArm
.endif
@@ -271,7 +274,7 @@ Diff8bitUnFilterWram:
.ifdef L_MultiBoot
thumb_func_start MultiBoot
MultiBoot:
- mov r1, #1
+ movs r1, #1
svc #37
bx lr
thumb_func_end MultiBoot
@@ -326,7 +329,7 @@ SoftResetRom:
ldr r3, =SOFT_RESET_DIRECT_BUF
movs r2, #0
strb r2, [r3, #0]
- sub r3, #SOFT_RESET_DIRECT_BUF - 0x3007f00
+ subs r3, #SOFT_RESET_DIRECT_BUF - USER_STACK
mov sp, r3
svc #1
svc #0
@@ -413,7 +416,7 @@ SoftReset:
ldr r3, =REG_IME
movs r2, #0
strb r2, [r3, #0]
- ldr r1, =0x3007f00
+ ldr r1, =USER_STACK
mov sp, r1
svc #1
svc #0
diff --git a/src/AgbRfu_LinkManager.c b/src/AgbRfu_LinkManager.c
index f6ebcc726..6fc8dc89a 100644
--- a/src/AgbRfu_LinkManager.c
+++ b/src/AgbRfu_LinkManager.c
@@ -352,7 +352,7 @@ static bool8 rfu_LMAN_linkWatcher(u16 REQ_commandID)
{
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((bm_linkLossSlot >> i) & 1)
+ if ((bm_linkLossSlot) & (1 << i))
{
lman.linkRecoveryTimer.active |= (1 << i);
lman.linkRecoveryTimer.count[i] = lman.linkRecoveryTimer.count_max;
@@ -396,7 +396,7 @@ static bool8 rfu_LMAN_linkWatcher(u16 REQ_commandID)
bm_disconnectSlot = 0;
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((lman.linkRecoveryTimer.active >> i) & 1 && lman.linkRecoveryTimer.count[i] && --lman.linkRecoveryTimer.count[i] == 0)
+ if ((lman.linkRecoveryTimer.active) & (1 << i) && lman.linkRecoveryTimer.count[i] && --lman.linkRecoveryTimer.count[i] == 0)
{
lman.linkRecoveryTimer.active &= ~(1 << i);
bm_disconnectSlot |= (1 << i);
diff --git a/src/m4a.c b/src/m4a.c
index 11a4525ea..66f563bd4 100644
--- a/src/m4a.c
+++ b/src/m4a.c
@@ -22,8 +22,7 @@ u8 gMPlayMemAccArea[0x10];
u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)
{
- u32 val1;
- u32 val2;
+ u32 val1, val2;
u32 fineAdjustShifted = fineAdjust << 24;
if (key > 178)
@@ -315,7 +314,7 @@ void MPlayExtender(struct CgbChannel *cgbChans)
void MusicPlayerJumpTableCopy(void)
{
- asm("swi 0x2A");
+ asm("svc 0x2A");
}
void ClearChain(void *x)
@@ -352,25 +351,25 @@ void SoundInit(struct SoundInfo *soundInfo)
| SOUND_ALL_MIX_FULL;
REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40;
- REG_DMA1SAD = (s32)soundInfo->pcmBuffer;
- REG_DMA1DAD = (s32)&REG_FIFO_A;
- REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE;
- REG_DMA2DAD = (s32)&REG_FIFO_B;
+ REG_DMA1SAD = (u32)soundInfo->pcmBuffer;
+ REG_DMA1DAD = (u32)&REG_FIFO_A;
+ REG_DMA2SAD = (u32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE;
+ REG_DMA2DAD = (u32)&REG_FIFO_B;
SOUND_INFO_PTR = soundInfo;
CpuFill32(0, soundInfo, sizeof(struct SoundInfo));
soundInfo->maxChans = 8;
soundInfo->masterVolume = 15;
- soundInfo->plynote = (u32)ply_note;
+ soundInfo->plynote = ply_note;
soundInfo->CgbSound = DummyFunc;
soundInfo->CgbOscOff = (void (*)(u8))DummyFunc;
soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc;
- soundInfo->ExtVolPit = (u32)DummyFunc;
+ soundInfo->ExtVolPit = (void (*)(struct MusicPlayerInfo *, struct MusicPlayerTrack *))DummyFunc;
MPlayJumpTableCopy(gMPlayJumpTable);
- soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable;
+ soundInfo->MPlayJumpTable = (void (**)())gMPlayJumpTable;
SampleFreqSet(SOUND_MODE_FREQ_13379);
@@ -381,7 +380,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;
@@ -433,13 +432,10 @@ void m4aSoundMode(u32 mode)
soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT;
temp = MAX_DIRECTSOUND_CHANNELS;
- chan = &soundInfo->chans[0];
- while (temp != 0)
+ for (temp = MAX_DIRECTSOUND_CHANNELS, chan = soundInfo->chans; temp != 0; temp--,chan++)
{
chan->status = 0;
- temp--;
- chan++;
}
}
@@ -469,37 +465,28 @@ void m4aSoundMode(u32 mode)
void SoundClear(void)
{
- struct SoundInfo *soundInfo = SOUND_INFO_PTR;
s32 i;
- void *chan;
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+ struct SoundChannel *chan;
if (soundInfo->ident != ID_NUMBER)
return;
soundInfo->ident++;
- i = MAX_DIRECTSOUND_CHANNELS;
- chan = &soundInfo->chans[0];
-
- while (i > 0)
+ for (i = MAX_DIRECTSOUND_CHANNELS, chan = soundInfo->chans; i > 0; i--,chan++)
{
- ((struct SoundChannel *)chan)->status = 0;
- i--;
- chan = (void *)((s32)chan + sizeof(struct SoundChannel));
+ chan->status = 0;
}
- chan = soundInfo->cgbChans;
+ chan = (struct SoundChannel *)soundInfo->cgbChans;
if (chan)
{
- i = 1;
-
- while (i <= 4)
+ for (i=1; i<=4; i++,chan++)
{
soundInfo->CgbOscOff(i);
- ((struct CgbChannel *)chan)->sf = 0;
- i++;
- chan = (void *)((s32)chan + sizeof(struct CgbChannel));
+ chan->status = 0;
}
}
@@ -510,27 +497,26 @@ void m4aSoundVSyncOff(void)
{
struct SoundInfo *soundInfo = SOUND_INFO_PTR;
- if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1)
- {
- soundInfo->ident += 10;
+ if (soundInfo->ident < ID_NUMBER || soundInfo->ident > ID_NUMBER + 1)
+ return;
+ 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_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;
+ 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_DMA1CNT_H = DMA_32BIT;
+ REG_DMA2CNT_H = DMA_32BIT;
- CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer));
- }
+ CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer));
}
void m4aSoundVSyncOn(void)
{
struct SoundInfo *soundInfo = SOUND_INFO_PTR;
- u32 ident = soundInfo->ident;
+ const u32 ident = soundInfo->ident;
if (ident == ID_NUMBER)
return;
@@ -580,7 +566,7 @@ void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track
}
soundInfo->intp = (u32)mplayInfo;
- soundInfo->func = (u32)MPlayMain;
+ soundInfo->func = MPlayMain;
soundInfo->ident = ID_NUMBER;
mplayInfo->ident = ID_NUMBER;
}
@@ -614,28 +600,21 @@ void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader
mplayInfo->tempoC = 0;
mplayInfo->fadeOI = 0;
- i = 0;
- track = mplayInfo->tracks;
-
- while (i < songHeader->trackCount && i < mplayInfo->trackCount)
+ for (i = 0, track = mplayInfo->tracks; i < songHeader->trackCount && i < mplayInfo->trackCount; i++, track++)
{
TrackStop(mplayInfo, track);
track->flags = MPT_FLG_EXIST | MPT_FLG_START;
track->chan = 0;
track->cmdPtr = songHeader->part[i];
- i++;
- track++;
}
- while (i < mplayInfo->trackCount)
+ for (; i < mplayInfo->trackCount; i++, track++)
{
TrackStop(mplayInfo, track);
track->flags = 0;
- i++;
- track++;
}
- if (songHeader->reverb & 0x80)
+ if (songHeader->reverb & SOUND_MODE_REVERB_SET)
m4aSoundMode(songHeader->reverb);
mplayInfo->ident = ID_NUMBER;
@@ -653,14 +632,9 @@ void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo)
mplayInfo->ident++;
mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE;
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
-
- while (i > 0)
+ for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++)
{
TrackStop(mplayInfo, track);
- i--;
- track++;
}
mplayInfo->ident = ID_NUMBER;
@@ -704,10 +678,8 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
if ((s16)(mplayInfo->fadeOV & mask) <= 0)
{
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
- while (i > 0)
+ for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++)
{
u32 val;
@@ -719,9 +691,6 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
if (!val)
track->flags = 0;
-
- i--;
- track++;
}
if (mplayInfo->fadeOV & TEMPORARY_FADE)
@@ -734,10 +703,7 @@ 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)
{
@@ -746,9 +712,6 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
track->volX = (fadeOV >> FADE_VOL_SHIFT);
track->flags |= MPT_FLG_VOLCHG;
}
-
- i--;
- track++;
}
}
@@ -756,7 +719,7 @@ void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tr
{
if (track->flags & MPT_FLG_VOLSET)
{
- s32 x;
+ u32 x;
s32 y;
x = (u32)(track->vol * track->volX) >> 5;