예제 #1
0
        public bool IsAfter(Instruction instr)
        {
            int indexOther = Instrs.IndexOf(instr);

            if (indexOther == -1)
            {
                indexOther = Instrs.Count;
            }
            return(indexOther < Index);
        }
예제 #2
0
        public bool IsBefore(Instruction instr)
        {
            int indexOther = Instrs.IndexOf(instr);

            if (indexOther == -1)
            {
                indexOther = Instrs.Count;
            }
            return(Index < indexOther);
        }
예제 #3
0
 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;
        }