Public feed #381344

Untitled

public text v1 · immutable
Raw Edit
·published 2007-03-04 20:02 UTC
rendered paste body
#include <stdio.h>
#include <stdlib.h>

#include "vm.h"


void vm(struct instruction *code)
{
  struct state state;
  struct state stack[4096];
  struct state *sp = stack;
  struct instruction cur;

  state.pc = 0;
  
  while(1) {
    cur = code[state.pc++];
    switch(cur.op) {
    case ADD:
      state.regs[cur.c] = state.regs[cur.a] + state.regs[cur.b];
      break;
    case SUB:
      state.regs[cur.c] = state.regs[cur.a] - state.regs[cur.b];
      break;
    case MUL:
      state.regs[cur.c] = state.regs[cur.a] * state.regs[cur.b];
      break;
    case DIV:
      state.regs[cur.c] = state.regs[cur.a] / state.regs[cur.b];
      break;
    case CMP:
      if(state.regs[cur.a] == state.regs[cur.b])
	state.regs[cur.c] = 0;
      else if(state.regs[cur.a] < state.regs[cur.b])
	state.regs[cur.c] = -1;
      else if(state.regs[cur.a] > state.regs[cur.b])
	state.regs[cur.c] = 1;
      break;
    case JMP:
      state.pc = cur.a;
      break;
    case JMPI:
      if(state.regs[cur.a] == 0)
	state.pc = cur.b;
      break;
    case SAVE:
      *sp++ = state;
      break;
    case REST:
      state = *--sp;
      break;
    case HALT:
      return;
    case PRINT:
      printf("%d ", state.regs[cur.a]);
      break;
    }
  }
}

  
  
  
int main(int argc, char **argv)
{
  struct instruction *code = malloc(10000);
  struct instruction *ptr = code;

  FILE *fd = fopen(argv[1], "rb");
  while(!feof(fd)) {
    fread(&ptr->op, sizeof(enum op_code), 1, fd);
    fread(&ptr->a, sizeof(word), 1, fd);
    fread(&ptr->b, sizeof(word), 1, fd);
    fread(&ptr->c, sizeof(word), 1, fd);
    ptr++;
  }
  vm(code);

  return 0;
}