コード例 #1
0
        public ushort SPEED_Read16(uint addr)
        {
            switch (addr)
            {
            case SPEED_Header.SPD_R_INTR_STAT:
                Log_Verb("SPD_R_INTR_STAT 16bit read " + regIntStat.ToString("X"));
                return(regIntStat);

            case SPEED_Header.SPD_R_INTR_MASK:
                Log_Verb("SPD_R_INTR_MASK 16bit read " + regIntrMask.ToString("X"));
                return(regIntrMask);

            case SPEED_Header.SPD_R_REV_1:
                Log_Error("SPD_R_REV_1 16bit read " + 0.ToString("X"));
                return(0);

            case SPEED_Header.SPD_R_REV_2:
                Log_Verb("STD_R_REV_1 16bit read " + regRev1.ToString("X"));
                return(regRev1);

            case SPEED_Header.SPD_R_REV_3:
                UInt16 rev3 = 0;
                if (DEV9Header.config.HddEnable)
                {
                    rev3 |= SPEED_Header.SPD_CAPS_ATA;
                }
                if (DEV9Header.config.EthEnable)
                {
                    rev3 |= SPEED_Header.SPD_CAPS_SMAP;
                }
                rev3 |= SPEED_Header.SPD_CAPS_FLASH;
                Log_Verb("SPD_R_REV_3 16bit read " + rev3.ToString("X"));
                return(rev3);

            case SPEED_Header.SPD_R_0e:
                UInt16 r0e = 0x0002;     //Have HDD inserted
                Log_Verb("SPD_R_0e 16bit read " + r0e.ToString("X"));
                return(r0e);

            case SPEED_Header.SPD_R_XFR_CTRL:
                Log_Verb("SPD_R_XFR_CTRL 16bit read " + regXFRCtrl.ToString("X"));
                return(regXFRCtrl);

            case SPEED_Header.SPD_R_DBUF_STAT:

                if (ifRead)         //Semi async
                {
                    HDDWriteFIFO(); //Yes this is not a typo
                }
                else
                {
                    HDDReadFIFO();
                }
                FIFOIntr();

                byte   count = (byte)((bytesWriteFIFO - bytesReadFIFO) / 512);
                UInt16 r38;
                if (xfrWrite)     //or ifRead?
                {
                    r38  = (byte)(SPEED_Header.SPD_DBUF_AVAIL_MAX - count);
                    r38 |= (count == 0) ? SPEED_Header.SPD_DBUF_STAT_1 : (UInt16)0;
                    r38 |= (count > 0) ? SPEED_Header.SPD_DBUF_STAT_2 : (UInt16)0;
                }
                else
                {
                    r38  = count;
                    r38 |= (count < SPEED_Header.SPD_DBUF_AVAIL_MAX) ? SPEED_Header.SPD_DBUF_STAT_1 : (UInt16)0;
                    r38 |= (count == 0) ? SPEED_Header.SPD_DBUF_STAT_2 : (UInt16)0;
                    //If overflow (HDD->SPEED), set both SPD_DBUF_STAT_2 & SPD_DBUF_STAT_FULL
                    //and overflow INTR set
                }

                if (count == SPEED_Header.SPD_DBUF_AVAIL_MAX)
                {
                    r38 |= SPEED_Header.SPD_DBUF_STAT_FULL;
                }

                Log_Verb("SPD_R_38  16bit read " + r38.ToString("X"));

                return(r38);

            case SPEED_Header.SPD_R_IF_CTRL:
                Log_Verb("SPD_R_IF_CTRL 16bit read " + regIFCtrl.ToString("X"));
                return(regIFCtrl);

            default:
                Log_Error("*Unknown 16bit read at address " + addr.ToString("x") + " value " + dev9.Dev9Ru16((int)addr).ToString("x"));
                return(dev9.Dev9Ru16((int)addr));
            }
        }