add external libraries and update stm version
[mTask.git] / int / nucleo-f767-blinky / src / interpret.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include "mTaskSymbols.h"
5 #include "interpret.h"
6 #include "interface.h"
7 #include "task.h"
8 #include "sds.h"
9
10 #ifdef STM32F767xx
11 #define trace(op, ...) ;
12 #else
13 #define trace(op, ...) ;
14 //printf("pc: %d, sp: %d, op: " op, pc, sp, ##__VA_ARGS__);
15 #endif
16
17 void run_task(struct task *t)
18 {
19 uint8_t *program = t->bc;
20 int plen = t->tlen;
21 int pc = 0;
22 int sp = 0;
23 char stack[STACKSIZE] = {0};
24 debug("Running task with length: %d\n", plen);
25 while(pc != plen){
26 debug("program: %d\n", program[pc]);
27 debug("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
28 stack[0], stack[1], stack[2], stack[3], stack[4],
29 stack[5], stack[6], stack[7], stack[8], stack[9]);
30
31 switch(program[pc++]){
32 case BCNOP: trace("nop\n");
33 break;
34 case BCLAB: trace("label: 0x%02x!!!!!!\n", program[pc]);
35 pc++;
36 break;
37 case BCPUSH: trace("push %d\n", program[pc]*265+program[pc+1]);
38 stack[sp++] = program[pc]*265 + program[pc+1];
39 pc+=2;
40 break;
41 case BCPOP: trace("pop\n");
42 sp--;
43 break;
44 case BCSDSSTORE: trace("sds store: %d\n", program[pc]);
45 sds_store(program[pc++], stack[--sp]);
46 break;
47 case BCSDSFETCH: trace("sds fetch: %d\n", program[pc]);
48 stack[sp++] = sds_fetch(program[pc++]);
49 break;
50 case BCSDSPUBLISH: trace("sds publish %d\n", program[pc]);
51 sds_publish(program[pc++]);
52 break;
53 case BCNOT: trace("not\n");
54 stack[sp] = stack[sp] > 0 ? 0 : 1;
55 break;
56 case BCADD: trace("add\n");
57 stack[sp-2] = stack[sp-1] + stack[sp-2];
58 sp -= 1;
59 break;
60 case BCSUB: trace("sub\n");
61 stack[sp-2] = stack[sp-1] - stack[sp-2];
62 sp -= 1;
63 break;
64 case BCMUL: trace("mul\n");
65 stack[sp-2] = stack[sp-1] * stack[sp-2];
66 sp -= 1;
67 break;
68 case BCDIV: trace("div\n");
69 stack[sp-2] = stack[sp-1] / stack[sp-2];
70 sp -= 1;
71 break;
72 case BCAND: trace("and\n");
73 stack[sp-2] = stack[sp-1] && stack[sp-2];
74 sp -= 1;
75 break;
76 case BCOR: trace("or\n");
77 stack[sp-2] = stack[sp-1] || stack[sp-2];
78 sp -= 1;
79 break;
80 case BCEQ: trace("eq\n");
81 stack[sp-2] = stack[sp-1] == stack[sp-2];
82 sp -= 1;
83 break;
84 case BCNEQ: trace("neq\n");
85 stack[sp-2] = stack[sp-1] != stack[sp-2];
86 sp -= 1;
87 break;
88 case BCLES: trace("les\n");
89 stack[sp-2] = stack[sp-1] < stack[sp-2];
90 sp -= 1;
91 break;
92 case BCGRE: trace("gre\n");
93 stack[sp-2] = stack[sp-1] > stack[sp-2];
94 sp -= 1;
95 break;
96 case BCLEQ: trace("leq\n");
97 stack[sp-2] = stack[sp-1] <= stack[sp-2];
98 sp -= 1;
99 break;
100 case BCGEQ: trace("geq\n");
101 stack[sp-2] = stack[sp-1] >= stack[sp-2];
102 sp -= 1;
103 break;
104 case BCJMP: trace("jmp to %d\n", program[pc]);
105 pc = program[pc]-1;
106 break;
107 case BCJMPT: trace("jmpt to %d\n", program[pc]);
108 pc = stack[--sp] ? program[pc]-1 : pc+1;
109 break;
110 case BCJMPF: trace("jmpf to %d\n", program[pc]);
111 pc = stack[--sp] ? pc+1 : program[pc]-1;
112 break;
113 case BCSERIALAVAIL: trace("SerialAvailable()\n");
114 break;
115 case BCSERIALPRINT: trace("SerialPrint()\n");
116 break;
117 case BCSERIALPRINTLN: trace("SerialPrintln()\n");
118 break;
119 case BCSERIALREAD: trace("SerialRead()\n");
120 break;
121 case BCSERIALPARSEINT: trace("SerialParseInt()\n");
122 break;
123 case BCANALOGREAD: trace("AnalogRead(%d)\n", program[pc]);
124 stack[sp++] = read_apin(program[pc++]);
125 break;
126 case BCANALOGWRITE: trace("AnalogWrite(%d)\n", program[pc]);
127 write_apin(program[pc++], stack[sp-1]);
128 sp--;
129 break;
130 case BCDIGITALREAD: trace("DigitalRead(%d)\n", program[pc]);
131 stack[sp++] = read_dpin(program[pc++]);
132 break;
133 case BCDIGITALWRITE: trace("DigitalWrite(%d)\n", program[pc]);
134 write_dpin(program[pc++], stack[sp-1]);
135 sp--;
136 break;
137 default:
138 trace("unrecognized\n");
139 die("Unrecognized command: %d\n", program[pc-1]);
140 }
141 }
142 debug("Task terminated\n");
143 }