--- np2/bios/bios1b.c 2004/01/22 01:10:03 1.11 +++ np2/bios/bios1b.c 2005/02/04 05:32:23 1.30 @@ -2,14 +2,13 @@ #include "cpucore.h" #include "pccore.h" #include "iocore.h" +#include "scsicmd.h" #include "bios.h" #include "biosmem.h" #include "sxsibios.h" #include "fddfile.h" #include "fdd_mtr.h" #include "sxsi.h" -#include "scsicmd.h" -#include "timing.h" enum { @@ -18,13 +17,26 @@ enum { }; -// static UINT8 fdmode = 0; -static BYTE work[65536]; -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) { @@ -34,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); } @@ -68,7 +82,7 @@ static void biosfd_resultout(UINT32 resu } #endif -static BOOL biosfd_seek(BYTE track, BOOL ndensity) { +static BOOL biosfd_seek(REG8 track, BOOL ndensity) { if (ndensity) { if (track < 42) { @@ -79,14 +93,13 @@ static BOOL biosfd_seek(BYTE track, BOOL } } fdc.ncn = track; - mtr_c = track; if (fdd_seek()) { return(FAILURE); } return(SUCCESS); } -static UINT16 fdfmt_biospara(BYTE fmt, BYTE rpm) { // ver0.31 +static UINT16 fdfmt_biospara(REG8 type, REG8 rpm, REG8 fmt) { UINT seg; UINT off; @@ -96,7 +109,7 @@ static UINT16 fdfmt_biospara(BYTE fmt, B 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); } @@ -108,7 +121,7 @@ static UINT16 fdfmt_biospara(BYTE fmt, B 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; @@ -116,18 +129,10 @@ static UINT16 fdfmt_biospara(BYTE fmt, B if (fmt) { off += 2; } - return(i286_memword_read(seg, LOW16(off))); -} - -static void change_rpm(BYTE rpm) { // ver0.31 - - if (np2cfg.usefd144) { - fdc.rpm = rpm; - } + return(MEML_READ16(seg, off)); } - enum { FDCBIOS_NORESULT, FDCBIOS_SUCCESS, @@ -142,7 +147,7 @@ enum { static void fdd_int(int result) { - if (result == FDCBIOS_NORESULT) { // ver0.29 + if (result == FDCBIOS_NORESULT) { return; } switch(CPU_AH & 0x0f) { @@ -155,6 +160,7 @@ static void fdd_int(int result) { case 0x0a: // READ ID case 0x0d: // フォーマット break; + default: return; } @@ -191,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[MEMB_DISK_INTL] &= ~(0x01 << fdc.us); } + else { + mem[MEMB_DISK_INTH] &= ~(0x10 << fdc.us); + } + CPU_IP = BIOSOFST_WAIT; } #if 1 @@ -264,9 +280,9 @@ static void b0clr(void) { } #endif -static BYTE fdd_operate(BYTE type, BOOL ndensity, BYTE rpm) { // ver0.31 +static REG8 fdd_operate(REG8 type, REG8 rpm, BOOL ndensity) { - BYTE ret_ah = 0x60; + REG8 ret_ah = 0x60; UINT16 size; UINT16 pos; UINT16 accesssize; @@ -277,33 +293,35 @@ static BYTE fdd_operate(BYTE type, BOOL BYTE hd; int result = FDCBIOS_NORESULT; UINT32 addr; + UINT8 mtr_c; + UINT mtr_r; + UINT fmode; - mtr_c = 0xff; + mtr_c = fdc.ncn; mtr_r = 0; - // とりあえずBIOSの時は無視する - fdc.mf = 0xff; // ver0.29 + fdc.mf = 0xff; // 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; @@ -316,11 +334,11 @@ static BYTE fdd_operate(BYTE type, BOOL } if (!fdd_diskready(fdc.us)) { fdd_int(FDCBIOS_NONREADY); - if (CPU_AH == 0x84) { // ver0.28 + if (CPU_AH == 0x84) { return(0x68); // 新センスは 両用ドライブ情報も } - if (CPU_AH == 0xc4) { // ver0.31 - if (np2cfg.usefd144) { + if (CPU_AH == 0xc4) { // ver0.31 + if (fdc.support144) { return(0x6c); } return(0x68); @@ -329,10 +347,11 @@ static BYTE fdd_operate(BYTE type, BOOL } } - // 2DDのモード選択 // ver0.29 - if (type == DISKTYPE_2DD) { - if (!(mem[MEMB_F2DD_MODE] & (0x10 << fdc.us))) { - ndensity = 1; + // モード選択 // ver0.78 + fmode = (type & 1)?MEMB_F2HD_MODE:MEMB_F2DD_MODE; + if (!(CPU_AL & 0x80)) { + if (!(mem[fmode] & (0x10 << fdc.us))) { + ndensity = TRUE; } } @@ -361,7 +380,7 @@ static BYTE fdd_operate(BYTE type, BOOL } } biosfd_setchrn(); - para = fdfmt_biospara(0, rpm); + para = fdfmt_biospara(type, rpm, 0); if (!para) { ret_ah = 0xd0; break; @@ -384,8 +403,9 @@ static BYTE fdd_operate(BYTE type, BOOL break; } size -= accesssize; - mtr_r += accesssize; // ver0.26 - if ((fdc.R++ == (BYTE)para) && (CPU_AH & 0x80) && (!fdc.hd)) { + mtr_r += accesssize; + if ((fdc.R++ == (UINT8)para) && + (CPU_AH & 0x80) && (!fdc.hd)) { fdc.hd = 1; fdc.H = 1; fdc.R = 1; @@ -421,17 +441,16 @@ static BYTE fdd_operate(BYTE type, BOOL ret_ah |= 0x01; } else { // 2DD - if (mem[0x005ca] & (0x01 << fdc.us)) { - ret_ah++; + if (mem[fmode] & (0x01 << fdc.us)) { + ret_ah |= 0x01; } - if (mem[0x005ca] & (0x10 << fdc.us)) { // ver0.30 + if (mem[fmode] & (0x10 << fdc.us)) { // ver0.30 ret_ah |= 0x04; } } - if (CPU_AH & 0x80) { // ver0.30 + 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対応ドライブ } } @@ -449,7 +468,7 @@ static BYTE fdd_operate(BYTE type, BOOL } } biosfd_setchrn(); - para = fdfmt_biospara(0, rpm); + para = fdfmt_biospara(type, rpm, 0); if (!para) { ret_ah = 0xd0; break; @@ -474,14 +493,15 @@ static BYTE fdd_operate(BYTE type, BOOL else { accesssize = size; } - i286_memx_read(addr, fdc.buf, accesssize); + MEML_READ(addr, fdc.buf, accesssize); if (fdd_write()) { break; } addr += accesssize; size -= accesssize; - mtr_r += accesssize; // ver0.26 - if ((fdc.R++ == (BYTE)para) && (CPU_AH & 0x80) && (!fdc.hd)) { + mtr_r += accesssize; + if ((fdc.R++ == (UINT8)para) && + (CPU_AH & 0x80) && (!fdc.hd)) { fdc.hd = 1; fdc.H = 1; fdc.R = 1; @@ -495,7 +515,7 @@ static BYTE fdd_operate(BYTE type, BOOL result = FDCBIOS_SUCCESS; } else { - ret_ah = fddlasterror; // 0xc0 // ver0.28 + ret_ah = fddlasterror; // 0xc0 result = FDCBIOS_WRITEERROR; } break; @@ -513,7 +533,7 @@ static BYTE fdd_operate(BYTE type, BOOL } } biosfd_setchrn(); - para = fdfmt_biospara(0, rpm); + para = fdfmt_biospara(type, rpm, 0); if (!para) { ret_ah = 0xd0; break; @@ -542,11 +562,11 @@ static BYTE fdd_operate(BYTE 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 - if (fdc.R++ == (BYTE)para) { + mtr_r += accesssize; + if (fdc.R++ == (UINT8)para) { if ((CPU_AH & 0x80) && (!fdc.hd)) { fdc.hd = 1; fdc.H = 1; @@ -583,7 +603,7 @@ static BYTE fdd_operate(BYTE type, BOOL } #endif else { - ret_ah = fddlasterror; // 0xc0; // ver0.28 + ret_ah = fddlasterror; // 0xc0; result = FDCBIOS_READERROR; } break; @@ -595,8 +615,8 @@ static BYTE fdd_operate(BYTE type, BOOL break; case 0x0a: // READ ID - fdc.mf = CPU_AH & 0x40; // ver0.29 - if (CPU_AH & 0x10) { // ver0.28 + fdc.mf = CPU_AH & 0x40; + if (CPU_AH & 0x10) { if (!biosfd_seek(CPU_CL, ndensity)) { result = FDCBIOS_SEEKSUCCESS; } @@ -607,10 +627,10 @@ static BYTE fdd_operate(BYTE type, BOOL } } if (fdd_readid()) { - ret_ah = fddlasterror; // 0xa0; // ver0.28 + ret_ah = fddlasterror; // 0xa0; break; } - if (fdc.N < 8) { // ver0.26 + if (fdc.N < 8) { mtr_r += 128 << fdc.N; } else { @@ -634,255 +654,60 @@ static BYTE fdd_operate(BYTE 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; } - fdc.sc = (BYTE)para; + fdc.sc = (UINT8)para; fdd_formatinit(); pos = CPU_BP; for (s=0; sfname[0])) { - diskequip |= bit; - } - } - SETBIOSMEM16(MEMW_DISK_EQUIP, diskequip); -} - -static void init_scsi_equip(void) { - UINT8 i; - UINT8 bit; - SXSIDEV sxsi; - UINT16 w; - - mem[MEMB_DISK_EQUIPS] = 0; - ZeroMemory(&mem[0x00460], 0x20); - for (i=0, bit=1; i<4; i++, bit<<=1) { - sxsi = sxsi_getptr((REG8)(0x20 + i)); - if ((sxsi) && (sxsi->fname[0])) { - mem[MEMB_DISK_EQUIPS] |= bit; - mem[0x00460+i*4] = sxsi->sectors; - mem[0x00461+i*4] = sxsi->surfaces; - switch(sxsi->size) { - case 256: - w = 0 << 12; - break; - - case 512: - w = 1 << 12; - break; - - default: - w = 2 << 12; - break; + case 0x0e: // ver0.78 + if (CPU_AH & 0x80) { // 密度設定 + mem[fmode] &= 0x0f; + mem[fmode] |= (UINT8)((CPU_AH & 0x0f) << 4); + } + else { // 面設定 + mem[fmode] &= 0xf0; + mem[fmode] |= (UINT8)(CPU_AH & 0x0f); } - w |= 0xc000; - w |= sxsi->cylinders; - SETBIOSMEM16(0x00462+i*4, w); - } - } -} - -static BYTE sxsi_pos(long *pos) { - - SXSIDEV sxsi; - - *pos = 0; - sxsi = sxsi_getptr(CPU_AL); - if (sxsi == NULL) { - return(0x60); - } - if (CPU_AL & 0x80) { - if ((CPU_DL >= sxsi->sectors) || - (CPU_DH >= sxsi->surfaces) || - (CPU_CX >= sxsi->cylinders)) { - return(0xd0); - } - *pos = ((CPU_CX * sxsi->surfaces) + CPU_DH) * sxsi->sectors - + CPU_DL; - } - else { - *pos = (CPU_DL << 16) | CPU_CX; - if (!(CPU_AL & 0x20)) { - (*pos) &= 0x1fffff; - } - if ((*pos) >= sxsi->totals) { - return(0xd0); - } - } - return(0x00); -} - -static REG8 sxsidev_format(REG8 drv, SXSIDEV sxsi) { - - UINT count; - REG8 ret; - long trk; - long trkmax; - - count = timing_getcount(); // 時間を止める - - ret = 0; - trk = 0; - trkmax = sxsi->surfaces * sxsi->cylinders; - while(trk < trkmax) { - ret = sxsi_format(drv, trk * sxsi->sectors); - if (ret) { - break; - } - trk++; - } - - timing_setcount(count); // 再開 - - return(ret); -} - -REG8 sxsi_operate(REG8 type) { - - SXSIDEV sxsi; - REG8 ret_ah; - long pos; - - sxsi = sxsi_getptr(CPU_AL); - if (sxsi == NULL) { - return(0x60); - } - - ret_ah = 0x00; - switch(CPU_AH & 0x0f) { - case 0x01: // ベリファイ - case 0x07: // リトラクト - case 0x0f: // リトラクト - break; - - case 0x03: // イニシャライズ - if (type == BIOS1B_SASI) { - init_sasi_equip(); - } - else if (type == BIOS1B_SCSI) { - init_scsi_equip(); - } - break; - - case 0x04: // センス ret_ah = 0x00; - if ((CPU_AH == 0x04) && (type == BIOS1B_SASI)) { - ret_ah = 0x04; - } - else if ((CPU_AH == 0x44) && (type == BIOS1B_SCSI)) { - CPU_BX = 1; - } - else if (CPU_AH == 0x84) { - CPU_BX = sxsi->size; - CPU_CX = sxsi->cylinders; - CPU_DH = sxsi->surfaces; - CPU_DL = sxsi->sectors; - } - break; - - case 0x05: // データの書き込み - i286_memx_read(ES_BASE + CPU_BP, work, CPU_BX); - ret_ah = sxsi_pos(&pos); - if (!ret_ah) { - ret_ah = sxsi_write(CPU_AL, pos, work, CPU_BX); - } - break; - - case 0x06: // データの読み込み - ret_ah = sxsi_pos(&pos); - if (!ret_ah) { - ret_ah = sxsi_read(CPU_AL, pos, work, CPU_BX); - if (ret_ah < 0x20) { - i286_memx_write(ES_BASE + CPU_BP, work, CPU_BX); - } - } - break; - - case 0x0a: // セクタ長設定 - if ((type == BIOS1B_SCSI) && - (sxsi->size == (128 << (CPU_BH & 3)))) { - ret_ah = 0x00; - } - else { - ret_ah = 0x40; - } - break; - - case 0x0c: // 代替情報取得 - if (type == BIOS1B_SCSI) { - ret_ah = 0x00; - CPU_CX = 0; - } - else { - ret_ah = 0x40; - } - break; - - case 0x0d: // フォーマット - if (CPU_AH & 0x80) { - ret_ah = sxsidev_format(CPU_AL, sxsi); - } - else { - if (CPU_DL) { - ret_ah = 0x30; - break; - } - i286_memstr_read(CPU_ES, CPU_BP, work, CPU_BX); - ret_ah = sxsi_pos(&pos); - if (!ret_ah) { - ret_ah = sxsi_format(CPU_AL, pos); - } - } - break; - - default: - ret_ah = 0x40; break; } + fdd_int(result); + if (mtr_c != fdc.ncn) { + fddmtr_seek(fdc.us, mtr_c, mtr_r); + } return(ret_ah); } // -------------------------------------------------------------------- BIOS -static UINT16 boot_fd1(BYTE rpm) { // ver0.31 +static UINT16 boot_fd1(REG8 type, REG8 rpm) { UINT remain; UINT size; UINT32 pos; UINT16 bootseg; - change_rpm(rpm); // ver0.31 + if (setfdcmode(fdc.us, type, rpm) != SUCCESS) { + return(0); + } if (biosfd_seek(0, 0)) { return(0); } @@ -926,43 +751,41 @@ static UINT16 boot_fd1(BYTE rpm) { return(bootseg); } -static UINT16 boot_fd(BYTE drv, BYTE type) { // ver0.27 +static UINT16 boot_fd(REG8 drv, REG8 type) { UINT16 bootseg; if (drv >= 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 + if (type & 2) { // 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); } } @@ -971,7 +794,7 @@ static UINT16 boot_fd(BYTE drv, BYTE typ static REG16 boot_hd(REG8 drv) { - BYTE ret; + REG8 ret; ret = sxsi_read(drv, 0, mem + 0x1fc00, 0x400); if (ret < 0x20) { @@ -1039,25 +862,22 @@ REG16 bootstrapload(void) { for (i=0; (i<4) && (!bootseg); i++) { bootseg = boot_hd((REG8)(0xa0 + i)); } - -// init_fdd_equip(); -// init_sasi_equip(); -// init_scsi_equip(); return(bootseg); } + // -------------------------------------------------------------------------- void bios0x1b(void) { - BYTE ret_ah; + REG8 ret_ah; REG8 flag; #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; @@ -1069,25 +889,27 @@ void bios0x1b(void) { REG8 seg; UINT sp; - seg = mem[0x004b0 + (CPU_AL >> 4)]; + seg = mem[MEMX_DISK_XROM + (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))); 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(("call by %.4x:%.4x", + MEML_READ16(CPU_SS, CPU_SP+2), + MEML_READ16(CPU_SS, CPU_SP))); 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; @@ -1103,34 +925,35 @@ void bios0x1b(void) { switch(CPU_AL & 0xf0) { case 0x90: - ret_ah = fdd_operate(DISKTYPE_2HD, 0, 0); + ret_ah = fdd_operate(3, 0, FALSE); break; case 0x30: case 0xb0: - ret_ah = fdd_operate(DISKTYPE_2HD, 0, 1); + ret_ah = fdd_operate(3, 1, FALSE); break; case 0x10: + ret_ah = fdd_operate(1, 0, FALSE); + break; + case 0x70: case 0xf0: - ret_ah = fdd_operate(DISKTYPE_2DD, 0, 0); + ret_ah = fdd_operate(0, 0, FALSE); break; case 0x50: - ret_ah = fdd_operate(DISKTYPE_2DD, 1, 0); + ret_ah = fdd_operate(0, 0, TRUE); break; case 0x00: case 0x80: -// ret_ah = sxsi_operate(BIOS1B_SASI); ret_ah = sasibios_operate(); break; #if defined(SUPPORT_SCSI) case 0x20: case 0xa0: -// ret_ah = sxsi_operate(BIOS1B_SCSI); ret_ah = scsibios_operate(); break; #endif @@ -1140,31 +963,49 @@ void bios0x1b(void) { break; } #if 0 - { - static BYTE p = 0; - if ((CPU_CL == 0x4d) && (ret_ah == 0xe0)) { - if (!p) { - trace_sw = 1; - p++; - debug_status(); - memorydump(); - } - } - } -#endif -#if 1 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); +} + +UINT bios0x1b_wait(void) { + + UINT addr; + REG8 bit; + + if (fddmtr.busy) { + CPU_IP--; + CPU_REMCLOCK = -1; + } + else { + if (fdc.chgreg & 1) { + addr = MEMB_DISK_INTL; + bit = 0x01; + } + else { + addr = MEMB_DISK_INTH; + bit = 0x10; + } + bit <<= fdc.us; + if (mem[addr] & bit) { + mem[addr] &= ~bit; + return(0); + } + else { + CPU_REMCLOCK -= 1000; + } + } + CPU_IP--; + return(1); }