|
|
| version 1.14, 2004/01/23 16:57:20 | version 1.17, 2004/01/29 10:04:05 |
|---|---|
| Line 23 static UINT mtr_r = 0; | Line 23 static UINT mtr_r = 0; |
| // ---- FDD | // ---- FDD |
| static void setfdcmode(REG8 drv, REG8 type, REG8 rpm) { | |
| if (drv < 4) { | |
| fdc.chgreg = type; | |
| fdc.rpm[drv] = rpm; | |
| if (type & 2) { | |
| CTRL_FDMEDIA = DISKTYPE_2HD; | |
| } | |
| else { | |
| CTRL_FDMEDIA = DISKTYPE_2DD; | |
| } | |
| } | |
| } | |
| void fddbios_equip(REG8 type, BOOL clear) { | void fddbios_equip(REG8 type, BOOL clear) { |
| REG16 diskequip; | REG16 diskequip; |
| Line 31 void fddbios_equip(REG8 type, BOOL clear | Line 45 void fddbios_equip(REG8 type, BOOL clear |
| if (clear) { | if (clear) { |
| diskequip &= 0x0f00; | diskequip &= 0x0f00; |
| } | } |
| if (type == DISKTYPE_2HD) { | if (type & 1) { |
| diskequip &= 0xfff0; | |
| diskequip |= 0x0003; | diskequip |= 0x0003; |
| } | } |
| if (type == DISKTYPE_2DD) { | else { |
| diskequip &= 0xf0ff; | |
| diskequip |= 0x0300; | diskequip |= 0x0300; |
| } | } |
| SETBIOSMEM16(MEMW_DISK_EQUIP, diskequip); | SETBIOSMEM16(MEMW_DISK_EQUIP, diskequip); |
| Line 83 static BOOL biosfd_seek(REG8 track, BOOL | Line 99 static BOOL biosfd_seek(REG8 track, BOOL |
| return(SUCCESS); | 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 seg; |
| UINT off; | UINT off; |
| Line 93 static UINT16 fdfmt_biospara(REG8 fmt, R | Line 109 static UINT16 fdfmt_biospara(REG8 fmt, R |
| if (n >= 4) { | if (n >= 4) { |
| n = 3; | n = 3; |
| } | } |
| if (CTRL_FDMEDIA == DISKTYPE_2HD) { | if (type & 2) { |
| seg = GETBIOSMEM16(MEMW_F2HD_P_SEG); | seg = GETBIOSMEM16(MEMW_F2HD_P_SEG); |
| off = GETBIOSMEM16(MEMW_F2HD_P_OFF); | off = GETBIOSMEM16(MEMW_F2HD_P_OFF); |
| } | } |
| Line 116 static UINT16 fdfmt_biospara(REG8 fmt, R | Line 132 static UINT16 fdfmt_biospara(REG8 fmt, R |
| return(i286_memword_read(seg, off)); | return(i286_memword_read(seg, off)); |
| } | } |
| static void change_rpm(REG8 rpm) { // ver0.31 | |
| if (np2cfg.usefd144) { | |
| fdc.rpm = rpm; | |
| } | |
| } | |
| enum { | enum { |
| FDCBIOS_NORESULT, | FDCBIOS_NORESULT, |
| Line 152 static void fdd_int(int result) { | Line 160 static void fdd_int(int result) { |
| case 0x0a: // READ ID | case 0x0a: // READ ID |
| case 0x0d: // フォーマット | case 0x0d: // フォーマット |
| break; | break; |
| default: | default: |
| return; | return; |
| } | } |
| Line 188 static void fdd_int(int result) { | Line 197 static void fdd_int(int result) { |
| fdc.stat[fdc.us] |= FDCRLT_IC0 | FDCRLT_NW; | fdc.stat[fdc.us] |= FDCRLT_IC0 | FDCRLT_NW; |
| fdcsend_error7(); | fdcsend_error7(); |
| break; | break; |
| default: | |
| return; | |
| } | } |
| if (fdc.chgreg & 1) { | |
| mem[0x0055e] &= ~(0x01 << fdc.us); | |
| } | |
| else { | |
| mem[0x0055f] &= ~(0x10 << fdc.us); | |
| } | |
| CPU_IP = BIOSOFST_WAIT; | |
| } | } |
| #if 1 | #if 1 |
| Line 261 static void b0clr(void) { | Line 280 static void b0clr(void) { |
| } | } |
| #endif | #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; | REG8 ret_ah = 0x60; |
| UINT16 size; | UINT16 size; |
| Line 278 static REG8 fdd_operate(REG8 type, BOOL | Line 297 static REG8 fdd_operate(REG8 type, BOOL |
| mtr_c = 0xff; | mtr_c = 0xff; |
| mtr_r = 0; | mtr_r = 0; |
| // とりあえずBIOSの時は無視する | // とりあえずBIOSの時は無視する |
| fdc.mf = 0xff; // ver0.29 | fdc.mf = 0xff; // ver0.29 |
| // TRACE_("int 1Bh", CPU_AH); | // TRACE_("int 1Bh", CPU_AH); |
| change_rpm(rpm); // ver0.31 | setfdcmode((REG8)(CPU_AL & 3), type, rpm); |
| if ((CPU_AH & 0x0f) != 0x0a) { | if ((CPU_AH & 0x0f) != 0x0a) { |
| fdc.crcn = 0; | fdc.crcn = 0; |
| } | } |
| if ((CPU_AH & 0x0f) != 0x03) { | if ((CPU_AH & 0x0f) != 0x03) { |
| CTRL_FDMEDIA = type; | if (type & 2) { |
| switch(type) { | if (pic.pi[1].imr & PIC_INT42) { |
| case DISKTYPE_2HD: | return(0x40); |
| if (pic.pi[1].imr & PIC_INT42) { | } |
| return(0xd0); | } |
| } | else { |
| break; | if (pic.pi[1].imr & PIC_INT41) { |
| case DISKTYPE_2DD: | return(0x40); |
| if (pic.pi[1].imr & PIC_INT41) { | } |
| return(0xd0); | |
| } | |
| break; | |
| } | } |
| if (fdc.us != (CPU_AL & 0x03)) { | if (fdc.us != (CPU_AL & 0x03)) { |
| fdc.us = CPU_AL & 0x03; | fdc.us = CPU_AL & 0x03; |
| Line 358 static REG8 fdd_operate(REG8 type, BOOL | Line 374 static REG8 fdd_operate(REG8 type, BOOL |
| } | } |
| } | } |
| biosfd_setchrn(); | biosfd_setchrn(); |
| para = fdfmt_biospara(0, rpm); | para = fdfmt_biospara(type, rpm, 0); |
| if (!para) { | if (!para) { |
| ret_ah = 0xd0; | ret_ah = 0xd0; |
| break; | break; |
| Line 447 static REG8 fdd_operate(REG8 type, BOOL | Line 463 static REG8 fdd_operate(REG8 type, BOOL |
| } | } |
| } | } |
| biosfd_setchrn(); | biosfd_setchrn(); |
| para = fdfmt_biospara(0, rpm); | para = fdfmt_biospara(type, rpm, 0); |
| if (!para) { | if (!para) { |
| ret_ah = 0xd0; | ret_ah = 0xd0; |
| break; | break; |
| Line 512 static REG8 fdd_operate(REG8 type, BOOL | Line 528 static REG8 fdd_operate(REG8 type, BOOL |
| } | } |
| } | } |
| biosfd_setchrn(); | biosfd_setchrn(); |
| para = fdfmt_biospara(0, rpm); | para = fdfmt_biospara(type, rpm, 0); |
| if (!para) { | if (!para) { |
| ret_ah = 0xd0; | ret_ah = 0xd0; |
| break; | break; |
| Line 633 static REG8 fdd_operate(REG8 type, BOOL | Line 649 static REG8 fdd_operate(REG8 type, BOOL |
| } | } |
| fdc.d = CPU_DL; | fdc.d = CPU_DL; |
| fdc.N = CPU_CH; | fdc.N = CPU_CH; |
| para = fdfmt_biospara(1, rpm); | para = fdfmt_biospara(type, rpm, 1); |
| if (!para) { | if (!para) { |
| ret_ah = 0xd0; | ret_ah = 0xd0; |
| break; | break; |
| Line 645 static REG8 fdd_operate(REG8 type, BOOL | Line 661 static REG8 fdd_operate(REG8 type, BOOL |
| i286_memstr_read(CPU_ES, pos, ID, 4); | i286_memstr_read(CPU_ES, pos, ID, 4); |
| fdd_formating(ID); | fdd_formating(ID); |
| pos += 4; | pos += 4; |
| if (ID[3] < 8) { | |
| mtr_r += 128 << ID[3]; | |
| } | |
| else { | |
| mtr_r += 128 << 8; | |
| } | |
| } | } |
| ret_ah = 0x00; | ret_ah = 0x00; |
| break; | break; |
| } | } |
| fdd_int(result); | fdd_int(result); |
| fddmtr_seek(fdc.us, mtr_c, mtr_r); | fddmtr_seek(fdc.us, mtr_c, mtr_r); |
| CPU_IP = BIOSOFST_WAIT; // ver0.30 | |
| return(ret_ah); | return(ret_ah); |
| } | } |
| // -------------------------------------------------------------------- BIOS | // -------------------------------------------------------------------- BIOS |
| static UINT16 boot_fd1(REG8 rpm) { // ver0.31 | static UINT16 boot_fd1(REG8 type, REG8 rpm) { |
| UINT remain; | UINT remain; |
| UINT size; | UINT size; |
| UINT32 pos; | UINT32 pos; |
| UINT16 bootseg; | UINT16 bootseg; |
| change_rpm(rpm); // ver0.31 | setfdcmode(fdc.us, type, rpm); |
| if (biosfd_seek(0, 0)) { | if (biosfd_seek(0, 0)) { |
| return(0); | return(0); |
| } | } |
| Line 716 static UINT16 boot_fd(REG8 drv, REG8 typ | Line 737 static UINT16 boot_fd(REG8 drv, REG8 typ |
| if (drv >= 4) { | if (drv >= 4) { |
| return(0); | return(0); |
| } | } |
| fdc.us = drv & 3; | fdc.us = drv; |
| if (!fdd_diskready(fdc.us)) { | if (!fdd_diskready(fdc.us)) { |
| return(0); | return(0); |
| } | } |
| // 2HD | // 2HD |
| if (type & 1) { | if (type & 1) { |
| CTRL_FDMEDIA = DISKTYPE_2HD; | |
| // 1.25MB | // 1.25MB |
| bootseg = boot_fd1(0); | bootseg = boot_fd1(3, 0); |
| if (bootseg) { | if (bootseg) { |
| mem[MEMB_DISK_BOOT] = (UINT8)(0x90 + drv); | mem[MEMB_DISK_BOOT] = (UINT8)(0x90 + drv); |
| fddbios_equip(DISKTYPE_2HD, TRUE); | fddbios_equip(3, TRUE); |
| return(bootseg); | return(bootseg); |
| } | } |
| // 1.44MB | // 1.44MB |
| bootseg = boot_fd1(1); | bootseg = boot_fd1(3, 1); |
| if (bootseg) { | if (bootseg) { |
| mem[MEMB_DISK_BOOT] = (UINT8)(0x30 + drv); | mem[MEMB_DISK_BOOT] = (UINT8)(0x30 + drv); |
| fddbios_equip(DISKTYPE_2HD, TRUE); | fddbios_equip(3, TRUE); |
| return(bootseg); | return(bootseg); |
| } | } |
| } | } |
| if (type & 2) { // ver0.29 | if (type & 2) { // ver0.29 |
| // 2DD | // 2DD |
| CTRL_FDMEDIA = DISKTYPE_2DD; | bootseg = boot_fd1(0, 0); |
| bootseg = boot_fd1(0); | |
| if (bootseg) { | if (bootseg) { |
| mem[MEMB_DISK_BOOT] = (BYTE)(0x70 + drv); | mem[MEMB_DISK_BOOT] = (BYTE)(0x70 + drv); |
| fddbios_equip(DISKTYPE_2DD, TRUE); | fddbios_equip(0, TRUE); |
| return(bootseg); | return(bootseg); |
| } | } |
| } | } |
| Line 883 void bios0x1b(void) { | Line 902 void bios0x1b(void) { |
| switch(CPU_AL & 0xf0) { | switch(CPU_AL & 0xf0) { |
| case 0x90: | case 0x90: |
| ret_ah = fdd_operate(DISKTYPE_2HD, 0, 0); | ret_ah = fdd_operate(3, 0, 0); |
| break; | break; |
| case 0x30: | case 0x30: |
| case 0xb0: | case 0xb0: |
| ret_ah = fdd_operate(DISKTYPE_2HD, 0, 1); | ret_ah = fdd_operate(3, 1, 0); |
| break; | break; |
| case 0x10: | case 0x10: |
| ret_ah = fdd_operate(1, 0, 0); | |
| break; | |
| case 0x70: | case 0x70: |
| case 0xf0: | case 0xf0: |
| ret_ah = fdd_operate(DISKTYPE_2DD, 0, 0); | ret_ah = fdd_operate(0, 0, 0); |
| break; | break; |
| case 0x50: | case 0x50: |
| ret_ah = fdd_operate(DISKTYPE_2DD, 1, 0); | ret_ah = fdd_operate(0, 0, 1); |
| break; | break; |
| case 0x00: | case 0x00: |