| version 1.21, 2005/02/04 06:42:11 | 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 84  static REG8 wrtrkstart(FDC *f) { | Line 84  static REG8 wrtrkstart(FDC *f) { | 
 | return(0); | return(0); | 
 | } | } | 
 |  |  | 
| static void wrtrkdata(FDC *f, UINT8 data) { | static void wrtrkdata(FDC *f, REG8 data) { | 
 |  |  | 
 | TAOSEC  *t; | TAOSEC  *t; | 
 | REG8    n; | REG8    n; | 
| Line 183  static void wrtrkdata(FDC *f, UINT8 data | Line 183  static void wrtrkdata(FDC *f, UINT8 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) { | 
 |  |  |