Diff for /xmil/io/fdc.c between versions 1.22 and 1.23

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) {
   

Removed from v.1.22  
changed lines
  Added in v.1.23


RetroPC.NET-CVS <cvs@retropc.net>