Diff: ILinterpreter.cpp
- Revision:
- 1:f8c5afc27878
- Parent:
- 0:684b6fdf080c
- Child:
- 2:64bc38078592
--- a/ILinterpreter.cpp Sun Jun 26 12:02:32 2011 +0000
+++ b/ILinterpreter.cpp Sun Jun 26 16:53:49 2011 +0000
@@ -13,7 +13,7 @@
};
#define IL_MNE_NUM 22
-const struct MNE_str mne_str[IL_MNE_NUM] = {
+static const struct MNE_str mne_str[IL_MNE_NUM] = {
{MNE_DEF, "DEF"},
{MNE_LD, "LD"}, {MNE_LDI, "LDI"}, {MNE_LDP, "LDP"}, {MNE_LDF, "LDF"},
{MNE_OR, "OR"}, {MNE_ORI, "ORI"}, {MNE_ORP, "ORP"}, {MNE_ORF, "ORF"},
@@ -29,15 +29,16 @@
};
#define IL_EXP_NUM 10
-const struct EXP_str exp_str[IL_EXP_NUM] = {
+static const struct EXP_str exp_str[IL_EXP_NUM] = {
{EXP_EQ, "=="}, {EXP_EQ, "="}, {EXP_NE, "!="}, {EXP_NE, "<>"},
{EXP_LT, "<="}, {EXP_LE, "<"}, {EXP_GT, ">"}, {EXP_GE, ">="},
{EXP_MOD, "%"}, {EXP_NMOD, "!%"},
};
-ILinterpreter::ILinterpreter () : stack(IL_STACK) {
+ILinterpreter::ILinterpreter () {
il_count = 0;
+ printf("<%x>\r\n", &inout);
memset(&inout, 0, sizeof(inout));
inout.sec = time(NULL) + (60 * 60 * 9);
inout_old = inout;
@@ -210,7 +211,7 @@
if (! il_count) return 0;
- stack.clear();
+ addr = 0;
inout.sec = time(NULL);
inout_tmp = inout;
@@ -218,19 +219,19 @@
for(i = 0; i < il_count; i ++) {
switch (il[i].mnemonic) {
case MNE_LD:
- stack.push(reg);
+ push(reg);
reg = input(&inout, i);
break;
case MNE_LDI:
- stack.push(reg);
+ push(reg);
reg = ! input(&inout, i);
break;
case MNE_LDP:
- stack.push(reg);
+ push(reg);
reg = input(&inout, i) && ! input(&inout_old, i, 1);
break;
case MNE_LDF:
- stack.push(reg);
+ push(reg);
reg = ! input(&inout, i) && input(&inout_old, i, 1);
break;
@@ -261,11 +262,11 @@
break;
case MNE_ANB:
- if (stack.pop(&j) || j == -1) return -1;
+ if (pop(&j) || j == -1) return -1;
reg = reg && j;
break;
case MNE_ORB:
- if (stack.pop(&j) || j == -1) return -1;
+ if (pop(&j) || j == -1) return -1;
reg = reg || j;
break;
@@ -274,13 +275,13 @@
break;
case MNE_MPS:
- if (stack.push(reg)) return -1;
+ if (push(reg)) return -1;
break;
case MNE_MRD:
- if (stack.read(®) || reg == -1) return -1;
+ if (read(®) || reg == -1) return -1;
break;
case MNE_MPP:
- if (stack.pop(®) || reg == -1) return -1;
+ if (pop(®) || reg == -1) return -1;
break;
case MNE_OUT:
@@ -300,10 +301,10 @@
}
// set callback function
-void ILinterpreter::attach (struct tInOut **io, float (*pf_i)(char, int, eEXPRESSION, int), void (*pf_o)(char, int, int, eMNEMONIC)) {
+struct tInOut* ILinterpreter::attach (float (*pf_i)(char, int, eEXPRESSION, int), void (*pf_o)(char, int, int, eMNEMONIC)) {
cb_input = pf_i;
cb_output = pf_o;
- *io = &inout;
+ return &inout;
}
// timer 10Hz
@@ -418,3 +419,32 @@
#endif
return 0;
}
+
+int ILinterpreter::push (int dat) {
+
+ if (addr >= IL_STACK) {
+ return -1;
+ }
+ stack[addr] = dat;
+ addr ++;
+ return dat;
+}
+
+int ILinterpreter::pop (int *dat) {
+
+ if (addr == 0) {
+ return -1;
+ }
+ addr --;
+ *dat = stack[addr];
+ return 0;
+}
+
+int ILinterpreter::read (int *dat) {
+
+ if (addr == 0) {
+ return -1;
+ }
+ *dat = stack[addr];
+ return 0;
+}
\ No newline at end of file