|
|
| version 1.17, 2004/01/29 10:04:05 | version 1.26, 2004/03/31 19:23:37 |
|---|---|
| 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) { | if ((rpm) && (!fdc.support144)) { |
| CTRL_FDMEDIA = DISKTYPE_2HD; | return(FAILURE); |
| } | } |
| else { | fdc.chgreg = type; |
| CTRL_FDMEDIA = DISKTYPE_2DD; | 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 870 void bios0x1b(void) { | Line 877 void bios0x1b(void) { |
| seg = mem[0x004b0 + (CPU_AL >> 4)]; | seg = mem[0x004b0 + (CPU_AL >> 4)]; |
| if (seg) { | 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; | 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(("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(("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); |
| } | } |