#include <stdio.h>
int AC = 0, mem[100]; int pc = 1;

void dump()
  {
    int i, j;
    printf("pc: %10d\n", pc);
    printf("AC: %10d", AC);
    printf("\n");
    for (i = 0; i < 20; i++)
      {
        printf("\n%3d: ", 5*i);
        for (j = 0; j < 5; j++) 
          printf("%10d ", mem[5*i+j]);
      }
    printf("\n");
  }

int main()
{
  int i, inst, op, addr;
  FILE *fp;
  char fname[256];

  printf("Nome do arquivo: ");
  if (scanf("%s", fname) != 1 ||
      (fp = fopen(fname, "r")) == NULL ) {
    fprintf(stderr, "Erro na abertura do arquivo\n");
    fprintf(stderr, "Nome lido para o arquivo: %s\n", fname);
    system("PAUSE");    
    return 1;
  }
  
  for (i = 0; i < 100; i++) mem[i] = 0;
  for (i = 1; i < 100; i++) {
    fscanf(fp, "%d", &mem[i]);
    if (mem[i] == 0) break;
  }
  printf("\nSaida:\n");
  do
    {
      inst = mem[pc++];
      op = (inst / 1000000) % 100; 
      addr = inst % 10000;
      switch (op) {
      case 10: AC = 0; break; 
      case 11: AC = mem[addr]; break;
      case 12: mem[addr] = AC; break;
      case 21: AC += mem[addr]; break;
      case 22: AC -= mem[addr]; break;
      case 23: AC *= mem[addr]; break;
      case 24: AC /= mem[addr]; break;
      case 25: AC %= mem[addr]; break;
      case 31: fscanf(fp, "%d", &mem[addr]); break;
      case 41: printf("    %10d\n", mem[addr]); break;
      case 50:
      case 70: break;
      case 51: pc = addr; break;
      case 52: if (AC <= 0) pc = addr; break;
      case 53: if (AC != 0) pc = addr; break;
      case 54: if (AC > 0) pc = addr; break;
      case 55: if (AC == 0) pc = addr; break;
      case 56: if (AC < 0) pc = addr; break;
      case 57: if (AC >= 0) pc = addr; break;
      default: printf("Instrucao invalida\n"); 
      }
    }
  while (op != 70);

  printf("\nEstado final do apontador de instrucoes,\
          \nacumulador e memoria:\n\n"); 
  dump();

  system("PAUSE");
  return 0;
}      
