Diff for /np2/bios/bios1b.c between versions 1.13 and 1.16

version 1.13, 2004/01/23 15:05:04 version 1.16, 2004/01/29 09:41:49
Line 9 Line 9
 #include        "fddfile.h"  #include        "fddfile.h"
 #include        "fdd_mtr.h"  #include        "fdd_mtr.h"
 #include        "sxsi.h"  #include        "sxsi.h"
 #include        "timing.h"  
   
   
 enum {  enum {
Line 24  static UINT mtr_r = 0; Line 23  static UINT mtr_r = 0;
   
 // ---- FDD  // ---- FDD
   
   static void setfdcmode(REG8 drv, REG8 type, REG8 rpm) {
   
           if (drv < 4) {
                   fdc.chgreg = type;
                   fdc.rpm[drv] = rpm;
                   if (type & 2) {
                           CTRL_FDMEDIA = DISKTYPE_2HD;
                   }
                   else {
                           CTRL_FDMEDIA = DISKTYPE_2DD;
                   }
           }
   }
   
 void fddbios_equip(REG8 type, BOOL clear) {  void fddbios_equip(REG8 type, BOOL clear) {
   
         REG16   diskequip;          REG16   diskequip;
Line 32  void fddbios_equip(REG8 type, BOOL clear Line 45  void fddbios_equip(REG8 type, BOOL clear
         if (clear) {          if (clear) {
                 diskequip &= 0x0f00;                  diskequip &= 0x0f00;
         }          }
         if (type == DISKTYPE_2HD) {          if (type & 1) {
                   diskequip &= 0xfff0;
                 diskequip |= 0x0003;                  diskequip |= 0x0003;
         }          }
         if (type == DISKTYPE_2DD) {          else {
                   diskequip &= 0xf0ff;
                 diskequip |= 0x0300;                  diskequip |= 0x0300;
         }          }
         SETBIOSMEM16(MEMW_DISK_EQUIP, diskequip);          SETBIOSMEM16(MEMW_DISK_EQUIP, diskequip);
Line 84  static BOOL biosfd_seek(REG8 track, BOOL Line 99  static BOOL biosfd_seek(REG8 track, BOOL
         return(SUCCESS);          return(SUCCESS);
 }  }
   
 static UINT16 fdfmt_biospara(REG8 fmt, REG8 rpm) {                                      // ver0.31  static UINT16 fdfmt_biospara(REG8 type, REG8 rpm, REG8 fmt) {
   
         UINT    seg;          UINT    seg;
         UINT    off;          UINT    off;
Line 94  static UINT16 fdfmt_biospara(REG8 fmt, R Line 109  static UINT16 fdfmt_biospara(REG8 fmt, R
         if (n >= 4) {          if (n >= 4) {
                 n = 3;                  n = 3;
         }          }
         if (CTRL_FDMEDIA == DISKTYPE_2HD) {          if (type & 2) {
                 seg = GETBIOSMEM16(MEMW_F2HD_P_SEG);                  seg = GETBIOSMEM16(MEMW_F2HD_P_SEG);
                 off = GETBIOSMEM16(MEMW_F2HD_P_OFF);                  off = GETBIOSMEM16(MEMW_F2HD_P_OFF);
         }          }
Line 117  static UINT16 fdfmt_biospara(REG8 fmt, R Line 132  static UINT16 fdfmt_biospara(REG8 fmt, R
         return(i286_memword_read(seg, off));          return(i286_memword_read(seg, off));
 }  }
   
 static void change_rpm(REG8 rpm) {                                                                      // ver0.31  
   
         if (np2cfg.usefd144) {  
                 fdc.rpm = rpm;  
         }  
 }  
   
   
   
 enum {  enum {
         FDCBIOS_NORESULT,          FDCBIOS_NORESULT,
Line 262  static void b0clr(void) { Line 269  static void b0clr(void) {
 }  }
 #endif  #endif
   
 static REG8 fdd_operate(REG8 type, BOOL ndensity, REG8 rpm) {           // ver0.31  static REG8 fdd_operate(REG8 type, REG8 rpm, BOOL ndensity) {
   
         REG8    ret_ah = 0x60;          REG8    ret_ah = 0x60;
         UINT16  size;          UINT16  size;
Line 279  static REG8 fdd_operate(REG8 type, BOOL  Line 286  static REG8 fdd_operate(REG8 type, BOOL 
         mtr_c = 0xff;          mtr_c = 0xff;
         mtr_r = 0;          mtr_r = 0;
   
   
         // とりあえずBIOSの時は無視する          // とりあえずBIOSの時は無視する
         fdc.mf = 0xff;                                          // ver0.29          fdc.mf = 0xff;                                          // ver0.29
   
 //      TRACE_("int 1Bh", CPU_AH);  //      TRACE_("int 1Bh", CPU_AH);
   
         change_rpm(rpm);                                                                                                // ver0.31          setfdcmode(CPU_AL & 3, type, rpm);
   
         if ((CPU_AH & 0x0f) != 0x0a) {          if ((CPU_AH & 0x0f) != 0x0a) {
                 fdc.crcn = 0;                  fdc.crcn = 0;
         }          }
         if ((CPU_AH & 0x0f) != 0x03) {          if ((CPU_AH & 0x0f) != 0x03) {
                 CTRL_FDMEDIA = type;                  if (type & 2) {
                 switch(type) {                          if (pic.pi[1].imr & PIC_INT42) {
                         case DISKTYPE_2HD:                                  return(0x40);
                                 if (pic.pi[1].imr & PIC_INT42) {                          }
                                         return(0xd0);                  }
                                 }                  else {
                                 break;                          if (pic.pi[1].imr & PIC_INT41) {
                         case DISKTYPE_2DD:                                  return(0x40);
                                 if (pic.pi[1].imr & PIC_INT41) {                          }
                                         return(0xd0);  
                                 }  
                                 break;  
                 }                  }
                 if (fdc.us != (CPU_AL & 0x03)) {                  if (fdc.us != (CPU_AL & 0x03)) {
                         fdc.us = CPU_AL & 0x03;                          fdc.us = CPU_AL & 0x03;
Line 359  static REG8 fdd_operate(REG8 type, BOOL  Line 363  static REG8 fdd_operate(REG8 type, BOOL 
                                 }                                  }
                         }                          }
                         biosfd_setchrn();                          biosfd_setchrn();
                         para = fdfmt_biospara(0, rpm);                          para = fdfmt_biospara(type, rpm, 0);
                         if (!para) {                          if (!para) {
                                 ret_ah = 0xd0;                                  ret_ah = 0xd0;
                                 break;                                  break;
Line 448  static REG8 fdd_operate(REG8 type, BOOL  Line 452  static REG8 fdd_operate(REG8 type, BOOL 
                                 }                                  }
                         }                          }
                         biosfd_setchrn();                          biosfd_setchrn();
                         para = fdfmt_biospara(0, rpm);                          para = fdfmt_biospara(type, rpm, 0);
                         if (!para) {                          if (!para) {
                                 ret_ah = 0xd0;                                  ret_ah = 0xd0;
                                 break;                                  break;
Line 513  static REG8 fdd_operate(REG8 type, BOOL  Line 517  static REG8 fdd_operate(REG8 type, BOOL 
                                 }                                  }
                         }                          }
                         biosfd_setchrn();                          biosfd_setchrn();
                         para = fdfmt_biospara(0, rpm);                          para = fdfmt_biospara(type, rpm, 0);
                         if (!para) {                          if (!para) {
                                 ret_ah = 0xd0;                                  ret_ah = 0xd0;
                                 break;                                  break;
Line 634  static REG8 fdd_operate(REG8 type, BOOL  Line 638  static REG8 fdd_operate(REG8 type, BOOL 
                         }                          }
                         fdc.d = CPU_DL;                          fdc.d = CPU_DL;
                         fdc.N = CPU_CH;                          fdc.N = CPU_CH;
                         para = fdfmt_biospara(1, rpm);                          para = fdfmt_biospara(type, rpm, 1);
                         if (!para) {                          if (!para) {
                                 ret_ah = 0xd0;                                  ret_ah = 0xd0;
                                 break;                                  break;
Line 646  static REG8 fdd_operate(REG8 type, BOOL  Line 650  static REG8 fdd_operate(REG8 type, BOOL 
                                 i286_memstr_read(CPU_ES, pos, ID, 4);                                  i286_memstr_read(CPU_ES, pos, ID, 4);
                                 fdd_formating(ID);                                  fdd_formating(ID);
                                 pos += 4;                                  pos += 4;
                                   if (ID[3] < 8) {
                                           mtr_r += 128 << ID[3];
                                   }
                                   else {
                                           mtr_r += 128 << 8;
                                   }
                         }                          }
                         ret_ah = 0x00;                          ret_ah = 0x00;
                         break;                          break;
Line 659  static REG8 fdd_operate(REG8 type, BOOL  Line 669  static REG8 fdd_operate(REG8 type, BOOL 
   
 // -------------------------------------------------------------------- BIOS  // -------------------------------------------------------------------- BIOS
   
 static UINT16 boot_fd1(REG8 rpm) {                                                                      // ver0.31  static UINT16 boot_fd1(REG8 type, REG8 rpm) {
   
         UINT    remain;          UINT    remain;
         UINT    size;          UINT    size;
         UINT32  pos;          UINT32  pos;
         UINT16  bootseg;          UINT16  bootseg;
   
         change_rpm(rpm);                                                                                                // ver0.31          setfdcmode(fdc.us, type, rpm);
         if (biosfd_seek(0, 0)) {          if (biosfd_seek(0, 0)) {
                 return(0);                  return(0);
         }          }
Line 717  static UINT16 boot_fd(REG8 drv, REG8 typ Line 727  static UINT16 boot_fd(REG8 drv, REG8 typ
         if (drv >= 4) {          if (drv >= 4) {
                 return(0);                  return(0);
         }          }
         fdc.us = drv & 3;          fdc.us = drv;
         if (!fdd_diskready(fdc.us)) {          if (!fdd_diskready(fdc.us)) {
                 return(0);                  return(0);
         }          }
   
         // 2HD          // 2HD
         if (type & 1) {          if (type & 1) {
                 CTRL_FDMEDIA = DISKTYPE_2HD;  
                 // 1.25MB                  // 1.25MB
                 bootseg = boot_fd1(0);                  bootseg = boot_fd1(3, 0);
                 if (bootseg) {                  if (bootseg) {
                         mem[MEMB_DISK_BOOT] = (UINT8)(0x90 + drv);                          mem[MEMB_DISK_BOOT] = (UINT8)(0x90 + drv);
                         fddbios_equip(DISKTYPE_2HD, TRUE);                          fddbios_equip(3, TRUE);
                         return(bootseg);                          return(bootseg);
                 }                  }
                 // 1.44MB                  // 1.44MB
                 bootseg = boot_fd1(1);                  bootseg = boot_fd1(3, 1);
                 if (bootseg) {                  if (bootseg) {
                         mem[MEMB_DISK_BOOT] = (UINT8)(0x30 + drv);                          mem[MEMB_DISK_BOOT] = (UINT8)(0x30 + drv);
                         fddbios_equip(DISKTYPE_2HD, TRUE);                          fddbios_equip(3, TRUE);
                         return(bootseg);                          return(bootseg);
                 }                  }
         }          }
         if (type & 2) {                                                                         // ver0.29          if (type & 2) {                                                                         // ver0.29
                 // 2DD                  // 2DD
                 CTRL_FDMEDIA = DISKTYPE_2DD;                  bootseg = boot_fd1(0, 0);
                 bootseg = boot_fd1(0);  
                 if (bootseg) {                  if (bootseg) {
                         mem[MEMB_DISK_BOOT] = (BYTE)(0x70 + drv);                          mem[MEMB_DISK_BOOT] = (BYTE)(0x70 + drv);
                         fddbios_equip(DISKTYPE_2DD, TRUE);                          fddbios_equip(0, TRUE);
                         return(bootseg);                          return(bootseg);
                 }                  }
         }          }
Line 884  void bios0x1b(void) { Line 892  void bios0x1b(void) {
   
         switch(CPU_AL & 0xf0) {          switch(CPU_AL & 0xf0) {
                 case 0x90:                  case 0x90:
                         ret_ah = fdd_operate(DISKTYPE_2HD, 0, 0);                          ret_ah = fdd_operate(3, 0, 0);
                         break;                          break;
   
                 case 0x30:                  case 0x30:
                 case 0xb0:                  case 0xb0:
                         ret_ah = fdd_operate(DISKTYPE_2HD, 0, 1);                          ret_ah = fdd_operate(3, 1, 0);
                         break;                          break;
   
                 case 0x10:                  case 0x10:
                           ret_ah = fdd_operate(1, 0, 0);
                           break;
   
                 case 0x70:                  case 0x70:
                 case 0xf0:                  case 0xf0:
                         ret_ah = fdd_operate(DISKTYPE_2DD, 0, 0);                          ret_ah = fdd_operate(0, 0, 0);
                         break;                          break;
   
                 case 0x50:                  case 0x50:
                         ret_ah = fdd_operate(DISKTYPE_2DD, 1, 0);                          ret_ah = fdd_operate(0, 0, 1);
                         break;                          break;
   
                 case 0x00:                  case 0x00:

Removed from v.1.13  
changed lines
  Added in v.1.16


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