void IOKey(void *argv){ reg_type receiver_control = LoadWord(RECEIVER_CONTROL); SetBit(&receiver_control, IO_INTERRUPT_ENABLE); while(!prog_finished && (WaitForSingleObject(hRunMutex, 75L) == WAIT_TIMEOUT)){ if(kbhit()){ char ch = getch(); /* for(size_t i = 0 ; i < 1000; i++) printf("Inside if kbhit() ch = %c\n", ch);*/ StoreByte(ch, RECEIVER_DATA); //muxtex in StoreByte function if(bitState(cpo_reg[STATUS], INTERRUPT_ENABLE) && bitState(cpo_reg[STATUS], EXCEPTION_LEVEL) && bitState(receiver_control, IO_INTERRUPT_ENABLE)){ SetCause(INTERRUPT); SetBit(&cpo_reg[CAUSE], 0XD);//set pending bit /*need to rectify perhaps*/ SetBit(&receiver_control, IO_READY); StoreWord(receiver_control, RECEIVER_CONTROL); /* for(size_t i = 0 ; i < 1000; i++) printf("Inside inside of kbhit() set state cause: %X\n", cpo_reg[CAUSE]);*/ }//end of if }//end of if kbhit ReleaseMutex(hRunMutex);//unlock }//end of while prog_finished }
void StartSimulator() { std::vector<std::string> current_instruction; int r0,r1,r2,res,desination; Tomasulo tomasulo( configuration.addsub_delay, configuration.mul_delay, configuration.div_delay, configuration.instruction_q_depth, configuration.addsub_rs, configuration.muldiv_rs, configuration.load_q_depth, configuration.store_q_depth); reg[0]=0;//make reg 0 always 0 while(1) { current_instruction=commands_vector[pc]; //simulate load instruction executetime += LoadWord(PCtoAddress(pc),&desination); executetime++; if (!tomasulo.isInstQueueFull()) { tomasulo.addToQueue(current_instruction); } tomasulo.doWork(); DoWork(); instructioncount++; if(current_instruction[1]=="halt") return; if(current_instruction[1]=="j") { pc=lables_map[current_instruction[2]]; continue; } if(current_instruction[1]=="add") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); r2=GetRegNumberFromString(current_instruction[4]); reg[r0]=reg[r1]+reg[r2]; pc++; continue; } if(current_instruction[1]=="sub") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); r2=GetRegNumberFromString(current_instruction[4]); reg[r0]=reg[r1]-reg[r2]; pc++; continue; } if(current_instruction[1]=="mul") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); r2=GetRegNumberFromString(current_instruction[4]); reg[r0]=reg[r1]*reg[r2]; pc++; continue; } if(current_instruction[1]=="div") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); r2=GetRegNumberFromString(current_instruction[4]); reg[r0]=reg[r1]/reg[r2]; pc++; continue; } if(current_instruction[1]=="slt") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); r2=GetRegNumberFromString(current_instruction[4]); reg[r0]=reg[r1]<reg[r2]?1:0; pc++; continue; } if(current_instruction[1]=="addi") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); res=MyAtoi(current_instruction[4]); reg[r0]=reg[r1]+res; pc++; continue; } if(current_instruction[1]=="subi") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); res=MyAtoi(current_instruction[4]); reg[r0]=reg[r1]-res; pc++; continue; } if(current_instruction[1]=="slti") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); res=MyAtoi(current_instruction[4]); reg[r0]=reg[r1]<res?1:0; pc++; continue; } if(current_instruction[1]=="beq") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); if(reg[r0]==reg[r1]) { pc=lables_map[current_instruction[4]]; continue; } pc++; continue; } if(current_instruction[1]=="bne") { r0=GetRegNumberFromString(current_instruction[2]); r1=GetRegNumberFromString(current_instruction[3]); if(reg[r0]!=reg[r1]) { pc=lables_map[current_instruction[4]]; continue; } pc++; continue; } if(current_instruction[1]=="lw") { r0=GetRegNumberFromString(current_instruction[2]); res=GetOffset(current_instruction[3]); r1=GetRegNumberFromString(current_instruction[3].substr(current_instruction[3].find_first_of(")")+1,std::string::npos)); executetime += LoadWord((reg[r1]+res)/4,®[r0]); pc++; continue; } if(current_instruction[1]=="sw") { r0=GetRegNumberFromString(current_instruction[2]); res=GetOffset(current_instruction[3]); r1=GetRegNumberFromString(current_instruction[3].substr(current_instruction[3].find_first_of(")")+1,std::string::npos)); executetime += StoreWord((reg[r1]+res)/4,®[r0]); pc++; continue; } printf("unknown instruction\n"); exit(1); } }