|
|
| version 1.22, 2005/02/13 22:27:53 | version 1.23, 2008/06/02 20:07:31 |
|---|---|
| Line 36 static const UINT8 fdctype[] = { | Line 36 static const UINT8 fdctype[] = { |
| FDCCTYPE_CMD3}; | FDCCTYPE_CMD3}; |
| // write track | /* write track */ |
| #if !defined(CONST_DISKIMAGE) | #if !defined(CONST_DISKIMAGE) |
| enum { | enum { |
| Line 183 static void wrtrkdata(FDC *f, REG8 data) | Line 183 static void wrtrkdata(FDC *f, REG8 data) |
| } | } |
| break; | break; |
| case TAO_MODE_DATA: // DATA WRITE | case TAO_MODE_DATA: /* DATA WRITE */ |
| if ((f->s.wt_ptr == 0) && | if ((f->s.wt_ptr == 0) && |
| ((data == TAO_CMD_DAM) || (data == TAO_CMD_DDAM))) { | ((data == TAO_CMD_DAM) || (data == TAO_CMD_DDAM))) { |
| break; | break; |
| Line 217 wtd_err: | Line 217 wtd_err: |
| #endif | #endif |
| // ---- | /* ---- */ |
| void neitem_fdcbusy(UINT id) { | void neitem_fdcbusy(UINT id) { |
| fdc.s.busy = 0; | fdc.s.busy = 0; |
| if (fdc.s.bufdir) { | if (fdc.s.bufdir) { |
| // TRACEOUT(("dma ready!")); | /* TRACEOUT(("dma ready!")); */ |
| dmac_sendready(TRUE); | dmac_sendready(TRUE); |
| } | } |
| (void)id; | (void)id; |
| Line 297 static SINT32 motorwait(const FDC *f) { | Line 297 static SINT32 motorwait(const FDC *f) { |
| curclock -= f->s.motorclock[f->s.drv]; | curclock -= f->s.motorclock[f->s.drv]; |
| if (curclock < (SINT32)pccore.realclock) { | if (curclock < (SINT32)pccore.realclock) { |
| nextclock = pccore.realclock - curclock; | nextclock = pccore.realclock - curclock; |
| // TRACEOUT(("motor starting busy %d", nextclock)); | /* TRACEOUT(("motor starting busy %d", nextclock)); */ |
| return(nextclock); | return(nextclock); |
| } | } |
| } | } |
| Line 436 static REG8 type2cmd(FDC *f, REG8 sc) { | Line 436 static REG8 type2cmd(FDC *f, REG8 sc) { |
| if (nextclock < 0) { | if (nextclock < 0) { |
| nextclock += f->s.loopclock; | nextclock += f->s.loopclock; |
| } | } |
| // TRACEOUT(("wait clock -> %d [%d/%d]", nextclock, | /* TRACEOUT(("wait clock -> %d [%d/%d]", nextclock, |
| // LOW16(secinfo), LOW16(secinfo >> 16))); | LOW16(secinfo), LOW16(secinfo >> 16))); */ |
| clock += nextclock; | clock += nextclock; |
| } | } |
| #endif | #endif |
| Line 479 static REG8 crccmd(FDC *f) { | Line 479 static REG8 crccmd(FDC *f) { |
| track = (f->s.c << 1) + f->s.h; | track = (f->s.c << 1) + f->s.h; |
| fdd = fddfile + f->s.drv; | fdd = fddfile + f->s.drv; |
| // TRACEOUT(("fdd->crc %d %d %d", f->s.drv, track, f->s.crcnum)); | /* TRACEOUT(("fdd->crc %d %d %d", f->s.drv, track, f->s.crcnum)); */ |
| stat = fdd->crc(fdd, f->s.media, track, f->s.crcnum, crcbuf); | stat = fdd->crc(fdd, f->s.media, track, f->s.crcnum, crcbuf); |
| if (stat & FDDSTAT_RECNFND) { | if (stat & FDDSTAT_RECNFND) { |
| f->s.crcnum = 0; | f->s.crcnum = 0; |
| Line 540 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 540 void IOOUTCALL fdc_o(UINT port, REG8 val |
| } | } |
| TRACEOUT(("fdc %.4x,%.2x [%.4x]", port, value, Z80_PC)); | TRACEOUT(("fdc %.4x,%.2x [%.4x]", port, value, Z80_PC)); |
| switch(port & 7) { | switch(port & 7) { |
| case 0: // コマンド | case 0: /* コマンド */ |
| if (fdc.s.bufwrite) { | if (fdc.s.bufwrite) { |
| fdc.s.stat = type2flash(&fdc); | fdc.s.stat = type2flash(&fdc); |
| } | } |
| Line 552 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 552 void IOOUTCALL fdc_o(UINT port, REG8 val |
| fdc.s.cmd = value; | fdc.s.cmd = value; |
| cmd = (REG8)(value >> 4); | cmd = (REG8)(value >> 4); |
| fdc.s.ctype = fdctype[cmd]; | fdc.s.ctype = fdctype[cmd]; |
| // TRACEOUT(("fdc cmd: %.2x", value)); | /* TRACEOUT(("fdc cmd: %.2x", value)); */ |
| // リストアコマンドにおいて | /* リストアコマンドにおいて |
| // マリオは コマンド発行後にbusyを見張る | * マリオは コマンド発行後にbusyを見張る |
| // 逆にソーサリアンとかは busyだとエラーになる… | * 逆にソーサリアンとかは busyだとエラーになる… |
| // 条件は何? | * 条件は何? |
| */ | |
| setbusy(&fdc, 20); | setbusy(&fdc, 20); |
| switch(cmd) { | switch(cmd) { |
| case 0x00: // リストア | case 0x00: /* リストア */ |
| fdc.s.motor = 0x80; // モーターOn? | fdc.s.motor = 0x80; /* モーターOn? */ |
| fdc.s.c = 0; | fdc.s.c = 0; |
| fdc.s.step = 1; | fdc.s.step = 1; |
| fdc.s.r = 0; // デゼニワールド | fdc.s.r = 0; /* デゼニワールド */ |
| seekcmd(&fdc); | seekcmd(&fdc); |
| fdc.s.rreg = 0; | fdc.s.rreg = 0; |
| break; | break; |
| case 0x01: // シーク | case 0x01: /* シーク */ |
| fdc.s.motor = 0x80; // モーターOn | fdc.s.motor = 0x80; /* モーターOn */ |
| fdc.s.step = (SINT8)((fdc.s.c<=fdc.s.data)?1:-1); | fdc.s.step = (SINT8)((fdc.s.c<=fdc.s.data)?1:-1); |
| fdc.s.c = fdc.s.data; | fdc.s.c = fdc.s.data; |
| seekcmd(&fdc); | seekcmd(&fdc); |
| break; | break; |
| case 0x02: // ステップ | case 0x02: /* ステップ */ |
| case 0x03: | case 0x03: |
| case 0x04: // ステップイン | case 0x04: /* ステップイン */ |
| case 0x05: | case 0x05: |
| case 0x06: // ステップアウト | case 0x06: /* ステップアウト */ |
| case 0x07: | case 0x07: |
| fdc.s.stat = FDDSTAT_HEADENG; | fdc.s.stat = FDDSTAT_HEADENG; |
| if (fdc.s.motor) { | if (fdc.s.motor) { |
| Line 593 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 594 void IOOUTCALL fdc_o(UINT port, REG8 val |
| } | } |
| break; | break; |
| case 0x08: // リードデータ | case 0x08: /* リードデータ */ |
| case 0x09: | case 0x09: |
| case 0x0a: // ライトデータ | case 0x0a: /* ライトデータ */ |
| case 0x0b: | case 0x0b: |
| fdc.s.stat = type2cmd(&fdc, fdc.s.r); | fdc.s.stat = type2cmd(&fdc, fdc.s.r); |
| break; | break; |
| case 0xc: // リードアドレス | case 0xc: /* リードアドレス */ |
| setbusy(&fdc, 200); | setbusy(&fdc, 200); |
| fdc.s.stat = crccmd(&fdc); | fdc.s.stat = crccmd(&fdc); |
| break; | break; |
| case 0x0d: // フォースインタラプト | case 0x0d: /* フォースインタラプト */ |
| setbusy(&fdc, 0); // 必要ない? | setbusy(&fdc, 0); /* 必要ない? */ |
| // fdc.s.skip = 0; // 000330 | /* fdc.s.skip = 0; */ /* 000330 */ |
| fdc.s.stat = 0; | fdc.s.stat = 0; |
| dmac_sendready(FALSE); | dmac_sendready(FALSE); |
| break; | break; |
| case 0x0e: // リードトラック | case 0x0e: /* リードトラック */ |
| #if !defined(CONST_DISKIMAGE) | #if !defined(CONST_DISKIMAGE) |
| setbusy(&fdc, 200); | setbusy(&fdc, 200); |
| ZeroMemory(fdc.s.buffer, 0x1a00); | ZeroMemory(fdc.s.buffer, 0x1a00); |
| Line 625 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 626 void IOOUTCALL fdc_o(UINT port, REG8 val |
| #endif | #endif |
| break; | break; |
| case 0x0f: // ライトトラック | case 0x0f: /* ライトトラック */ |
| #if !defined(CONST_DISKIMAGE) | #if !defined(CONST_DISKIMAGE) |
| setbusy(&fdc, 200); | setbusy(&fdc, 200); |
| fdc.s.stat = wrtrkstart(&fdc); | fdc.s.stat = wrtrkstart(&fdc); |
| Line 636 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 637 void IOOUTCALL fdc_o(UINT port, REG8 val |
| } | } |
| break; | break; |
| case 1: // トラック | case 1: /* トラック */ |
| fdc.s.creg = value; | fdc.s.creg = value; |
| break; | break; |
| case 2: // セクタ | case 2: /* セクタ */ |
| fddmtr_waitsec(value); | fddmtr_waitsec(value); |
| fdc.s.r = value; | fdc.s.r = value; |
| fdc.s.rreg = value; | fdc.s.rreg = value; |
| break; | break; |
| case 3: // データ | case 3: /* データ */ |
| fdc.s.data = value; | fdc.s.data = value; |
| #if !defined(CONST_DISKIMAGE) | #if !defined(CONST_DISKIMAGE) |
| if (fdc.s.motor) { | if (fdc.s.motor) { |
| Line 668 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 669 void IOOUTCALL fdc_o(UINT port, REG8 val |
| #endif | #endif |
| break; | break; |
| case 4: // ドライブ・サイド | case 4: /* ドライブ・サイド */ |
| fdc.s.ctbl[fdc.s.drv] = fdc.s.c; | fdc.s.ctbl[fdc.s.drv] = fdc.s.c; |
| fdc.s.c = fdc.s.ctbl[value & 0x03]; | fdc.s.c = fdc.s.ctbl[value & 0x03]; |
| fdc.s.motor = (UINT8)(value & 0x80); | fdc.s.motor = (UINT8)(value & 0x80); |
| fdc.s.drv = (UINT8)(value & 0x03); | fdc.s.drv = (UINT8)(value & 0x03); |
| fdc.s.h = (UINT8)((value >> 4) & 1); | fdc.s.h = (UINT8)((value >> 4) & 1); |
| fdc.s.cmd = 0; // T&E SORCERIAN | fdc.s.cmd = 0; /* T&E SORCERIAN */ |
| fdc.s.ctype = 0; | fdc.s.ctype = 0; |
| fdc.s.stat = 0; | fdc.s.stat = 0; |
| fddmtr_drvset(); | fddmtr_drvset(); |
| if (!fdc.s.motor) { | if (!fdc.s.motor) { |
| fdc.s.r = 0; // SACOM TELENET | fdc.s.r = 0; /* SACOM TELENET */ |
| fdc.s.rreg = 0; | fdc.s.rreg = 0; |
| } | } |
| #if defined(SUPPORT_MOTORRISEUP) | #if defined(SUPPORT_MOTORRISEUP) |
| Line 694 REG8 IOINPCALL fdc_i(UINT port) { | Line 695 REG8 IOINPCALL fdc_i(UINT port) { |
| REG8 ret; | REG8 ret; |
| // TRACEOUT(("fdc inp %.4x", port)); | /* TRACEOUT(("fdc inp %.4x", port)); */ |
| if ((port & (~7)) != 0x0ff8) { | if ((port & (~7)) != 0x0ff8) { |
| return(0xff); | return(0xff); |
| } | } |
| switch(port & 7) { | switch(port & 7) { |
| case 0: // ステータス | case 0: /* ステータス */ |
| ret = fdc.s.busy; | ret = fdc.s.busy; |
| if (ret) { | if (ret) { |
| return(ret); | return(ret); |
| } | } |
| #if 1 | #if 1 |
| if (fdc.s.bufdir >= FDCDIR_IN) { // YsII | if (fdc.s.bufdir >= FDCDIR_IN) { /* YsII */ |
| fdc.s.curtime++; | fdc.s.curtime++; |
| if (fdc.s.curtime >= 8) { | if (fdc.s.curtime >= 8) { |
| fdc.s.curtime = 0; | fdc.s.curtime = 0; |
| Line 724 REG8 IOINPCALL fdc_i(UINT port) { | Line 725 REG8 IOINPCALL fdc_i(UINT port) { |
| dmac_sendready(FALSE); | dmac_sendready(FALSE); |
| } | } |
| #endif | #endif |
| // TRACEOUT(("ret->%.2x", ret)); | /* TRACEOUT(("ret->%.2x", ret)); */ |
| return(ret); | return(ret); |
| case 1: // トラック | case 1: /* トラック */ |
| TRACEOUT(("fdc inp %.4x,%.2x", port, fdc.s.creg)); | TRACEOUT(("fdc inp %.4x,%.2x", port, fdc.s.creg)); |
| return(fdc.s.creg); | return(fdc.s.creg); |
| case 2: // セクタ | case 2: /* セクタ */ |
| TRACEOUT(("fdc inp %.4x,%.2x", port, fdc.s.rreg)); | TRACEOUT(("fdc inp %.4x,%.2x", port, fdc.s.rreg)); |
| return(fdc.s.rreg); | return(fdc.s.rreg); |
| case 3: // データ | case 3: /* データ */ |
| if (fdc.s.motor) { | if (fdc.s.motor) { |
| if (fdc.s.bufdir == FDCDIR_IN) { | if (fdc.s.bufdir == FDCDIR_IN) { |
| fdc.s.curtime = 0; | fdc.s.curtime = 0; |
| Line 744 TRACEOUT(("fdc inp %.4x,%.2x", port, fdc | Line 745 TRACEOUT(("fdc inp %.4x,%.2x", port, fdc |
| #else | #else |
| fdc.s.data = fdc.e.buffer[fdc.s.bufpos]; | fdc.s.data = fdc.e.buffer[fdc.s.bufpos]; |
| #endif | #endif |
| // TRACEOUT(("read %.2x - %.2x [%.4x]", fdc.s.bufpos, fdc.s.data, Z80_PC)); | |
| if (!fdc.s.busy) { | if (!fdc.s.busy) { |
| fdc.s.bufpos++; | fdc.s.bufpos++; |
| if (fdc.s.bufpos >= fdc.s.bufsize) { | if (fdc.s.bufpos >= fdc.s.bufsize) { |
| fdcenddata(&fdc); | fdcenddata(&fdc); |
| } | } |
| } | } |
| /* TRACEOUT(("read %.2x - %.2x [%.4x]", fdc.s.bufpos, fdc.s.data, Z80_PC)); */ | |
| } | } |
| } | } |
| return(fdc.s.data); | return(fdc.s.data); |
| case 4: // FM | case 4: /* FM */ |
| case 5: // MFM | case 5: /* MFM */ |
| return(0x00); | return(0x00); |
| case 6: // 1.6M | case 6: /* 1.6M */ |
| fdc.s.media = DISKTYPE_2HD; | fdc.s.media = DISKTYPE_2HD; |
| break; | break; |
| case 7: // 500K/1M | case 7: /* 500K/1M */ |
| fdc.s.media = DISKTYPE_2D; | fdc.s.media = DISKTYPE_2D; |
| break; | break; |
| } | } |
| Line 771 TRACEOUT(("fdc inp %.4x,%.2x", port, fdc | Line 772 TRACEOUT(("fdc inp %.4x,%.2x", port, fdc |
| } | } |
| // ---- | /* reset */ |
| void fdc_reset(void) { | void fdc_reset(void) { |