// 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];	
}
示例#2
0
// 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);
}