--- xmil/io/fdc.c 2004/08/11 13:53:53 1.8 +++ xmil/io/fdc.c 2004/08/12 17:57:36 1.12 @@ -13,19 +13,20 @@ static const UINT8 fdctype[] = {1,1,1,1,1,1,1,1,2,2,2,2,3,4,3,3}; -void nvitem_fdcbusy(UINT id) { +void neitem_fdcbusy(UINT id) { fdc.s.busy = FALSE; if (fdc.s.bufdir) { TRACEOUT(("dma ready!")); - dma.DMA_REDY = 0; + dmac_sendready(TRUE); } + (void)id; } static void setbusy(UINT clock) { fdc.s.busy = TRUE; - nevent_set(NEVENT_FDC, clock, nvitem_fdcbusy, NEVENT_ABSOLUTE); + nevent_set(NEVENT_FDC, clock, neitem_fdcbusy, NEVENT_ABSOLUTE); } static REG8 getstat(void) { @@ -130,6 +131,7 @@ static REG8 type2cmd(REG8 sc) { fdc.s.bufmark = fdc.s.cmd & 1; fdc.s.bufpos = 0; fdc.s.bufsize = size; + fdc.s.curtime = 0; return(stat); } @@ -169,6 +171,7 @@ static REG8 crccmd(void) { fdc.s.bufsize = 0; } fdc.s.bufwrite = FALSE; + fdc.s.curtime = 0; return(stat); } @@ -181,6 +184,7 @@ static void bufposinc(void) { return; } fdc.s.bufpos++; + fdc.s.curtime = 0; if (fdc.s.bufpos >= fdc.s.bufsize) { r = FALSE; if (fdc.s.type == 2) { @@ -208,8 +212,8 @@ static void bufposinc(void) { } } if (!r) { - dma.DMA_REDY = 8; fdc.s.bufdir = FDCDIR_NONE; + dmac_sendready(FALSE); } } } @@ -221,7 +225,7 @@ void IOOUTCALL fdc_o(UINT port, REG8 val if ((port & (~7)) != 0x0ff8) { return; } - TRACEOUT(("fdc %.4x,%.2x [%.4x]", port, value, Z80_PC)); +// TRACEOUT(("fdc %.4x,%.2x [%.4x]", port, value, Z80_PC)); switch(port & 7) { case 0: // コマンド fdc.s.cmd = value; @@ -232,12 +236,16 @@ void IOOUTCALL fdc_o(UINT port, REG8 val fdc.s.stat = type2flash(); } fdc.s.bufdir = FDCDIR_NONE; + // リストアコマンドにおいて + //  マリオは コマンド発行後にbusyを見張る + //  逆にソーサリアンとかは busyだとエラーになる… + // 条件は何? setbusy(20); switch(cmd) { case 0x00: // リストア - if (value & 8) { // LAYDOCK - setbusy(0); - } + // if (value & 8) { // LAYDOCK + // setbusy(0); + // } fdc.s.motor = 0x80; // モーターOn? fdc.s.c = 0; fdc.s.step = 1; @@ -301,7 +309,7 @@ void IOOUTCALL fdc_o(UINT port, REG8 val case 0x0d: // フォースインタラプト setbusy(0); // 必要ない? // fdc.s.skip = 0; // 000330 - dma.DMA_REDY = 8; // ver0.25 + dmac_sendready(FALSE); break; case 0x0e: // リードトラック @@ -377,20 +385,18 @@ REG8 IOINPCALL fdc_i(UINT port) { if (ret) { return(ret); } -#if 0 - if (fdc.s.type == 2) { - if (last_r == _fdc.r && last_off == fdc.off && - !(--timeoutwait)) { - inc_off(); - timeoutwait = 4; +#if 1 + if (fdc.s.bufdir) { // YsII + fdc.s.curtime++; + if (fdc.s.curtime >= 8) { + fdc.s.stat |= 0x04; + bufposinc(); } - last_r = _fdc.r; - last_off = fdc.off; - } // Read Write時のみの変化でいい筈 + } #endif ret = getstat(); if (!(ret & 0x02)) { - dma.DMA_REDY = 8; + dmac_sendready(FALSE); } return(ret); @@ -433,5 +439,6 @@ void fdc_reset(void) { FDDMTR_INIT; ZeroMemory(&fdc, sizeof(fdc)); fdc.s.step = 1; + fdc.s.equip = xmilcfg.fddequip; }