Compare commits
7 Commits
1d96cee661
...
sound_tuni
Author | SHA1 | Date | |
---|---|---|---|
68816a06fa | |||
1d915baf77
|
|||
08b96a6617
|
|||
ff95034605 | |||
ac4801c7cf
|
|||
a4cb8129c5
|
|||
f5fa1e5e22
|
BIN
docs/IMG_4936.jpg
Normal file
After Width: | Height: | Size: 2.0 MiB |
BIN
docs/display-driver.jpg
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
docs/game-ctrl.jpg
Normal file
After Width: | Height: | Size: 94 KiB |
BIN
docs/logo.jpg
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
docs/reset-ctrl.jpg
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
docs/rgb-driver.jpg
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
docs/sound-driver-1.jpg
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
docs/sound-driver-2.jpg
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
docs/sound-driver-3.jpg
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
docs/sound-driver-4.jpg
Normal file
After Width: | Height: | Size: 74 KiB |
@ -12,12 +12,13 @@
|
|||||||
#include "buttons.h"
|
#include "buttons.h"
|
||||||
|
|
||||||
|
|
||||||
#define GAME_CYCLE_TIME 100
|
#define GAME_CYCLE_TIME 50
|
||||||
#define GAMEOVER_DELAY 10
|
#define GAMEOVER_DELAY 10
|
||||||
|
#define MAX_LEVEL 20
|
||||||
|
|
||||||
|
|
||||||
static uint8_t delayFactor(uint8_t level) {
|
static uint8_t delayFactor(uint8_t level) {
|
||||||
return 11 - level;
|
return MAX_LEVEL + 1 - level;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -36,6 +37,7 @@ void gameExec(void *handle) {
|
|||||||
static uint8_t rowIndex;
|
static uint8_t rowIndex;
|
||||||
static uint8_t proceedDelay;
|
static uint8_t proceedDelay;
|
||||||
static uint8_t level;
|
static uint8_t level;
|
||||||
|
static uint16_t filledLines;
|
||||||
static uint16_t score;
|
static uint16_t score;
|
||||||
static bool newHighScoreAchieved;
|
static bool newHighScoreAchieved;
|
||||||
|
|
||||||
@ -46,6 +48,7 @@ void gameExec(void *handle) {
|
|||||||
canvasClear();
|
canvasClear();
|
||||||
soundCtrl(SOUND_START);
|
soundCtrl(SOUND_START);
|
||||||
level = 1;
|
level = 1;
|
||||||
|
filledLines = 0;
|
||||||
score = 0;
|
score = 0;
|
||||||
newHighScoreAchieved = false;
|
newHighScoreAchieved = false;
|
||||||
phase = e_Phase_Game;
|
phase = e_Phase_Game;
|
||||||
@ -118,9 +121,9 @@ void gameExec(void *handle) {
|
|||||||
}
|
}
|
||||||
// --- engine end ---------------------------------------------------------
|
// --- engine end ---------------------------------------------------------
|
||||||
|
|
||||||
|
bool wipedLines = false;
|
||||||
canvasShow();
|
canvasShow();
|
||||||
if (phase == e_Phase_Game) {
|
if (phase == e_Phase_Game) {
|
||||||
uint8_t wipeCnt = 0;
|
|
||||||
for (uint8_t r = 0; r < CANVAS_HEIGHT; r++) {
|
for (uint8_t r = 0; r < CANVAS_HEIGHT; r++) {
|
||||||
if (canvasIsRowFilled(r)) {
|
if (canvasIsRowFilled(r)) {
|
||||||
score += level;
|
score += level;
|
||||||
@ -131,13 +134,23 @@ void gameExec(void *handle) {
|
|||||||
displaySetValue(score);
|
displaySetValue(score);
|
||||||
canvasWipeRow(r);
|
canvasWipeRow(r);
|
||||||
canvasShow();
|
canvasShow();
|
||||||
wipeCnt += 1;
|
wipedLines = true;
|
||||||
|
filledLines += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (wipeCnt != 0) {
|
}
|
||||||
|
|
||||||
|
if (wipedLines) {
|
||||||
|
soundCtrl(SOUND_PLING);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wipedLines && (filledLines > 0) && ((filledLines % 10) == 0)) {
|
||||||
|
if (level < MAX_LEVEL) {
|
||||||
|
level += 1;
|
||||||
|
}
|
||||||
soundCtrl(SOUND_FANFARE);
|
soundCtrl(SOUND_FANFARE);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (isGameActive()) {
|
if (isGameActive()) {
|
||||||
displaySetValue(score);
|
displaySetValue(score);
|
||||||
|
17
readme.md
@ -1,9 +1,13 @@
|
|||||||
# Tetris - Hardware and Software
|
# Tetris - Hardware and Software
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
This Tetris implementation consists of a hardware and a software (running on that hardware).
|
This Tetris implementation consists of a hardware and a software (running on that hardware).
|
||||||
|
|
||||||
The hardware utilizes four MSP430 microcontrollers for 1.) the game play, 2.) the play ground canvas, 3.) the score display and 4.) the sound effects.
|
The hardware utilizes four MSP430 microcontrollers for 1.) the game play, 2.) the play ground canvas, 3.) the score display and 4.) the sound effects.
|
||||||
|
|
||||||
|
Further documentation including calculations and drawing can be found in the `docs` subdirs of the four main subdirs.
|
||||||
|
|
||||||
## Game Play
|
## Game Play
|
||||||
|
|
||||||
Code is in subdir `game-ctrl` (https://gitea.hottis.de/wn/tetris/src/branch/main/game-ctrl).
|
Code is in subdir `game-ctrl` (https://gitea.hottis.de/wn/tetris/src/branch/main/game-ctrl).
|
||||||
@ -14,6 +18,9 @@ The buttons are debounced using RC circuitry and Schmitt triggers and connected
|
|||||||
|
|
||||||
The peripherial microcontrollers and the EEPROM are connected via SPI including individual chip select lines.
|
The peripherial microcontrollers and the EEPROM are connected via SPI including individual chip select lines.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
## Play Ground Canvas
|
## Play Ground Canvas
|
||||||
|
|
||||||
Code is in subdir `rgb-driver` (https://gitea.hottis.de/wn/tetris/src/branch/main/rgb-driver).
|
Code is in subdir `rgb-driver` (https://gitea.hottis.de/wn/tetris/src/branch/main/rgb-driver).
|
||||||
@ -22,6 +29,9 @@ The play ground is implemented using a 10 * 20 matrix of PL9823 RGB LEDs which a
|
|||||||
|
|
||||||
The communcation with the game play controller is implemented as a sequences of tuples of LED address (0 to 211) and color code. A single octet of 253 where the LED address is expected is taken as the end-of-telegram mark. Readiness to receive a telegram is signaled to the game play controller via a single line connected to a GPIO of the game play controller.
|
The communcation with the game play controller is implemented as a sequences of tuples of LED address (0 to 211) and color code. A single octet of 253 where the LED address is expected is taken as the end-of-telegram mark. Readiness to receive a telegram is signaled to the game play controller via a single line connected to a GPIO of the game play controller.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
## Score Display
|
## Score Display
|
||||||
|
|
||||||
Code is in subdir `display-driver` (https://gitea.hottis.de/wn/tetris/src/branch/main/display-driver).
|
Code is in subdir `display-driver` (https://gitea.hottis.de/wn/tetris/src/branch/main/display-driver).
|
||||||
@ -30,6 +40,9 @@ In the first place, a MAX7221 was meant to be used for connecting a multiple dig
|
|||||||
|
|
||||||
Communication with the game play controller is just a 16 bit number to be displayed.
|
Communication with the game play controller is just a 16 bit number to be displayed.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
## Sound Effects
|
## Sound Effects
|
||||||
|
|
||||||
Code is in subdir `sound-driver` (https://gitea.hottis.de/wn/tetris/src/branch/main/sound-driver).
|
Code is in subdir `sound-driver` (https://gitea.hottis.de/wn/tetris/src/branch/main/sound-driver).
|
||||||
@ -40,4 +53,8 @@ An amplifier following the proposal of the AY-3-8913 datasheet is implemented us
|
|||||||
|
|
||||||
The clock generator proposed by the AY-3-8913 does not work reliably, so an alternative design from "The Art of Electronics" has been used.
|
The clock generator proposed by the AY-3-8913 does not work reliably, so an alternative design from "The Art of Electronics" has been used.
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
@ -4,16 +4,17 @@ OBJDUMP=$(TOOLCHAIN_PREFIX)/bin/msp430-elf-objdump
|
|||||||
|
|
||||||
ARTIFACT=firmware
|
ARTIFACT=firmware
|
||||||
MCU=msp430g2553
|
MCU=msp430g2553
|
||||||
COMMONFLAGS=-Wall -mmcu=$(MCU) -I $(TOOLCHAIN_PREFIX)/include -O0 -g0
|
COMMONFLAGS=-Wall -mmcu=$(MCU) -I $(TOOLCHAIN_PREFIX)/include -g0 -fdata-sections -ffunction-sections
|
||||||
CFLAGS=$(COMMONFLAGS) -std=gnu99
|
|
||||||
ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__
|
|
||||||
|
|
||||||
# for debugging
|
DEBUGFLAGS=
|
||||||
CFLAGS+= -g3 -ggdb -gdwarf-2
|
# DEBUGFLAGS+= -g3 -ggdb -gdwarf-2
|
||||||
|
|
||||||
LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include
|
CFLAGS=$(COMMONFLAGS) -std=gnu99 -O0 $(DEBUGFLAGS)
|
||||||
|
ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__ -Os $(DEBUGFLAGS)
|
||||||
|
|
||||||
$(ARTIFACT).elf: main.o scheduler.o spi.o spi_init.o sequencer.o melody_tetris.o melody_tusch1.o psg.o mute.o
|
LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include -Wl,-Map,firmware.map
|
||||||
|
|
||||||
|
$(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
|
||||||
$(CC) -o $@ $(LDFLAGS) $^
|
$(CC) -o $@ $(LDFLAGS) $^
|
||||||
$(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt
|
$(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt
|
||||||
|
|
||||||
|
@ -6,8 +6,6 @@
|
|||||||
#include "psg.h"
|
#include "psg.h"
|
||||||
#include "scheduler.h"
|
#include "scheduler.h"
|
||||||
#include "sequencer.h"
|
#include "sequencer.h"
|
||||||
#include "melody_tetris.h"
|
|
||||||
#include "melody_tusch1.h"
|
|
||||||
#include "mute.h"
|
#include "mute.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
@ -31,8 +29,6 @@ int main() {
|
|||||||
|
|
||||||
__enable_interrupt();
|
__enable_interrupt();
|
||||||
|
|
||||||
// playMelodyTetris();
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
schExec();
|
schExec();
|
||||||
}
|
}
|
||||||
|
30
sound-driver/melody_pling.c
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "psg.h"
|
||||||
|
#include "sequencer.h"
|
||||||
|
#include "scheduler.h"
|
||||||
|
|
||||||
|
const t_tone plingVoice1[] = {
|
||||||
|
{ .octave = e_O_5, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = true },
|
||||||
|
{ .octave = e_O_5, .note = e_G, .length = e_L_1_4, .legato = false, .staccato = true },
|
||||||
|
|
||||||
|
{ .octave = e_O_Null, .note = e_Null, .length = e_L_SyncMark,.legato = false, .staccato = false },
|
||||||
|
{ .octave = e_O_Null, .note = e_Null, .length = e_L_StopMark,.legato = false, .staccato = false },
|
||||||
|
|
||||||
|
{ .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false },
|
||||||
|
};
|
||||||
|
|
||||||
|
t_melodies pling = {
|
||||||
|
.melodies = { { .amplitude = 12, .tones = plingVoice1 } },
|
||||||
|
.chip = 1,
|
||||||
|
.numOfMelodies = 1,
|
||||||
|
.pace = 200,
|
||||||
|
.slotMask = 0x02
|
||||||
|
};
|
||||||
|
|
||||||
|
void playPling() {
|
||||||
|
sequencerPlayMelodies(&pling);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
8
sound-driver/melody_pling.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef _MELODY_PLING_H_
|
||||||
|
#define _MELODY_PLING_H_
|
||||||
|
|
||||||
|
|
||||||
|
void playPling();
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _MELODY_PLING_H_
|
@ -923,18 +923,26 @@ const t_tone voice3[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
t_melodies tetrisTheme = {
|
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 } },
|
||||||
|
.chip = 0,
|
||||||
.numOfMelodies = 3,
|
.numOfMelodies = 3,
|
||||||
.pace = 160,
|
.pace = 160,
|
||||||
.slotMask = 0x01
|
.slotMask = 0x01
|
||||||
};
|
};
|
||||||
|
|
||||||
void playMelodyTetris() {
|
void playMelodyTetris() {
|
||||||
|
tetrisTheme.pace = 160; // reset to start value each time
|
||||||
sequencerPlayMelodies(&tetrisTheme);
|
sequencerPlayMelodies(&tetrisTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void playMelodyTetrisFaster() {
|
||||||
|
tetrisTheme.pace += 10;
|
||||||
|
sequencerChangePace(&tetrisTheme);
|
||||||
|
}
|
||||||
|
|
||||||
void stopMelodyTetris() {
|
void stopMelodyTetris() {
|
||||||
sequencerStopMelodies(&tetrisTheme);
|
sequencerStopMelodies(&tetrisTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,6 +4,6 @@
|
|||||||
|
|
||||||
void playMelodyTetris();
|
void playMelodyTetris();
|
||||||
void stopMelodyTetris();
|
void stopMelodyTetris();
|
||||||
|
void playMelodyTetrisFaster();
|
||||||
|
|
||||||
#endif // _MELODY_TETRIS_H_
|
#endif // _MELODY_TETRIS_H_
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "psg.h"
|
#include "psg.h"
|
||||||
#include "sequencer.h"
|
#include "sequencer.h"
|
||||||
#include "scheduler.h"
|
#include "scheduler.h"
|
||||||
|
#include "melody_tetris.h"
|
||||||
|
|
||||||
const t_tone tusch1voice1[] = {
|
const t_tone tusch1voice1[] = {
|
||||||
{ .octave = e_O_5, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = true },
|
{ .octave = e_O_5, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = true },
|
||||||
@ -71,7 +72,8 @@ const t_tone tusch1voice3[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
t_melodies tusch1 = {
|
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 } },
|
||||||
|
.chip = 1,
|
||||||
.numOfMelodies = 3,
|
.numOfMelodies = 3,
|
||||||
.pace = 200,
|
.pace = 200,
|
||||||
.slotMask = 0x02
|
.slotMask = 0x02
|
||||||
|
@ -175,5 +175,21 @@ void psgInit() {
|
|||||||
// disable everything
|
// disable everything
|
||||||
psgWrite(0, _ENABLE_REG, 0xff);
|
psgWrite(0, _ENABLE_REG, 0xff);
|
||||||
psgWrite(1, _ENABLE_REG, 0xff);
|
psgWrite(1, _ENABLE_REG, 0xff);
|
||||||
|
|
||||||
|
// volume to 0 on all channels
|
||||||
|
psgWrite(0, CHANNEL_A_AMPLITUDE_REG, 0);
|
||||||
|
psgWrite(0, CHANNEL_B_AMPLITUDE_REG, 0);
|
||||||
|
psgWrite(0, CHANNEL_C_AMPLITUDE_REG, 0);
|
||||||
|
psgWrite(1, CHANNEL_A_AMPLITUDE_REG, 0);
|
||||||
|
psgWrite(1, CHANNEL_B_AMPLITUDE_REG, 0);
|
||||||
|
psgWrite(1, CHANNEL_C_AMPLITUDE_REG, 0);
|
||||||
|
|
||||||
|
// frequency preset
|
||||||
|
psgWriteFrequency(0, 0, 0);
|
||||||
|
psgWriteFrequency(0, 1, 0);
|
||||||
|
psgWriteFrequency(0, 2, 0);
|
||||||
|
psgWriteFrequency(1, 0, 0);
|
||||||
|
psgWriteFrequency(1, 1, 0);
|
||||||
|
psgWriteFrequency(1, 2, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ void sequencerExec(void *handle) {
|
|||||||
if (melody->tones[melody->idx].length == e_L_EndMark) {
|
if (melody->tones[melody->idx].length == e_L_EndMark) {
|
||||||
melody->idx = 0;
|
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) ?
|
melody->lengthCnt = (melody->tones[melody->idx].staccato) ?
|
||||||
(calcLength(melodies, melody->tones[melody->idx].length) / 2) :
|
(calcLength(melodies, melody->tones[melody->idx].length) / 2) :
|
||||||
calcLength(melodies, melody->tones[melody->idx].length);
|
calcLength(melodies, melody->tones[melody->idx].length);
|
||||||
@ -78,7 +78,7 @@ void sequencerExec(void *handle) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case e_StaccatoBreak:
|
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->lengthCnt = calcLength(melodies, melody->tones[melody->idx].length) / 2;
|
||||||
melody->state = e_HoldStaccatoBreak;
|
melody->state = e_HoldStaccatoBreak;
|
||||||
break;
|
break;
|
||||||
@ -90,7 +90,7 @@ void sequencerExec(void *handle) {
|
|||||||
break;
|
break;
|
||||||
case e_SeparateTone:
|
case e_SeparateTone:
|
||||||
if (! (melody->tones[melody->idx].legato)) {
|
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->idx += 1;
|
||||||
melody->state = e_PlayTone;
|
melody->state = e_PlayTone;
|
||||||
@ -127,3 +127,7 @@ void sequencerStopMelodies(t_melodies *melodies) {
|
|||||||
schDel(melodies->taskId);
|
schDel(melodies->taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sequencerChangePace(t_melodies *melodies) {
|
||||||
|
melodies->quarterLength = 60000 / melodies->pace / SEQUENCER_PERIOD; // duration of a 1/4 tone in ms
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -42,7 +42,6 @@ typedef enum {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t idx;
|
uint16_t idx;
|
||||||
uint8_t chip;
|
|
||||||
uint16_t lengthCnt;
|
uint16_t lengthCnt;
|
||||||
t_sequencerState state;
|
t_sequencerState state;
|
||||||
uint8_t amplitude;
|
uint8_t amplitude;
|
||||||
@ -52,11 +51,12 @@ typedef struct {
|
|||||||
#define SEQUENCER_PERIOD 4 // ms
|
#define SEQUENCER_PERIOD 4 // ms
|
||||||
#define NUM_OF_CHANNELS 3
|
#define NUM_OF_CHANNELS 3
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
uint8_t chip;
|
||||||
uint8_t slotMask;
|
uint8_t slotMask;
|
||||||
uint8_t taskId;
|
uint8_t taskId;
|
||||||
uint16_t quarterLength;
|
uint16_t quarterLength;
|
||||||
uint8_t numOfMelodies;
|
uint8_t numOfMelodies;
|
||||||
uint8_t pace; // quarter notes per minute
|
uint16_t pace; // quarter notes per minute
|
||||||
uint8_t sync;
|
uint8_t sync;
|
||||||
t_melody melodies[NUM_OF_CHANNELS];
|
t_melody melodies[NUM_OF_CHANNELS];
|
||||||
} t_melodies;
|
} t_melodies;
|
||||||
@ -64,5 +64,6 @@ typedef struct {
|
|||||||
void sequencerInit();
|
void sequencerInit();
|
||||||
void sequencerPlayMelodies(t_melodies *melodies);
|
void sequencerPlayMelodies(t_melodies *melodies);
|
||||||
void sequencerStopMelodies(t_melodies *melodies);
|
void sequencerStopMelodies(t_melodies *melodies);
|
||||||
|
void sequencerChangePace(t_melodies *melodies);
|
||||||
|
|
||||||
#endif // _SEQUENCER_H_
|
#endif // _SEQUENCER_H_
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
#define SOUND_FANFARE 0x10
|
#define SOUND_FANFARE 0x10
|
||||||
#define SOUND_LOCK 0x20
|
#define SOUND_LOCK 0x20
|
||||||
#define SOUND_MOTION 0x40
|
#define SOUND_MOTION 0x40
|
||||||
#define SOUND_SPEED_UP 0x80
|
#define SOUND_PLING 0x80
|
||||||
|
|
||||||
#endif // _SOUND_CODES_H_
|
#endif // _SOUND_CODES_H_
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
#include <msp430g2553.h>
|
#include <msp430g2553.h>
|
||||||
#include "soundCodes.h"
|
#include "soundCodes.h"
|
||||||
|
|
||||||
.section ".data"
|
;; .global cmd
|
||||||
.global cmd
|
;; .section .data.spi,"aw"
|
||||||
cmd:
|
;;cmd:
|
||||||
.byte
|
;; .byte
|
||||||
|
|
||||||
.section ".text","ax",@progbits
|
.section ".text","ax",@progbits
|
||||||
receive_isr:
|
receive_isr:
|
||||||
@ -29,17 +29,19 @@ spiCmdHandler_2:
|
|||||||
spiCmdHandler_3:
|
spiCmdHandler_3:
|
||||||
bit #SOUND_START, &cmd
|
bit #SOUND_START, &cmd
|
||||||
jz spiCmdHandler_4
|
jz spiCmdHandler_4
|
||||||
call #playMelodyTetris
|
;;call #playMelodyTetris
|
||||||
bic #SOUND_START, &cmd
|
bic #SOUND_START, &cmd
|
||||||
spiCmdHandler_4:
|
spiCmdHandler_4:
|
||||||
bit #SOUND_GAMEOVER, &cmd
|
bit #SOUND_GAMEOVER, &cmd
|
||||||
jz spiCmdHandler_5
|
jz spiCmdHandler_5
|
||||||
|
;;call #stopMelodyTetris
|
||||||
;; insert a call here
|
;; insert a call here
|
||||||
bic #SOUND_GAMEOVER, &cmd
|
bic #SOUND_GAMEOVER, &cmd
|
||||||
spiCmdHandler_5:
|
spiCmdHandler_5:
|
||||||
bit #SOUND_FANFARE, &cmd
|
bit #SOUND_FANFARE, &cmd
|
||||||
jz spiCmdHandler_6
|
jz spiCmdHandler_6
|
||||||
call #playTusch1
|
;;call #playMelodyTetrisFaster
|
||||||
|
;;call #playTusch1
|
||||||
bic #SOUND_FANFARE, &cmd
|
bic #SOUND_FANFARE, &cmd
|
||||||
spiCmdHandler_6:
|
spiCmdHandler_6:
|
||||||
bit #SOUND_LOCK, &cmd
|
bit #SOUND_LOCK, &cmd
|
||||||
@ -52,19 +54,14 @@ spiCmdHandler_7:
|
|||||||
;; insert a call here
|
;; insert a call here
|
||||||
bic #SOUND_MOTION, &cmd
|
bic #SOUND_MOTION, &cmd
|
||||||
spiCmdHandler_8:
|
spiCmdHandler_8:
|
||||||
bit #SOUND_SPEED_UP, &cmd
|
bit #SOUND_PLING, &cmd
|
||||||
jz spiCmdHandler_end
|
jz spiCmdHandler_end
|
||||||
;; insert a call here
|
;;call #playPling
|
||||||
bic #SOUND_SPEED_UP, &cmd
|
bic #SOUND_PLING, &cmd
|
||||||
spiCmdHandler_end:
|
spiCmdHandler_end:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.section "__interrupt_vector_8","ax",@progbits
|
.section "__interrupt_vector_8","ax",@progbits
|
||||||
.word receive_isr
|
.word receive_isr
|
||||||
|
|
||||||
|
|
||||||
.end
|
.end
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include "soundCodes.h"
|
#include "soundCodes.h"
|
||||||
|
|
||||||
|
|
||||||
extern uint8_t cmd;
|
uint8_t cmd;
|
||||||
|
|
||||||
void spiInit() {
|
void spiInit() {
|
||||||
// SPI slave
|
// SPI slave
|
||||||
|