static int rvm_cpu_check_space(rvm_cpu_t *cpu)
{
rvm_reg_t *stack;
- rvm_uint_t stacksize;
+ rword stacksize;
if (cpu->stacksize - RVM_GET_REGU(cpu, SP) <= RVM_STACK_CHUNK) {
stacksize = cpu->stacksize + 2 * RVM_STACK_CHUNK;
static void rvm_op_ldr(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- RVM_SET_REGU(cpu, ins->op1, *((rvm_uint_t*)RVM_GET_REGU(cpu, ins->op2)));
+ RVM_SET_REGU(cpu, ins->op1, *((rword*)RVM_GET_REGU(cpu, ins->op2)));
}
static void rvm_op_ldrp(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- RVM_SET_REGU(cpu, ins->op1, *((rvm_pointer_t*)RVM_GET_REGU(cpu, ins->op2)));
+ RVM_SET_REGU(cpu, ins->op1, *((rpointer*)RVM_GET_REGU(cpu, ins->op2)));
}
static void rvm_op_ldrb(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- RVM_SET_REGU(cpu, ins->op1, *((rvm_u8_t*)RVM_GET_REGU(cpu, ins->op2)));
+ RVM_SET_REGU(cpu, ins->op1, *((ruint8*)RVM_GET_REGU(cpu, ins->op2)));
}
static void rvm_op_ldrh(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- RVM_SET_REGU(cpu, ins->op1, *((rvm_u16_t*)RVM_GET_REGU(cpu, ins->op2)));
+ RVM_SET_REGU(cpu, ins->op1, *((ruint16*)RVM_GET_REGU(cpu, ins->op2)));
}
static void rvm_op_str(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- *((rvm_uint_t*)RVM_GET_REGP(cpu, ins->op2)) = RVM_GET_REGU(cpu, ins->op1);
+ *((rword*)RVM_GET_REGP(cpu, ins->op2)) = RVM_GET_REGU(cpu, ins->op1);
}
static void rvm_op_strp(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- *((rvm_pointer_t*)RVM_GET_REGP(cpu, ins->op2)) = (rvm_pointer_t)RVM_GET_REGP(cpu, ins->op1);
+ *((rpointer*)RVM_GET_REGP(cpu, ins->op2)) = (rpointer)RVM_GET_REGP(cpu, ins->op1);
}
static void rvm_op_strb(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- *((rvm_u8_t*)RVM_GET_REGP(cpu, ins->op2)) = (rvm_u8_t)RVM_GET_REGU(cpu, ins->op1);
+ *((ruint8*)RVM_GET_REGP(cpu, ins->op2)) = (ruint8)RVM_GET_REGU(cpu, ins->op1);
}
static void rvm_op_strh(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- *((rvm_u16_t*)RVM_GET_REGP(cpu, ins->op2)) = (rvm_u16_t)RVM_GET_REGU(cpu, ins->op1);
+ *((ruint16*)RVM_GET_REGP(cpu, ins->op2)) = (ruint16)RVM_GET_REGU(cpu, ins->op1);
}
static void rvm_op_adds(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 + op3;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_adc(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 + op3 + (RVM_STATUS_GETBIT(cpu, RVM_STATUS_C) ? 1 : 0);
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_and(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 & op3;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_orr(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 | op3;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_lsl(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 << op3;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_lsr(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 >> op3;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_asr(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 >> op3;
res |= op2 & RVM_SIGN_BIT;
static void rvm_op_ror(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
unsigned int i;
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2;
for (i = 0; i < op3; i++) {
static void rvm_op_tst(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 & op3;
RVM_STATUS_CLRALL(cpu);
static void rvm_op_eor(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 ^ op3;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_not(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2);
res = ~op2;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_teq(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 ^ op3;
RVM_STATUS_CLRALL(cpu);
static void rvm_op_bic(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 & ~op3;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_clz(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2);
for (res = RVM_REGISTER_BITS; op2; ) {
op2 >>= 1;
static void rvm_op_subs(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 - op3;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_sbc(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 - op3 + (RVM_STATUS_GETBIT(cpu, RVM_STATUS_C) ? 0 : -1);
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_mls(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_int_t res;
- rvm_int_t op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rsword res;
+ rsword op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
- res = (rvm_int_t)(op2 * op3);
+ res = (rsword)(op2 * op3);
RVM_SET_REGU(cpu, ins->op1, res);
/* TBD: Not sure how to update the RVM_STATUS_C */
RVM_STATUS_CLRALL(cpu);
static void rvm_op_muls(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
res = op2 * op3;
RVM_SET_REGU(cpu, ins->op1, res);
static void rvm_op_divs(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rword res, op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
if (!op3)
RVM_ABORT(cpu, RVM_E_DIVZERO);
static void rvm_op_dvs(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_int_t res;
- rvm_int_t op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
+ rsword res;
+ rsword op2 = RVM_GET_REGU(cpu, ins->op2), op3 = RVM_GET_REGU(cpu, ins->op3);
if (!op3)
RVM_ABORT(cpu, RVM_E_DIVZERO);
- res = (rvm_int_t)(op2 / op3);
+ res = (rsword)(op2 / op3);
RVM_SET_REGU(cpu, ins->op1, res);
RVM_STATUS_CLRALL(cpu);
RVM_STATUS_UPDATE(cpu, RVM_STATUS_Z, !res);
static void rvm_op_pushm(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
int n;
- rvm_uint_t bits = RVM_GET_REGU(cpu, ins->op1);
+ rword bits = RVM_GET_REGU(cpu, ins->op1);
if ((RVM_GET_REGU(cpu, SP) % RVM_STACK_CHUNK) == 0)
rvm_cpu_check_space(cpu);
for (n = 0; bits && n < RLST; n++) {
- if (((rvm_uint_t)(1 << n)) & bits) {
+ if (((rword)(1 << n)) & bits) {
RVM_SET_REGU(cpu, SP, RVM_GET_REGU(cpu, SP) + 1);
cpu->stack[RVM_GET_REGU(cpu, SP)] = RVM_GET_REG(cpu, n);
bits &= ~(1<<n);
static void rvm_op_popm(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
int n;
- rvm_uint_t bits = RVM_GET_REGU(cpu, ins->op1);
+ rword bits = RVM_GET_REGU(cpu, ins->op1);
for (n = RLST - 1; bits && n >= 0; n--) {
- if (((rvm_uint_t)(1 << n)) & bits) {
+ if (((rword)(1 << n)) & bits) {
RVM_SET_REG(cpu, n, cpu->stack[RVM_GET_REGU(cpu, SP)]);
RVM_SET_REGU(cpu, SP, RVM_GET_REGU(cpu, SP) - 1);
bits &= ~(1<<n);
static void rvm_op_stm(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
int n;
- rvm_uint_t *dst = (rvm_uint_t*) RVM_GET_REGU(cpu, ins->op1);
- rvm_uint_t bits = RVM_GET_REGU(cpu, ins->op2);
+ rword *dst = (rword*) RVM_GET_REGU(cpu, ins->op1);
+ rword bits = RVM_GET_REGU(cpu, ins->op2);
for (n = 0; bits && n < RLST; n++) {
- if (((rvm_uint_t)(1 << n)) & bits) {
+ if (((rword)(1 << n)) & bits) {
*dst = RVM_GET_REGU(cpu, n);
dst += 1;
bits &= ~(1<<n);
static void rvm_op_ldm(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
int n;
- rvm_uint_t *src = (rvm_uint_t*)RVM_GET_REGU(cpu, ins->op1);
- rvm_uint_t bits = RVM_GET_REGU(cpu, ins->op2);
+ rword *src = (rword*)RVM_GET_REGU(cpu, ins->op1);
+ rword bits = RVM_GET_REGU(cpu, ins->op2);
for (n = 0; bits && n < RLST; n++) {
- if (((rvm_uint_t)(1 << n)) & bits) {
+ if (((rword)(1 << n)) & bits) {
RVM_SET_REGU(cpu, n, *src);
src += 1;
bits &= ~(1<<n);
static void rvm_op_cmp(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t op1 = RVM_GET_REGU(cpu, ins->op1), op2 = RVM_GET_REGU(cpu, ins->op2);
- rvm_uint_t res = (rvm_uint_t)(op1 - op2);
+ rword op1 = RVM_GET_REGU(cpu, ins->op1), op2 = RVM_GET_REGU(cpu, ins->op2);
+ rword res = (rword)(op1 - op2);
RVM_STATUS_UPDATE(cpu, RVM_STATUS_C, op1 < op2);
RVM_STATUS_UPDATE(cpu, RVM_STATUS_Z, !res);
static void rvm_op_cmn(rvm_cpu_t *cpu, rvm_asmins_t *ins)
{
- rvm_uint_t op1 = RVM_GET_REGU(cpu, ins->op1), op2 = RVM_GET_REGU(cpu, ins->op2);
- rvm_uint_t res = (rvm_uint_t)(op1 + op2);
+ rword op1 = RVM_GET_REGU(cpu, ins->op1), op2 = RVM_GET_REGU(cpu, ins->op2);
+ rword res = (rword)(op1 + op2);
RVM_STATUS_UPDATE(cpu, RVM_STATUS_C, res < op1 || res < op2);
RVM_STATUS_UPDATE(cpu, RVM_STATUS_Z, !res);
}
-int rvm_cpu_exec(rvm_cpu_t *cpu, rvm_asmins_t *prog, rvm_uint_t pc)
+int rvm_cpu_exec(rvm_cpu_t *cpu, rvm_asmins_t *prog, rword pc)
{
rvm_asmins_t *pi;
}
-int rvm_cpu_exec_debug(rvm_cpu_t *cpu, rvm_asmins_t *prog, rvm_uint_t pc)
+int rvm_cpu_exec_debug(rvm_cpu_t *cpu, rvm_asmins_t *prog, rword pc)
{
rvm_asmins_t *pi;
}
-rvm_asmins_t rvm_asmp(rvm_uint_t opcode, rvm_uint_t op1, rvm_uint_t op2, rvm_uint_t op3, rvm_pointer_t data)
+rvm_asmins_t rvm_asmp(rword opcode, rword op1, rword op2, rword op3, rpointer data)
{
rvm_asmins_t a;
a.opcode = (unsigned char) opcode;
}
-rvm_asmins_t rvm_asmu(rvm_uint_t opcode, rvm_uint_t op1, rvm_uint_t op2, rvm_uint_t op3, rvm_uint_t data)
+rvm_asmins_t rvm_asmu(rword opcode, rword op1, rword op2, rword op3, rword data)
{
rvm_asmins_t a;
a.opcode = (unsigned char) opcode;
return a;
}
-rvm_asmins_t rvm_asm(rvm_uint_t opcode, rvm_uint_t op1, rvm_uint_t op2, rvm_uint_t op3, rvm_uint_t data)
+rvm_asmins_t rvm_asm(rword opcode, rword op1, rword op2, rword op3, rword data)
{
return rvm_asmu(opcode, op1, op2, op3, data);
}
#ifndef _REGVM_H_
#define _REGVM_H_
-#include "rvmconfig.h"
+#include "rtypes.h"
+
+#ifndef RVM_REG_SIZE
+#define RVM_REG_SIZE (sizeof(rword)/8)
+#endif
#ifdef __cplusplus
extern "C" {
RVM_POP,
RVM_CMP,
RVM_NOP,
- RVM_BEQ,
- RVM_BNEQ,
- RVM_BLEQ,
- RVM_BGEQ,
- RVM_BLES,
- RVM_BGRE,
+ RVM_BEQ, /* Branch if equal */
+ RVM_BNEQ, /* Branch if not equal */
+ RVM_BLEQ, /* Branch if less or equal */
+ RVM_BGEQ, /* Branch if less or equal */
+ RVM_BLES, /* Branch if less */
+ RVM_BGRE, /* Branch if greater */
RVM_RET,
RVM_ROR, /* Rotate right, the last bit rotated out updates the Carry flag */
RVM_PUSHM,
};
-#define RVM_REGISTER_BITS (8 * sizeof(rvm_uint_t))
+#define RVM_REGISTER_BITS (8 * sizeof(rword))
#define RVM_SIGN_BIT (1LU << (RVM_REGISTER_BITS - 1))
#define RVM_STATUS_Z (1 << 0)
#define RVM_STATUS_N (1 << 1)
#define RVM_CB(table, offset) ((((table) & ((1 << 16) - 1)) << 16) | ((offset) & ((1 << 16) - 1)))
#define RVM_ABORT(cpu, e) do { cpu->error = (e); cpu->abort = 1; return; } while (0)
#define BIT(_shiftby_) (1 << (_shiftby_))
+#define RVM_REGU(r) (r)->v.u
#define RVM_GET_REGU(cpu, reg) (cpu)->r[(reg)].v.u
-#define RVM_SET_REGU(cpu, reg, val) do { (cpu)->r[(reg)].v.u = (rvm_uint_t)(val); } while (0)
+#define RVM_SET_REGU(cpu, reg, val) do { (cpu)->r[(reg)].v.u = (rword)(val); } while (0)
+#define RVM_REGP(r) (r)->v.p
#define RVM_GET_REGP(cpu, reg) (cpu)->r[(reg)].v.p
-#define RVM_SET_REGP(cpu, reg, val) do { (cpu)->r[(reg)].v.p = (rvm_pointer_t)(val); } while (0)
+#define RVM_SET_REGP(cpu, reg, val) do { (cpu)->r[(reg)].v.p = (rpointer)(val); } while (0)
+#define RVM_REG(r) (r)
#define RVM_GET_REG(cpu, reg) (cpu)->r[(reg)]
#define RVM_SET_REG(cpu, reg, val) do { (cpu)->r[(reg)] = (rvm_reg_t)(val); } while (0)
-#define RVM_REGU(r) (r)->v.u
-#define RVM_REGI(r) (r)->v.i
-#define RVM_REGD(r) (r)->v.d
-#define RVM_REGP(r) (r)->v.p
+
#define RVM_E_DIVZERO (1)
#define RVM_E_ILLEGAL (2)
typedef struct rvm_reg_s {
union {
- rvm_uint_t u;
- rvm_pointer_t p;
-#ifdef RVM_USERDATA
- rvm_userdata_t d;
-#endif
+ rword u;
+ rpointer p;
+ ruint8 c[RVM_REG_SIZE];
} v;
} rvm_reg_t;
struct rvm_cpu_s {
rvm_reg_t r[DA + 1];
- rvm_uint_t status;
- rvm_uint_t error;
- rvm_uint_t abort;
+ rword status;
+ rword error;
+ rword abort;
rvm_reg_t *stack;
- rvm_uint_t stacksize;
+ rword stacksize;
rvm_cpu_swi *switable[RVM_MAX_CBTABLES];
unsigned int switable_count;
void *userdata;
rvm_cpu_t *rvm_cpu_create();
void rvm_cpu_destroy(rvm_cpu_t * vm);
int rvm_cpu_switable_add(rvm_cpu_t * cpu, rvm_cpu_swi *switable);
-int rvm_cpu_exec(rvm_cpu_t *cpu, rvm_asmins_t *prog, rvm_uint_t pc);
-int rvm_cpu_exec_debug(rvm_cpu_t *cpu, rvm_asmins_t *prog, rvm_uint_t pc);
-rvm_asmins_t rvm_asm(rvm_uint_t opcode, rvm_uint_t op1, rvm_uint_t op2, rvm_uint_t op3, rvm_uint_t data);
-rvm_asmins_t rvm_asmu(rvm_uint_t opcode, rvm_uint_t op1, rvm_uint_t op2, rvm_uint_t op3, rvm_uint_t data);
-rvm_asmins_t rvm_asmp(rvm_uint_t opcode, rvm_uint_t op1, rvm_uint_t op2, rvm_uint_t op3, rvm_pointer_t data);
-//rvm_asmins_t rvm_asmi(rvm_uint_t opcode, rvm_uint_t op1, rvm_uint_t op2, rvm_uint_t op3, rvm_int_t data);
-//rvm_asmins_t rvm_asmd(rvm_uint_t opcode, rvm_uint_t op1, rvm_uint_t op2, rvm_uint_t op3, rvm_double_t data);
-//rvm_asmins_t rvm_asmr(rvm_uint_t opcode, rvm_uint_t op1, rvm_uint_t op2, rvm_uint_t op3, rvm_reg_t data);
+int rvm_cpu_exec(rvm_cpu_t *cpu, rvm_asmins_t *prog, rword pc);
+int rvm_cpu_exec_debug(rvm_cpu_t *cpu, rvm_asmins_t *prog, rword pc);
+rvm_asmins_t rvm_asm(rword opcode, rword op1, rword op2, rword op3, rword data);
+rvm_asmins_t rvm_asmu(rword opcode, rword op1, rword op2, rword op3, rword data);
+rvm_asmins_t rvm_asmp(rword opcode, rword op1, rword op2, rword op3, rpointer data);
void rvm_asm_dump(rvm_asmins_t *pi, unsigned int count);