|
|
@@ -112,19 +112,19 @@ static command_state_t command_state; |
|
|
///////////////////////////////////////////////////////////////// |
|
|
// STACK //////////////////////////////////////////////////////// |
|
|
|
|
|
static int16_t pop(void); |
|
|
static void push(int16_t); |
|
|
static int16_t cs_pop(command_state_t *cs); |
|
|
static void cs_push(command_state_t *cs, int16_t data); |
|
|
|
|
|
static int16_t top; |
|
|
static int16_t stack[STACK_SIZE]; |
|
|
|
|
|
int16_t pop() { |
|
|
int16_t cs_pop(command_state_t *NOTUSED(cs)) { |
|
|
top--; |
|
|
// sprintf(dbg,"\r\npop %d", stack[top]); |
|
|
return stack[top]; |
|
|
} |
|
|
|
|
|
void push(int16_t data) { |
|
|
void cs_push(command_state_t *NOTUSED(cs), int16_t data) { |
|
|
stack[top] = data; |
|
|
// sprintf(dbg,"\r\npush %d", stack[top]); |
|
|
top++; |
|
|
@@ -211,43 +211,39 @@ static void op_FLIP_set(const void *data, scene_state_t *ss, exec_state_t *es, |
|
|
|
|
|
|
|
|
static void op_M_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(ss->variables.m); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, ss->variables.m); |
|
|
} |
|
|
|
|
|
static void op_M_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t m = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t m = cs_pop(cs); |
|
|
if (m < 10) m = 10; |
|
|
ss->variables.m = m; |
|
|
(*update_metro)(m, ss->variables.m_act, 0); |
|
|
} |
|
|
|
|
|
static void op_M_ACT_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
push(ss->variables.m_act); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, ss->variables.m_act); |
|
|
} |
|
|
|
|
|
static void op_M_ACT_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t m_act = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t m_act = cs_pop(cs); |
|
|
if (m_act != 0) m_act = 1; |
|
|
ss->variables.m_act = m_act; |
|
|
(*update_metro)(ss->variables.m, m_act, 0); |
|
|
} |
|
|
|
|
|
static void op_P_N_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
push(ss->variables.p_n); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, ss->variables.p_n); |
|
|
} |
|
|
|
|
|
static void op_P_N_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a < 0) |
|
|
a = 0; |
|
|
else if (a > 3) |
|
|
@@ -256,17 +252,15 @@ static void op_P_N_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
} |
|
|
|
|
|
static void op_P_L_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
push(tele_patterns[pn].l); |
|
|
cs_push(cs, tele_patterns[pn].l); |
|
|
} |
|
|
|
|
|
static void op_P_L_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a < 0) |
|
|
tele_patterns[pn].l = 0; |
|
|
else if (a > 63) |
|
|
@@ -276,17 +270,15 @@ static void op_P_L_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
} |
|
|
|
|
|
static void op_P_I_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
push(tele_patterns[pn].i); |
|
|
cs_push(cs, tele_patterns[pn].i); |
|
|
} |
|
|
|
|
|
static void op_P_I_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a < 0) |
|
|
tele_patterns[pn].i = 0; |
|
|
else if (a > tele_patterns[pn].l) |
|
|
@@ -297,23 +289,20 @@ static void op_P_I_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
} |
|
|
|
|
|
static void op_P_HERE_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
push(tele_patterns[pn].v[tele_patterns[pn].i]); |
|
|
cs_push(cs, tele_patterns[pn].v[tele_patterns[pn].i]); |
|
|
} |
|
|
|
|
|
static void op_P_HERE_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
tele_patterns[pn].v[tele_patterns[pn].i] = a; |
|
|
} |
|
|
|
|
|
static void op_P_NEXT_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
if ((tele_patterns[pn].i == (tele_patterns[pn].l - 1)) || |
|
|
(tele_patterns[pn].i == tele_patterns[pn].end)) { |
|
|
@@ -325,14 +314,13 @@ static void op_P_NEXT_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
|
|
|
if (tele_patterns[pn].i > tele_patterns[pn].l) tele_patterns[pn].i = 0; |
|
|
|
|
|
push(tele_patterns[pn].v[tele_patterns[pn].i]); |
|
|
cs_push(cs, tele_patterns[pn].v[tele_patterns[pn].i]); |
|
|
|
|
|
(*update_pi)(); |
|
|
} |
|
|
|
|
|
static void op_P_NEXT_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
if ((tele_patterns[pn].i == (tele_patterns[pn].l - 1)) || |
|
|
(tele_patterns[pn].i == tele_patterns[pn].end)) { |
|
|
@@ -344,15 +332,14 @@ static void op_P_NEXT_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
|
|
|
if (tele_patterns[pn].i > tele_patterns[pn].l) tele_patterns[pn].i = 0; |
|
|
|
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
tele_patterns[pn].v[tele_patterns[pn].i] = a; |
|
|
|
|
|
(*update_pi)(); |
|
|
} |
|
|
|
|
|
static void op_P_PREV_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
if ((tele_patterns[pn].i == 0) || |
|
|
(tele_patterns[pn].i == tele_patterns[pn].start)) { |
|
|
@@ -366,14 +353,13 @@ static void op_P_PREV_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
else |
|
|
tele_patterns[pn].i--; |
|
|
|
|
|
push(tele_patterns[pn].v[tele_patterns[pn].i]); |
|
|
cs_push(cs, tele_patterns[pn].v[tele_patterns[pn].i]); |
|
|
|
|
|
(*update_pi)(); |
|
|
} |
|
|
|
|
|
static void op_P_PREV_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
if ((tele_patterns[pn].i == 0) || |
|
|
(tele_patterns[pn].i == tele_patterns[pn].start)) { |
|
|
@@ -387,24 +373,22 @@ static void op_P_PREV_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
else |
|
|
tele_patterns[pn].i--; |
|
|
|
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
tele_patterns[pn].v[tele_patterns[pn].i] = a; |
|
|
|
|
|
(*update_pi)(); |
|
|
} |
|
|
|
|
|
static void op_P_WRAP_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
push(tele_patterns[pn].wrap); |
|
|
cs_push(cs, tele_patterns[pn].wrap); |
|
|
} |
|
|
|
|
|
static void op_P_WRAP_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a < 0) |
|
|
tele_patterns[pn].wrap = 0; |
|
|
else if (a > 1) |
|
|
@@ -414,17 +398,15 @@ static void op_P_WRAP_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
} |
|
|
|
|
|
static void op_P_START_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
push(tele_patterns[pn].start); |
|
|
cs_push(cs, tele_patterns[pn].start); |
|
|
} |
|
|
|
|
|
static void op_P_START_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a < 0) |
|
|
tele_patterns[pn].start = 0; |
|
|
else if (a > 63) |
|
|
@@ -434,17 +416,15 @@ static void op_P_START_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
} |
|
|
|
|
|
static void op_P_END_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
push(tele_patterns[pn].end); |
|
|
cs_push(cs, tele_patterns[pn].end); |
|
|
} |
|
|
|
|
|
static void op_P_END_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a < 0) |
|
|
tele_patterns[pn].end = 0; |
|
|
else if (a > 63) |
|
|
@@ -472,72 +452,68 @@ int16_t normalise_value(int16_t min, int16_t max, int16_t wrap, int16_t value) { |
|
|
} |
|
|
|
|
|
static void op_O_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t min = ss->variables.o_min; |
|
|
int16_t max = ss->variables.o_max; |
|
|
int16_t wrap = ss->variables.o_wrap; |
|
|
|
|
|
// restrict current_value to (wrapped) bounds |
|
|
int16_t current_value = normalise_value(min, max, wrap, ss->variables.o); |
|
|
push(current_value); |
|
|
cs_push(cs, current_value); |
|
|
|
|
|
// calculate new value |
|
|
ss->variables.o = |
|
|
normalise_value(min, max, wrap, current_value + ss->variables.o_inc); |
|
|
} |
|
|
|
|
|
static void op_O_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
ss->variables.o = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
ss->variables.o = cs_pop(cs); |
|
|
} |
|
|
|
|
|
static void op_DRUNK_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t min = ss->variables.drunk_min; |
|
|
int16_t max = ss->variables.drunk_max; |
|
|
int16_t wrap = ss->variables.drunk_wrap; |
|
|
|
|
|
// restrict current_value to (wrapped) bounds |
|
|
int16_t current_value = |
|
|
normalise_value(min, max, wrap, ss->variables.drunk); |
|
|
push(current_value); |
|
|
cs_push(cs, current_value); |
|
|
|
|
|
// calculate new value |
|
|
int16_t new_value = current_value + (rand() % 3) - 1; |
|
|
ss->variables.drunk = normalise_value(min, max, wrap, new_value); |
|
|
} |
|
|
|
|
|
static void op_DRUNK_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
ss->variables.drunk = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
ss->variables.drunk = cs_pop(cs); |
|
|
} |
|
|
|
|
|
static void op_Q_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t *q = ss->variables.q; |
|
|
int16_t q_n = ss->variables.q_n; |
|
|
push(q[q_n - 1]); |
|
|
cs_push(cs, q[q_n - 1]); |
|
|
} |
|
|
|
|
|
static void op_Q_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t *q = ss->variables.q; |
|
|
for (int16_t i = Q_LENGTH - 1; i > 0; i--) { q[i] = q[i - 1]; } |
|
|
q[0] = pop(); |
|
|
q[0] = cs_pop(cs); |
|
|
} |
|
|
|
|
|
static void op_Q_N_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
push(ss->variables.q_n); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, ss->variables.q_n); |
|
|
} |
|
|
|
|
|
static void op_Q_N_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a < 1) |
|
|
a = 1; |
|
|
else if (a > Q_LENGTH) |
|
|
@@ -546,51 +522,45 @@ static void op_Q_N_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
} |
|
|
|
|
|
static void op_Q_AVG_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t avg = 0; |
|
|
int16_t *q = ss->variables.q; |
|
|
int16_t q_n = ss->variables.q_n; |
|
|
for (int16_t i = 0; i < q_n; i++) { avg += q[i]; } |
|
|
avg /= q_n; |
|
|
|
|
|
push(avg); |
|
|
cs_push(cs, avg); |
|
|
} |
|
|
|
|
|
static void op_Q_AVG_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t *q = ss->variables.q; |
|
|
for (int16_t i = 0; i < Q_LENGTH; i++) { q[i] = a; } |
|
|
} |
|
|
|
|
|
static void op_SCENE_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
push(ss->variables.scene); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, ss->variables.scene); |
|
|
} |
|
|
|
|
|
static void op_SCENE_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t scene = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t scene = cs_pop(cs); |
|
|
ss->variables.scene = scene; |
|
|
(*update_scene)(scene); |
|
|
} |
|
|
|
|
|
static void op_FLIP_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t flip = ss->variables.flip; |
|
|
push(flip); |
|
|
cs_push(cs, flip); |
|
|
ss->variables.flip = flip == 0; |
|
|
} |
|
|
|
|
|
static void op_FLIP_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
ss->variables.flip = pop() != 0; |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
ss->variables.flip = cs_pop(cs) != 0; |
|
|
} |
|
|
|
|
|
|
|
|
@@ -620,106 +590,98 @@ static void op_TR_TIME_set(const void *data, scene_state_t *ss, |
|
|
exec_state_t *es, command_state_t *cs); |
|
|
|
|
|
static void op_CV_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
a = normalise_value(0, CV_COUNT - 1, 0, a - 1); |
|
|
push(ss->variables.cv[a]); |
|
|
cs_push(cs, ss->variables.cv[a]); |
|
|
} |
|
|
|
|
|
static void op_CV_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
a = normalise_value(0, CV_COUNT - 1, 0, a - 1); |
|
|
b = normalise_value(0, 16383, 0, b); |
|
|
ss->variables.cv[a] = b; |
|
|
(*update_cv)(a, b, 1); |
|
|
} |
|
|
|
|
|
static void op_CV_SLEW_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
a = normalise_value(0, CV_COUNT - 1, 0, a - 1); |
|
|
push(ss->variables.cv_slew[a]); |
|
|
cs_push(cs, ss->variables.cv_slew[a]); |
|
|
} |
|
|
|
|
|
static void op_CV_SLEW_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
a = normalise_value(0, CV_COUNT - 1, 0, a - 1); |
|
|
b = normalise_value(1, 32767, 0, b); // min slew = 1 |
|
|
ss->variables.cv_slew[a] = b; |
|
|
(*update_cv_slew)(a, b); |
|
|
} |
|
|
|
|
|
static void op_CV_OFF_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
a = normalise_value(0, CV_COUNT - 1, 0, a - 1); |
|
|
push(ss->variables.cv_off[a]); |
|
|
cs_push(cs, ss->variables.cv_off[a]); |
|
|
} |
|
|
|
|
|
static void op_CV_OFF_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
a = normalise_value(0, CV_COUNT - 1, 0, a - 1); |
|
|
ss->variables.cv_off[a] = b; |
|
|
(*update_cv_off)(a, b); |
|
|
(*update_cv)(a, ss->variables.cv[a], 1); |
|
|
} |
|
|
|
|
|
static void op_TR_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
a = normalise_value(0, TR_COUNT - 1, 0, a - 1); |
|
|
push(ss->variables.tr[a]); |
|
|
cs_push(cs, ss->variables.tr[a]); |
|
|
} |
|
|
|
|
|
static void op_TR_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
a = normalise_value(0, TR_COUNT - 1, 0, a - 1); |
|
|
ss->variables.tr[a] = b != 0; |
|
|
(*update_tr)(a, b); |
|
|
} |
|
|
|
|
|
static void op_TR_POL_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
a = normalise_value(0, TR_COUNT - 1, 0, a - 1); |
|
|
push(ss->variables.tr_pol[a]); |
|
|
cs_push(cs, ss->variables.tr_pol[a]); |
|
|
} |
|
|
|
|
|
static void op_TR_POL_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
a = normalise_value(0, TR_COUNT - 1, 0, a - 1); |
|
|
ss->variables.tr_pol[a] = b > 0; |
|
|
} |
|
|
|
|
|
static void op_TR_TIME_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
a = normalise_value(0, TR_COUNT - 1, 0, a - 1); |
|
|
push(ss->variables.tr_time[a]); |
|
|
cs_push(cs, ss->variables.tr_time[a]); |
|
|
} |
|
|
|
|
|
static void op_TR_TIME_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
a = normalise_value(0, TR_COUNT - 1, 0, a - 1); |
|
|
if (b < 0) b = 0; |
|
|
ss->variables.tr_time[a] = b; |
|
|
@@ -811,15 +773,15 @@ static const tele_mod_t tele_mods[MODS] = { |
|
|
|
|
|
|
|
|
void mod_PROB(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs), tele_command_t *sub_command) { |
|
|
int16_t a = pop(); |
|
|
command_state_t *cs, tele_command_t *sub_command) { |
|
|
int16_t a = cs_pop(cs); |
|
|
|
|
|
if (rand() % 101 < a) { process(sub_command); } |
|
|
} |
|
|
void mod_DEL(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs), tele_command_t *sub_command) { |
|
|
command_state_t *cs, tele_command_t *sub_command) { |
|
|
int16_t i = 0; |
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
|
|
|
if (a < 1) a = 1; |
|
|
|
|
|
@@ -842,17 +804,17 @@ void mod_S(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), |
|
|
} |
|
|
} |
|
|
void mod_IF(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs), tele_command_t *sub_command) { |
|
|
command_state_t *cs, tele_command_t *sub_command) { |
|
|
condition = false; |
|
|
if (pop()) { |
|
|
if (cs_pop(cs)) { |
|
|
condition = true; |
|
|
process(sub_command); |
|
|
} |
|
|
} |
|
|
void mod_ELIF(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs), tele_command_t *sub_command) { |
|
|
command_state_t *cs, tele_command_t *sub_command) { |
|
|
if (!condition) { |
|
|
if (pop()) { |
|
|
if (cs_pop(cs)) { |
|
|
condition = true; |
|
|
process(sub_command); |
|
|
} |
|
|
@@ -866,9 +828,9 @@ void mod_ELSE(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), |
|
|
} |
|
|
} |
|
|
void mod_L(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs), tele_command_t *sub_command) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
command_state_t *cs, tele_command_t *sub_command) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
int16_t loop_size = a < b ? b - a : a - b; |
|
|
|
|
|
for (int16_t i = 0; i <= loop_size; i++) { |
|
|
@@ -884,11 +846,9 @@ void mod_L(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), |
|
|
static void op_CONSTANT(const void *data, scene_state_t *ss, exec_state_t *es, |
|
|
command_state_t *cs); |
|
|
static void op_PEEK_I16(const void *data, scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs); |
|
|
static void op_POKE_I16(const void *data, scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs); |
|
|
|
|
|
static void op_ADD(const void *data, scene_state_t *ss, exec_state_t *es, |
|
|
command_state_t *cs); |
|
|
@@ -1020,9 +980,8 @@ static void op_ER(const void *data, scene_state_t *ss, exec_state_t *es, |
|
|
|
|
|
// Constant Ops |
|
|
static void op_CONSTANT(const void *data, scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
push((intptr_t)data); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, (intptr_t)data); |
|
|
} |
|
|
|
|
|
#define MAKE_CONSTANT_OP(n, v, d) \ |
|
|
@@ -1033,21 +992,19 @@ static void op_CONSTANT(const void *data, scene_state_t *NOTUSED(ss), |
|
|
|
|
|
// Variables, peek & poke |
|
|
static void op_PEEK_I16(const void *data, scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
char *base = (char *)ss; |
|
|
size_t offset = (size_t)data; |
|
|
int16_t *ptr = (int16_t *)(base + offset); |
|
|
push(*ptr); |
|
|
cs_push(cs, *ptr); |
|
|
} |
|
|
|
|
|
static void op_POKE_I16(const void *data, scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
char *base = (char *)ss; |
|
|
size_t offset = (size_t)data; |
|
|
int16_t *ptr = (int16_t *)(base + offset); |
|
|
*ptr = pop(); |
|
|
*ptr = cs_pop(cs); |
|
|
} |
|
|
|
|
|
#define MAKE_SIMPLE_VARIABLE_OP(n, v, d) \ |
|
|
@@ -1215,39 +1172,39 @@ static const tele_op_t tele_ops[OPS] = { |
|
|
// clang-format on |
|
|
|
|
|
static void op_ADD(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() + pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) + cs_pop(cs)); |
|
|
} |
|
|
static void op_SUB(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() - pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) - cs_pop(cs)); |
|
|
} |
|
|
static void op_MUL(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() * pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) * cs_pop(cs)); |
|
|
} |
|
|
static void op_DIV(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() / pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) / cs_pop(cs)); |
|
|
} |
|
|
// can be optimized: |
|
|
static void op_MOD(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() % pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) % cs_pop(cs)); |
|
|
} |
|
|
static void op_RAND(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a == -1) |
|
|
push(0); |
|
|
cs_push(cs, 0); |
|
|
else |
|
|
push(rand() % (a + 1)); |
|
|
cs_push(cs, rand() % (a + 1)); |
|
|
} |
|
|
static void op_RRAND(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a, b, min, max, range; |
|
|
a = pop(); |
|
|
b = pop(); |
|
|
a = cs_pop(cs); |
|
|
b = cs_pop(cs); |
|
|
if (a < b) { |
|
|
min = a; |
|
|
max = b; |
|
|
@@ -1258,53 +1215,53 @@ static void op_RRAND(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
} |
|
|
range = max - min + 1; |
|
|
if (range == 0) |
|
|
push(a); |
|
|
cs_push(cs, a); |
|
|
else |
|
|
push(rand() % range + min); |
|
|
cs_push(cs, rand() % range + min); |
|
|
} |
|
|
static void op_TOSS(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(rand() & 1); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, rand() & 1); |
|
|
} |
|
|
static void op_MIN(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a, b; |
|
|
a = pop(); |
|
|
b = pop(); |
|
|
a = cs_pop(cs); |
|
|
b = cs_pop(cs); |
|
|
if (b > a) |
|
|
push(a); |
|
|
cs_push(cs, a); |
|
|
else |
|
|
push(b); |
|
|
cs_push(cs, b); |
|
|
} |
|
|
static void op_MAX(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a, b; |
|
|
a = pop(); |
|
|
b = pop(); |
|
|
a = cs_pop(cs); |
|
|
b = cs_pop(cs); |
|
|
if (a > b) |
|
|
push(a); |
|
|
cs_push(cs, a); |
|
|
else |
|
|
push(b); |
|
|
cs_push(cs, b); |
|
|
} |
|
|
static void op_LIM(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a, b, i; |
|
|
i = pop(); |
|
|
a = pop(); |
|
|
b = pop(); |
|
|
i = cs_pop(cs); |
|
|
a = cs_pop(cs); |
|
|
b = cs_pop(cs); |
|
|
if (i < a) |
|
|
push(a); |
|
|
cs_push(cs, a); |
|
|
else if (i > b) |
|
|
push(b); |
|
|
cs_push(cs, b); |
|
|
else |
|
|
push(i); |
|
|
cs_push(cs, i); |
|
|
} |
|
|
static void op_WRAP(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a, b, i, c; |
|
|
i = pop(); |
|
|
a = pop(); |
|
|
b = pop(); |
|
|
i = cs_pop(cs); |
|
|
a = cs_pop(cs); |
|
|
b = cs_pop(cs); |
|
|
if (a < b) { |
|
|
c = b - a + 1; |
|
|
while (i >= b) i -= c; |
|
|
@@ -1315,55 +1272,55 @@ static void op_WRAP(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
while (i >= a) i -= c; |
|
|
while (i < b) i += c; |
|
|
} |
|
|
push(i); |
|
|
cs_push(cs, i); |
|
|
} |
|
|
static void op_QT(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
// this rounds negative numbers rather than quantize (choose closer) |
|
|
int16_t a, b, c, d, e; |
|
|
b = pop(); |
|
|
a = pop(); |
|
|
b = cs_pop(cs); |
|
|
a = cs_pop(cs); |
|
|
|
|
|
c = b / a; |
|
|
d = c * a; |
|
|
e = (c + 1) * a; |
|
|
|
|
|
if (abs(b - d) < abs(b - e)) |
|
|
push(d); |
|
|
cs_push(cs, d); |
|
|
else |
|
|
push(e); |
|
|
cs_push(cs, e); |
|
|
} |
|
|
static void op_AVG(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push((pop() + pop()) >> 1); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, (cs_pop(cs) + cs_pop(cs)) >> 1); |
|
|
} |
|
|
static void op_EQ(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() == pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) == cs_pop(cs)); |
|
|
} |
|
|
static void op_NE(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() != pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) != cs_pop(cs)); |
|
|
} |
|
|
static void op_LT(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() < pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) < cs_pop(cs)); |
|
|
} |
|
|
static void op_GT(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() > pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) > cs_pop(cs)); |
|
|
} |
|
|
static void op_NZ(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() != 0); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) != 0); |
|
|
} |
|
|
static void op_EZ(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() == 0); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) == 0); |
|
|
} |
|
|
static void op_TR_TOG(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
// saturate and shift |
|
|
if (a < 1) |
|
|
a = 1; |
|
|
@@ -1377,17 +1334,17 @@ static void op_TR_TOG(const void *NOTUSED(data), scene_state_t *ss, |
|
|
update_tr(a, ss->variables.tr[a]); |
|
|
} |
|
|
static void op_N(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
|
|
|
if (a < 0) { |
|
|
if (a < -127) a = -127; |
|
|
a = -a; |
|
|
push(-table_n[a]); |
|
|
cs_push(cs, -table_n[a]); |
|
|
} |
|
|
else { |
|
|
if (a > 127) a = 127; |
|
|
push(table_n[a]); |
|
|
cs_push(cs, table_n[a]); |
|
|
} |
|
|
} |
|
|
static void op_S_ALL(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
@@ -1421,36 +1378,36 @@ static void op_M_RESET(const void *NOTUSED(data), scene_state_t *ss, |
|
|
(*update_metro)(ss->variables.m, ss->variables.m_act, 1); |
|
|
} |
|
|
static void op_V(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a > 10) |
|
|
a = 10; |
|
|
else if (a < -10) |
|
|
a = -10; |
|
|
|
|
|
if (a < 0) { |
|
|
a = -a; |
|
|
push(-table_v[a]); |
|
|
cs_push(cs, -table_v[a]); |
|
|
} |
|
|
else |
|
|
push(table_v[a]); |
|
|
cs_push(cs, table_v[a]); |
|
|
} |
|
|
static void op_VV(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
uint8_t negative = 1; |
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a < 0) { |
|
|
negative = -1; |
|
|
a = -a; |
|
|
} |
|
|
if (a > 1000) a = 1000; |
|
|
|
|
|
push(negative * (table_v[a / 100] + table_vv[a % 100])); |
|
|
cs_push(cs, negative * (table_v[a / 100] + table_vv[a % 100])); |
|
|
} |
|
|
static void op_P_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a < 0) { |
|
|
if (tele_patterns[pn].l == 0) |
|
|
a = 0; |
|
|
@@ -1461,13 +1418,13 @@ static void op_P_get(const void *NOTUSED(data), scene_state_t *ss, |
|
|
} |
|
|
if (a > 63) a = 63; |
|
|
|
|
|
push(tele_patterns[pn].v[a]); |
|
|
cs_push(cs, tele_patterns[pn].v[a]); |
|
|
} |
|
|
static void op_P_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
if (a < 0) { |
|
|
if (tele_patterns[pn].l == 0) |
|
|
a = 0; |
|
|
@@ -1482,11 +1439,11 @@ static void op_P_set(const void *NOTUSED(data), scene_state_t *ss, |
|
|
(*update_pi)(); |
|
|
} |
|
|
static void op_P_INS(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a, b, i; |
|
|
a = pop(); |
|
|
b = pop(); |
|
|
a = cs_pop(cs); |
|
|
b = cs_pop(cs); |
|
|
|
|
|
if (a < 0) { |
|
|
if (tele_patterns[pn].l == 0) |
|
|
@@ -1508,10 +1465,10 @@ static void op_P_INS(const void *NOTUSED(data), scene_state_t *ss, |
|
|
(*update_pi)(); |
|
|
} |
|
|
static void op_P_RM(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a, i; |
|
|
a = pop(); |
|
|
a = cs_pop(cs); |
|
|
|
|
|
if (a < 0) { |
|
|
if (tele_patterns[pn].l == 0) |
|
|
@@ -1525,21 +1482,21 @@ static void op_P_RM(const void *NOTUSED(data), scene_state_t *ss, |
|
|
a = tele_patterns[pn].l; |
|
|
|
|
|
if (tele_patterns[pn].l > 0) { |
|
|
push(tele_patterns[pn].v[a]); |
|
|
cs_push(cs, tele_patterns[pn].v[a]); |
|
|
for (i = a; i < tele_patterns[pn].l; i++) |
|
|
tele_patterns[pn].v[i] = tele_patterns[pn].v[i + 1]; |
|
|
|
|
|
tele_patterns[pn].l--; |
|
|
} |
|
|
else |
|
|
push(0); |
|
|
cs_push(cs, 0); |
|
|
(*update_pi)(); |
|
|
} |
|
|
static void op_P_PUSH(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
int16_t a; |
|
|
a = pop(); |
|
|
a = cs_pop(cs); |
|
|
|
|
|
if (tele_patterns[pn].l < 64) { |
|
|
tele_patterns[pn].v[tele_patterns[pn].l] = a; |
|
|
@@ -1548,20 +1505,20 @@ static void op_P_PUSH(const void *NOTUSED(data), scene_state_t *ss, |
|
|
} |
|
|
} |
|
|
static void op_P_POP(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t pn = ss->variables.p_n; |
|
|
if (tele_patterns[pn].l > 0) { |
|
|
tele_patterns[pn].l--; |
|
|
push(tele_patterns[pn].v[tele_patterns[pn].l]); |
|
|
cs_push(cs, tele_patterns[pn].v[tele_patterns[pn].l]); |
|
|
(*update_pi)(); |
|
|
} |
|
|
else |
|
|
push(0); |
|
|
cs_push(cs, 0); |
|
|
} |
|
|
static void op_PN_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
|
|
|
if (a < 0) |
|
|
a = 0; |
|
|
@@ -1578,13 +1535,13 @@ static void op_PN_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
} |
|
|
if (b > 63) b = 63; |
|
|
|
|
|
push(tele_patterns[a].v[b]); |
|
|
cs_push(cs, tele_patterns[a].v[b]); |
|
|
} |
|
|
static void op_PN_set(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
int16_t c = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
int16_t c = cs_pop(cs); |
|
|
|
|
|
if (a < 0) |
|
|
a = 0; |
|
|
@@ -1605,9 +1562,8 @@ static void op_PN_set(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
(*update_pi)(); |
|
|
} |
|
|
static void op_TR_PULSE(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), |
|
|
command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
// saturate and shift |
|
|
if (a < 1) |
|
|
a = 1; |
|
|
@@ -1621,27 +1577,27 @@ static void op_TR_PULSE(const void *NOTUSED(data), scene_state_t *ss, |
|
|
update_tr(a, ss->variables.tr[a]); |
|
|
} |
|
|
static void op_II(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
update_ii(a, b); |
|
|
} |
|
|
static void op_RSH(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() >> pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) >> cs_pop(cs)); |
|
|
} |
|
|
static void op_LSH(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() << pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) << cs_pop(cs)); |
|
|
} |
|
|
static void op_S_L(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(tele_stack_top); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, tele_stack_top); |
|
|
} |
|
|
static void op_CV_SET(const void *NOTUSED(data), scene_state_t *ss, |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
int16_t b = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
int16_t b = cs_pop(cs); |
|
|
// saturate and shift |
|
|
if (a < 1) |
|
|
a = 1; |
|
|
@@ -1656,8 +1612,8 @@ static void op_CV_SET(const void *NOTUSED(data), scene_state_t *ss, |
|
|
(*update_cv)(a, b, 0); |
|
|
} |
|
|
static void op_EXP(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
if (a > 16383) |
|
|
a = 16383; |
|
|
else if (a < -16383) |
|
|
@@ -1667,41 +1623,41 @@ static void op_EXP(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
|
|
|
if (a < 0) { |
|
|
a = -a; |
|
|
push(-table_exp[a]); |
|
|
cs_push(cs, -table_exp[a]); |
|
|
} |
|
|
else |
|
|
push(table_exp[a]); |
|
|
cs_push(cs, table_exp[a]); |
|
|
} |
|
|
static void op_ABS(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
|
|
|
if (a < 0) |
|
|
push(-a); |
|
|
cs_push(cs, -a); |
|
|
else |
|
|
push(a); |
|
|
cs_push(cs, a); |
|
|
} |
|
|
static void op_AND(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() & pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) & cs_pop(cs)); |
|
|
} |
|
|
static void op_OR(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() | pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) | cs_pop(cs)); |
|
|
} |
|
|
static void op_XOR(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
push(pop() ^ pop()); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
cs_push(cs, cs_pop(cs) ^ cs_pop(cs)); |
|
|
} |
|
|
static void op_JI(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
uint32_t ji = (((pop() << 8) / pop()) * 1684) >> 8; |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
uint32_t ji = (((cs_pop(cs) << 8) / cs_pop(cs)) * 1684) >> 8; |
|
|
while (ji > 1683) ji >>= 1; |
|
|
push(ji); |
|
|
cs_push(cs, ji); |
|
|
} |
|
|
static void op_SCRIPT(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
uint16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
uint16_t a = cs_pop(cs); |
|
|
if (a > 0 && a < 9) (*run_script)(a); |
|
|
} |
|
|
static void op_KILL(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
@@ -1710,49 +1666,49 @@ static void op_KILL(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
(*update_kill)(); |
|
|
} |
|
|
static void op_MUTE(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a; |
|
|
a = pop(); |
|
|
a = cs_pop(cs); |
|
|
|
|
|
if (a > 0 && a < 9) { (*update_mute)(a - 1, 0); } |
|
|
} |
|
|
static void op_UNMUTE(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a; |
|
|
a = pop(); |
|
|
a = cs_pop(cs); |
|
|
|
|
|
if (a > 0 && a < 9) { (*update_mute)(a - 1, 1); } |
|
|
} |
|
|
static void op_SCALE(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a, b, x, y, i; |
|
|
a = pop(); |
|
|
b = pop(); |
|
|
x = pop(); |
|
|
y = pop(); |
|
|
i = pop(); |
|
|
a = cs_pop(cs); |
|
|
b = cs_pop(cs); |
|
|
x = cs_pop(cs); |
|
|
y = cs_pop(cs); |
|
|
i = cs_pop(cs); |
|
|
|
|
|
push((i - a) * (y - x) / (b - a) + x); |
|
|
cs_push(cs, (i - a) * (y - x) / (b - a) + x); |
|
|
} |
|
|
static void op_STATE(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t a = pop(); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t a = cs_pop(cs); |
|
|
a--; |
|
|
if (a < 0) |
|
|
a = 0; |
|
|
else if (a > 7) |
|
|
a = 7; |
|
|
|
|
|
(*update_input)(a); |
|
|
push(input_states[a]); |
|
|
cs_push(cs, input_states[a]); |
|
|
} |
|
|
|
|
|
static void op_ER(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), |
|
|
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) { |
|
|
int16_t fill = pop(); |
|
|
int16_t len = pop(); |
|
|
int16_t step = pop(); |
|
|
push(euclidean(fill, len, step)); |
|
|
exec_state_t *NOTUSED(es), command_state_t *cs) { |
|
|
int16_t fill = cs_pop(cs); |
|
|
int16_t len = cs_pop(cs); |
|
|
int16_t step = cs_pop(cs); |
|
|
cs_push(cs, euclidean(fill, len, step)); |
|
|
} |
|
|
|
|
|
///////////////////////////////////////////////////////////////// |
|
|
@@ -1932,7 +1888,7 @@ process_result_t process(tele_command_t *c) { |
|
|
tele_word_t word_type = c->data[idx].t; |
|
|
int16_t word_value = c->data[idx].v; |
|
|
|
|
|
if (word_type == NUMBER) { push(word_value); } |
|
|
if (word_type == NUMBER) { cs_push(&command_state, word_value); } |
|
|
else if (word_type == OP) { |
|
|
tele_op_t op = tele_ops[word_value]; |
|
|
|
|
|
@@ -1952,7 +1908,8 @@ process_result_t process(tele_command_t *c) { |
|
|
} |
|
|
|
|
|
if (top) { |
|
|
process_result_t o = {.has_value = true, .value = pop() }; |
|
|
process_result_t o = {.has_value = true, |
|
|
.value = cs_pop(&command_state) }; |
|
|
return o; |
|
|
} |
|
|
else { |
|
|
|