public bool IsAfter(Instruction instr) { int indexOther = Instrs.IndexOf(instr); if (indexOther == -1) { indexOther = Instrs.Count; } return(indexOther < Index); }
public bool IsBefore(Instruction instr) { int indexOther = Instrs.IndexOf(instr); if (indexOther == -1) { indexOther = Instrs.Count; } return(Index < indexOther); }
private void _Insert(Instruction instr) { Instrs.Insert(Index, instr); }
private static void Fetch( ) { //F->D // Getf_pc if ( M_icode == Instrs.IJXX && M_Cnd == 0 ) { f_pc = M_valA; } else if ( W_icode == Instrs.IRET ) { f_pc = W_valM; } else { f_pc = F_predPC; } // IsSADR if ( InstrAddrs.Count != 0 && !InstrAddrs.Contains( f_pc ) ) { f_code = "address error"; f_stat = Stats.SADR; f_icode = Instrs.INOP; f_ifun = 0; f_rA = 8; f_rB = 8; f_predPC = 0; f_valC = 0; f_valP = 0; f_pc = 0; f_needr = 0; f_needvc = 0; return; } var addr = f_pc; var icode = (byte) ( Memory[ addr ] / 16 ); var ifun = (byte) ( Memory[ addr ] % 16 ); var instr = GetString.Instr( icode, ifun ); var operand = GetString.InstrOperand( icode, addr ); // IsSINS if ( instr.Equals( "error" ) || operand.Equals( "error" ) ) { f_code = "instruction error"; f_stat = Stats.SINS; f_icode = Instrs.INOP; f_ifun = 0; f_rA = 8; f_rB = 8; f_predPC = 0; f_valC = 0; f_valP = 0; f_pc = 0; f_needr = 0; f_needvc = 0; return; } // IsSHLT if ( icode == 1 ) { f_code = "halt"; f_stat = Stats.SHLT; f_icode = Instrs.IHALT; f_ifun = 0; f_rA = 8; f_rB = 8; f_predPC = 0; f_valC = 0; f_valP = 0; f_pc = 0; f_needr = 0; f_needvc = 0; return; } f_code = instr + " " + operand; f_stat = Stats.SAOK; f_icode = (Instrs) icode; f_ifun = ifun; var rA = (byte) ( Memory[ addr + 1 ] / 16 ); var rB = (byte) ( Memory[ addr + 1 ] % 16 ); var valc = GetBytesArray( addr + 2 ); var vald = GetBytesArray( addr + 1 ); // dest of JXX and CALL if ( f_icode == Instrs.IRRMOVL || f_icode == Instrs.IOPL || f_icode == Instrs.IPUSHL || f_icode == Instrs.IPOPL || f_icode == Instrs.IIRMOVL || f_icode == Instrs.IRMMOVL || f_icode == Instrs.IMRMOVL ) { f_needr = 1; } else { f_needr = 0; } if ( f_icode == Instrs.IIRMOVL || f_icode == Instrs.IRMMOVL || f_icode == Instrs.IMRMOVL || f_icode == Instrs.IJXX || f_icode == Instrs.ICALL ) { f_needvc = 1; } else { f_needvc = 0; } if ( f_needr == 1 ) { f_rA = rA; f_rB = rB; } else { f_rA = 8; f_rB = 8; } if ( f_needvc == 1 && f_needr == 1 ) { f_valC = PipeConvert.LitEnd2I( valc ); } else if ( f_needvc == 1 && f_needr == 0 ) { f_valC = PipeConvert.LitEnd2I( vald ); } else { f_valC = 0; } if ( f_needvc == 1 && f_needr == 1 ) { f_valP = f_pc + 6; } else if ( f_needvc == 1 && f_needr == 0 ) { f_valP = f_pc + 5; } else if ( f_needvc == 0 && f_needr == 1 ) { f_valP = f_pc + 2; } else { f_valP = f_pc + 1; } if ( f_icode == Instrs.IJXX || f_icode == Instrs.ICALL ) { f_predPC = f_valC; } else { f_predPC = f_valP; } }
private static void Bubble( ) { //Stall/Bubble处理 if ( ( E_icode == Instrs.IMRMOVL || E_icode == Instrs.IPOPL ) && ( E_dstM == d_srcA || E_dstM == d_srcB ) ) { D_stall = 1; } else { D_stall = 0; } if ( ( E_icode == Instrs.IMRMOVL || E_icode == Instrs.IPOPL ) && ( E_dstM == d_srcA || E_dstM == d_srcB ) || ( D_icode == Instrs.IRET || E_icode == Instrs.IRET || M_icode == Instrs.IRET ) ) { F_stall = 1; } else { F_stall = 0; } if ( m_stat != Stats.SAOK || W_stat != Stats.SAOK ) { M_bubble = 1; } else { M_bubble = 0; } if ( ( E_icode == Instrs.IJXX && e_Cnd == 0 ) || ( E_icode == Instrs.IMRMOVL || E_icode == Instrs.IPOPL ) && ( E_dstM == d_srcA || E_dstM == d_srcB ) ) { E_bubble = 1; } else { E_bubble = 0; } if ( ( E_icode == Instrs.IJXX && e_Cnd == 0 ) || !( ( E_icode == Instrs.IMRMOVL || E_icode == Instrs.IPOPL ) && ( E_dstM == d_srcA || E_dstM == d_srcB ) ) && ( D_icode == Instrs.IRET || E_icode == Instrs.IRET || M_icode == Instrs.IRET ) ) { D_bubble = 1; } else { D_bubble = 0; } if ( D_stall == 1 ) { d_code = E_code; d_stat = E_stat; d_icode = E_icode; d_ifun = E_ifun; d_valC = E_valC; d_valA = E_valA; d_valB = E_valB; d_dstE = E_dstE; d_dstM = E_dstM; d_srcA = E_srcA; d_srcB = E_srcB; } if ( F_stall == 1 ) { f_code = D_code; f_stat = D_stat; f_icode = D_icode; f_ifun = D_ifun; f_rA = D_rA; f_rB = D_rB; f_valC = D_valC; f_valP = D_valP; f_predPC = F_predPC; } if ( M_bubble == 1 ) { e_code = "bubble"; e_stat = Stats.SAOK; e_icode = Instrs.INOP; e_ifun = 0; e_valC = 0; e_valA = 0; e_valB = 0; e_dstE = 8; e_dstM = 8; e_srcA = 8; e_srcB = 8; e_Cnd = 0; e_valE = 0; e_alufun = 0; e_aluA = 0; e_aluB = 0; e_setcc = 0; } if ( E_bubble == 1 ) { d_code = "bubble"; d_stat = Stats.SAOK; d_icode = Instrs.INOP; d_ifun = 0; d_rA = 8; d_rB = 8; d_valC = 0; d_valP = 0; d_valA = 0; d_valB = 0; d_srcA = 8; d_srcB = 8; d_dstE = 8; d_dstM = 8; d_rvalA = 0; d_rvalB = 0; } if ( D_bubble == 1 ) { f_code = "bubble"; f_stat = Stats.SAOK; f_icode = Instrs.INOP; f_ifun = 0; f_rA = 8; f_rB = 8; f_predPC = 0; f_valC = 0; f_valP = 0; f_pc = 0; f_needr = 0; f_needvc = 0; } }
public static void Init( ) { Cycle = 0; zf = 0; sf = 0; of = 0; InstrAddrs.Clear( ); for ( var i = 0; i < 9; i++ ) { Registers[ i ] = 0; } F_predPC = 0; f_stat = Stats.SAOK; f_icode = Instrs.INOP; f_ifun = 0; f_rA = 8; f_rB = 8; f_predPC = 0; f_valC = 0; f_valP = 0; f_pc = 0; f_needr = 0; f_needvc = 0; D_stat = Stats.SAOK; D_icode = Instrs.INOP; D_ifun = 0; D_rA = 8; D_rB = 8; D_valC = 0; D_valP = 0; D_code = "nop"; d_stat = Stats.SAOK; d_icode = Instrs.INOP; d_ifun = 0; d_rA = 8; d_rB = 8; d_valC = 0; d_valP = 0; d_valA = 0; d_valB = 0; d_srcA = 8; d_srcB = 8; d_dstE = 8; d_dstM = 8; d_rvalA = 0; d_rvalB = 0; E_stat = Stats.SAOK; E_icode = Instrs.INOP; E_ifun = 0; E_valC = 0; E_valA = 0; E_valB = 0; E_dstE = 8; E_dstM = 8; E_srcA = 8; E_srcB = 8; E_code = "nop"; e_stat = Stats.SAOK; e_icode = Instrs.INOP; e_ifun = 0; e_valC = 0; e_valA = 0; e_valB = 0; e_dstE = 8; e_dstM = 8; e_srcA = 8; e_srcB = 8; e_Cnd = 0; e_valE = 0; e_alufun = 0; e_aluA = 0; e_aluB = 0; e_setcc = 0; M_stat = Stats.SAOK; M_icode = Instrs.INOP; M_Cnd = 0; M_valE = 0; M_valA = 0; M_dstE = 8; M_dstM = 8; M_code = "nop"; m_stat = Stats.SAOK; m_icode = Instrs.INOP; m_valE = 0; m_valA = 0; m_dstE = 8; m_dstM = 8; m_addr = 0; m_valM = 0; m_Memread = 0; m_Memwrite = 0; W_stat = Stats.SAOK; W_icode = Instrs.INOP; W_valE = 0; W_valM = 0; W_dstE = 8; W_dstM = 8; W_code = "nop"; w_stat = Stats.SAOK; }