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; }
// 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"); }
// 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; }
// 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; }
// 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); } }