|
|
| version 1.7, 2004/08/11 12:08:16 | version 1.8, 2004/08/11 13:53:53 |
|---|---|
| Line 222 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 222 void IOOUTCALL fdc_o(UINT port, REG8 val |
| return; | return; |
| } | } |
| TRACEOUT(("fdc %.4x,%.2x [%.4x]", port, value, Z80_PC)); | TRACEOUT(("fdc %.4x,%.2x [%.4x]", port, value, Z80_PC)); |
| port &= 0xf; | switch(port & 7) { |
| if (port == 8) { // コマンド | case 0: // コマンド |
| fdc.s.cmd = value; | fdc.s.cmd = value; |
| cmd = (REG8)(value >> 4); | cmd = (REG8)(value >> 4); |
| fdc.s.type = fdctype[cmd]; | fdc.s.type = fdctype[cmd]; |
| TRACEOUT(("fdc cmd: %.2x", value)); | TRACEOUT(("fdc cmd: %.2x", value)); |
| if (fdc.s.bufwrite) { | if (fdc.s.bufwrite) { |
| fdc.s.stat = type2flash(); | fdc.s.stat = type2flash(); |
| } | } |
| fdc.s.bufdir = FDCDIR_NONE; | fdc.s.bufdir = FDCDIR_NONE; |
| setbusy(20); | setbusy(20); |
| switch(cmd) { | switch(cmd) { |
| case 0x00: // リストア | case 0x00: // リストア |
| if (value & 8) { // LAYDOCK | if (value & 8) { // LAYDOCK |
| setbusy(0); | setbusy(0); |
| } | } |
| fdc.s.motor = 0x80; // モーターOn? | fdc.s.motor = 0x80; // モーターOn? |
| fdc.s.c = 0; | fdc.s.c = 0; |
| fdc.s.step = 1; | fdc.s.step = 1; |
| fdc.s.r = 0; // デゼニワールド | fdc.s.r = 0; // デゼニワールド |
| seekcmd(); | seekcmd(); |
| fdc.s.rreg = 0; | fdc.s.rreg = 0; |
| break; | break; |
| case 0x01: // シーク | case 0x01: // シーク |
| fdc.s.motor = 0x80; // モーターOn | fdc.s.motor = 0x80; // モーターOn |
| fdc.s.step = (SINT8)((fdc.s.c<=fdc.s.data)?1:-1); | fdc.s.step = (SINT8)((fdc.s.c<=fdc.s.data)?1:-1); |
| fdc.s.c = fdc.s.data; | fdc.s.c = fdc.s.data; |
| seekcmd(); | seekcmd(); |
| break; | break; |
| case 0x02: // ステップ | case 0x02: // ステップ |
| case 0x03: | case 0x03: |
| if (fdc.s.motor) { | if (fdc.s.motor) { |
| fdc.s.c += fdc.s.step; | fdc.s.c += fdc.s.step; |
| if (cmd & 1) { | if (cmd & 1) { |
| seekcmd(); | seekcmd(); |
| } | |
| } | } |
| } | break; |
| break; | |
| case 0x04: // ステップイン | case 0x04: // ステップイン |
| case 0x05: | case 0x05: |
| if (fdc.s.motor) { | if (fdc.s.motor) { |
| fdc.s.step = 1; | fdc.s.step = 1; |
| fdc.s.c++; | fdc.s.c++; |
| if (cmd & 1) { | if (cmd & 1) { |
| seekcmd(); | seekcmd(); |
| } | |
| } | } |
| } | break; |
| break; | |
| case 0x06: // ステップアウト | case 0x06: // ステップアウト |
| case 0x07: | case 0x07: |
| if (fdc.s.motor) { | if (fdc.s.motor) { |
| fdc.s.step = -1; | fdc.s.step = -1; |
| fdc.s.c--; | fdc.s.c--; |
| if (cmd & 1) { | if (cmd & 1) { |
| seekcmd(); | seekcmd(); |
| } | |
| } | } |
| } | break; |
| break; | |
| case 0x08: // リードデータ | case 0x08: // リードデータ |
| case 0x09: | case 0x09: |
| case 0x0a: // ライトデータ | case 0x0a: // ライトデータ |
| case 0x0b: | case 0x0b: |
| setbusy(500); | setbusy(500); |
| fdc.s.stat = type2cmd(fdc.s.r); | fdc.s.stat = type2cmd(fdc.s.r); |
| break; | break; |
| case 0xc: // リードアドレス | case 0xc: // リードアドレス |
| setbusy(200); | setbusy(200); |
| fdc.s.stat = crccmd(); | fdc.s.stat = crccmd(); |
| break; | break; |
| case 0x0d: // フォースインタラプト | case 0x0d: // フォースインタラプト |
| setbusy(0); // 必要ない? | setbusy(0); // 必要ない? |
| // fdc.s.skip = 0; // 000330 | // fdc.s.skip = 0; // 000330 |
| dma.DMA_REDY = 8; // ver0.25 | dma.DMA_REDY = 8; // ver0.25 |
| break; | break; |
| case 0x0e: // リードトラック | case 0x0e: // リードトラック |
| setbusy(200); | setbusy(200); |
| ZeroMemory(fdc.s.buffer, 0x1a00); | ZeroMemory(fdc.s.buffer, 0x1a00); |
| fdc.s.bufpos = 0; | fdc.s.bufpos = 0; |
| fdc.s.bufsize = 0x1a00; | fdc.s.bufsize = 0x1a00; |
| fdc.s.bufdir = FDCDIR_IN; | fdc.s.bufdir = FDCDIR_IN; |
| break; | break; |
| case 0x0f: // ライトトラック | case 0x0f: // ライトトラック |
| #if 0 | break; |
| { | } |
| FDDFILE fdd = fddfile + fdc.s.drv; | break; |
| switch(fdd->type) { | |
| case DISKTYPE_NOTREADY: | |
| case DISKTYPE_BETA: | |
| break; | |
| case DISKTYPE_D88: | |
| default: | |
| if (fdc.s.motor) { // ver0.25 | |
| init_tao_d88(); | |
| if (dma.DMA_ENBL) { | |
| dma.DMA_REDY = 0; | |
| } | |
| } | |
| break; | |
| } | |
| } | |
| #endif | |
| break; | |
| } | |
| } | |
| else { | |
| cmd = (REG8)(fdc.s.cmd >> 4); | |
| switch(port) { | |
| case 0x09: // トラック | |
| fdc.s.c = value; | |
| break; | |
| case 0x0a: // セクタ | |
| FDDMTR_WAITSEC(value); | |
| fdc.s.r = value; | |
| fdc.s.rreg = value; | |
| break; | |
| case 0x0b: // データ | |
| fdc.s.data = value; | |
| if ((fdc.s.motor) && (fdc.s.bufdir == FDCDIR_OUT)) { | |
| fdc.s.buffer[fdc.s.bufpos] = value; | |
| fdc.s.bufwrite = TRUE; | |
| bufposinc(); | |
| } | |
| #if 0 | |
| else if (cmd == 0x0f) { // TRACK WRITE | |
| FDDFILE fdd = fddfile + fdc.s.drv; | |
| switch(fdd->type) { | |
| case DISKTYPE_NOTREADY: | |
| case DISKTYPE_BETA: | |
| break; | |
| case DISKTYPE_D88: | |
| default: | |
| fdd_wtao_d88(value); | |
| break; | |
| } | |
| } | |
| #endif | |
| break; | |
| case 0x0c: // ドライブ・サイド | case 1: // トラック |
| fdc.s.ctbl[fdc.s.drv] = fdc.s.c; | fdc.s.c = value; |
| fdc.s.c = fdc.s.ctbl[value & 0x03]; | break; |
| fdc.s.motor = (UINT8)(value & 0x80); | |
| fdc.s.drv = (UINT8)(value & 0x03); | case 2: // セクタ |
| fdc.s.h = (UINT8)((value >> 4) & 1); | FDDMTR_WAITSEC(value); |
| fdc.s.cmd = 0; // T&E SORCERIAN | fdc.s.r = value; |
| fdc.s.type = 0; | fdc.s.rreg = value; |
| break; | |
| FDDMTR_DRVSET; | |
| if (!fdc.s.motor) { | case 3: // データ |
| fdc.s.r = 0; // SACOM TELENET | fdc.s.data = value; |
| fdc.s.rreg = 0; | if ((fdc.s.motor) && (fdc.s.bufdir == FDCDIR_OUT)) { |
| } | fdc.s.buffer[fdc.s.bufpos] = value; |
| break; | fdc.s.bufwrite = TRUE; |
| } | bufposinc(); |
| } | |
| break; | |
| case 4: // ドライブ・サイド | |
| fdc.s.ctbl[fdc.s.drv] = fdc.s.c; | |
| fdc.s.c = fdc.s.ctbl[value & 0x03]; | |
| fdc.s.motor = (UINT8)(value & 0x80); | |
| fdc.s.drv = (UINT8)(value & 0x03); | |
| fdc.s.h = (UINT8)((value >> 4) & 1); | |
| fdc.s.cmd = 0; // T&E SORCERIAN | |
| fdc.s.type = 0; | |
| FDDMTR_DRVSET; | |
| if (!fdc.s.motor) { | |
| fdc.s.r = 0; // SACOM TELENET | |
| fdc.s.rreg = 0; | |
| } | |
| break; | |
| } | } |
| } | } |
| REG8 IOINPCALL fdc_i(UINT port) { | REG8 IOINPCALL fdc_i(UINT port) { |
| static BYTE timeoutwait; | // static BYTE timeoutwait; |
| static BYTE last_r; | // static BYTE last_r; |
| static short last_off; | // static short last_off; |
| REG8 cmd; | |
| REG8 ret; | REG8 ret; |
| if ((port & (~7)) != 0x0ff8) { | if ((port & (~7)) != 0x0ff8) { |
| return(0xff); | return(0xff); |
| } | } |
| cmd = (REG8)(fdc.s.cmd >> 4); | #if 0 |
| if ((port &= 0xf) != 8) { | if ((port &= 0xf) != 8) { |
| last_r = -1; | last_r = -1; |
| last_off = -1; | last_off = -1; |
| timeoutwait = 4; | timeoutwait = 4; |
| } | } |
| switch(port) { | #endif |
| case 0x8: // ステータス | switch(port & 7) { |
| case 0: // ステータス | |
| ret = fdc.s.busy; | ret = fdc.s.busy; |
| if (ret) { | if (ret) { |
| return(ret); | return(ret); |
| Line 432 static short last_off; | Line 394 static short last_off; |
| } | } |
| return(ret); | return(ret); |
| case 0x9: // トラック | case 1: // トラック |
| return(fdc.s.creg); | return(fdc.s.creg); |
| case 0xa: // セクタ | case 2: // セクタ |
| return(fdc.s.rreg); | return(fdc.s.rreg); |
| case 0xb: // データ | case 3: // データ |
| if (fdc.s.motor) { | if (fdc.s.motor) { |
| if (fdc.s.bufdir == FDCDIR_IN) { | if (fdc.s.bufdir == FDCDIR_IN) { |
| fdc.s.data = fdc.s.buffer[fdc.s.bufpos]; | fdc.s.data = fdc.s.buffer[fdc.s.bufpos]; |
| TRACEOUT(("sector read %.2x (%.2x) [%.4x]", fdc.s.data, fdc.s.bufpos, Z80_PC)); | TRACEOUT(("read %.2x %.2x [%.4x]", fdc.s.data, fdc.s.bufpos, Z80_PC)); |
| bufposinc(); | bufposinc(); |
| } | } |
| } | } |
| return(fdc.s.data); // WOODY POCO !!! | return(fdc.s.data); |
| // case 0xc: // FM | case 4: // FM |
| // case 0xd: // MFM | case 5: // MFM |
| // break; | return(0x00); |
| case 0xe: // 1.6M | case 6: // 1.6M |
| fdc.s.media = DISKTYPE_2HD; | fdc.s.media = DISKTYPE_2HD; |
| return(0xff); | break; |
| case 0xf: // 500K/1M | case 7: // 500K/1M |
| fdc.s.media = DISKTYPE_2D; | fdc.s.media = DISKTYPE_2D; |
| return(0xff); | break; |
| } | } |
| return(0); | return(0xff); |
| } | } |