typedef int c_int;
|
typedef int c_int;
|
union c_insn
|
union c_insn
|
{
|
{
|
void (*op) ();
|
void (*op) ();
|
c_int *mem;
|
c_int *mem;
|
c_int imm;
|
c_int imm;
|
};
|
};
|
static union c_insn c_stack[((0x100 + 4) * 4)];
|
static union c_insn c_stack[((0x100 + 4) * 4)];
|
static struct c_ident *c_funcs;
|
static struct c_ident *c_funcs;
|
static void (*c_op_bz) ();
|
static void (*c_op_bz) ();
|
static void c_direct (union c_insn *addr);
|
static void c_direct (union c_insn *addr);
|
c_compile (int (*ext_getchar) (), void (*ext_rewind) (),
|
c_compile (int (*ext_getchar) (), void (*ext_rewind) (),
|
struct c_ident *externs)
|
struct c_ident *externs)
|
{
|
{
|
c_direct (((void *) 0));
|
c_direct (((void *) 0));
|
}
|
}
|
static void
|
static void
|
c_direct (union c_insn *addr)
|
c_direct (union c_insn *addr)
|
{
|
{
|
union c_insn *pc = addr;
|
union c_insn *pc = addr;
|
union c_insn *sp = c_stack;
|
union c_insn *sp = c_stack;
|
c_int imm = 0;
|
c_int imm = 0;
|
static void *ops[] = {
|
static void *ops[] = {
|
&&op_index, &&op_assign, &&op_add_a, &&op_sub_a, &&op_mul_a, &&op_div_a,
|
&&op_index, &&op_assign, &&op_add_a, &&op_sub_a, &&op_mul_a, &&op_div_a,
|
&&op_mod_a, &&op_or_a, &&op_xor_a, &&op_and_a, &&op_shl_a, &&op_shr_a,
|
&&op_mod_a, &&op_or_a, &&op_xor_a, &&op_and_a, &&op_shl_a, &&op_shr_a,
|
};
|
};
|
{
|
{
|
c_op_bz = &&op_bz;
|
c_op_bz = &&op_bz;
|
}
|
}
|
goto *(pc++)->op;
|
goto *(pc++)->op;
|
op_bz:if (imm)
|
op_bz:if (imm)
|
{
|
{
|
}
|
}
|
op_push_imm_imm:(sp - 2)->imm = imm;
|
op_push_imm_imm:(sp - 2)->imm = imm;
|
goto *(pc - 1)->op;
|
goto *(pc - 1)->op;
|
op_index:imm = *((sp - 3)->mem += imm);
|
op_index:imm = *((sp - 3)->mem += imm);
|
op_assign:*(sp - 3)->mem = imm;
|
op_assign:*(sp - 3)->mem = imm;
|
op_add_a:imm = *(sp - 3)->mem += imm;
|
op_add_a:imm = *(sp - 3)->mem += imm;
|
op_sub_a:imm = *(sp - 3)->mem -= imm;
|
op_sub_a:imm = *(sp - 3)->mem -= imm;
|
op_mul_a:imm = *(sp - 3)->mem *= imm;
|
op_mul_a:imm = *(sp - 3)->mem *= imm;
|
op_div_a:imm = *(sp - 3)->mem /= imm;
|
op_div_a:imm = *(sp - 3)->mem /= imm;
|
op_mod_a:imm = *(sp - 3)->mem %= imm;
|
op_mod_a:imm = *(sp - 3)->mem %= imm;
|
op_or_a:imm = *(sp - 3)->mem |= imm;
|
op_or_a:imm = *(sp - 3)->mem |= imm;
|
op_xor_a:imm = *(sp - 3)->mem ^= imm;
|
op_xor_a:imm = *(sp - 3)->mem ^= imm;
|
op_and_a:imm = *(sp - 3)->mem &= imm;
|
op_and_a:imm = *(sp - 3)->mem &= imm;
|
op_shl_a:imm = *(sp - 3)->mem <<= imm;
|
op_shl_a:imm = *(sp - 3)->mem <<= imm;
|
op_shr_a:imm = *(sp - 3)->mem >>= imm;
|
op_shr_a:imm = *(sp - 3)->mem >>= imm;
|
}
|
}
|
|
|