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)); } }