--- np2/bios/bios1b.c 2004/01/23 15:05:04 1.13 +++ np2/bios/bios1b.c 2004/03/07 23:04:50 1.25 @@ -9,7 +9,6 @@ #include "fddfile.h" #include "fdd_mtr.h" #include "sxsi.h" -#include "timing.h" enum { @@ -18,11 +17,26 @@ enum { }; -static BYTE mtr_c = 0; -static UINT mtr_r = 0; +// ---- FDD +static BOOL setfdcmode(REG8 drv, REG8 type, REG8 rpm) { -// ---- FDD + if (drv >= 4) { + return(FAILURE); + } + 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) { @@ -32,11 +46,13 @@ void fddbios_equip(REG8 type, BOOL clear if (clear) { diskequip &= 0x0f00; } - if (type == DISKTYPE_2HD) { - diskequip |= 0x0003; + if (type & 1) { + diskequip &= 0xfff0; + diskequip |= (fdc.equip & 0x0f); } - if (type == DISKTYPE_2DD) { - diskequip |= 0x0300; + else { + diskequip &= 0x0fff; + diskequip |= (fdc.equip & 0x0f) << 12; } SETBIOSMEM16(MEMW_DISK_EQUIP, diskequip); } @@ -77,14 +93,13 @@ static BOOL biosfd_seek(REG8 track, BOOL } } fdc.ncn = track; - mtr_c = track; if (fdd_seek()) { return(FAILURE); } 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 off; @@ -94,7 +109,7 @@ static UINT16 fdfmt_biospara(REG8 fmt, R if (n >= 4) { n = 3; } - if (CTRL_FDMEDIA == DISKTYPE_2HD) { + if (type & 2) { seg = GETBIOSMEM16(MEMW_F2HD_P_SEG); off = GETBIOSMEM16(MEMW_F2HD_P_OFF); } @@ -106,7 +121,7 @@ static UINT16 fdfmt_biospara(REG8 fmt, R off = 0x2361; // see bios.cpp } off += fdc.us * 2; - off = i286_memword_read(seg, off); + off = MEML_READ16(seg, off); off += n * 8; if (!(CPU_AH & 0x40)) { off += 4; @@ -114,17 +129,9 @@ static UINT16 fdfmt_biospara(REG8 fmt, R if (fmt) { off += 2; } - return(i286_memword_read(seg, off)); + return(MEML_READ16(seg, off)); } -static void change_rpm(REG8 rpm) { // ver0.31 - - if (np2cfg.usefd144) { - fdc.rpm = rpm; - } -} - - enum { FDCBIOS_NORESULT, @@ -153,6 +160,7 @@ static void fdd_int(int result) { case 0x0a: // READ ID case 0x0d: // フォーマット break; + default: return; } @@ -189,7 +197,17 @@ static void fdd_int(int result) { fdc.stat[fdc.us] |= FDCRLT_IC0 | FDCRLT_NW; fdcsend_error7(); break; + + default: + return; } + if (fdc.chgreg & 1) { + mem[0x0055e] &= ~(0x01 << fdc.us); + } + else { + mem[0x0055f] &= ~(0x10 << fdc.us); + } + CPU_IP = BIOSOFST_WAIT; } #if 1 @@ -262,7 +280,7 @@ static void b0clr(void) { } #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; UINT16 size; @@ -275,33 +293,34 @@ static REG8 fdd_operate(REG8 type, BOOL BYTE hd; int result = FDCBIOS_NORESULT; UINT32 addr; + UINT8 mtr_c; + UINT mtr_r; - mtr_c = 0xff; + mtr_c = fdc.ncn; mtr_r = 0; - // とりあえずBIOSの時は無視する fdc.mf = 0xff; // ver0.29 // TRACE_("int 1Bh", CPU_AH); - change_rpm(rpm); // ver0.31 + if (setfdcmode((REG8)(CPU_AL & 3), type, rpm) != SUCCESS) { + return(0x40); + } + if ((CPU_AH & 0x0f) != 0x0a) { fdc.crcn = 0; } if ((CPU_AH & 0x0f) != 0x03) { - CTRL_FDMEDIA = type; - switch(type) { - case DISKTYPE_2HD: - if (pic.pi[1].imr & PIC_INT42) { - return(0xd0); - } - break; - case DISKTYPE_2DD: - if (pic.pi[1].imr & PIC_INT41) { - return(0xd0); - } - break; + if (type & 2) { + if (pic.pi[1].imr & PIC_INT42) { + return(0x40); + } + } + else { + if (pic.pi[1].imr & PIC_INT41) { + return(0x40); + } } if (fdc.us != (CPU_AL & 0x03)) { fdc.us = CPU_AL & 0x03; @@ -318,7 +337,7 @@ static REG8 fdd_operate(REG8 type, BOOL return(0x68); // 新センスは 両用ドライブ情報も } if (CPU_AH == 0xc4) { // ver0.31 - if (np2cfg.usefd144) { + if (fdc.support144) { return(0x6c); } return(0x68); @@ -359,7 +378,7 @@ static REG8 fdd_operate(REG8 type, BOOL } } biosfd_setchrn(); - para = fdfmt_biospara(0, rpm); + para = fdfmt_biospara(type, rpm, 0); if (!para) { ret_ah = 0xd0; break; @@ -429,8 +448,7 @@ static REG8 fdd_operate(REG8 type, BOOL } if (CPU_AH & 0x80) { // ver0.30 ret_ah |= 8; // 1MB/640KB両用ドライブ - if ((CPU_AH & 0x40) && - (np2cfg.usefd144)) { // ver0.31 + if ((CPU_AH & 0x40) && (fdc.support144)) { ret_ah |= 4; // 1.44対応ドライブ } } @@ -448,7 +466,7 @@ static REG8 fdd_operate(REG8 type, BOOL } } biosfd_setchrn(); - para = fdfmt_biospara(0, rpm); + para = fdfmt_biospara(type, rpm, 0); if (!para) { ret_ah = 0xd0; break; @@ -473,7 +491,7 @@ static REG8 fdd_operate(REG8 type, BOOL else { accesssize = size; } - i286_memx_read(addr, fdc.buf, accesssize); + MEML_READ(addr, fdc.buf, accesssize); if (fdd_write()) { break; } @@ -513,7 +531,7 @@ static REG8 fdd_operate(REG8 type, BOOL } } biosfd_setchrn(); - para = fdfmt_biospara(0, rpm); + para = fdfmt_biospara(type, rpm, 0); if (!para) { ret_ah = 0xd0; break; @@ -542,7 +560,7 @@ static REG8 fdd_operate(REG8 type, BOOL if (fdd_read()) { break; } - i286_memx_write(addr, fdc.buf, accesssize); + MEML_WRITE(addr, fdc.buf, accesssize); addr += accesssize; size -= accesssize; mtr_r += accesssize; // ver0.26 @@ -634,7 +652,7 @@ static REG8 fdd_operate(REG8 type, BOOL } fdc.d = CPU_DL; fdc.N = CPU_CH; - para = fdfmt_biospara(1, rpm); + para = fdfmt_biospara(type, rpm, 1); if (!para) { ret_ah = 0xd0; break; @@ -643,30 +661,39 @@ static REG8 fdd_operate(REG8 type, BOOL fdd_formatinit(); pos = CPU_BP; for (s=0; s= 4) { return(0); } - fdc.us = drv & 3; + fdc.us = drv; if (!fdd_diskready(fdc.us)) { return(0); } // 2HD if (type & 1) { - CTRL_FDMEDIA = DISKTYPE_2HD; // 1.25MB - bootseg = boot_fd1(0); + bootseg = boot_fd1(3, 0); if (bootseg) { mem[MEMB_DISK_BOOT] = (UINT8)(0x90 + drv); - fddbios_equip(DISKTYPE_2HD, TRUE); + fddbios_equip(3, TRUE); return(bootseg); } // 1.44MB - bootseg = boot_fd1(1); + bootseg = boot_fd1(3, 1); if (bootseg) { mem[MEMB_DISK_BOOT] = (UINT8)(0x30 + drv); - fddbios_equip(DISKTYPE_2HD, TRUE); + fddbios_equip(3, TRUE); return(bootseg); } } if (type & 2) { // ver0.29 // 2DD - CTRL_FDMEDIA = DISKTYPE_2DD; - bootseg = boot_fd1(0); + bootseg = boot_fd1(0, 0); if (bootseg) { mem[MEMB_DISK_BOOT] = (BYTE)(0x70 + drv); - fddbios_equip(DISKTYPE_2DD, TRUE); + fddbios_equip(0, TRUE); return(bootseg); } } @@ -837,8 +862,8 @@ void bios0x1b(void) { #if defined(SUPPORT_SCSI) if ((CPU_AL & 0xf0) == 0xc0) { TRACEOUT(("%.4x:%.4x AX=%.4x BX=%.4x CX=%.4x DX=%.4 ES=%.4x BP=%.4x", - i286_memword_read(CPU_SS, CPU_SP+2), - i286_memword_read(CPU_SS, CPU_SP), + MEML_READ16(CPU_SS, CPU_SP+2), + MEML_READ16(CPU_SS, CPU_SP), CPU_AX, CPU_BX, CPU_CX, CPU_DX, CPU_ES, CPU_BP)); scsicmd_bios(); return; @@ -853,22 +878,24 @@ void bios0x1b(void) { seg = mem[0x004b0 + (CPU_AL >> 4)]; if (seg) { TRACEOUT(("call by %.4x:%.4x", - i286_memword_read(CPU_SS, CPU_SP+2), - i286_memword_read(CPU_SS, CPU_SP))); + MEML_READ16(CPU_SS, CPU_SP+2), + MEML_READ16(CPU_SS, CPU_SP))); sp = CPU_SP; - i286_memword_write(CPU_SS, sp - 2, CPU_DS); - i286_memword_write(CPU_SS, sp - 4, CPU_SI); - i286_memword_write(CPU_SS, sp - 6, CPU_DI); - i286_memword_write(CPU_SS, sp - 8, CPU_ES); // +a - i286_memword_write(CPU_SS, sp - 10, CPU_BP); // +8 - i286_memword_write(CPU_SS, sp - 12, CPU_DX); // +6 - i286_memword_write(CPU_SS, sp - 14, CPU_CX); // +4 - i286_memword_write(CPU_SS, sp - 16, CPU_BX); // +2 - i286_memword_write(CPU_SS, sp - 18, CPU_AX); // +0 + MEML_WRITE16(CPU_SS, sp - 2, CPU_DS); + MEML_WRITE16(CPU_SS, sp - 4, CPU_SI); + MEML_WRITE16(CPU_SS, sp - 6, CPU_DI); + MEML_WRITE16(CPU_SS, sp - 8, CPU_ES); // +a + MEML_WRITE16(CPU_SS, sp - 10, CPU_BP); // +8 + MEML_WRITE16(CPU_SS, sp - 12, CPU_DX); // +6 + MEML_WRITE16(CPU_SS, sp - 14, CPU_CX); // +4 + MEML_WRITE16(CPU_SS, sp - 16, CPU_BX); // +2 + MEML_WRITE16(CPU_SS, sp - 18, CPU_AX); // +0 +#if 0 TRACEOUT(("bypass to %.4x:0018", seg << 8)); 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_ES, CPU_BP)); +#endif sp -= 18; CPU_SP = sp; CPU_BP = sp; @@ -884,22 +911,25 @@ void bios0x1b(void) { switch(CPU_AL & 0xf0) { case 0x90: - ret_ah = fdd_operate(DISKTYPE_2HD, 0, 0); + ret_ah = fdd_operate(3, 0, 0); break; case 0x30: case 0xb0: - ret_ah = fdd_operate(DISKTYPE_2HD, 0, 1); + ret_ah = fdd_operate(3, 1, 0); break; case 0x10: + ret_ah = fdd_operate(1, 0, 0); + break; + case 0x70: case 0xf0: - ret_ah = fdd_operate(DISKTYPE_2DD, 0, 0); + ret_ah = fdd_operate(0, 0, 0); break; case 0x50: - ret_ah = fdd_operate(DISKTYPE_2DD, 1, 0); + ret_ah = fdd_operate(0, 0, 1); break; case 0x00: @@ -921,16 +951,16 @@ void bios0x1b(void) { #if 0 TRACEOUT(("%04x:%04x AX=%04x BX=%04x %02x:%02x:%02x:%02x\n" \ "ES=%04x BP=%04x \nret=%02x", - i286_memword_read(CPU_SS, CPU_SP+2), - i286_memword_read(CPU_SS, CPU_SP), + MEML_READ16(CPU_SS, CPU_SP+2), + MEML_READ16(CPU_SS, CPU_SP), CPU_AX, CPU_BX, CPU_CL, CPU_DH, CPU_DL, CPU_CH, CPU_ES, CPU_BP, ret_ah)); #endif 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) { flag += 1; } - i286_membyte_write(CPU_SS, CPU_SP + 4, flag); + MEML_WRITE8(CPU_SS, CPU_SP + 4, flag); }