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;
        }
    }
}
예제 #2
0
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;
}
예제 #3
0
UInt8 sunriseIdeReadRegister(SunriseIde* ide, UInt8 reg)
{
    UInt8 value;

    if (reg == 14) {
        reg = 7;
    }

    if (ide->softReset) {
        return 0x7f | (reg == 7 ? 0x80 : 0);
    }

    if (reg == 0) {
        return sunriseIdeRead(ide) & 0xFF;
    } 

    value = harddiskIdeReadRegister(ide->hdide[ide->currentDevice], reg);
    if (reg == 6) {
        value = (value & ~0x10) | (ide->currentDevice << 4);
    }
    return value;
}
예제 #4
0
UInt8 harddiskIdePeekRegister(HarddiskIde* hd, UInt8 reg)
{
    return harddiskIdeReadRegister(hd, reg);
}