| version 1.17, 2004/01/29 10:04:05 | version 1.25, 2004/03/07 23:04:50 | 
| Line 17  enum { | Line 17  enum { | 
 | }; | }; | 
 |  |  | 
 |  |  | 
 | static  BYTE    mtr_c = 0; |  | 
 | static  UINT    mtr_r = 0; |  | 
 |  |  | 
 |  |  | 
 | // ---- FDD | // ---- FDD | 
 |  |  | 
| static void setfdcmode(REG8 drv, REG8 type, REG8 rpm) { | static BOOL setfdcmode(REG8 drv, REG8 type, REG8 rpm) { | 
 |  |  | 
| if (drv < 4) { | if (drv >= 4) { | 
| fdc.chgreg = type; | return(FAILURE); | 
| fdc.rpm[drv] = rpm; |  | 
| if (type & 2) { |  | 
| CTRL_FDMEDIA = DISKTYPE_2HD; |  | 
| } |  | 
| else { |  | 
| CTRL_FDMEDIA = DISKTYPE_2DD; |  | 
| } |  | 
 | } | } | 
 |  | if ((rpm) && (!fdc.support144)) { | 
 |  | return(FAILURE); | 
 |  | } | 
 |  | fdc.chgreg = type; | 
 |  | fdc.rpm[drv] = rpm; | 
 |  | if (type & 2) { | 
 |  | CTRL_FDMEDIA = DISKTYPE_2HD; | 
 |  | } | 
 |  | else { | 
 |  | CTRL_FDMEDIA = DISKTYPE_2DD; | 
 |  | } | 
 |  | return(SUCCESS); | 
 | } | } | 
 |  |  | 
 | void fddbios_equip(REG8 type, BOOL clear) { | void fddbios_equip(REG8 type, BOOL clear) { | 
| Line 47  void fddbios_equip(REG8 type, BOOL clear | Line 48  void fddbios_equip(REG8 type, BOOL clear | 
 | } | } | 
 | if (type & 1) { | if (type & 1) { | 
 | diskequip &= 0xfff0; | diskequip &= 0xfff0; | 
| diskequip |= 0x0003; | diskequip |= (fdc.equip & 0x0f); | 
 | } | } | 
 | else { | else { | 
| diskequip &= 0xf0ff; | diskequip &= 0x0fff; | 
| diskequip |= 0x0300; | diskequip |= (fdc.equip & 0x0f) << 12; | 
 | } | } | 
 | SETBIOSMEM16(MEMW_DISK_EQUIP, diskequip); | SETBIOSMEM16(MEMW_DISK_EQUIP, diskequip); | 
 | } | } | 
| Line 92  static BOOL biosfd_seek(REG8 track, BOOL | Line 93  static BOOL biosfd_seek(REG8 track, BOOL | 
 | } | } | 
 | } | } | 
 | fdc.ncn = track; | fdc.ncn = track; | 
 | mtr_c = track; |  | 
 | if (fdd_seek()) { | if (fdd_seek()) { | 
 | return(FAILURE); | return(FAILURE); | 
 | } | } | 
| Line 121  static UINT16 fdfmt_biospara(REG8 type, | Line 121  static UINT16 fdfmt_biospara(REG8 type, | 
 | off = 0x2361;                                                                   // see bios.cpp | off = 0x2361;                                                                   // see bios.cpp | 
 | } | } | 
 | off += fdc.us * 2; | off += fdc.us * 2; | 
