void sunriseIdeReset(SunriseIde* ide) { ide->currentDevice = 0; ide->softReset = 0; harddiskIdeReset(ide->hdide[0]); harddiskIdeReset(ide->hdide[1]); }
static void writeIo(RomMapperGIde* rm, UInt16 ioPort, UInt8 value) { switch (ioPort & 0x0f) { case 0x04: // Reserved for expansion board break; case 0x05: // RTC 72421 rtc72421Write(ioPort >> 8, value); break; case 0x06: // GIDE digital output register rm->intEnable = value & 0x01?1:0; if (value & 0x02) harddiskIdeReset(rm->hdide); break; case 0x07: // GIDE drive address register break; case 0x08: // IDE data register harddiskIdeWrite(rm->hdide, value); break; case 0x09: // IDE write precomp register harddiskIdeWriteRegister(rm->hdide, 1, value); break; case 0x0a: // IDE sector count register harddiskIdeWriteRegister(rm->hdide, 2, value); break; case 0x0b: // IDE sector number register harddiskIdeWriteRegister(rm->hdide, 3, value); break; case 0x0c: // IDE cylinder low register harddiskIdeWriteRegister(rm->hdide, 4, value); break; case 0x0d: // IDE cylinder high register harddiskIdeWriteRegister(rm->hdide, 5, value); break; case 0x0e: // IDE drive/head register rm->drvSelect = value; harddiskIdeWriteRegister(rm->hdide, 6, value); break; case 0x0f: // IDE command register harddiskIdeWriteRegister(rm->hdide, 7, value); break; } }
HarddiskIde* harddiskIdeCreate(int diskId) { HarddiskIde* hd = malloc(sizeof(HarddiskIde)); hd->diskId = diskId; hd->transferRead = 0; hd->transferWrite = 0; harddiskIdeReset(hd); return hd; }
void sunriseIdeWriteRegister(SunriseIde* ide, UInt8 reg, UInt8 value) { if (ide->softReset) { if ((reg == 14) && !(value & 0x04)) { ide->softReset = 0; } return; } if (reg == 0) { sunriseIdeWrite(ide, (value << 8) | value); return; } if ((reg == 14) && (value & 0x04)) { ide->softReset = 1; harddiskIdeReset(ide->hdide[0]); harddiskIdeReset(ide->hdide[1]); return; } if (reg == 6) { ide->currentDevice = (value >> 4) & 1; }
static void reset(RomMapperGIde* rm) { harddiskIdeReset(rm->hdide); }
static void reset(RomMapperRsIde* rm) { harddiskIdeReset(rm->hdide); i8255Reset(rm->i8255); }