10 Commits

Author SHA1 Message Date
1f807cdb7c disable debug 2024-04-25 22:34:11 +02:00
735599ee7f better pling 2024-04-25 19:14:46 +02:00
7a2c9f96d4 different pling, still boring 2024-04-25 12:21:50 +02:00
5d7a94c3b2 sound tuning 2024-04-25 12:12:52 +02:00
1d915baf77 docs 2024-04-23 15:38:11 +02:00
08b96a6617 photo 2024-04-23 15:34:15 +02:00
ff95034605 level and speed up stuff 2024-04-23 12:45:39 +02:00
ac4801c7cf docs update 2024-04-22 15:51:05 +02:00
a4cb8129c5 update 2024-04-22 15:48:49 +02:00
f5fa1e5e22 single schematics pages 2024-04-22 15:46:30 +02:00
27 changed files with 145 additions and 62 deletions

BIN
docs/IMG_4936.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
docs/display-driver.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
docs/game-ctrl.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
docs/logo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
docs/reset-ctrl.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
docs/rgb-driver.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
docs/sound-driver-1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
docs/sound-driver-2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
docs/sound-driver-3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
docs/sound-driver-4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

@ -7,7 +7,7 @@ MCU=msp430g2553
CFLAGS=-Wall -mmcu=$(MCU) -std=gnu99 -I $(TOOLCHAIN_PREFIX)/include -O1 -g0 CFLAGS=-Wall -mmcu=$(MCU) -std=gnu99 -I $(TOOLCHAIN_PREFIX)/include -O1 -g0
# for debugging # for debugging
CFLAGS+= -g3 -ggdb -gdwarf-2 #CFLAGS+= -g3 -ggdb -gdwarf-2
LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include

View File

@ -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);

View File

@ -1,9 +1,13 @@
# Tetris - Hardware and Software # Tetris - Hardware and Software
![](./docs/IMG_4936.jpg)
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.
![](./docs/game-ctrl.jpg)
## 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.
![](./docs/rgb-driver.jpg)
## 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.
![](./docs/display-driver.jpg)
## 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.
![](./docs/sound-driver-1.jpg)
![](./docs/sound-driver-2.jpg)
![](./docs/sound-driver-3.jpg)
![](./docs/sound-driver-4.jpg)

View File

@ -4,16 +4,15 @@ 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 DEBUGFLAGS=
# DEBUGFLAGS+= -g3 -ggdb -gdwarf-2
COMMONFLAGS=-Wall -mmcu=$(MCU) -I $(TOOLCHAIN_PREFIX)/include -O0 -g0 $(DEBUGFLAGS)
CFLAGS=$(COMMONFLAGS) -std=gnu99 CFLAGS=$(COMMONFLAGS) -std=gnu99
ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__ ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__
# for debugging
CFLAGS+= -g3 -ggdb -gdwarf-2
LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include 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 $(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

View File

@ -31,7 +31,6 @@ int main() {
__enable_interrupt(); __enable_interrupt();
// playMelodyTetris();
while (1) { while (1) {
schExec(); schExec();

View File

@ -0,0 +1,56 @@
#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_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_Cis, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_D, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_Dis, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_E, .length = e_L_1_4, .legato = false, .staccato = false },
{ .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 },
};
const t_tone plingVoice2[] = {
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_Gis, .length = e_L_1_4, .legato = false, .staccato = false },
{ .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_HoldMark,.legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false },
};
const t_tone plingVoice3[] = {
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_H, .length = e_L_1_4, .legato = false, .staccato = false },
{ .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_HoldMark,.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 }, { .amplitude = 12, .tones = plingVoice2 }, { .amplitude = 12, .tones = plingVoice3 } },
.numOfMelodies = 3,
.pace = 200,
.chip = 1
};
void playPling() {
sequencerPlayMelodies(&pling);
}

View File

@ -0,0 +1,8 @@
#ifndef _MELODY_PLING_H_
#define _MELODY_PLING_H_
void playPling();
#endif // _MELODY_PLING_H_

View File

