--- np2/bios/bios1b.c 2004/01/13 05:30:58 1.10 +++ np2/bios/bios1b.c 2004/01/23 15:05:04 1.13 @@ -2,11 +2,14 @@ #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 "timing.h" enum { @@ -15,22 +18,26 @@ enum { }; - char fdmode = 0; -static BYTE work[65536]; static BYTE mtr_c = 0; static UINT mtr_r = 0; // ---- FDD -static void init_fdd_equip(void) { +void fddbios_equip(REG8 type, BOOL clear) { - UINT16 diskequip; + REG16 diskequip; diskequip = GETBIOSMEM16(MEMW_DISK_EQUIP); - diskequip &= 0x0f00; - diskequip |= (UINT16)(~fdmode) & 3; - diskequip |= (UINT16)fdmode << 12; + if (clear) { + diskequip &= 0x0f00; + } + if (type == DISKTYPE_2HD) { + diskequip |= 0x0003; + } + if (type == DISKTYPE_2DD) { + diskequip |= 0x0300; + } SETBIOSMEM16(MEMW_DISK_EQUIP, diskequip); } @@ -59,7 +66,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) { @@ -77,7 +84,7 @@ static BOOL biosfd_seek(BYTE track, BOOL return(SUCCESS); } -static UINT16 fdfmt_biospara(BYTE fmt, BYTE rpm) { // ver0.31 +static UINT16 fdfmt_biospara(REG8 fmt, REG8 rpm) { // ver0.31 UINT seg; UINT off; @@ -107,10 +114,10 @@ static UINT16 fdfmt_biospara(BYTE fmt, B if (fmt) { off += 2; } - return(i286_memword_read(seg, LOW16(off))); + return(i286_memword_read(seg, off)); } -static void change_rpm(BYTE rpm) { // ver0.31 +static void change_rpm(REG8 rpm) { // ver0.31 if (np2cfg.usefd144) { fdc.rpm = rpm; @@ -255,9 +262,9 @@ static void b0clr(void) { } #endif -static BYTE fdd_operate(BYTE type, BOOL ndensity, BYTE rpm) { // ver0.31 +static REG8 fdd_operate(REG8 type, BOOL ndensity, REG8 rpm) { // ver0.31 - BYTE ret_ah = 0x60; + REG8 ret_ah = 0x60; UINT16 size; UINT16 pos; UINT16 accesssize; @@ -376,7 +383,8 @@ static BYTE fdd_operate(BYTE type, BOOL } size -= accesssize; mtr_r += accesssize; // ver0.26 - if ((fdc.R++ == (BYTE)para) && (CPU_AH & 0x80) && (!fdc.hd)) { + if ((fdc.R++ == (UINT8)para) && + (CPU_AH & 0x80) && (!fdc.hd)) { fdc.hd = 1; fdc.H = 1; fdc.R = 1; @@ -396,7 +404,7 @@ static BYTE fdd_operate(BYTE type, BOOL break; case 0x03: // 初期化 - init_fdd_equip(); + fddbios_equip(type, FALSE); ret_ah = 0x00; break; @@ -472,7 +480,8 @@ static BYTE fdd_operate(BYTE type, BOOL addr += accesssize; size -= accesssize; mtr_r += accesssize; // ver0.26 - if ((fdc.R++ == (BYTE)para) && (CPU_AH & 0x80) && (!fdc.hd)) { + if ((fdc.R++ == (UINT8)para) && + (CPU_AH & 0x80) && (!fdc.hd)) { fdc.hd = 1; fdc.H = 1; fdc.R = 1; @@ -537,7 +546,7 @@ static BYTE fdd_operate(BYTE type, BOOL addr += accesssize; size -= accesssize; mtr_r += accesssize; // ver0.26 - if (fdc.R++ == (BYTE)para) { + if (fdc.R++ == (UINT8)para) { if ((CPU_AH & 0x80) && (!fdc.hd)) { fdc.hd = 1; fdc.H = 1; @@ -630,7 +639,7 @@ static BYTE fdd_operate(BYTE type, BOOL ret_ah = 0xd0; break; } - fdc.sc = (BYTE)para; + fdc.sc = (UINT8)para; fdd_formatinit(); pos = CPU_BP; for (s=0; s> 4; - if ((CPU_AL & 0x0f) >= 2) { - return(0x60); - } - np2drv |= (CPU_AL & 1); - sxsi = &sxsi_hd[np2drv]; - if (CPU_AL & 0x80) { - if ((CPU_DL >= sxsi->sectors) || - (CPU_DH >= sxsi->surfaces) || - (CPU_CX >= sxsi->tracks)) { - 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); -} - - -UINT8 sxsi_operate(UINT8 type) { - - BYTE ret_ah = 0x00; - BYTE drv; - long pos; -// int i; - - drv = (CPU_AL & 0x20) >> 4; - if ((CPU_AL & 0x0f) >= 2) { - return(0x60); - } - drv |= (CPU_AL & 1); - - switch(CPU_AH & 0x0f) { - case 0x01: // ベリファイ - case 0x07: // リトラクト - case 0x0f: // リトラクト - break; - - case 0x03: // イニシャライズ - if (type == HDDTYPE_SASI) { - init_sasi_equip(); - } - else if (type == HDDTYPE_SCSI) { - init_scsi_equip(); - } - break; - - case 0x04: // センス - ret_ah = 0x00; - if ((CPU_AH == 0x04) && (type == HDDTYPE_SASI)) { - ret_ah = 0x04; - } - else if ((CPU_AH == 0x44) && (type == HDDTYPE_SCSI)) { - CPU_BX = 1; - } - else if (CPU_AH == 0x84) { - CPU_BX = sxsi_hd[drv].size; - CPU_CX = sxsi_hd[drv].tracks; - CPU_DH = sxsi_hd[drv].surfaces; - CPU_DL = sxsi_hd[drv].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 0x0d: // フォーマット - 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; - } - return(ret_ah); -} - - // -------------------------------------------------------------------- BIOS -static UINT16 boot_fd1(BYTE rpm) { // ver0.31 +static UINT16 boot_fd1(REG8 rpm) { // ver0.31 UINT remain; UINT size; @@ -867,7 +710,7 @@ 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) { // ver0.27 UINT16 bootseg; @@ -885,13 +728,15 @@ static UINT16 boot_fd(BYTE drv, BYTE typ // 1.25MB bootseg = boot_fd1(0); if (bootseg) { - mem[MEMB_DISK_BOOT] = (BYTE)(0x90+drv); + mem[MEMB_DISK_BOOT] = (UINT8)(0x90 + drv); + fddbios_equip(DISKTYPE_2HD, TRUE); return(bootseg); } // 1.44MB bootseg = boot_fd1(1); if (bootseg) { - mem[MEMB_DISK_BOOT] = (BYTE)(0x30+drv); + mem[MEMB_DISK_BOOT] = (UINT8)(0x30 + drv); + fddbios_equip(DISKTYPE_2HD, TRUE); return(bootseg); } } @@ -900,17 +745,17 @@ static UINT16 boot_fd(BYTE drv, BYTE typ CTRL_FDMEDIA = DISKTYPE_2DD; bootseg = boot_fd1(0); if (bootseg) { - mem[MEMB_DISK_BOOT] = (BYTE)(0x70+drv); - fdmode = 3; + mem[MEMB_DISK_BOOT] = (BYTE)(0x70 + drv); + fddbios_equip(DISKTYPE_2DD, TRUE); return(bootseg); } } return(0); } -static UINT16 boot_hd(BYTE drv) { // ver0.27 +static REG16 boot_hd(REG8 drv) { - BYTE ret; + REG8 ret; ret = sxsi_read(drv, 0, mem + 0x1fc00, 0x400); if (ret < 0x20) { @@ -920,16 +765,17 @@ static UINT16 boot_hd(BYTE drv) { return(0); } -UINT16 bootstrapload(void) { // ver0.27 +REG16 bootstrapload(void) { BYTE i; - UINT16 bootseg; + REG16 bootseg; - fdmode = 0; +// fdmode = 0; bootseg = 0; switch(mem[MEMB_MSW5] & 0xf0) { // うぐぅ…本当はALレジスタの値から case 0x00: // ノーマル break; + case 0x20: // 640KB FDD for (i=0; (i<4) && (!bootseg); i++) { if (fdd_diskready(i)) { @@ -937,6 +783,7 @@ UINT16 bootstrapload(void) { // } } break; + case 0x40: // 1.2MB FDD for (i=0; (i<4) && (!bootseg); i++) { if (fdd_diskready(i)) { @@ -944,25 +791,24 @@ UINT16 bootstrapload(void) { // } } break; + case 0x60: // MO break; + case 0xa0: // SASI 1 - if (sxsi_hd[0].fname[0]) { - bootseg = boot_hd(0x80); - } + bootseg = boot_hd(0x80); break; + case 0xb0: // SASI 2 - if (sxsi_hd[1].fname[0]) { - bootseg = boot_hd(0x81); - } + bootseg = boot_hd(0x81); break; + case 0xc0: // SCSI - for (i=0; (i<2) && (!bootseg); i++) { - if (sxsi_hd[i+2].fname[0]) { - bootseg = boot_hd((BYTE)(0xa0 | i)); - } + for (i=0; (i<4) && (!bootseg); i++) { + bootseg = boot_hd((REG8)(0xa0 + i)); } break; + default: // ROM return(0); } @@ -972,30 +818,35 @@ UINT16 bootstrapload(void) { // } } for (i=0; (i<2) && (!bootseg); i++) { - if (sxsi_hd[i].fname[0]) { - bootseg = boot_hd((BYTE)(0x80 | i)); - } + bootseg = boot_hd((REG8)(0x80 + i)); } - for (i=0; (i<2) && (!bootseg); i++) { - if (sxsi_hd[i+2].fname[0]) { - bootseg = boot_hd((BYTE)(0xa0 | i)); - } + 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 0 // bypass to disk bios +#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), + CPU_AX, CPU_BX, CPU_CX, CPU_DX, CPU_ES, CPU_BP)); + scsicmd_bios(); + return; + } +#endif + +#if 1 // bypass to disk bios +{ REG8 seg; UINT sp; @@ -1028,6 +879,7 @@ void bios0x1b(void) { CPU_IP = 0x18; return; } +} #endif switch(CPU_AL & 0xf0) { @@ -1052,12 +904,13 @@ void bios0x1b(void) { case 0x00: case 0x80: - ret_ah = sxsi_operate(HDDTYPE_SASI); + ret_ah = sasibios_operate(); break; -#if 0 + +#if defined(SUPPORT_SCSI) case 0x20: case 0xa0: - ret_ah = sxsi_operate(HDDTYPE_SCSI); + ret_ah = scsibios_operate(); break; #endif @@ -1066,19 +919,6 @@ 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 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),