Skip to content
Permalink
Browse files

convert the variables X, Y and Z into ops

  • Loading branch information
samdoshi committed Apr 11, 2016
1 parent cd0dafc commit d8ee6d31561940f7a40b9e24180348389d76e78a
Showing with 67 additions and 43 deletions.
  1. +8 −1 src/state.h
  2. +56 −39 src/teletype.c
  3. +0 −3 src/teletype.h
  4. +3 −0 tests/process_tests.c
@@ -1,8 +1,15 @@
#ifndef _STATE_H_
#define _STATE_H_

#include <stdint.h>

typedef struct {
} scene_state_t;
int16_t x;
int16_t y;
int16_t z;
} scene_variables_t;

typedef struct { scene_variables_t variables; } scene_state_t;

typedef struct {
} exec_state_t;
@@ -1,4 +1,5 @@
#include <ctype.h> // isdigit
#include <stddef.h> // offsetof
#include <stdint.h> // types
#include <stdio.h> // printf
#include <stdlib.h> // rand, strtol
@@ -138,46 +139,26 @@ static void v_FLIP(void);

static int16_t tele_q[16];

#define VARS 39
#define VARS 36
static tele_var_t tele_vars[VARS] = {
{ "I", NULL, 0 }, // gets overwritten by ITER
{ "TIME", NULL, 0 },
{ "TIME.ACT", NULL, 1 },
{ "IN", NULL, 0 },
{ "PARAM", NULL, 0 },
{ "PRESET", NULL, 0 },
{ "M", v_M, 1000 },
{ "M.ACT", v_M_ACT, 1 },
{ "X", NULL, 0 },
{ "Y", NULL, 0 },
{ "Z", NULL, 0 },
{ "T", NULL, 0 },
{ "A", NULL, 1 },
{ "B", NULL, 2 },
{ "C", NULL, 3 },
{ "D", NULL, 4 },
{ "O", v_O, 0 },
{ "DRUNK", v_DRUNK, 0 },
{ "Q", v_Q, 0 },
{ "Q.N", v_Q_N, 1 },
{ "Q.AVG", v_Q_AVG, 0 },
{ "SCENE", v_SCENE, 0 },
{ "P.N", v_P_N, 0 },
{ "P.L", v_P_L, 0 },
{ "P.I", v_P_I, 0 },
{ "P.HERE", v_P_HERE, 0 },
{ "P.NEXT", v_P_NEXT, 0 },
{ "P.PREV", v_P_PREV, 0 },
{ "P.WRAP", v_P_WRAP, 0 },
{ "P.START", v_P_START, 0 },
{ "P.END", v_P_END, 0 },
{ "FLIP", v_FLIP, 0 },
{ "O.MIN", NULL, 0 },
{ "O.MAX", NULL, 63 },
{ "O.WRAP", NULL, 1 },
{ "O.DIR", NULL, 1 },
{ "DRUNK.MIN", NULL, 0 },
{ "DRUNK.MAX", NULL, 255 },
{ "TIME", NULL, 0 }, { "TIME.ACT", NULL, 1 },
{ "IN", NULL, 0 }, { "PARAM", NULL, 0 },
{ "PRESET", NULL, 0 }, { "M", v_M, 1000 },
{ "M.ACT", v_M_ACT, 1 }, { "T", NULL, 0 },
{ "A", NULL, 1 }, { "B", NULL, 2 },
{ "C", NULL, 3 }, { "D", NULL, 4 },
{ "O", v_O, 0 }, { "DRUNK", v_DRUNK, 0 },
{ "Q", v_Q, 0 }, { "Q.N", v_Q_N, 1 },
{ "Q.AVG", v_Q_AVG, 0 }, { "SCENE", v_SCENE, 0 },
{ "P.N", v_P_N, 0 }, { "P.L", v_P_L, 0 },
{ "P.I", v_P_I, 0 }, { "P.HERE", v_P_HERE, 0 },
{ "P.NEXT", v_P_NEXT, 0 }, { "P.PREV", v_P_PREV, 0 },
{ "P.WRAP", v_P_WRAP, 0 }, { "P.START", v_P_START, 0 },
{ "P.END", v_P_END, 0 }, { "FLIP", v_FLIP, 0 },
{ "O.MIN", NULL, 0 }, { "O.MAX", NULL, 63 },
{ "O.WRAP", NULL, 1 }, { "O.DIR", NULL, 1 },
{ "DRUNK.MIN", NULL, 0 }, { "DRUNK.MAX", NULL, 255 },
{ "DRUNK.WRAP", NULL, 0 }
};

@@ -694,6 +675,12 @@ void mod_L(tele_command_t *c) {

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));
static void op_POKE_I16(const void *data, scene_state_t *ss,
exec_state_t *NOTUSED(es),
command_state_t *NOTUSED(cs));

static void op_ADD(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
@@ -836,9 +823,39 @@ static void op_CONSTANT(const void *data, scene_state_t *NOTUSED(ss),
.returns = 1, .data = (void *)v, .doc = d \
}

#define OPS 101
// 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)) {
char *base = (char *)ss;
size_t offset = (size_t)data;
int16_t *ptr = (int16_t *)(base + offset);
push(*ptr);
}

static void op_POKE_I16(const void *data, scene_state_t *ss,
exec_state_t *NOTUSED(es),
command_state_t *NOTUSED(cs)) {
char *base = (char *)ss;
size_t offset = (size_t)data;
int16_t *ptr = (int16_t *)(base + offset);
*ptr = pop();
}

#define MAKE_SIMPLE_VARIABLE_OP(n, v, d) \
{ \
.name = #n, .get = op_PEEK_I16, .set = op_POKE_I16, .params = 0, \
.returns = 1, .data = (void *)offsetof(scene_state_t, v), .doc = d \
}

#define OPS 104
// clang-format off
static const tele_op_t tele_ops[OPS] = {
// var member docs
MAKE_SIMPLE_VARIABLE_OP(X, variables.x, "X"),
MAKE_SIMPLE_VARIABLE_OP(Y, variables.y, "Y"),
MAKE_SIMPLE_VARIABLE_OP(Z, variables.z, "Z"),

// op get fn inputs output docs
MAKE_GET_OP(ADD , op_ADD , 2, true , "[A B] ADD A TO B" ),
MAKE_GET_OP(SUB , op_SUB , 2, true , "[A B] SUBTRACT B FROM A" ),
@@ -24,9 +24,6 @@ enum varnames {
V_PRESET,
V_M,
V_M_ACT,
V_X,
V_Y,
V_Z,
V_T,
V_A,
V_B,
@@ -101,6 +101,9 @@ TEST test_X() {
char* test2[2] = { "X 10", "X" };
CHECK_CALL(process_helper(2, test2, 10));

char* test3[2] = { "X 10", "ADD 5 X" };
CHECK_CALL(process_helper(2, test3, 15));

PASS();
}

0 comments on commit d8ee6d3

Please sign in to comment.