// Sets valC and byte0 to byte7 for printReg. Only used by 9 or 10 byte instructions. void setValC_and_bytes(int numBytesInInstr) { int PC_offset = numBytesInInstr - 8; valCValid = 1; valC = getValC(PC_offset); b0 = instrBuffer[PC_offset]; b1 = instrBuffer[PC_offset + 1]; b2 = instrBuffer[PC_offset + 2]; b3 = instrBuffer[PC_offset + 3]; b4 = instrBuffer[PC_offset + 4]; b5 = instrBuffer[PC_offset + 5]; b6 = instrBuffer[PC_offset + 6]; b7 = instrBuffer[PC_offset + 7]; }
// Function: fetchStage() // Description: Stuff // Params: none // Returns: nothing // Modifies: yo momma //void fetchStage(){ void fetchStage(forwardType forward){ //what address should instruction be fetched at unsigned int f_pc; if((forward.M_icode == JXX) && !forward.M_Cnd) f_pc = forward.M_valA; else if(forward.W_icode == RET) f_pc = forward.W_valM; else f_pc = F.predPC; bool memError= false; unsigned int tempByte = getByte(f_pc, &memError); unsigned int f_ifun; unsigned int f_icode; //determine icode and ifun if(memError){ f_ifun = FNONE; f_icode = NOP; } else{ f_ifun = getBits(0,3, tempByte); f_icode = getBits(4,7, tempByte); } //is instruction valid bool instr_valid = instrValid(f_icode); //determine status code for fetched instruction unsigned int f_stat; if(memError) f_stat = SADR; else if(!instr_valid) f_stat = SINS; else if(f_icode==HALT) f_stat = SHLT; else f_stat = SAOK; //does fetched instruction require a register_id byte? unsigned int rA; unsigned int rB; bool needRId = needRegId(f_icode); if(needRId) { unsigned int rByte = getByte(f_pc+1, &memError); rA = getBits(4, 7, rByte); rB = getBits(0, 3, rByte); } else{ rA = RNONE; rB = RNONE; } //does fetched instruction require a constant word? //bool need_valC; bool needVC = needValC(f_icode); unsigned int f_valC; f_valC = getValC(f_pc, needRId, needVC); /* if(needVC){ unsigned char byte0 = getByte(f_pc+1, &memError); unsigned char byte1 = getByte(f_pc+2, &memError); unsigned char byte2 = getByte(f_pc+3, &memError); unsigned char byte3 = getByte(f_pc+4, &memError); f_valC = buildWord(byte0, byte1, byte2, byte3); } else f_valC = 0; */ /* if(instr_valid){ F.predPC = f_pc+1; } else{ F.predPC = f_pc+5; } */ unsigned int f_valP; f_valP = pcIncrement(f_pc, needVC, needRId); F.predPC = predictPC(f_icode, f_valC, f_valP); memError = true; updateDregister(f_stat, f_icode, f_ifun, rA, rB, f_valC, f_valP); }