|
|
| version 1.26, 2004/03/31 19:23:37 | version 1.30, 2005/02/04 05:32:23 |
|---|---|
| Line 147 enum { | Line 147 enum { |
| static void fdd_int(int result) { | static void fdd_int(int result) { |
| if (result == FDCBIOS_NORESULT) { // ver0.29 | if (result == FDCBIOS_NORESULT) { |
| return; | return; |
| } | } |
| switch(CPU_AH & 0x0f) { | switch(CPU_AH & 0x0f) { |
| Line 202 static void fdd_int(int result) { | Line 202 static void fdd_int(int result) { |
| return; | return; |
| } | } |
| if (fdc.chgreg & 1) { | if (fdc.chgreg & 1) { |
| mem[0x0055e] &= ~(0x01 << fdc.us); | mem[MEMB_DISK_INTL] &= ~(0x01 << fdc.us); |
| } | } |
| else { | else { |
| mem[0x0055f] &= ~(0x10 << fdc.us); | mem[MEMB_DISK_INTH] &= ~(0x10 << fdc.us); |
| } | } |
| CPU_IP = BIOSOFST_WAIT; | CPU_IP = BIOSOFST_WAIT; |
| } | } |
| Line 295 static REG8 fdd_operate(REG8 type, REG8 | Line 295 static REG8 fdd_operate(REG8 type, REG8 |
| UINT32 addr; | UINT32 addr; |
| UINT8 mtr_c; | UINT8 mtr_c; |
| UINT mtr_r; | UINT mtr_r; |
| UINT fmode; | |
| mtr_c = fdc.ncn; | mtr_c = fdc.ncn; |
| mtr_r = 0; | mtr_r = 0; |
| // とりあえずBIOSの時は無視する | // とりあえずBIOSの時は無視する |
| fdc.mf = 0xff; // ver0.29 | fdc.mf = 0xff; |
| // TRACE_("int 1Bh", CPU_AH); | // TRACE_("int 1Bh", CPU_AH); |
| Line 333 static REG8 fdd_operate(REG8 type, REG8 | Line 334 static REG8 fdd_operate(REG8 type, REG8 |
| } | } |
| if (!fdd_diskready(fdc.us)) { | if (!fdd_diskready(fdc.us)) { |
| fdd_int(FDCBIOS_NONREADY); | fdd_int(FDCBIOS_NONREADY); |
| if (CPU_AH == 0x84) { // ver0.28 | if (CPU_AH == 0x84) { |
| return(0x68); // 新センスは 両用ドライブ情報も | return(0x68); // 新センスは 両用ドライブ情報も |
| } | } |
| if (CPU_AH == 0xc4) { // ver0.31 | if (CPU_AH == 0xc4) { // ver0.31 |
| if (fdc.support144) { | if (fdc.support144) { |
| return(0x6c); | return(0x6c); |
| } | } |
| Line 346 static REG8 fdd_operate(REG8 type, REG8 | Line 347 static REG8 fdd_operate(REG8 type, REG8 |
| } | } |
| } | } |
| // 2DDのモード選択 // ver0.29 | // モード選択 // ver0.78 |
| if (type == DISKTYPE_2DD) { | fmode = (type & 1)?MEMB_F2HD_MODE:MEMB_F2DD_MODE; |
| if (!(mem[MEMB_F2DD_MODE] & (0x10 << fdc.us))) { | if (!(CPU_AL & 0x80)) { |
| ndensity = 1; | if (!(mem[fmode] & (0x10 << fdc.us))) { |
| ndensity = TRUE; | |
| } | } |
| } | } |
| Line 401 static REG8 fdd_operate(REG8 type, REG8 | Line 403 static REG8 fdd_operate(REG8 type, REG8 |
| break; | break; |
| } | } |
| size -= accesssize; | size -= accesssize; |
| mtr_r += accesssize; // ver0.26 | mtr_r += accesssize; |
| if ((fdc.R++ == (UINT8)para) && | if ((fdc.R++ == (UINT8)para) && |
| (CPU_AH & 0x80) && (!fdc.hd)) { | (CPU_AH & 0x80) && (!fdc.hd)) { |
| fdc.hd = 1; | fdc.hd = 1; |
| Line 439 static REG8 fdd_operate(REG8 type, REG8 | Line 441 static REG8 fdd_operate(REG8 type, REG8 |
| ret_ah |= 0x01; | ret_ah |= 0x01; |
| } | } |
| else { // 2DD | else { // 2DD |
| if (mem[0x005ca] & (0x01 << fdc.us)) { | if (mem[fmode] & (0x01 << fdc.us)) { |
| ret_ah++; | ret_ah |= 0x01; |
| } | } |
| if (mem[0x005ca] & (0x10 << fdc.us)) { // ver0.30 | if (mem[fmode] & (0x10 << fdc.us)) { // ver0.30 |
| ret_ah |= 0x04; | ret_ah |= 0x04; |
| } | } |
| } | } |
| 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) && (fdc.support144)) { | if ((CPU_AH & 0x40) && (fdc.support144)) { |
| ret_ah |= 4; // 1.44対応ドライブ | ret_ah |= 4; // 1.44対応ドライブ |
| Line 497 static REG8 fdd_operate(REG8 type, REG8 | Line 499 static REG8 fdd_operate(REG8 type, REG8 |
| } | } |
| addr += accesssize; | addr += accesssize; |
| size -= accesssize; | size -= accesssize; |
| mtr_r += accesssize; // ver0.26 | mtr_r += accesssize; |
| if ((fdc.R++ == (UINT8)para) && | if ((fdc.R++ == (UINT8)para) && |
| (CPU_AH & 0x80) && (!fdc.hd)) { | (CPU_AH & 0x80) && (!fdc.hd)) { |
| fdc.hd = 1; | fdc.hd = 1; |
| Line 513 static REG8 fdd_operate(REG8 type, REG8 | Line 515 static REG8 fdd_operate(REG8 type, REG8 |
| result = FDCBIOS_SUCCESS; | result = FDCBIOS_SUCCESS; |
| } | } |
| else { | else { |
| ret_ah = fddlasterror; // 0xc0 // ver0.28 | ret_ah = fddlasterror; // 0xc0 |
| result = FDCBIOS_WRITEERROR; | result = FDCBIOS_WRITEERROR; |
| } | } |
| break; | break; |
| Line 563 static REG8 fdd_operate(REG8 type, REG8 | Line 565 static REG8 fdd_operate(REG8 type, REG8 |
| MEML_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; |
| if (fdc.R++ == (UINT8)para) { | if (fdc.R++ == (UINT8)para) { |
| if ((CPU_AH & 0x80) && (!fdc.hd)) { | if ((CPU_AH & 0x80) && (!fdc.hd)) { |
| fdc.hd = 1; | fdc.hd = 1; |
| Line 601 static REG8 fdd_operate(REG8 type, REG8 | Line 603 static REG8 fdd_operate(REG8 type, REG8 |
| } | } |
| #endif | #endif |
| else { | else { |
| ret_ah = fddlasterror; // 0xc0; // ver0.28 | ret_ah = fddlasterror; // 0xc0; |
| result = FDCBIOS_READERROR; | result = FDCBIOS_READERROR; |
| } | } |
| break; | break; |
| Line 613 static REG8 fdd_operate(REG8 type, REG8 | Line 615 static REG8 fdd_operate(REG8 type, REG8 |
| break; | break; |
| case 0x0a: // READ ID | case 0x0a: // READ ID |
| fdc.mf = CPU_AH & 0x40; // ver0.29 | fdc.mf = CPU_AH & 0x40; |
| if (CPU_AH & 0x10) { // ver0.28 | if (CPU_AH & 0x10) { |
| if (!biosfd_seek(CPU_CL, ndensity)) { | if (!biosfd_seek(CPU_CL, ndensity)) { |
| result = FDCBIOS_SEEKSUCCESS; | result = FDCBIOS_SEEKSUCCESS; |
| } | } |
| Line 625 static REG8 fdd_operate(REG8 type, REG8 | Line 627 static REG8 fdd_operate(REG8 type, REG8 |
| } | } |
| } | } |
| if (fdd_readid()) { | if (fdd_readid()) { |
| ret_ah = fddlasterror; // 0xa0; // ver0.28 | ret_ah = fddlasterror; // 0xa0; |
| break; | break; |
| } | } |
| if (fdc.N < 8) { // ver0.26 | if (fdc.N < 8) { |
| mtr_r += 128 << fdc.N; | mtr_r += 128 << fdc.N; |
| } | } |
| else { | else { |
| Line 673 static REG8 fdd_operate(REG8 type, REG8 | Line 675 static REG8 fdd_operate(REG8 type, REG8 |
| } | } |
| ret_ah = 0x00; | ret_ah = 0x00; |
| break; | 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); | |
| } | |
| ret_ah = 0x00; | |
| break; | |
| } | } |
| fdd_int(result); | fdd_int(result); |
| if (mtr_c != fdc.ncn) { | if (mtr_c != fdc.ncn) { |
| Line 737 static UINT16 boot_fd1(REG8 type, REG8 r | Line 751 static UINT16 boot_fd1(REG8 type, REG8 r |
| return(bootseg); | return(bootseg); |
| } | } |
| static UINT16 boot_fd(REG8 drv, REG8 type) { // ver0.27 | static UINT16 boot_fd(REG8 drv, REG8 type) { |
| UINT16 bootseg; | UINT16 bootseg; |
| Line 766 static UINT16 boot_fd(REG8 drv, REG8 typ | Line 780 static UINT16 boot_fd(REG8 drv, REG8 typ |
| return(bootseg); | return(bootseg); |
| } | } |
| } | } |
| if (type & 2) { // ver0.29 | if (type & 2) { |
| // 2DD | // 2DD |
| bootseg = boot_fd1(0, 0); | bootseg = boot_fd1(0, 0); |
| if (bootseg) { | if (bootseg) { |
| Line 875 void bios0x1b(void) { | Line 889 void bios0x1b(void) { |
| REG8 seg; | REG8 seg; |
| UINT sp; | UINT sp; |
| seg = mem[0x004b0 + (CPU_AL >> 4)]; | seg = mem[MEMX_DISK_XROM + (CPU_AL >> 4)]; |
| if (seg) { | if (seg) { |
| sp = CPU_SP; | sp = CPU_SP; |
| MEML_WRITE16(CPU_SS, sp - 2, CPU_DS); | MEML_WRITE16(CPU_SS, sp - 2, CPU_DS); |
| Line 911 void bios0x1b(void) { | Line 925 void bios0x1b(void) { |
| switch(CPU_AL & 0xf0) { | switch(CPU_AL & 0xf0) { |
| case 0x90: | case 0x90: |
| ret_ah = fdd_operate(3, 0, 0); | ret_ah = fdd_operate(3, 0, FALSE); |
| break; | break; |
| case 0x30: | case 0x30: |
| case 0xb0: | case 0xb0: |
| ret_ah = fdd_operate(3, 1, 0); | ret_ah = fdd_operate(3, 1, FALSE); |
| break; | break; |
| case 0x10: | case 0x10: |
| ret_ah = fdd_operate(1, 0, 0); | ret_ah = fdd_operate(1, 0, FALSE); |
| break; | break; |
| case 0x70: | case 0x70: |
| case 0xf0: | case 0xf0: |
| ret_ah = fdd_operate(0, 0, 0); | ret_ah = fdd_operate(0, 0, FALSE); |
| break; | break; |
| case 0x50: | case 0x50: |
| ret_ah = fdd_operate(0, 0, 1); | ret_ah = fdd_operate(0, 0, TRUE); |
| break; | break; |
| case 0x00: | case 0x00: |
| Line 964 void bios0x1b(void) { | Line 978 void bios0x1b(void) { |
| MEML_WRITE8(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); | |
| } | |