switch (BASIC(a1)->id) { case ID_ADD: { COUNTUP_INTERACTION(vm); BASIC(a1)->id = ID_ADD2; VALUE a1port1 = AGENT(a1)->port[1]; AGENT(a1)->port[1] = a2; a2 = a1port1; goto loop; } case ID_ADD2: { COUNTUP_INTERACTION(vm); // r << Add(m,n) double n = FIX2FLOAT(AGENT(a1)->port[1]); double m = FIX2FLOAT(a2); a2 = FLOAT2FIX(m + n); VALUE a1port0 = AGENT(a1)->port[0]; free_Agent(a1); a1 = a1port0; goto loop; } case ID_SUB: { COUNTUP_INTERACTION(vm); BASIC(a1)->id = ID_SUB2; VALUE a1port1 = AGENT(a1)->port[1]; AGENT(a1)->port[1] = a2; a2 = a1port1; goto loop; } case ID_SUB2: { COUNTUP_INTERACTION(vm); // r << Sub(m,n) double n = FIX2FLOAT(AGENT(a1)->port[1]); double m = FIX2FLOAT(a2); a2 = FLOAT2FIX(m - n); VALUE a1port0 = AGENT(a1)->port[0]; free_Agent(a1); a1 = a1port0; goto loop; } case ID_MUL: { COUNTUP_INTERACTION(vm); BASIC(a1)->id = ID_MUL2; VALUE a1port1 = AGENT(a1)->port[1]; AGENT(a1)->port[1] = a2; a2 = a1port1; goto loop; } case ID_MUL2: { COUNTUP_INTERACTION(vm); // r << Mult(m,n) double n = FIX2FLOAT(AGENT(a1)->port[1]); double m = FIX2FLOAT(a2); a2 = FLOAT2FIX(m * n); VALUE a1port0 = AGENT(a1)->port[0]; free_Agent(a1); a1 = a1port0; goto loop; } case ID_DIV: { COUNTUP_INTERACTION(vm); BASIC(a1)->id = ID_DIV2; VALUE a1port1 = AGENT(a1)->port[1]; AGENT(a1)->port[1] = a2; a2 = a1port1; goto loop; } case ID_DIV2: { COUNTUP_INTERACTION(vm); // r << DIV(m,n) double n = FIX2FLOAT(AGENT(a1)->port[1]); double m = FIX2FLOAT(a2); a2 = FLOAT2FIX(m / n); VALUE a1port0 = AGENT(a1)->port[0]; free_Agent(a1); a1 = a1port0; goto loop; } case ID_MOD: { COUNTUP_INTERACTION(vm); BASIC(a1)->id = ID_MOD2; VALUE a1port1 = AGENT(a1)->port[1]; AGENT(a1)->port[1] = a2; a2 = a1port1; goto loop; } case ID_MOD2: { COUNTUP_INTERACTION(vm); // r << MOD(m,n) double n = FIX2FLOAT(AGENT(a1)->port[1]); double m = FIX2FLOAT(a2); a2 = FLOAT2FIX(fmod(m, n)); VALUE a1port0 = AGENT(a1)->port[0]; free_Agent(a1); a1 = a1port0; goto loop; } case ID_ERASER: { COUNTUP_INTERACTION(vm); // Eps ~ (int n) free_Agent(a1); return; } case ID_DUP: { COUNTUP_INTERACTION(vm); // Dup(x,y) ~ (int n) --> x~n, y~n; VALUE a1port = AGENT(a1)->port[0]; PUSH(vm, a1port, a2); a1port = AGENT(a1)->port[1]; free_Agent(a1); a1 = a1port; goto loop; } }