static void writeA(RomMapperRsIde* rm, UInt8 value) { rm->ideAddress = value & 0x07; rm->ideIoRead = value & 0x40 ? 0:1; rm->ideIoWrite = value & 0x20 ? 0:1; if (rm->ideIoRead) { switch (rm->ideAddress) { case 0: rm->ideData = harddiskIdeRead(rm->hdide); break; default: rm->ideData = harddiskIdeReadRegister(rm->hdide, rm->ideAddress); break; } } if (rm->ideIoWrite) { switch (rm->ideAddress) { case 0: harddiskIdeWrite(rm->hdide, rm->ideData); break; default: harddiskIdeWriteRegister(rm->hdide, rm->ideAddress, (UInt8)rm->ideData); break; } } }
static UInt8 readIo(RomMapperGIde* rm, UInt16 ioPort) { switch (ioPort & 0x0f) { case 0x04: // Reserved for expansion board return 0xff; case 0x05: // RTC 72421 return rtc72421Read(ioPort >> 8); case 0x06: // GIDE alternate status return rm->altStatus; case 0x07: // GIDE drive address register return rm->drvSelect; case 0x08: // IDE data register return (UInt8)harddiskIdeRead(rm->hdide); case 0x09: // IDE error register return harddiskIdeReadRegister(rm->hdide, 1); case 0x0a: // IDE sector count register return harddiskIdeReadRegister(rm->hdide, 2); case 0x0b: // IDE sector number register return harddiskIdeReadRegister(rm->hdide, 3); case 0x0c: // IDE cylinder low register return harddiskIdeReadRegister(rm->hdide, 4); case 0x0d: // IDE cylinder high register return harddiskIdeReadRegister(rm->hdide, 5); case 0x0e: // IDE drive/head register return harddiskIdeReadRegister(rm->hdide, 6); case 0x0f: // IDE status register rm->altStatus = harddiskIdeReadRegister(rm->hdide, 7); return rm->altStatus; } return 0xff; }
UInt16 sunriseIdeRead(SunriseIde* ide) { return harddiskIdeRead(ide->hdide[ide->currentDevice]); }