int execute_command(char cmd_char, int reg[], int nreg,
                    int mem[], int memlen)
{

  if (cmd_char == '?' || cmd_char == 'h')
    help_message();

  switch (cmd_char) {
  case 'd':
    dump_control_unit(pc, ir, running, reg, nreg);
    dump_memory(mem, memlen);
    return 0;
    break;

  case 'q':
    return 1;
    break;

  case '\n':
    one_instruction_cycle(reg, nreg, mem, memlen);
    return 0;
    break;

  default:
    printf("Please enter a valid character");
    break;
  }

  return 0;
}
Exemplo n.º 2
0
// Initialize the control registers (pc, ir, running flag) and
// the general-purpose registers
//
void initialize_control_unit(int reg[], int nreg) {
	pc = 0;
	ir = 0;
	running = 1;
	int i;
	for(i=0;i<nreg;i++){
		reg[i]=0;
	}
	printf("\nInitial control unit:\n");
	dump_control_unit(pc, ir, running, reg, nreg);
	printf("\n");
}
Exemplo n.º 3
0
// Execute a nonnumeric command; complain if it's not 'h', '?', 'd', 'q' or '\n'
// Return true for the q command, false otherwise
//
int execute_command(char cmd_char, int reg[], int nreg, int mem[], int memlen) {
	if (cmd_char == '?' || cmd_char == 'h') {
		help_message();
	} else if (cmd_char == 'd') {
		printf("Dumping control and memory:\n");
		dump_control_unit(pc, ir, running, reg, NREG);
		dump_memory(mem, MEMLEN);
	} else if (cmd_char == 'q') {
		printf("Quitting\n");
		exit(0);
	} else if (cmd_char == '\n' || cmd_char == ' ') {
		one_instruction_cycle(reg,nreg,mem,memlen);
	} else {
		printf("Unkown command: %c; Ignoring it.\n",cmd_char);
		return 1;
	}
	return 0;
}
Exemplo n.º 4
0
// Main program: Initialize the cpu, read initial memory values,
// and execute the read-in program starting at location 00.
//
int main(int argc, char *argv[]) {
	printf("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n");
	printf("=-=-=-=-=-=-= SDC SIM lab06 CS350 Devanshu Bharel =-=-=-=-=-=-=\n");
	printf("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n");
	initialize_control_unit(reg, NREG);
	initialize_memory(argc, argv, mem, MEMLEN);

	char *prompt = "> ";
	printf("\nBeginning execution; type h for help\n%s", prompt);

	int done = read_execute_command(reg, NREG, mem, MEMLEN);
	while (!done) {
		printf("%s", prompt);
		done = read_execute_command(reg, NREG, mem, MEMLEN);
	}
	printf("At termination\n");
	dump_control_unit(pc, ir, running, reg, NREG);
	dump_memory(mem, MEMLEN);
	return 0;
}
int main(int argc, char *argv[])
{
  printf("SDC Simulator\n");

  /* initialize everything */
  initialize_control_unit(reg, NREG);
  initialize_memory(argc, argv, mem, MEMLEN);

  char *prompt = "> ";
  printf("\nBeginning execution; type h for help\n%s", prompt);
  int done = read_execute_command(reg, NREG, mem, MEMLEN);
  while (!done) {
    printf("%s", prompt);
    done = read_execute_command(reg, NREG, mem, MEMLEN);
  }

  /* Dump everything when done */
  printf("Termination\n");
  dump_control_unit(pc, ir, running, reg, NREG);
  printf("\n");
  dump_memory(mem, MEMLEN);

  return 0;
}
Exemplo n.º 6
0
// print out control unit 
void exec_DMP(int addr_MM, int reg[], int nreg, int mem[], int memlen) {
	printf("I/O 3: Dump control unit:\n");
	dump_control_unit(pc, ir, running, reg, NREG);
}
void one_instruction_cycle(int reg[], int nreg,
                           int mem[], int memlen)
{
  int reg_R, addr_MM, instr_sign, opcode;

  /* Check if CPU is running */
  if (running == 0) {
    printf("The CPU is not running");
    return;
  }

  /* Make sure that we didn't hit any boundaries */
  if (pc >= memlen) {
    printf("Program counter out of range");
    exec_HLT();
  }

  /* Get instruction and increment PC */
  int instr_loc = pc;
  ir = mem[pc++];

  /* Check instruction sign */
  if (ir < 0) {
    instr_sign = -1;
    ir *= -1;
  } else if (ir > 0) {
    instr_sign = 1;
  }

  /* Decode instruction into opcode, register, and memory address */
  opcode = ir / 1000;
  reg_R = (ir % 1000) / 100;
  addr_MM = ir % 100;

  printf("At %02d instr %d %d %02d: ",
         instr_loc, opcode, reg_R, addr_MM);

  switch (opcode) {
  /* HALT */
  case 0:
    exec_HLT();
    break;

  /* LOAD */
  case 1: {
    reg[reg_R] = mem[addr_MM];
  } break;

  /* STORE */
  case 2: {
    mem[addr_MM] = reg[reg_R];
  } break;

  /* ADD-IM-MM */
  case 3: {
    reg[reg_R] += mem[addr_MM];
  } break;

  /* NOT */
  case 4: {
    reg[reg_R] = (-reg[reg_R]);
  } break;

  /* LOAD IMMEDIATE */
  case 5: {
    reg[reg_R] = addr_MM * instr_sign;
  } break;

  /* ADD IMMEDIATE */
  case 6: {
    reg[reg_R] += addr_MM * instr_sign;
  } break;

  /* JUMP */
  case 7: {
    pc = addr_MM;
  } break;

  /* BRANCH CONDITIONAL */
  case 8: {
    if (reg[reg_R] > 0 && instr_sign > 0) {
      pc = addr_MM;
    } else if (reg[reg_R] < 0 && instr_sign < 0)
      pc = addr_MM;
  } break;

  /* I/O Subroutines */
  case 9: {
    switch (reg_R) {
    /* GETCHAR */
    case 0: {
      printf("enter a character>> ");
      int k = getchar();
      reg[0] = k;
    } break;

    /* PRINTCHAR */
    case 1: {
      printf("%c\n", reg[0]);
    } break;

    /* PRINT-STRING */
    case 2: {
      while (mem[addr_MM] != 0) {
          printf("%c \n", mem[addr_MM++]);
      }
      printf("\n");
    } break;

    /* DUMP CU */
    case 3: {
      dump_control_unit(pc, ir, running, reg, nreg);
    } break;

    /* DUMP MEM */
    case 4: {
      dump_memory(mem, memlen);
    } break;

    default:
      return;
      break;
    }
  } break;
  default:
    printf("Bad opcode!? %d\n", opcode);
  }
}