diff --git a/sound-driver/Makefile b/sound-driver/Makefile index fa14a2a..ecdce2a 100644 --- a/sound-driver/Makefile +++ b/sound-driver/Makefile @@ -4,13 +4,12 @@ OBJDUMP=$(TOOLCHAIN_PREFIX)/bin/msp430-elf-objdump ARTIFACT=firmware MCU=msp430g2553 -COMMONFLAGS=-Wall -mmcu=$(MCU) -I $(TOOLCHAIN_PREFIX)/include -O0 -g0 +DEBUGFLAGS= +# DEBUGFLAGS+= -g3 -ggdb -gdwarf-2 +COMMONFLAGS=-Wall -mmcu=$(MCU) -I $(TOOLCHAIN_PREFIX)/include -O0 -g0 $(DEBUGFLAGS) CFLAGS=$(COMMONFLAGS) -std=gnu99 ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__ -# for debugging -CFLAGS+= -g3 -ggdb -gdwarf-2 - LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include $(ARTIFACT).elf: main.o scheduler.o spi.o spi_init.o sequencer.o melody_tetris.o melody_tusch1.o psg.o mute.o melody_pling.o diff --git a/sound-driver/main.c b/sound-driver/main.c index 8e4a119..695eb33 100644 --- a/sound-driver/main.c +++ b/sound-driver/main.c @@ -31,7 +31,6 @@ int main() { __enable_interrupt(); - // playMelodyTetris(); while (1) { schExec(); diff --git a/sound-driver/melody_pling.c b/sound-driver/melody_pling.c index 6b76b56..88ebacd 100644 --- a/sound-driver/melody_pling.c +++ b/sound-driver/melody_pling.c @@ -15,10 +15,10 @@ const t_tone plingVoice1[] = { }; t_melodies pling = { - .melodies = { { .chip = 1, .amplitude = 12, .tones = plingVoice1 } }, + .melodies = { { .amplitude = 12, .tones = plingVoice1 } }, .numOfMelodies = 1, .pace = 200, - .slotMask = 0x02 + .chip = 1 }; void playPling() { diff --git a/sound-driver/melody_tetris.c b/sound-driver/melody_tetris.c index 30091fb..598fe6c 100644 --- a/sound-driver/melody_tetris.c +++ b/sound-driver/melody_tetris.c @@ -922,15 +922,16 @@ const t_tone voice3[] = { { .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false }, }; +#define INITIAL_PACE 160 t_melodies tetrisTheme = { - .melodies = { { .chip = 0, .amplitude = 8, .tones = voice1 }, { .chip = 0, .amplitude = 8, .tones = voice2 }, { .chip = 0, .amplitude = 8, .tones = voice3 } }, + .melodies = { { .amplitude = 8, .tones = voice1 }, { .amplitude = 8, .tones = voice2 }, { .amplitude = 8, .tones = voice3 } }, .numOfMelodies = 3, - .pace = 160, - .slotMask = 0x01 + .pace = INITIAL_PACE, + .chip = 0 }; void playMelodyTetris() { - tetrisTheme.pace = 160; // reset to start value each time + tetrisTheme.pace = INITIAL_PACE; // reset to start value each time sequencerPlayMelodies(&tetrisTheme); } diff --git a/sound-driver/melody_tusch1.c b/sound-driver/melody_tusch1.c index a596ab2..8c61445 100644 --- a/sound-driver/melody_tusch1.c +++ b/sound-driver/melody_tusch1.c @@ -72,10 +72,10 @@ const t_tone tusch1voice3[] = { }; t_melodies tusch1 = { - .melodies = { { .chip = 1, .amplitude = 12, .tones = tusch1voice1 }, { .chip = 1, .amplitude = 12, .tones = tusch1voice2 }, { .chip = 1, .amplitude = 12, .tones = tusch1voice3 } }, + .melodies = { { .amplitude = 12, .tones = tusch1voice1 }, { .amplitude = 12, .tones = tusch1voice2 }, { .amplitude = 12, .tones = tusch1voice3 } }, .numOfMelodies = 3, .pace = 200, - .slotMask = 0x02 + .chip = 1 }; void playTusch1() { diff --git a/sound-driver/psg.c b/sound-driver/psg.c index b00dd6a..251e6bb 100644 --- a/sound-driver/psg.c +++ b/sound-driver/psg.c @@ -81,19 +81,6 @@ inline static void BUS_OP_CS1_DISABLE() { BUS_CTRL_REG |= _CS1; } -#if 0 -static void delay() { -asm volatile ( - "push r12\n" - "mov.w #5, r12\n" - "loop:\n" - "dec.w r12\n" - "jnz loop\n" - "pop r12\n" -); -} -#endif - static uint8_t psgReadShadow(uint8_t chip, uint8_t address) { return psgShadowRegisters[chip][address]; } diff --git a/sound-driver/scheduler.c b/sound-driver/scheduler.c index 74455c2..12f215c 100644 --- a/sound-driver/scheduler.c +++ b/sound-driver/scheduler.c @@ -52,16 +52,6 @@ uint16_t schAdd(void (*exec)(void *), void *handle, uint32_t delay, uint32_t per return taskId; } -/* -void schDel(void (*exec)(void *), void *handle) { - for (uint16_t i = 0; i < MAX_NUM_OF_TASKS; i++) { - if ((tasks[i].exec == exec) && (tasks[i].handle == handle)) { - tasks[i].exec = NULL; - break; - } - } -} -*/ void schDel(uint16_t taskId) { tasks[taskId].exec = NULL; } diff --git a/sound-driver/sequencer.c b/sound-driver/sequencer.c index 9ffc25c..184cb76 100644 --- a/sound-driver/sequencer.c +++ b/sound-driver/sequencer.c @@ -59,7 +59,7 @@ void sequencerExec(void *handle) { if (melody->tones[melody->idx].length == e_L_EndMark) { melody->idx = 0; } - psgPlayTone(melody->chip, channel, melody->amplitude, melody->tones[melody->idx].octave, melody->tones[melody->idx].note); + psgPlayTone(melodies->chip, channel, melody->amplitude, melody->tones[melody->idx].octave, melody->tones[melody->idx].note); melody->lengthCnt = (melody->tones[melody->idx].staccato) ? (calcLength(melodies, melody->tones[melody->idx].length) / 2) : calcLength(melodies, melody->tones[melody->idx].length); @@ -78,7 +78,7 @@ void sequencerExec(void *handle) { } break; case e_StaccatoBreak: - psgPlayTone(melody->chip, channel, 0, e_O_Null, e_Pause); + psgPlayTone(melodies->chip, channel, 0, e_O_Null, e_Pause); melody->lengthCnt = calcLength(melodies, melody->tones[melody->idx].length) / 2; melody->state = e_HoldStaccatoBreak; break; @@ -90,7 +90,7 @@ void sequencerExec(void *handle) { break; case e_SeparateTone: if (! (melody->tones[melody->idx].legato)) { - psgPlayTone(melody->chip, channel, 0, e_O_Null, e_Pause); + psgPlayTone(melodies->chip, channel, 0, e_O_Null, e_Pause); } melody->idx += 1; melody->state = e_PlayTone; @@ -106,6 +106,8 @@ void sequencerExec(void *handle) { } void sequencerPlayMelodies(t_melodies *melodies) { + melodies->slotMask = (1 << melodies->chip); + if ((slots & melodies->slotMask) != 0) { return; } @@ -123,8 +125,11 @@ void sequencerPlayMelodies(t_melodies *melodies) { } void sequencerStopMelodies(t_melodies *melodies) { - slots &= ~(melodies->slotMask); schDel(melodies->taskId); + slots &= ~(melodies->slotMask); + for (uint8_t channel = 0; channel < melodies->numOfMelodies; channel++) { + psgPlayTone(melodies->chip, channel, 0, e_O_Null, e_Pause); + } } void sequencerChangePace(t_melodies *melodies) { diff --git a/sound-driver/sequencer.h b/sound-driver/sequencer.h index bdb4fd6..7411ae9 100644 --- a/sound-driver/sequencer.h +++ b/sound-driver/sequencer.h @@ -42,7 +42,6 @@ typedef enum { typedef struct { uint16_t idx; - uint8_t chip; uint16_t lengthCnt; t_sequencerState state; uint8_t amplitude; @@ -53,10 +52,11 @@ typedef struct { #define NUM_OF_CHANNELS 3 typedef struct { uint8_t slotMask; + uint8_t chip; uint8_t taskId; uint16_t quarterLength; uint8_t numOfMelodies; - uint8_t pace; // quarter notes per minute + uint16_t pace; // quarter notes per minute uint8_t sync; t_melody melodies[NUM_OF_CHANNELS]; } t_melodies; diff --git a/sound-driver/spi.S b/sound-driver/spi.S index c8d4864..97358e2 100644 --- a/sound-driver/spi.S +++ b/sound-driver/spi.S @@ -1,10 +1,6 @@ #include #include "soundCodes.h" - .section ".data" - .global cmd -cmd: - .byte .section ".text","ax",@progbits receive_isr: @@ -34,7 +30,7 @@ spiCmdHandler_3: spiCmdHandler_4: bit #SOUND_GAMEOVER, &cmd jz spiCmdHandler_5 - ;; insert a call here + call #stopMelodyTetris bic #SOUND_GAMEOVER, &cmd spiCmdHandler_5: bit #SOUND_FANFARE, &cmd @@ -59,9 +55,6 @@ spiCmdHandler_8: spiCmdHandler_end: ret - - - .section "__interrupt_vector_8","ax",@progbits .word receive_isr diff --git a/sound-driver/spi_init.c b/sound-driver/spi_init.c index 5d831b1..fdef72c 100644 --- a/sound-driver/spi_init.c +++ b/sound-driver/spi_init.c @@ -6,7 +6,7 @@ #include "soundCodes.h" -extern uint8_t cmd; +uint8_t cmd; void spiInit() { // SPI slave