| off = i286_memword_read(seg, off); | off = MEML_READ16(seg, off); | 
 | off += n * 8; | off += n * 8; | 
 | if (!(CPU_AH & 0x40)) { | if (!(CPU_AH & 0x40)) { | 
 | off += 4; | off += 4; | 
| Line 129  static UINT16 fdfmt_biospara(REG8 type, | Line 129  static UINT16 fdfmt_biospara(REG8 type, | 
 | if (fmt) { | if (fmt) { | 
 | off += 2; | off += 2; | 
 | } | } | 
| return(i286_memword_read(seg, off)); | return(MEML_READ16(seg, off)); | 
 | } | } | 
 |  |  | 
 |  |  | 
| Line 293  static REG8 fdd_operate(REG8 type, REG8 | Line 293  static REG8 fdd_operate(REG8 type, REG8 | 
 | BYTE    hd; | BYTE    hd; | 
 | int             result = FDCBIOS_NORESULT; | int             result = FDCBIOS_NORESULT; | 
 | UINT32  addr; | UINT32  addr; | 
 |  | UINT8   mtr_c; | 
 |  | UINT    mtr_r; | 
 |  |  | 
| mtr_c = 0xff; | mtr_c = fdc.ncn; | 
 | mtr_r = 0; | mtr_r = 0; | 
 |  |  | 
 | // とりあえずBIOSの時は無視する | // とりあえずBIOSの時は無視する | 
| Line 302  static REG8 fdd_operate(REG8 type, REG8 | Line 304  static REG8 fdd_operate(REG8 type, REG8 | 
 |  |  | 
 | //      TRACE_("int 1Bh", CPU_AH); | //      TRACE_("int 1Bh", CPU_AH); | 
 |  |  | 
| setfdcmode((REG8)(CPU_AL & 3), type, rpm); | if (setfdcmode((REG8)(CPU_AL & 3), type, rpm) != SUCCESS) { | 
|  | return(0x40); | 
|  | } | 
 |  |  | 
 | if ((CPU_AH & 0x0f) != 0x0a) { | if ((CPU_AH & 0x0f) != 0x0a) { | 
 | fdc.crcn = 0; | fdc.crcn = 0; | 
| Line 333  static REG8 fdd_operate(REG8 type, REG8 | Line 337  static REG8 fdd_operate(REG8 type, REG8 | 
 | return(0x68);                   // 新センスは 両用ドライブ情報も | return(0x68);                   // 新センスは 両用ドライブ情報も | 
 | } | } | 
 | if (CPU_AH == 0xc4) {                                                           // ver0.31 | if (CPU_AH == 0xc4) {                                                           // ver0.31 | 
| if (np2cfg.usefd144) { | if (fdc.support144) { | 
 | return(0x6c); | return(0x6c); | 
 | } | } | 
 | return(0x68); | return(0x68); | 
| Line 444  static REG8 fdd_operate(REG8 type, REG8 | Line 448  static REG8 fdd_operate(REG8 type, REG8 | 
 | } | } | 
 | if (CPU_AH & 0x80) {                            // ver0.30 | if (CPU_AH & 0x80) {                            // ver0.30 | 
 | ret_ah |= 8;                                    // 1MB/640KB両用ドライブ | ret_ah |= 8;                                    // 1MB/640KB両用ドライブ | 
| if ((CPU_AH & 0x40) && | if ((CPU_AH & 0x40) && (fdc.support144)) { | 
| (np2cfg.usefd144)) {            // ver0.31 |  | 
 | ret_ah |= 4;                            // 1.44対応ドライブ | ret_ah |= 4;                            // 1.44対応ドライブ | 
 | } | } | 
 | } | } | 
| Line 488  static REG8 fdd_operate(REG8 type, REG8 | Line 491  static REG8 fdd_operate(REG8 type, REG8 | 
 | else { | else { | 
 | accesssize = size; | accesssize = size; | 
 | } | } | 
| i286_memx_read(addr, fdc.buf, accesssize); | MEML_READ(addr, fdc.buf, accesssize); | 
 | if (fdd_write()) { | if (fdd_write()) { | 
 | break; | break; | 
 | } | } | 
| Line 557  static REG8 fdd_operate(REG8 type, REG8 | Line 560  static REG8 fdd_operate(REG8 type, REG8 | 
 | if (fdd_read()) { | if (fdd_read()) { | 
 | break; | break; | 
 | } | } | 
| i286_memx_write(addr, fdc.buf, accesssize); | MEML_WRITE(addr, fdc.buf, accesssize); | 
 | addr += accesssize; | addr += accesssize; | 
 | size -= accesssize; | size -= accesssize; | 
 | mtr_r += accesssize;                                            // ver0.26 | mtr_r += accesssize;                                            // ver0.26 | 
| Line 658  static REG8 fdd_operate(REG8 type, REG8 | Line 661  static REG8 fdd_operate(REG8 type, REG8 | 
 | fdd_formatinit(); | fdd_formatinit(); | 
 | pos = CPU_BP; | pos = CPU_BP; | 
 | for (s=0; s<fdc.sc; s++) { | for (s=0; s<fdc.sc; s++) { | 
| i286_memstr_read(CPU_ES, pos, ID, 4); | MEML_READSTR(CPU_ES, pos, ID, 4); | 
 | fdd_formating(ID); | fdd_formating(ID); | 
 | pos += 4; | pos += 4; | 
 | if (ID[3] < 8) { | if (ID[3] < 8) { | 
| Line 672  static REG8 fdd_operate(REG8 type, REG8 | Line 675  static REG8 fdd_operate(REG8 type, REG8 | 
 | break; | break; | 
 | } | } | 
 | fdd_int(result); | fdd_int(result); | 
| fddmtr_seek(fdc.us, mtr_c, mtr_r); | if (mtr_c != fdc.ncn) { | 
|  | fddmtr_seek(fdc.us, mtr_c, mtr_r); | 
|  | } | 
 | return(ret_ah); | return(ret_ah); | 
 | } | } | 
 |  |  | 
| Line 686  static UINT16 boot_fd1(REG8 type, REG8 r | Line 691  static UINT16 boot_fd1(REG8 type, REG8 r | 
 | UINT32  pos; | UINT32  pos; | 
 | UINT16  bootseg; | UINT16  bootseg; | 
 |  |  | 
| setfdcmode(fdc.us, type, rpm); | if (setfdcmode(fdc.us, type, rpm) != SUCCESS) { | 
|  | return(0); | 
|  | } | 
 | if (biosfd_seek(0, 0)) { | if (biosfd_seek(0, 0)) { | 
 | return(0); | return(0); | 
 | } | } | 
| Line 855  void bios0x1b(void) { | Line 862  void bios0x1b(void) { | 
 | #if defined(SUPPORT_SCSI) | #if defined(SUPPORT_SCSI) | 
 | if ((CPU_AL & 0xf0) == 0xc0) { | if ((CPU_AL & 0xf0) == 0xc0) { | 
 | TRACEOUT(("%.4x:%.4x AX=%.4x BX=%.4x CX=%.4x DX=%.4 ES=%.4x BP=%.4x", | TRACEOUT(("%.4x:%.4x AX=%.4x BX=%.4x CX=%.4x DX=%.4 ES=%.4x BP=%.4x", | 
| i286_memword_read(CPU_SS, CPU_SP+2), | MEML_READ16(CPU_SS, CPU_SP+2), | 
| i286_memword_read(CPU_SS, CPU_SP), | MEML_READ16(CPU_SS, CPU_SP), | 
 | CPU_AX, CPU_BX, CPU_CX, CPU_DX, CPU_ES, CPU_BP)); | CPU_AX, CPU_BX, CPU_CX, CPU_DX, CPU_ES, CPU_BP)); | 
 | scsicmd_bios(); | scsicmd_bios(); | 
 | return; | return; | 
| Line 871  void bios0x1b(void) { | Line 878  void bios0x1b(void) { | 
 | seg = mem[0x004b0 + (CPU_AL >> 4)]; | seg = mem[0x004b0 + (CPU_AL >> 4)]; | 
 | if (seg) { | if (seg) { | 
 | TRACEOUT(("call by %.4x:%.4x", | TRACEOUT(("call by %.4x:%.4x", | 
| i286_memword_read(CPU_SS, CPU_SP+2), | MEML_READ16(CPU_SS, CPU_SP+2), | 
| i286_memword_read(CPU_SS, CPU_SP))); | MEML_READ16(CPU_SS, CPU_SP))); | 
 | sp = CPU_SP; | sp = CPU_SP; | 
| i286_memword_write(CPU_SS, sp - 2, CPU_DS); | MEML_WRITE16(CPU_SS, sp - 2, CPU_DS); | 
| i286_memword_write(CPU_SS, sp - 4, CPU_SI); | MEML_WRITE16(CPU_SS, sp - 4, CPU_SI); | 
| i286_memword_write(CPU_SS, sp - 6, CPU_DI); | MEML_WRITE16(CPU_SS, sp - 6, CPU_DI); | 
| i286_memword_write(CPU_SS, sp - 8, CPU_ES);                     // +a | MEML_WRITE16(CPU_SS, sp - 8, CPU_ES);           // +a | 
| i286_memword_write(CPU_SS, sp - 10, CPU_BP);            // +8 | MEML_WRITE16(CPU_SS, sp - 10, CPU_BP);          // +8 | 
| i286_memword_write(CPU_SS, sp - 12, CPU_DX);            // +6 | MEML_WRITE16(CPU_SS, sp - 12, CPU_DX);          // +6 | 
| i286_memword_write(CPU_SS, sp - 14, CPU_CX);            // +4 | MEML_WRITE16(CPU_SS, sp - 14, CPU_CX);          // +4 | 
| i286_memword_write(CPU_SS, sp - 16, CPU_BX);            // +2 | MEML_WRITE16(CPU_SS, sp - 16, CPU_BX);          // +2 | 
| i286_memword_write(CPU_SS, sp - 18, CPU_AX);            // +0 | MEML_WRITE16(CPU_SS, sp - 18, CPU_AX);          // +0 | 
|  | #if 0 | 
 | TRACEOUT(("bypass to %.4x:0018", seg << 8)); | TRACEOUT(("bypass to %.4x:0018", seg << 8)); | 
 | TRACEOUT(("AX=%04x BX=%04x %02x:%02x:%02x:%02x ES=%04x BP=%04x", | TRACEOUT(("AX=%04x BX=%04x %02x:%02x:%02x:%02x ES=%04x BP=%04x", | 
 | CPU_AX, CPU_BX, CPU_CL, CPU_DH, CPU_DL, CPU_CH, | CPU_AX, CPU_BX, CPU_CL, CPU_DH, CPU_DL, CPU_CH, | 
 | CPU_ES, CPU_BP)); | CPU_ES, CPU_BP)); | 
 |  | #endif | 
 | sp -= 18; | sp -= 18; | 
 | CPU_SP = sp; | CPU_SP = sp; | 
 | CPU_BP = sp; | CPU_BP = sp; | 
| Line 942  void bios0x1b(void) { | Line 951  void bios0x1b(void) { | 
 | #if 0 | #if 0 | 
 | TRACEOUT(("%04x:%04x AX=%04x BX=%04x %02x:%02x:%02x:%02x\n"     \ | TRACEOUT(("%04x:%04x AX=%04x BX=%04x %02x:%02x:%02x:%02x\n"     \ | 
 | "ES=%04x BP=%04x \nret=%02x", | "ES=%04x BP=%04x \nret=%02x", | 
| i286_memword_read(CPU_SS, CPU_SP+2), | MEML_READ16(CPU_SS, CPU_SP+2), | 
| i286_memword_read(CPU_SS, CPU_SP), | MEML_READ16(CPU_SS, CPU_SP), | 
 | CPU_AX, CPU_BX, CPU_CL, CPU_DH, CPU_DL, CPU_CH, | CPU_AX, CPU_BX, CPU_CL, CPU_DH, CPU_DL, CPU_CH, | 
 | CPU_ES, CPU_BP, ret_ah)); | CPU_ES, CPU_BP, ret_ah)); | 
 | #endif | #endif | 
 | CPU_AH = ret_ah; | CPU_AH = ret_ah; | 
| flag = i286_membyte_read(CPU_SS, CPU_SP+4) & 0xfe; | flag = MEML_READ8(CPU_SS, CPU_SP+4) & 0xfe; | 
 | if (ret_ah >= 0x20) { | if (ret_ah >= 0x20) { | 
 | flag += 1; | flag += 1; | 
 | } | } | 
| i286_membyte_write(CPU_SS, CPU_SP + 4, flag); | MEML_WRITE8(CPU_SS, CPU_SP + 4, flag); | 
 | } | } | 
 |  |  |