From 562f435116748b259ef5cd97d36e6049c1d9fbc7 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 11 Jun 2021 17:12:13 +0200 Subject: Add memcpy32 inline function --- src/gba/gba.h | 8 +++++ src/rng.c | 2 +- src/sequencer.c | 100 ++++++++++++++++++++++++++++++++------------------------ 3 files changed, 66 insertions(+), 44 deletions(-) (limited to 'src') diff --git a/src/gba/gba.h b/src/gba/gba.h index 797c71e..3a84b89 100644 --- a/src/gba/gba.h +++ b/src/gba/gba.h @@ -660,4 +660,12 @@ wait_vsync(void) { #define EWRAM_CODE __attribute__((section(".ewram"), long_call)) #define EWRAM_BSS __attribute__((section(".sbss"))) +static inline +void +memcpy32(u32 *dst, const u32 *src, u32 size) { + for (size_t i = 0; i < size / 4; i++) { + dst[i] = src[i]; + } +} + #endif // GBA_H diff --git a/src/rng.c b/src/rng.c index 96760b8..58a517b 100644 --- a/src/rng.c +++ b/src/rng.c @@ -1,4 +1,4 @@ -u16 rng_state; +static u16 rng_state = 0; u32 hash16(u32 input, u32 key) { u32 hash = input * key; diff --git a/src/sequencer.c b/src/sequencer.c index 002b4d0..fae4ce3 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -798,9 +798,9 @@ irq_timer(void) { // TODO: Should we compare if previous and current wave are the // same before updating? SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); - dma_copy(SOUND_WAVE_RAM, params->wave_a, 16, 3); + memcpy32(SOUND_WAVE_RAM, params->wave_a, 16); SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); - dma_copy(SOUND_WAVE_RAM, params->wave_b, 16, 3); + memcpy32(SOUND_WAVE_RAM, params->wave_b, 16); switch (params->wave_mode) { case 0: { @@ -1164,47 +1164,61 @@ handle_param_selection_ch3(void) { // ^^ // |`- odd // `-- even - // if (param_selection_loc < 32) { - // u8 byte_number = param_selection_loc >> 1; - // u8 byte = sequences[2][trig_selection_loc].wave_a[byte_number]; - // if (odd) { - // byte = (~0xF & byte) | ((byte + inc) & 0xF); - // } else { - // byte = (0xF & byte) | (((byte >> 4) + inc) & 0xF) << 4; - // } - // sequences[2][trig_selection_loc].wave_a[byte_number] = byte; - // } else if (param_selection_loc < 64){ - // u8 byte_number = (param_selection_loc - 32) >> 1; - // u8 byte = sequences[2][trig_selection_loc].wave_b[byte_number]; - // if (odd) { - // byte = (~0xF & byte) | (byte + inc); - // } else { - // byte = (0xF & byte) | ((byte >> 4) + inc) << 4; - // } - // sequences[2][trig_selection_loc].wave_b[byte_number] = byte; - // } else if (param_selection_loc == 64){ - // dma_copy(&trig->wave_a, &sine_wave, 16, 3); - // } else if (param_selection_loc == 65){ - // dma_copy(&trig->wave_a, &saw_wave, 16, 3); - // } else if (param_selection_loc == 66){ - // dma_copy(&trig->wave_a, &square_wave, 16, 3); - // } else if (param_selection_loc == 67){ - // u32 rand_wave[4] = { - // rng32(), rng32(), rng32(), rng32(), - // }; - // dma_copy(&trig->wave_a, &rand_wave, 16, 3); - // } else if (param_selection_loc == 68){ - // dma_copy(&trig->wave_b, &sine_wave, 16, 3); - // } else if (param_selection_loc == 69){ - // dma_copy(&trig->wave_b, &saw_wave, 16, 3); - // } else if (param_selection_loc == 70){ - // dma_copy(&trig->wave_b, &square_wave, 16, 3); - // } else if (param_selection_loc == 71){ - // u32 rand_wave[4] = { - // rng32(), rng32(), rng32(), rng32(), - // }; - // dma_copy(&trig->wave_b, &rand_wave, 16, 3); - // } + if (param_selection_loc < 32) { + // u8 byte_number = param_selection_loc >> 1; + // u8 byte = sequences[2][trig_selection_loc].wave_a[byte_number]; + // if (odd) { + // byte = (~0xF & byte) | ((byte + inc) & 0xF); + // } else { + // byte = (0xF & byte) | (((byte >> 4) + inc) & 0xF) << 4; + // } + // sequences[2][trig_selection_loc].wave_a[byte_number] = byte; + } else if (param_selection_loc < 64){ + // u8 byte_number = (param_selection_loc - 32) >> 1; + // u8 byte = sequences[2][trig_selection_loc].wave_b[byte_number]; + // if (odd) { + // byte = (~0xF & byte) | (byte + inc); + // } else { + // byte = (0xF & byte) | ((byte >> 4) + inc) << 4; + // } + // sequences[2][trig_selection_loc].wave_b[byte_number] = byte; + } else { + u32 *wave_a = &ch3.params[trig_selection_loc].wave_a; + u32 *wave_b = &ch3.params[trig_selection_loc].wave_b; + switch (param_selection_loc) { + case 64: { + memcpy32(wave_a, sine_wave, 16); + } break; + case 65: { + memcpy32(wave_a, saw_wave, 16); + } break; + case 66: { + memcpy32(wave_a, square_wave, 16); + } break; + case 67: { + u32 rand_wave[4] = { + rng32(), rng32(), rng32(), rng32(), + }; + memcpy32(wave_a, rand_wave, 16); + } break; + case 68: { + memcpy32(wave_b, sine_wave, 16); + } break; + case 69: { + memcpy32(wave_b, saw_wave, 16); + } break; + case 70: { + memcpy32(wave_b, square_wave, 16); + } break; + case 71: { + u32 rand_wave[4] = { + rng32(), rng32(), rng32(), rng32(), + }; + memcpy32(wave_b, rand_wave, 16); + } break; + } + draw_parameters(); + } } } -- cgit v1.2.1