diff --git a/chirp.cpp b/chirp.cpp index 35084bf..973129c 100644 --- a/chirp.cpp +++ b/chirp.cpp @@ -34,6 +34,10 @@ struct channel_t { Uint8* play_pos; int32_t play_len; Uint8 play_buffer[132300]; + char* stack[10] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; + uint8_t stackpos = 0; + char* labels[10] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; + uint8_t numlabels = 0; }; static channel_t channels[MAX_CHANNELS]; @@ -140,6 +144,8 @@ int chirp_play(const char* new_song) { channels[c].octave=4; channels[c].tempo=44100; channels[c].waveform=0; + channels[c].stackpos=0; + channels[c].numlabels=0; channels[c].song = (char*)malloc( strlen( new_song ) + 1 ); strcpy( channels[c].song, new_song ); channels[c].song_ptr = channels[c].song; @@ -200,8 +206,33 @@ int32_t interpret_next_token(const int c) { //uint8_t* buffer) { if( param >= 48 && param <= 57 ) { channels[c].waveform = param - 48; ++*token; } return 0; case '=': + channels[c].stackpos = 0; + channels[c].numlabels = 0; channels[c].song_ptr = channels[c].song; return 0; + case '[': + ++*token; + channels[c].labels[channels[c].numlabels] = *token; //channels[c].song_ptr; + channels[c].numlabels++; + { + char* nextpos = *token; + while(*nextpos!=']') nextpos++; + channels[c].stack[channels[c].stackpos]=nextpos+1; + } + channels[c].stackpos++; + return 0; + case ']': + ++*token; + channels[c].stackpos--; + channels[c].song_ptr=channels[c].stack[channels[c].stackpos]; + return 0; + case '@': + param = *++*token; + if( param >= 48 && param <= 57 ) { param -= 48; ++*token; } else { param = 0; } + channels[c].stack[channels[c].stackpos]=*token; + channels[c].stackpos++; + channels[c].song_ptr=channels[c].labels[uint8_t(param)]; + return 0; case '\0': return -1; default: diff --git a/data/game.lua b/data/game.lua index dfbf119..434524d 100644 --- a/data/game.lua +++ b/data/game.lua @@ -2,8 +2,8 @@ x=0 function _init() text="HOLA MINI" - playchirp("o4w4ce") - playchirp("o4w4go5c") + playchirp("v4[l0ceg]v2@0v1@0") + --playchirp("o4w4go5c") end function _update()