UInt8 wd2793PeekStatusReg(WD2793* wd) { UInt8 regStatus; sync(wd); regStatus = wd->regStatus; if (((wd->regCommand & 0x80) == 0) || ((wd->regCommand & 0xf0) == 0xd0)) { regStatus &= ~(ST_INDEX | ST_TRACK00 | ST_HEAD_LOADED | ST_WRITE_PROTECTED); if (diskEnabled(wd->drive)) { if (diskPresent(wd->drive)) { if ((UInt64)160 * boardSystemTime() / boardFrequency() & 0x1e) { regStatus |= ST_INDEX; } } if (wd->diskTrack == 0) { regStatus |= ST_TRACK00; } if (wd->headLoaded) { regStatus |= ST_HEAD_LOADED; } } else { regStatus |= ST_WRITE_PROTECTED; } } else { if (wd2793PeekDataRequest(wd)) { regStatus |= ST_DATA_REQUEST; } else { regStatus &= ~ST_DATA_REQUEST; } } if (diskPresent(wd->drive)) { regStatus &= ~ST_NOT_READY; } else { regStatus |= ST_NOT_READY; } return regStatus; }
static UInt8 peekIo(Microsol* rm, UInt16 ioPort) { switch (ioPort) { case 0xd0: return wd2793PeekStatusReg(rm->fdc); case 0xd1: return wd2793PeekTrackReg(rm->fdc); case 0xd2: return wd2793PeekSectorReg(rm->fdc); case 0xd3: return wd2793PeekDataReg(rm->fdc); case 0xd4: return 0x3f | (wd2793PeekIrq(rm->fdc) ? 0x80 : 0) | (wd2793PeekDataRequest(rm->fdc) ? 0 : 0x40); } return 0xff; }