Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #define INSN_OPCODE(I) ((I) >> 12) //opcode
- #define INSN_11_9(I) (((I) >> 9) & 0x7)
- #define INSN_8_6(I) (((I) >> 6) & 0x7) //Rs
- #define INSN_5_3(I) (((I) >> 3) & 0x7) //subopcode
- #define INSN_2_0(I) ((I) & 0x7) //Rt
- #define INSN_5_0(I) ((I) & 0x3F) //IMM6
- #define INSN_8_0(I) ((I) & 0x1FF) //IMM9
- #define INSN_5(I) (((I) >> 5) & 0x1)
- #define INSN_8_7(I) (((I) >> 7) & 0x3)
- #define INSN_11(I) (((I) >> 11) & 0x1)
- #define INSN_5_4(I) (((I) >> 4) & 0x3)
- #define INSN_4_0(I) ((I) & 0x1F)
- #define INSN_3_0(I) ((I) & 0xF)
- #define INSN_7_0(I) ((I) & 0xFF) //IMM8
- #define INSN_6_0(I) ((I) & 0x7F) //IMM7
- #define INSN_10_0(I) ((I) & 0x7FF) //IMM11
- #define INSN_15(I) ((I) >> 15)
- void Reset (MachineState *theMachineState) {
- int i;
- printf("RESET\n");
- theMachineState -> PC = 0x8200;
- theMachineState -> PSR = 0x8002;
- for (i = 0; i < 8; i++) {
- theMachineState -> R[i] = 0;
- }
- for (i = 0; i < 65536; i++) {
- theMachineState -> memory[i] = 0;
- }
- }
- void updateNZP(MachineState *theMachineState, signed short int value) {
- theMachineState -> PSR = theMachineState -> PSR & 0x8000;
- if (value < 0) {
- theMachineState -> PSR += 4;
- printf("N is true\n");
- } else if (value == 0) {
- theMachineState -> PSR += 2;
- printf("Z is true\n");
- } else {
- theMachineState -> PSR += 1;
- printf("P is true\n");
- }
- }
- // Fill in control signals
- int FillInstruction (unsigned short int INSN, ControlSignals *theControls) {
- unsigned short int bit5;
- unsigned short int opcode;
- unsigned short int subOpcode;
- unsigned short int bits7and8;
- unsigned short int bit11;
- unsigned short int bits4and5;
- unsigned short int bit;
- unsigned short int shifted_INSN;
- int i;
- shifted_INSN = INSN;
- for (i = 0; i < 16; i++) {
- bit = shifted_INSN & 0x1;
- if (bit != 0 && bit != 1) {
- printf("INSN input is invalid\n");
- return 1;
- }
- shifted_INSN = shifted_INSN >> 1;
- }
- opcode = INSN_OPCODE(INSN);
- printf("Value of OPCODE is %d\n", opcode);
- switch (opcode) {
- case 0: //0000
- //Branch statements
- bit11 = INSN_11(INSN);
- theControls->PCMux_CTL = 0;
- theControls->regFile_WE = 0;
- theControls->NZP_WE = 0;
- theControls->DATA_WE = 0;
- theControls->rsMux_CTL = 0;
- theControls->rtMux_CTL = 0;
- theControls->rdMux_CTL = 0;
- theControls->regInputMux_CTL = 0;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->ALUMux_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 1:
- //arith statements
- theControls->PCMux_CTL = 1;
- theControls->rsMux_CTL = 0;
- theControls->rtMux_CTL = 0;
- theControls->rdMux_CTL = 0;
- theControls->regInputMux_CTL = 0;
- theControls->regFile_WE = 1;
- theControls->ALUMux_CTL = 0;
- theControls->NZP_WE = 1;
- theControls->DATA_WE = 0;
- bit5 = INSN_5(INSN);
- if (bit5) {
- theControls->ArithMux_CTL = 1;
- }
- else {
- theControls->ArithMux_CTL = 0;
- }
- subOpcode = INSN_5_3(INSN);
- switch (subOpcode) {
- case 0:
- //add
- theControls->Arith_CTL = 0;
- break;
- case 1:
- //mult
- theControls->Arith_CTL = 1;
- break;
- case 2:
- //sub
- theControls->Arith_CTL = 2;
- break;
- case 3:
- //div
- theControls->Arith_CTL = 3;
- break;
- default:
- //add IMM5
- theControls->Arith_CTL = 0;
- break;
- }
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 2:
- //Comp Statement
- theControls->DATA_WE = 0;
- theControls->NZP_WE = 1;
- theControls->ALUMux_CTL = 4;
- theControls->regInputMux_CTL = 0;
- theControls->regFile_WE = 0;
- theControls->rsMux_CTL = 2;
- theControls->PCMux_CTL = 1;
- theControls->rtMux_CTL = 0;
- bits7and8 = INSN_8_7(INSN);
- switch (bits7and8) {
- case 0:
- //cmp
- theControls->CMP_CTL = 0;
- break;
- case 1:
- //cmpu
- theControls->CMP_CTL = 1;
- break;
- case 2:
- //cmpi
- theControls->CMP_CTL = 2;
- break;
- case 3:
- theControls->CMP_CTL = 3;
- break;
- }
- theControls->rdMux_CTL = 0;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 4:
- //jsr Statement
- theControls->DATA_WE = 0;
- theControls->NZP_WE = 1;
- theControls->regInputMux_CTL = 2;
- theControls->regFile_WE = 1;
- theControls->rdMux_CTL = 1;
- theControls->rsMux_CTL = 0;
- bit11 = INSN_11(INSN);
- if (bit11) {
- //jsr
- theControls->PCMux_CTL = 5;
- }
- else {
- //jsrr
- theControls->PCMux_CTL = 3;
- }
- theControls->rtMux_CTL = 0;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->ALUMux_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 5:
- //Logic Statements
- theControls->DATA_WE = 0;
- theControls->NZP_WE = 1;
- theControls->ALUMux_CTL = 1;
- theControls->regInputMux_CTL = 0;
- theControls->regFile_WE = 1;
- theControls->rsMux_CTL = 0;
- theControls->PCMux_CTL = 1;
- theControls->rtMux_CTL = 0;
- theControls->rdMux_CTL = 0;
- bit5 = INSN_5(INSN);
- if (bit5) {
- theControls->LogicMux_CTL = 1;
- }
- else {
- theControls->LogicMux_CTL = 0;
- }
- subOpcode = INSN_5_3(INSN);
- switch (subOpcode) {
- case 0:
- //and
- theControls->LOGIC_CTL = 0;
- break;
- case 1:
- //not
- theControls->LOGIC_CTL = 1;
- break;
- case 2:
- //or
- theControls->LOGIC_CTL = 2;
- break;
- case 3:
- //xor
- theControls->LOGIC_CTL = 3;
- break;
- default:
- //and IMM
- theControls->LOGIC_CTL = 0;
- break;
- }
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 6:
- //ldr
- theControls->PCMux_CTL = 1;
- theControls->rsMux_CTL = 0;
- theControls->rdMux_CTL = 0;
- theControls->rtMux_CTL = 0;
- theControls->regFile_WE = 1;
- theControls->regInputMux_CTL = 1;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 2;
- theControls->ALUMux_CTL = 0;
- theControls->NZP_WE = 1;
- theControls->DATA_WE = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 7:
- //str
- theControls->PCMux_CTL = 1;
- theControls->rsMux_CTL = 0;
- theControls->rtMux_CTL = 1;
- theControls->regFile_WE = 0;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 2;
- theControls->ALUMux_CTL = 0;
- theControls->NZP_WE = 0;
- theControls->DATA_WE = 1;
- break;
- theControls->rdMux_CTL = 0;
- theControls->regInputMux_CTL = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 8:
- //rti
- theControls->PCMux_CTL = 3;
- theControls->rsMux_CTL = 1;
- theControls->regFile_WE = 0;
- theControls->NZP_WE = 0;
- theControls->DATA_WE = 0;
- theControls->Privilege_CTL = 0;
- theControls->rtMux_CTL = 0;
- theControls->rdMux_CTL = 0;
- theControls->regInputMux_CTL = 0;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->ALUMux_CTL = 0;
- break;
- case 9:
- //const
- theControls->PCMux_CTL = 1;
- theControls->rdMux_CTL = 0;
- theControls->regFile_WE = 1;
- theControls->regInputMux_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->ALUMux_CTL = 3;
- theControls->NZP_WE = 1;
- theControls->DATA_WE = 0;
- theControls->rsMux_CTL = 0;
- theControls->rtMux_CTL = 0;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 10:
- //shift statements
- theControls->PCMux_CTL = 1;
- theControls->rsMux_CTL = 0;
- theControls->rdMux_CTL = 0;
- theControls->rtMux_CTL = 0;
- theControls->regFile_WE = 1;
- theControls->regInputMux_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->NZP_WE = 1;
- theControls->DATA_WE = 0;
- bits4and5 = INSN_5_4(INSN);
- //mod
- if (bits4and5 == 3) {
- theControls->Arith_CTL = 4;
- theControls->ALUMux_CTL = 0;
- }
- else {
- theControls->Arith_CTL = 0;
- theControls->ALUMux_CTL = 2;
- }
- switch (bits4and5) {
- case 0:
- //sll
- theControls->SHIFT_CTL = 0;
- break;
- case 1:
- //sra
- theControls->SHIFT_CTL = 1;
- break;
- case 2:
- //srl
- theControls->SHIFT_CTL = 2;;
- break;
- case 3:
- //mod
- theControls->SHIFT_CTL = 0;
- break;
- }
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 12:
- //jmp statements
- theControls->rsMux_CTL = 0;
- theControls->regFile_WE = 0;
- theControls->NZP_WE = 0;
- theControls->DATA_WE = 0;
- bit11 = INSN_11(INSN);
- if (bit11 == 1) {
- //jmp
- theControls->PCMux_CTL = 2;
- }
- else {
- //jmpr
- theControls->PCMux_CTL = 3;
- }
- theControls->rtMux_CTL = 0;
- theControls->rdMux_CTL = 0;
- theControls->regInputMux_CTL = 0;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->ALUMux_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 13:
- //hiconst
- theControls->PCMux_CTL = 1;
- theControls->rsMux_CTL = 2;
- theControls->rdMux_CTL = 0;
- theControls->regFile_WE = 1;
- theControls->regInputMux_CTL = 0;
- theControls->CONST_CTL = 1;
- theControls->ALUMux_CTL = 3;
- theControls->NZP_WE = 1;
- theControls->DATA_WE = 0;
- theControls->rtMux_CTL = 0;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->Privilege_CTL = 2;
- break;
- case 15:
- //trap
- theControls->PCMux_CTL = 4;
- theControls->rdMux_CTL = 1;
- theControls->regFile_WE = 1;
- theControls->regInputMux_CTL = 2;
- theControls->NZP_WE = 1;
- theControls->DATA_WE = 0;
- theControls->Privilege_CTL = 1;
- theControls->rsMux_CTL = 0;
- theControls->rtMux_CTL = 0;
- theControls->Arith_CTL = 0;
- theControls->ArithMux_CTL = 0;
- theControls->LOGIC_CTL = 0;
- theControls->LogicMux_CTL = 0;
- theControls->SHIFT_CTL = 0;
- theControls->CONST_CTL = 0;
- theControls->CMP_CTL = 0;
- theControls->ALUMux_CTL = 0;
- break;
- case 16:
- //opcode invalid
- printf("Invalid INSN given, opcode is invalid.\n");
- return 1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement