diff --git a/firmware/apps/mariofx.c b/firmware/apps/mariofx.c new file mode 100644 index 0000000..6cf9fe9 --- /dev/null +++ b/firmware/apps/mariofx.c @@ -0,0 +1,65 @@ +#include +#include +#include +#define __DELAY_BACKWARD_COMPATIBLE__ +#include +#include +#include +#include +#include +#include + +static uint16_t osc; +static uint16_t sample; +static uint8_t row; + + +#define LENGTH(x) (sizeof(x) / sizeof(x[0])) +static const uint8_t mushroom[] = {6,1,6,10,13,18,13,1,6,8,13,8,13,18,20,25,20,3,8,11,15,11,15,20,23,27,23}; + +static void mariofx_ISR(void) { + if (row < LENGTH(mushroom)) { + osc += pgm_read_word(&freq_table[mushroom[row] + 18]) * 3; + if (++sample == 800 ) { + sample = 0; + row++; + } + } else { + if (btn_state(BTNST_SUP, BTN_RIGHT)) { + button_clear(BTN_RIGHT); + row = 0; + } + } + + if (osc >= 0xc000) { + PORTB |= (1 << PORTB2); + PORTC &= ~(1<< PORTC5); + } + else { + PORTB &= ~(1<< PORTB2); + PORTC |= (1 << PORTC5); + } +} + + + +static void mariofx(void) { + /* initialisation required */ + if (mode_uninitialized) { + mode_uninitialized = false; + + init_buzzr(); + osc = sample = row = 0; + start_timer(mariofx_ISR); + } + + /*deinialisation required */ + if (mode_last_tick) { + stop_timer(); + } + + return; +} + + +REGISTER(mariofx); diff --git a/firmware/lib/freq_table.c b/firmware/lib/freq_table.c new file mode 100644 index 0000000..66e3f2c --- /dev/null +++ b/firmware/lib/freq_table.c @@ -0,0 +1,51 @@ +#include +const uint16_t freq_table[] PROGMEM = { +/*0x00*/ 0, +/*0x01*/ 130, +/*0x02*/ 137, +/*0x03*/ 145, +/*0x04*/ 154, +/*0x05*/ 163, +/*0x06*/ 173, +/*0x07*/ 183, +/*0x08*/ 194, +/*0x09*/ 206, +/*0x0a*/ 218, +/*0x0b*/ 231, +/*0x0c*/ 245, +/*0x0d*/ 259, +/*0x0e*/ 275, +/*0x0f*/ 291, +/*0x10*/ 308, +/*0x11*/ 327, +/*0x12*/ 346, +/*0x13*/ 367, +/*0x14*/ 388, +/*0x15*/ 412, +/*0x16*/ 436, +/*0x17*/ 462, +/*0x18*/ 489, +/*0x19*/ 518, +/*0x1a*/ 549, +/*0x1b*/ 582, +/*0x1c*/ 617, +/*0x1d*/ 653, +/*0x1e*/ 692, +/*0x1f*/ 733, +/*0x20*/ 777, +/*0x21*/ 823, +/*0x22*/ 872, +/*0x23*/ 924, +/*0x24*/ 979, +/*0x25*/ 1037, +/*0x26*/ 1099, +/*0x27*/ 1164, +/*0x28*/ 1233, +/*0x29*/ 1306, +/*0x2a*/ 1384, +/*0x2b*/ 1466, +/*0x2c*/ 1554, +/*0x2d*/ 1646, +/*0x2e*/ 1744, +/*0x2f*/ 1848, +}; diff --git a/firmware/lib/freq_table.h b/firmware/lib/freq_table.h index 5c38ae2..2e48945 100644 --- a/firmware/lib/freq_table.h +++ b/firmware/lib/freq_table.h @@ -1,50 +1 @@ -const uint16_t freq_table[] PROGMEM = { -/*0x00*/ 0, -/*0x01*/ 130, -/*0x02*/ 137, -/*0x03*/ 145, -/*0x04*/ 154, -/*0x05*/ 163, -/*0x06*/ 173, -/*0x07*/ 183, -/*0x08*/ 194, -/*0x09*/ 206, -/*0x0a*/ 218, -/*0x0b*/ 231, -/*0x0c*/ 245, -/*0x0d*/ 259, -/*0x0e*/ 275, -/*0x0f*/ 291, -/*0x10*/ 308, -/*0x11*/ 327, -/*0x12*/ 346, -/*0x13*/ 367, -/*0x14*/ 388, -/*0x15*/ 412, -/*0x16*/ 436, -/*0x17*/ 462, -/*0x18*/ 489, -/*0x19*/ 518, -/*0x1a*/ 549, -/*0x1b*/ 582, -/*0x1c*/ 617, -/*0x1d*/ 653, -/*0x1e*/ 692, -/*0x1f*/ 733, -/*0x20*/ 777, -/*0x21*/ 823, -/*0x22*/ 872, -/*0x23*/ 924, -/*0x24*/ 979, -/*0x25*/ 1037, -/*0x26*/ 1099, -/*0x27*/ 1164, -/*0x28*/ 1233, -/*0x29*/ 1306, -/*0x2a*/ 1384, -/*0x2b*/ 1466, -/*0x2c*/ 1554, -/*0x2d*/ 1646, -/*0x2e*/ 1744, -/*0x2f*/ 1848, -}; +extern const uint16_t freq_table[] PROGMEM;