Dependents:   WeatherStation

Committer:
okini3939
Date:
Fri Oct 07 14:53:44 2011 +0000
Revision:
3:ed09123d603f
Parent:
2:64bc38078592

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 3:ed09123d603f 1 /*
okini3939 3:ed09123d603f 2 * Instruction List interpreter library
okini3939 3:ed09123d603f 3 * Copyright (c) 2011 Hiroshi Suga
okini3939 3:ed09123d603f 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 3:ed09123d603f 5 */
okini3939 3:ed09123d603f 6
okini3939 0:684b6fdf080c 7 /** @file
okini3939 0:684b6fdf080c 8 * @brief Instruction List interpreter
okini3939 0:684b6fdf080c 9 */
okini3939 0:684b6fdf080c 10
okini3939 0:684b6fdf080c 11 #include "mbed.h"
okini3939 0:684b6fdf080c 12 #include "ILinterpreter.h"
okini3939 0:684b6fdf080c 13
okini3939 0:684b6fdf080c 14 #undef DEBUG
okini3939 0:684b6fdf080c 15
okini3939 0:684b6fdf080c 16 struct MNE_str {
okini3939 0:684b6fdf080c 17 eMNEMONIC mne;
okini3939 0:684b6fdf080c 18 char str[5];
okini3939 0:684b6fdf080c 19 };
okini3939 0:684b6fdf080c 20
okini3939 0:684b6fdf080c 21 #define IL_MNE_NUM 22
okini3939 1:f8c5afc27878 22 static const struct MNE_str mne_str[IL_MNE_NUM] = {
okini3939 0:684b6fdf080c 23 {MNE_DEF, "DEF"},
okini3939 0:684b6fdf080c 24 {MNE_LD, "LD"}, {MNE_LDI, "LDI"}, {MNE_LDP, "LDP"}, {MNE_LDF, "LDF"},
okini3939 0:684b6fdf080c 25 {MNE_OR, "OR"}, {MNE_ORI, "ORI"}, {MNE_ORP, "ORP"}, {MNE_ORF, "ORF"},
okini3939 0:684b6fdf080c 26 {MNE_AND, "AND"}, {MNE_ANI, "ANI"}, {MNE_ANDP, "ANDP"}, {MNE_ANDF, "ANDF"},
okini3939 0:684b6fdf080c 27 {MNE_ORB, "ORB"}, {MNE_ANB, "ANB"}, {MNE_INV, "INV"},
okini3939 0:684b6fdf080c 28 {MNE_MPS, "MPS"}, {MNE_MRD, "MRD"}, {MNE_MPP, "MPP"},
okini3939 0:684b6fdf080c 29 {MNE_OUT, "OUT"}, {MNE_SET, "SET"}, {MNE_RST, "RST"},
okini3939 0:684b6fdf080c 30 };
okini3939 0:684b6fdf080c 31
okini3939 0:684b6fdf080c 32 struct EXP_str {
okini3939 0:684b6fdf080c 33 eEXPRESSION exp;
okini3939 0:684b6fdf080c 34 char str[3];
okini3939 0:684b6fdf080c 35 };
okini3939 0:684b6fdf080c 36
okini3939 0:684b6fdf080c 37 #define IL_EXP_NUM 10
okini3939 1:f8c5afc27878 38 static const struct EXP_str exp_str[IL_EXP_NUM] = {
okini3939 0:684b6fdf080c 39 {EXP_EQ, "=="}, {EXP_EQ, "="}, {EXP_NE, "!="}, {EXP_NE, "<>"},
okini3939 0:684b6fdf080c 40 {EXP_LT, "<="}, {EXP_LE, "<"}, {EXP_GT, ">"}, {EXP_GE, ">="},
okini3939 0:684b6fdf080c 41 {EXP_MOD, "%"}, {EXP_NMOD, "!%"},
okini3939 0:684b6fdf080c 42 };
okini3939 0:684b6fdf080c 43
okini3939 0:684b6fdf080c 44
okini3939 1:f8c5afc27878 45 ILinterpreter::ILinterpreter () {
okini3939 0:684b6fdf080c 46 il_count = 0;
okini3939 0:684b6fdf080c 47 memset(&inout, 0, sizeof(inout));
okini3939 0:684b6fdf080c 48 inout.sec = time(NULL) + (60 * 60 * 9);
okini3939 0:684b6fdf080c 49 inout_old = inout;
okini3939 0:684b6fdf080c 50 cb_input = NULL;
okini3939 0:684b6fdf080c 51 cb_output = NULL;
okini3939 0:684b6fdf080c 52 }
okini3939 0:684b6fdf080c 53
okini3939 0:684b6fdf080c 54 // input relay, expression
okini3939 0:684b6fdf080c 55 int ILinterpreter::input (tInOut *io, int i, int old) {
okini3939 0:684b6fdf080c 56 int keynum;
okini3939 0:684b6fdf080c 57 float value, check;
okini3939 0:684b6fdf080c 58 struct tm *tim;
okini3939 0:684b6fdf080c 59
okini3939 0:684b6fdf080c 60 tim = localtime(&io->sec);
okini3939 0:684b6fdf080c 61 keynum = il[i].keynum;
okini3939 0:684b6fdf080c 62 // right value
okini3939 0:684b6fdf080c 63 check = il[i].value;
okini3939 0:684b6fdf080c 64
okini3939 0:684b6fdf080c 65 // left value
okini3939 0:684b6fdf080c 66 value = 0;
okini3939 0:684b6fdf080c 67 switch (il[i].key) {
okini3939 0:684b6fdf080c 68
okini3939 0:684b6fdf080c 69 case 'y':
okini3939 0:684b6fdf080c 70 value = tim->tm_year + 1900;
okini3939 0:684b6fdf080c 71 break;
okini3939 0:684b6fdf080c 72 case 'm':
okini3939 3:ed09123d603f 73 value = tim->tm_mon + 1;
okini3939 0:684b6fdf080c 74 break;
okini3939 0:684b6fdf080c 75 case 'd':
okini3939 0:684b6fdf080c 76 value = tim->tm_mday;
okini3939 0:684b6fdf080c 77 break;
okini3939 0:684b6fdf080c 78 case 'h':
okini3939 0:684b6fdf080c 79 value = tim->tm_hour;
okini3939 0:684b6fdf080c 80 break;
okini3939 0:684b6fdf080c 81 case 'i':
okini3939 0:684b6fdf080c 82 value = tim->tm_min;
okini3939 0:684b6fdf080c 83 break;
okini3939 0:684b6fdf080c 84 case 's':
okini3939 0:684b6fdf080c 85 value = tim->tm_sec;
okini3939 0:684b6fdf080c 86 break;
okini3939 0:684b6fdf080c 87
okini3939 0:684b6fdf080c 88 case '0':
okini3939 0:684b6fdf080c 89 value = 0;
okini3939 0:684b6fdf080c 90 break;
okini3939 0:684b6fdf080c 91 case '1':
okini3939 0:684b6fdf080c 92 value = 1;
okini3939 0:684b6fdf080c 93 break;
okini3939 0:684b6fdf080c 94
okini3939 0:684b6fdf080c 95 case 'M': // RELAY
okini3939 0:684b6fdf080c 96 if (keynum >= IL_RELAY_NUM) break;
okini3939 0:684b6fdf080c 97 value = io->relay[keynum];
okini3939 0:684b6fdf080c 98 break;
okini3939 0:684b6fdf080c 99
okini3939 0:684b6fdf080c 100 case 'T': // Timer
okini3939 0:684b6fdf080c 101 if (keynum >= IL_TIMER_NUM) break;
okini3939 0:684b6fdf080c 102 if (il[i].expression == EXP_NULL) {
okini3939 3:ed09123d603f 103 value = io->timer_flg[keynum] && io->timer_set[keynum] && io->timer_cnt[keynum] >= io->timer_set[keynum];
okini3939 0:684b6fdf080c 104 } else {
okini3939 3:ed09123d603f 105 value = (float)io->timer_cnt[keynum] / 10.0;
okini3939 0:684b6fdf080c 106 }
okini3939 0:684b6fdf080c 107 break;
okini3939 0:684b6fdf080c 108
okini3939 0:684b6fdf080c 109 case 'C': // Counter
okini3939 0:684b6fdf080c 110 if (keynum >= IL_COUNTER_NUM) break;
okini3939 0:684b6fdf080c 111 if (il[i].expression == EXP_NULL) {
okini3939 0:684b6fdf080c 112 value = io->count_cnt[keynum] >= io->count_set[keynum];
okini3939 0:684b6fdf080c 113 } else {
okini3939 0:684b6fdf080c 114 value = io->count_cnt[keynum];
okini3939 0:684b6fdf080c 115 }
okini3939 0:684b6fdf080c 116 break;
okini3939 0:684b6fdf080c 117
okini3939 0:684b6fdf080c 118 default: // order input
okini3939 0:684b6fdf080c 119 if (cb_input) {
okini3939 0:684b6fdf080c 120 value = (*cb_input)(il[i].key, keynum, il[i].expression, old);
okini3939 0:684b6fdf080c 121 }
okini3939 0:684b6fdf080c 122 break;
okini3939 0:684b6fdf080c 123 }
okini3939 0:684b6fdf080c 124
okini3939 0:684b6fdf080c 125 // expression
okini3939 0:684b6fdf080c 126 switch (il[i].expression) {
okini3939 0:684b6fdf080c 127 case EXP_EQ:
okini3939 0:684b6fdf080c 128 return value == check;
okini3939 0:684b6fdf080c 129 case EXP_NE:
okini3939 0:684b6fdf080c 130 return value != check;
okini3939 0:684b6fdf080c 131 case EXP_LE:
okini3939 0:684b6fdf080c 132 return value <= check;
okini3939 0:684b6fdf080c 133 case EXP_LT:
okini3939 0:684b6fdf080c 134 return value < check;
okini3939 0:684b6fdf080c 135 case EXP_GE:
okini3939 0:684b6fdf080c 136 return value >= check;
okini3939 0:684b6fdf080c 137 case EXP_GT:
okini3939 0:684b6fdf080c 138 return value > check;
okini3939 0:684b6fdf080c 139 case EXP_MOD:
okini3939 0:684b6fdf080c 140 return (int)value % (int)check;
okini3939 0:684b6fdf080c 141 case EXP_NMOD:
okini3939 0:684b6fdf080c 142 return ! ((int)value % (int)check);
okini3939 0:684b6fdf080c 143 }
okini3939 0:684b6fdf080c 144
okini3939 0:684b6fdf080c 145 return value != 0;
okini3939 0:684b6fdf080c 146 }
okini3939 0:684b6fdf080c 147
okini3939 0:684b6fdf080c 148 // output relay
okini3939 0:684b6fdf080c 149 void ILinterpreter::output (int i, int reg, eMNEMONIC mne) {
okini3939 0:684b6fdf080c 150 int keynum;
okini3939 0:684b6fdf080c 151
okini3939 0:684b6fdf080c 152 keynum = il[i].keynum;
okini3939 0:684b6fdf080c 153 #ifdef DEBUG
okini3939 0:684b6fdf080c 154 printf("output [%c%d] reg=%d sr=%d\r\n", il[i].key, keynum, reg, mne);
okini3939 0:684b6fdf080c 155 #endif
okini3939 0:684b6fdf080c 156
okini3939 0:684b6fdf080c 157 switch (il[i].key) {
okini3939 0:684b6fdf080c 158 case 'M': // relay
okini3939 0:684b6fdf080c 159 if (keynum >= IL_RELAY_NUM) break;
okini3939 0:684b6fdf080c 160 if (mne == MNE_OUT) {
okini3939 0:684b6fdf080c 161 inout.relay[keynum] = reg;
okini3939 0:684b6fdf080c 162 } else
okini3939 0:684b6fdf080c 163 if (mne == MNE_SET && reg) {
okini3939 0:684b6fdf080c 164 inout.relay[keynum] = 1;
okini3939 0:684b6fdf080c 165 } else
okini3939 0:684b6fdf080c 166 if (mne == MNE_RST && reg) {
okini3939 0:684b6fdf080c 167 inout.relay[keynum] = 0;
okini3939 0:684b6fdf080c 168 }
okini3939 0:684b6fdf080c 169 break;
okini3939 0:684b6fdf080c 170
okini3939 0:684b6fdf080c 171 case 'T': // Timer
okini3939 0:684b6fdf080c 172 if (keynum >= IL_TIMER_NUM) break;
okini3939 0:684b6fdf080c 173 if (mne == MNE_OUT) {
okini3939 0:684b6fdf080c 174 if (! inout.timer_flg[keynum]) {
okini3939 0:684b6fdf080c 175 // set timer
okini3939 0:684b6fdf080c 176 inout.timer_cnt[keynum] = 0;
okini3939 0:684b6fdf080c 177 }
okini3939 0:684b6fdf080c 178 inout.timer_flg[keynum] = reg;
okini3939 0:684b6fdf080c 179 } else
okini3939 0:684b6fdf080c 180 if (mne == MNE_RST && reg) {
okini3939 0:684b6fdf080c 181 inout.timer_cnt[keynum] = 0;
okini3939 0:684b6fdf080c 182 }
okini3939 0:684b6fdf080c 183 break;
okini3939 0:684b6fdf080c 184
okini3939 0:684b6fdf080c 185 case 'C': // Counter
okini3939 0:684b6fdf080c 186 if (keynum >= IL_COUNTER_NUM) break;
okini3939 0:684b6fdf080c 187 if (mne == MNE_OUT && reg) {
okini3939 0:684b6fdf080c 188 if (inout.count_rev[keynum]) {
okini3939 0:684b6fdf080c 189 inout.count_cnt[keynum] --;
okini3939 0:684b6fdf080c 190 } else {
okini3939 0:684b6fdf080c 191 inout.count_cnt[keynum] ++;
okini3939 0:684b6fdf080c 192 }
okini3939 0:684b6fdf080c 193 } else
okini3939 0:684b6fdf080c 194 if (mne == MNE_RST && reg) {
okini3939 0:684b6fdf080c 195 inout.count_cnt[keynum] = 0;
okini3939 0:684b6fdf080c 196 }
okini3939 0:684b6fdf080c 197 case 'R': // Counter (reverse)
okini3939 0:684b6fdf080c 198 if (keynum >= IL_COUNTER_NUM) break;
okini3939 0:684b6fdf080c 199 if (mne == MNE_OUT) {
okini3939 0:684b6fdf080c 200 inout.count_rev[keynum] = reg;
okini3939 0:684b6fdf080c 201 }
okini3939 0:684b6fdf080c 202 break;
okini3939 0:684b6fdf080c 203
okini3939 0:684b6fdf080c 204 default: // order output
okini3939 0:684b6fdf080c 205 if (cb_output) {
okini3939 0:684b6fdf080c 206 (*cb_output)(il[i].key, keynum, reg, mne);
okini3939 0:684b6fdf080c 207 }
okini3939 0:684b6fdf080c 208 break;
okini3939 0:684b6fdf080c 209 }
okini3939 0:684b6fdf080c 210 }
okini3939 0:684b6fdf080c 211
okini3939 0:684b6fdf080c 212 // execute IL
okini3939 0:684b6fdf080c 213 int ILinterpreter::exec () {
okini3939 0:684b6fdf080c 214 int i, j, reg = -1;
okini3939 0:684b6fdf080c 215 tInOut inout_tmp;
okini3939 0:684b6fdf080c 216
okini3939 0:684b6fdf080c 217 if (! il_count) return 0;
okini3939 0:684b6fdf080c 218
okini3939 1:f8c5afc27878 219 addr = 0;
okini3939 0:684b6fdf080c 220 inout.sec = time(NULL);
okini3939 0:684b6fdf080c 221 inout_tmp = inout;
okini3939 3:ed09123d603f 222 #ifdef DEBUG
okini3939 3:ed09123d603f 223 printf("timer0=%d(%d) timer1=%d(%d)\r\n", inout.timer_cnt[0], inout.timer_set[0], inout.timer_cnt[1], inout.timer_set[1]);
okini3939 3:ed09123d603f 224 #endif
okini3939 0:684b6fdf080c 225
okini3939 0:684b6fdf080c 226 // mnemonic decode
okini3939 0:684b6fdf080c 227 for(i = 0; i < il_count; i ++) {
okini3939 0:684b6fdf080c 228 switch (il[i].mnemonic) {
okini3939 0:684b6fdf080c 229 case MNE_LD:
okini3939 1:f8c5afc27878 230 push(reg);
okini3939 0:684b6fdf080c 231 reg = input(&inout, i);
okini3939 0:684b6fdf080c 232 break;
okini3939 0:684b6fdf080c 233 case MNE_LDI:
okini3939 1:f8c5afc27878 234 push(reg);
okini3939 0:684b6fdf080c 235 reg = ! input(&inout, i);
okini3939 0:684b6fdf080c 236 break;
okini3939 0:684b6fdf080c 237 case MNE_LDP:
okini3939 1:f8c5afc27878 238 push(reg);
okini3939 0:684b6fdf080c 239 reg = input(&inout, i) && ! input(&inout_old, i, 1);
okini3939 0:684b6fdf080c 240 break;
okini3939 0:684b6fdf080c 241 case MNE_LDF:
okini3939 1:f8c5afc27878 242 push(reg);
okini3939 0:684b6fdf080c 243 reg = ! input(&inout, i) && input(&inout_old, i, 1);
okini3939 0:684b6fdf080c 244 break;
okini3939 0:684b6fdf080c 245
okini3939 0:684b6fdf080c 246 case MNE_AND:
okini3939 0:684b6fdf080c 247 reg = reg && input(&inout, i);
okini3939 0:684b6fdf080c 248 break;
okini3939 0:684b6fdf080c 249 case MNE_ANI:
okini3939 0:684b6fdf080c 250 reg = reg && ! input(&inout, i);
okini3939 0:684b6fdf080c 251 break;
okini3939 0:684b6fdf080c 252 case MNE_ANDP:
okini3939 2:64bc38078592 253 reg = reg && (input(&inout, i) && ! input(&inout_old, i, 1));
okini3939 0:684b6fdf080c 254 break;
okini3939 0:684b6fdf080c 255 case MNE_ANDF:
okini3939 2:64bc38078592 256 reg = reg && (! input(&inout, i) && input(&inout_old, i, 1));
okini3939 0:684b6fdf080c 257 break;
okini3939 0:684b6fdf080c 258
okini3939 0:684b6fdf080c 259 case MNE_OR:
okini3939 0:684b6fdf080c 260 reg = reg || input(&inout, i);
okini3939 0:684b6fdf080c 261 break;
okini3939 0:684b6fdf080c 262 case MNE_ORI:
okini3939 0:684b6fdf080c 263 reg = reg || ! input(&inout, i);
okini3939 0:684b6fdf080c 264 break;
okini3939 0:684b6fdf080c 265 case MNE_ORP:
okini3939 2:64bc38078592 266 reg = reg || (input(&inout, i) && ! input(&inout_old, i, 1));
okini3939 0:684b6fdf080c 267 break;
okini3939 0:684b6fdf080c 268 case MNE_ORF:
okini3939 2:64bc38078592 269 reg = reg || (! input(&inout, i) && input(&inout_old, i, 1));
okini3939 0:684b6fdf080c 270 break;
okini3939 0:684b6fdf080c 271
okini3939 0:684b6fdf080c 272 case MNE_ANB:
okini3939 1:f8c5afc27878 273 if (pop(&j) || j == -1) return -1;
okini3939 0:684b6fdf080c 274 reg = reg && j;
okini3939 0:684b6fdf080c 275 break;
okini3939 0:684b6fdf080c 276 case MNE_ORB:
okini3939 1:f8c5afc27878 277 if (pop(&j) || j == -1) return -1;
okini3939 0:684b6fdf080c 278 reg = reg || j;
okini3939 0:684b6fdf080c 279 break;
okini3939 0:684b6fdf080c 280
okini3939 0:684b6fdf080c 281 case MNE_INV:
okini3939 0:684b6fdf080c 282 reg = ! reg;
okini3939 0:684b6fdf080c 283 break;
okini3939 0:684b6fdf080c 284
okini3939 0:684b6fdf080c 285 case MNE_MPS:
okini3939 1:f8c5afc27878 286 if (push(reg)) return -1;
okini3939 0:684b6fdf080c 287 break;
okini3939 0:684b6fdf080c 288 case MNE_MRD:
okini3939 1:f8c5afc27878 289 if (read(&reg) || reg == -1) return -1;
okini3939 0:684b6fdf080c 290 break;
okini3939 0:684b6fdf080c 291 case MNE_MPP:
okini3939 1:f8c5afc27878 292 if (pop(&reg) || reg == -1) return -1;
okini3939 0:684b6fdf080c 293 break;
okini3939 0:684b6fdf080c 294
okini3939 0:684b6fdf080c 295 case MNE_OUT:
okini3939 0:684b6fdf080c 296 case MNE_SET:
okini3939 0:684b6fdf080c 297 case MNE_RST:
okini3939 0:684b6fdf080c 298 output(i, reg, il[i].mnemonic);
okini3939 0:684b6fdf080c 299 break;
okini3939 0:684b6fdf080c 300 }
okini3939 0:684b6fdf080c 301 }
okini3939 0:684b6fdf080c 302
okini3939 0:684b6fdf080c 303 inout_old = inout_tmp;
okini3939 0:684b6fdf080c 304
okini3939 0:684b6fdf080c 305 return 0;
okini3939 0:684b6fdf080c 306 }
okini3939 0:684b6fdf080c 307
okini3939 0:684b6fdf080c 308 // set callback function
okini3939 1:f8c5afc27878 309 struct tInOut* ILinterpreter::attach (float (*pf_i)(char, int, eEXPRESSION, int), void (*pf_o)(char, int, int, eMNEMONIC)) {
okini3939 0:684b6fdf080c 310 cb_input = pf_i;
okini3939 0:684b6fdf080c 311 cb_output = pf_o;
okini3939 1:f8c5afc27878 312 return &inout;
okini3939 0:684b6fdf080c 313 }
okini3939 0:684b6fdf080c 314
okini3939 0:684b6fdf080c 315 // timer 10Hz
okini3939 0:684b6fdf080c 316 void ILinterpreter::pool () {
okini3939 0:684b6fdf080c 317 int i;
okini3939 0:684b6fdf080c 318
okini3939 0:684b6fdf080c 319 if (! il_count) return;
okini3939 0:684b6fdf080c 320
okini3939 0:684b6fdf080c 321 // timer
okini3939 0:684b6fdf080c 322 for (i = 0; i < IL_TIMER_NUM; i ++) {
okini3939 0:684b6fdf080c 323 if (inout.timer_flg[i] && inout.timer_cnt[i] < inout.timer_set[i]) {
okini3939 0:684b6fdf080c 324 inout.timer_cnt[i] ++;
okini3939 0:684b6fdf080c 325 }
okini3939 0:684b6fdf080c 326 }
okini3939 0:684b6fdf080c 327 }
okini3939 0:684b6fdf080c 328
okini3939 0:684b6fdf080c 329 // load sub
okini3939 0:684b6fdf080c 330 void ILinterpreter::load_exp (int i, char *buf) {
okini3939 0:684b6fdf080c 331 int j, len;
okini3939 0:684b6fdf080c 332 char *tmp;
okini3939 0:684b6fdf080c 333
okini3939 0:684b6fdf080c 334 // MNEMONIC "KEY""num"==value
okini3939 0:684b6fdf080c 335 il[i].key = buf[0];
okini3939 0:684b6fdf080c 336 il[i].keynum = strtol(&buf[1], &tmp, 10);
okini3939 0:684b6fdf080c 337 il[i].expression = EXP_NULL;
okini3939 0:684b6fdf080c 338 il[i].value = 0;
okini3939 0:684b6fdf080c 339
okini3939 0:684b6fdf080c 340 if (tmp) {
okini3939 0:684b6fdf080c 341 // expression
okini3939 0:684b6fdf080c 342 for (j = 0; j < IL_EXP_NUM; j ++) {
okini3939 0:684b6fdf080c 343 len = strlen(exp_str[j].str);
okini3939 0:684b6fdf080c 344 if (strncmp(tmp, exp_str[j].str, len) == 0 && tmp[len] >= '0' && tmp[len] <= '9') {
okini3939 0:684b6fdf080c 345 // MNEMONIC KEYnum"==""value"
okini3939 0:684b6fdf080c 346 il[i].expression = exp_str[j].exp;
okini3939 0:684b6fdf080c 347 il[i].value = atof(&tmp[len]);
okini3939 0:684b6fdf080c 348 break;
okini3939 0:684b6fdf080c 349 }
okini3939 0:684b6fdf080c 350 }
okini3939 0:684b6fdf080c 351 }
okini3939 0:684b6fdf080c 352 }
okini3939 0:684b6fdf080c 353
okini3939 0:684b6fdf080c 354 // load IL file
okini3939 0:684b6fdf080c 355 int ILinterpreter::load (char *file) {
okini3939 0:684b6fdf080c 356 FILE *fp;
okini3939 0:684b6fdf080c 357 char c;
okini3939 0:684b6fdf080c 358 int i, j, len;
okini3939 0:684b6fdf080c 359 char buf[20];
okini3939 0:684b6fdf080c 360
okini3939 0:684b6fdf080c 361 il_count = 0;
okini3939 0:684b6fdf080c 362
okini3939 0:684b6fdf080c 363 fp = fopen(file, "r");
okini3939 0:684b6fdf080c 364 if (fp == NULL) return -1;
okini3939 0:684b6fdf080c 365
okini3939 0:684b6fdf080c 366 i = 0;
okini3939 0:684b6fdf080c 367 for (;;) {
okini3939 0:684b6fdf080c 368 if (il_count >= IL_NUM) break;
okini3939 0:684b6fdf080c 369 c = fgetc(fp);
okini3939 0:684b6fdf080c 370 if (feof(fp)) break;
okini3939 0:684b6fdf080c 371
okini3939 0:684b6fdf080c 372 if (c != '\r' && c != '\n' && i < 40 - 1) {
okini3939 0:684b6fdf080c 373 // load
okini3939 0:684b6fdf080c 374 buf[i] = c;
okini3939 0:684b6fdf080c 375 i ++;
okini3939 0:684b6fdf080c 376 continue;
okini3939 0:684b6fdf080c 377 }
okini3939 0:684b6fdf080c 378 buf[i] = 0;
okini3939 0:684b6fdf080c 379
okini3939 0:684b6fdf080c 380 if (i == 0 || buf[0] == '#' || buf[0] == ';') {
okini3939 0:684b6fdf080c 381 // comment
okini3939 0:684b6fdf080c 382 i = 0;
okini3939 0:684b6fdf080c 383 continue;
okini3939 0:684b6fdf080c 384 }
okini3939 0:684b6fdf080c 385
okini3939 0:684b6fdf080c 386 // mnemonic
okini3939 0:684b6fdf080c 387 for (j = 0; j < IL_MNE_NUM; j ++) {
okini3939 0:684b6fdf080c 388 len = strlen(mne_str[j].str);
okini3939 0:684b6fdf080c 389 if (strncmp(buf, mne_str[j].str, len) == 0 && (buf[len] == ' ' || buf[len] == 0)) {
okini3939 0:684b6fdf080c 390 // "MNEMONIC" KEYnum==value
okini3939 0:684b6fdf080c 391 il[il_count].mnemonic = mne_str[j].mne;
okini3939 0:684b6fdf080c 392 load_exp(il_count, &buf[len + 1]);
okini3939 2:64bc38078592 393 #ifdef DEBUG
okini3939 2:64bc38078592 394 printf("%d: M=%d [%c%d] E=%d V=%f\r\n", il_count, il[il_count].mnemonic, il[il_count].key, il[il_count].keynum, il[il_count].expression, il[il_count].value);
okini3939 2:64bc38078592 395 #endif
okini3939 0:684b6fdf080c 396 il_count ++;
okini3939 0:684b6fdf080c 397 break;
okini3939 0:684b6fdf080c 398 }
okini3939 0:684b6fdf080c 399 }
okini3939 0:684b6fdf080c 400 if (strncmp(buf, "END", 3) == 0) break;
okini3939 0:684b6fdf080c 401 if (j == IL_MNE_NUM) return -1;
okini3939 0:684b6fdf080c 402
okini3939 0:684b6fdf080c 403 i = 0;
okini3939 0:684b6fdf080c 404 }
okini3939 0:684b6fdf080c 405
okini3939 0:684b6fdf080c 406 // init
okini3939 0:684b6fdf080c 407 for (i = 0; i < il_count; i ++) {
okini3939 0:684b6fdf080c 408 if (il[i].mnemonic == MNE_DEF) {
okini3939 0:684b6fdf080c 409 switch (il[i].key) {
okini3939 3:ed09123d603f 410 case 'T': // Timer
okini3939 0:684b6fdf080c 411 inout.timer_set[il[i].keynum] = (int)il[i].value * 10;
okini3939 0:684b6fdf080c 412 break;
okini3939 0:684b6fdf080c 413
okini3939 3:ed09123d603f 414 case 'C': // Counter
okini3939 0:684b6fdf080c 415 inout.count_set[il[i].keynum] = (int)il[i].value;
okini3939 0:684b6fdf080c 416 break;
okini3939 0:684b6fdf080c 417 }
okini3939 0:684b6fdf080c 418 }
okini3939 0:684b6fdf080c 419 }
okini3939 0:684b6fdf080c 420
okini3939 0:684b6fdf080c 421 fclose(fp);
okini3939 0:684b6fdf080c 422
okini3939 3:ed09123d603f 423 return il_count;
okini3939 0:684b6fdf080c 424 }
okini3939 1:f8c5afc27878 425
okini3939 1:f8c5afc27878 426 int ILinterpreter::push (int dat) {
okini3939 1:f8c5afc27878 427
okini3939 1:f8c5afc27878 428 if (addr >= IL_STACK) {
okini3939 1:f8c5afc27878 429 return -1;
okini3939 1:f8c5afc27878 430 }
okini3939 1:f8c5afc27878 431 stack[addr] = dat;
okini3939 1:f8c5afc27878 432 addr ++;
okini3939 1:f8c5afc27878 433 return dat;
okini3939 1:f8c5afc27878 434 }
okini3939 1:f8c5afc27878 435
okini3939 1:f8c5afc27878 436 int ILinterpreter::pop (int *dat) {
okini3939 1:f8c5afc27878 437
okini3939 1:f8c5afc27878 438 if (addr == 0) {
okini3939 1:f8c5afc27878 439 return -1;
okini3939 1:f8c5afc27878 440 }
okini3939 1:f8c5afc27878 441 addr --;
okini3939 1:f8c5afc27878 442 *dat = stack[addr];
okini3939 1:f8c5afc27878 443 return 0;
okini3939 1:f8c5afc27878 444 }
okini3939 1:f8c5afc27878 445
okini3939 1:f8c5afc27878 446 int ILinterpreter::read (int *dat) {
okini3939 1:f8c5afc27878 447
okini3939 1:f8c5afc27878 448 if (addr == 0) {
okini3939 1:f8c5afc27878 449 return -1;
okini3939 1:f8c5afc27878 450 }
okini3939 1:f8c5afc27878 451 *dat = stack[addr];
okini3939 1:f8c5afc27878 452 return 0;
okini3939 1:f8c5afc27878 453 }