Skip to content

Commit

Permalink
Merge pull request #6 from PoroCYon/master
Browse files Browse the repository at this point in the history
Fix IRQ_SAFE mode and make it the default
  • Loading branch information
kusma committed Feb 19, 2020
2 parents d6edc56 + bc68426 commit 573f165
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 19 deletions.
5 changes: 5 additions & 0 deletions src/pimp_config.h
Expand Up @@ -29,4 +29,9 @@
/* #define ASSERT_ENABLE */
/* #define PRINT_PATTERNS */

#define PIMP_MIXER_IRQ_SAFE /* on by default */
#define PIMP_MIXER_USE_BRESENHAM_MIXER
/* #define PIMP_MIXER_NO_MIXING */
/* #define PIMP_MIXER_NO_CLIPPING */

#endif /* PIMP_CONFIG_H */
36 changes: 17 additions & 19 deletions src/pimp_mixer_arm.S
Expand Up @@ -20,20 +20,16 @@
@irq-safe: 1121327
@irq-unsafe: 1105083

// #define IRQ_SAFE
#define USE_BRESENHAM_MIXER
// #define NO_MIXING
// #define NO_CLIPPING
#include "pimp_config.h"

#ifndef PIMP_MIXER_IRQ_SAFE
.stack_store:
.word 0

#ifndef IRQ_SAFE
.ime_store:
.word 0
#endif

#ifdef USE_BRESENHAM_MIXER
#ifdef PIMP_MIXER_USE_BRESENHAM_MIXER
.sample_data_store:
.word 0
#endif
Expand All @@ -53,12 +49,12 @@
pimp_mixer_mix_samples:
stmfd sp!, {r4-r12, lr} @ store all registers but parameters and stack

#ifdef NO_MIXING
#ifdef PIMP_MIXER_NO_MIXING
ldmfd sp!, {r4-r12, lr} @ restore rest of registers
bx lr @ return to caller
#endif

#ifndef IRQ_SAFE
#ifndef PIMP_MIXER_IRQ_SAFE
str sp, .stack_store @ store stack pointer so we can use that register in our mixer (note, interrupts must be disabled for this to be safe)
#endif

Expand Down Expand Up @@ -135,23 +131,23 @@ pimp_mixer_mix_samples:
movs COUNTER, COUNTER, asr #3 @ divide counter by 8
beq .ret @ if no more samples, return

#ifndef IRQ_SAFE
#ifndef PIMP_MIXER_IRQ_SAFE
ldr r4, =0x4000208 @ load address of REG_IME
ldr r5, [r4] @ load value of REG_IME
str r5, .ime_store @ stash for later
eor r6, r6
str r6, [r4] @ disable interrupt
#endif

#ifdef USE_BRESENHAM_MIXER
#ifdef PIMP_MIXER_USE_BRESENHAM_MIXER
// if ((sample_cursor_delta & ~((1UL << 12) - 1)) == 0)
@ check if bresenham mixer can be used or not
ldr r4, =0xfffff000 @ ~((1UL << 12) - 1))
tst SAMPLE_CURSOR_DELTA, r4 @ any bits set?
beq .bresenham_mixer @ no? lets go!
#endif

#ifdef IRQ_SAFE
#ifdef PIMP_MIXER_IRQ_SAFE
#define TEMP r11
#define UNROLL_RANGE r4-r10
#else
Expand Down Expand Up @@ -190,7 +186,7 @@ pimp_mixer_mix_samples:
mla r10, TEMP, VOLUME, r10
add SAMPLE_CURSOR, SAMPLE_CURSOR, SAMPLE_CURSOR_DELTA

#ifndef IRQ_SAFE
#ifndef PIMP_MIXER_IRQ_SAFE
ldrb TEMP, [SAMPLE_DATA, SAMPLE_CURSOR, lsr #12]
mla r11, TEMP, VOLUME, r11
add SAMPLE_CURSOR, SAMPLE_CURSOR, SAMPLE_CURSOR_DELTA
Expand All @@ -210,21 +206,22 @@ pimp_mixer_mix_samples:
subs COUNTER, COUNTER, #1
bne .simple_loop

#ifndef IRQ_SAFE
#ifndef PIMP_MIXER_IRQ_SAFE
ldr r4, =0x4000208 @ load address of REG_IME
ldr r5, .ime_store @ stash for later
str r5, [r4] @ write value to REG_IME

ldr sp, .stack_store @ restore stack pointer
#endif

.ret:
@ clean return
mov r0, SAMPLE_CURSOR

ldr sp, .stack_store @ restore stack pointer
ldmfd sp!, {r4-r12, lr} @ restore rest of registers
bx lr @ return to caller

#ifdef USE_BRESENHAM_MIXER
#ifdef PIMP_MIXER_USE_BRESENHAM_MIXER

.bresenham_mixer:
str SAMPLE_DATA, .sample_data_store @ stash away SAMPLE_DATA for later use
Expand Down Expand Up @@ -273,7 +270,7 @@ pimp_mixer_mix_samples:
ldrcsb TEMP, [SAMPLE_DATA], #1
mulcs TEMP, VOLUME, TEMP

#ifndef IRQ_SAFE
#ifndef PIMP_MIXER_IRQ_SAFE
add r11, TEMP, r11
adds SAMPLE_CURSOR, SAMPLE_CURSOR, SAMPLE_CURSOR_DELTA
ldrcsb TEMP, [SAMPLE_DATA], #1
Expand All @@ -294,13 +291,14 @@ pimp_mixer_mix_samples:
subs COUNTER, COUNTER, #1
bne .bresenham_loop

#ifndef IRQ_SAFE
#ifndef PIMP_MIXER_IRQ_SAFE
ldr r4, =0x4000208 @ load address of REG_IME
ldr r5, .ime_store @ stash for later
str r5, [r4] @ write value to REG_IME
#endif

ldr sp, .stack_store @ restore stack pointer
#endif

ldr r0, .sample_data_store @ restore the old sample data

@ calculate how the sample cursor changed
Expand Down

0 comments on commit 573f165

Please sign in to comment.