以下にこの仮想マシンをテスト実行するためのシンプルなプログラムを示す。
#define INVALID ((int) 0x800055aa)
#define REG 0x80005a00
int dst[] = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, INVALID }; // 要求している出力: フィボナッチ数列(例).
long long tc = 0LL;
int test(int *p, int t1)
{
int v[64], i, c, sr;
if ((tc & 0xffffff) == 0) // 中間報告用の簡易表示.
printf(" %d (%02x %02x %02x %02x) \r", (int) tc, p[0], p[4], p[12], p[16]);
tc++; // テストした回数.
for (i = 0; i < 64; i++)
v[i] = INVALID;
int lb[100], lbn = 0, l, dp = 0;
for (i = 0; p[i] != 0; ) {
if (p[i] == 0x01) { lb[lbn++] = i; } // LB
i += 4;
}
for (i = 0; p[i] != 0; ) {
t1--; if (t1 <= 0) return -3; // (timeout)
c = p[i];
sr = p[i + 2];
i += 4;
if ((sr & ~0x3f) == REG)
sr = v[sr & 0x3f];
if (sr == INVALID) return -2; // (未定義参照).
if (c == 0x01) { continue; } // LB
if (c == 0x02) { // JMP
jmp: l = p[i + (-4 + 3)];
if (l >= lbn) return -1; // (未完成プログラム).
i = lb[l];
continue;
}
if (c == 0x05) { // OUT
if (dst[dp] != sr) return -4; // (正しくない結果の出力).
if (dst[++dp] == INVALID) return t1; // 残り時間をスコアとして返す.
continue;
}
int j = p[i + (-4 + 1)];
if (0x10 <= c && c <= 0x1b && v[j] == INVALID && c != 0x17) return -2; // (未定義参照).
if (0x20 <= c && c <= 0x25 && v[j] == INVALID) return -2; // (未定義参照).
if (c == 0x10) { v[j] |= sr; continue; } // OR
if (c == 0x11) { v[j] ^= sr; continue; } // XOR
if (c == 0x12) { v[j] &= sr; continue; } // AND
if (c == 0x14) { v[j] += sr; continue; } // ADD
if (c == 0x15) { v[j] -= sr; continue; } // SUB
if (c == 0x16) { v[j] *= sr; continue; } // MUL
if (c == 0x17) { v[j] = sr; continue; } // LET
if (c == 0x18) { v[j] <<= sr; continue; } // SHL
if (c == 0x19) { v[j] >>= sr; continue; } // SAR
if (c == 0x1a) { v[j] /= sr; continue; } // DIV
if (c == 0x1b) { v[j] %= sr; continue; } // MOD
if (c == 0x20) { if (v[j] == sr) goto jmp; continue; }
if (c == 0x21) { if (v[j] != sr) goto jmp; continue; }
if (c == 0x22) { if (v[j] < sr) goto jmp; continue; }
if (c == 0x23) { if (v[j] >= sr) goto jmp; continue; }
if (c == 0x24) { if (v[j] <= sr) goto jmp; continue; }
if (c == 0x25) { if (v[j] > sr) goto jmp; continue; }
kerrorExit("test: internal error : c=0x%02x", c); // これはエラー終了させる自作ライブラリ関数.
}
return 0; // dummy.
}