@ -922,19 +922,27 @@ const t_tone voice3[] = {
{ .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false }, { .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false },
}; };
#define INITIAL_PACE 160
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 } },
.numOfMelodies = 3, .numOfMelodies = 3,
.pace = 160, .pace = INITIAL_PACE,
.slotMask = 0x01 .chip = 0
}; };
void playMelodyTetris() { void playMelodyTetris() {
tetrisTheme.pace = INITIAL_PACE; // reset to start value each time
sequencerPlayMelodies(&tetrisTheme); sequencerPlayMelodies(&tetrisTheme);
} }
void playMelodyTetrisFaster() {
tetrisTheme.pace += 15;
sequencerChangePace(&tetrisTheme);
}
void stopMelodyTetris() { void stopMelodyTetris() {
sequencerStopMelodies(&tetrisTheme); sequencerStopMelodies(&tetrisTheme);
} }

View File

@ -4,6 +4,6 @@
void playMelodyTetris(); void playMelodyTetris();
void stopMelodyTetris(); void stopMelodyTetris();
void playMelodyTetrisFaster();
#endif // _MELODY_TETRIS_H_ #endif // _MELODY_TETRIS_H_

View File

@ -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,14 +72,15 @@ 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 } },
.numOfMelodies = 3, .numOfMelodies = 3,
.pace = 200, .pace = 200,
.slotMask = 0x02 .chip = 1
}; };
void playTusch1() { void playTusch1() {
sequencerPlayMelodies(&tusch1); sequencerPlayMelodies(&tusch1);
// playMelodyTetrisFaster();
} }

View File

@ -81,19 +81,6 @@ inline static void BUS_OP_CS1_DISABLE() {
BUS_CTRL_REG |= _CS1; 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) { static uint8_t psgReadShadow(uint8_t chip, uint8_t address) {
return psgShadowRegisters[chip][address]; return psgShadowRegisters[chip][address];
} }

View File

@ -52,16 +52,6 @@ uint16_t schAdd(void (*exec)(void *), void *handle, uint32_t delay, uint32_t per
return taskId; 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) { void schDel(uint16_t taskId) {
tasks[taskId].exec = NULL; tasks[taskId].exec = NULL;
} }

View File

@ -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;
@ -106,6 +106,8 @@ void sequencerExec(void *handle) {
} }
void sequencerPlayMelodies(t_melodies *melodies) { void sequencerPlayMelodies(t_melodies *melodies) {
melodies->slotMask = (1 << melodies->chip);
if ((slots & melodies->slotMask) != 0) { if ((slots & melodies->slotMask) != 0) {
return; return;
} }
@ -123,7 +125,14 @@ void sequencerPlayMelodies(t_melodies *melodies) {
} }
void sequencerStopMelodies(t_melodies *melodies) { void sequencerStopMelodies(t_melodies *melodies) {
slots &= ~(melodies->slotMask);
schDel(melodies->taskId); 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) {
melodies->quarterLength = 60000 / melodies->pace / SEQUENCER_PERIOD; // duration of a 1/4 tone in ms
} }

View File

@ -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;
@ -53,10 +52,11 @@ typedef struct {
#define NUM_OF_CHANNELS 3 #define NUM_OF_CHANNELS 3
typedef struct { typedef struct {
uint8_t slotMask; uint8_t slotMask;
uint8_t chip;
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_

View File

@ -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_

View File

@ -1,10 +1,6 @@
#include <msp430g2553.h> #include <msp430g2553.h>
#include "soundCodes.h" #include "soundCodes.h"
.section ".data"
.global cmd
cmd:
.byte
.section ".text","ax",@progbits .section ".text","ax",@progbits
receive_isr: receive_isr:
@ -34,11 +30,12 @@ spiCmdHandler_3:
spiCmdHandler_4: spiCmdHandler_4:
bit #SOUND_GAMEOVER, &cmd bit #SOUND_GAMEOVER, &cmd
jz spiCmdHandler_5 jz spiCmdHandler_5
;; insert a call here call #stopMelodyTetris
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 #playMelodyTetrisFaster
call #playTusch1 call #playTusch1
bic #SOUND_FANFARE, &cmd bic #SOUND_FANFARE, &cmd
spiCmdHandler_6: spiCmdHandler_6:
@ -52,17 +49,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

View File

@ -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