|
|
| version 1.8, 2004/08/11 13:53:53 | version 1.12, 2004/08/12 17:57:36 |
|---|---|
| Line 13 | Line 13 |
| static const UINT8 fdctype[] = {1,1,1,1,1,1,1,1,2,2,2,2,3,4,3,3}; | static const UINT8 fdctype[] = {1,1,1,1,1,1,1,1,2,2,2,2,3,4,3,3}; |
| void nvitem_fdcbusy(UINT id) { | void neitem_fdcbusy(UINT id) { |
| fdc.s.busy = FALSE; | fdc.s.busy = FALSE; |
| if (fdc.s.bufdir) { | if (fdc.s.bufdir) { |
| TRACEOUT(("dma ready!")); | TRACEOUT(("dma ready!")); |
| dma.DMA_REDY = 0; | dmac_sendready(TRUE); |
| } | } |
| (void)id; | |
| } | } |
| static void setbusy(UINT clock) { | static void setbusy(UINT clock) { |
| fdc.s.busy = TRUE; | fdc.s.busy = TRUE; |
| nevent_set(NEVENT_FDC, clock, nvitem_fdcbusy, NEVENT_ABSOLUTE); | nevent_set(NEVENT_FDC, clock, neitem_fdcbusy, NEVENT_ABSOLUTE); |
| } | } |
| static REG8 getstat(void) { | static REG8 getstat(void) { |
| Line 130 static REG8 type2cmd(REG8 sc) { | Line 131 static REG8 type2cmd(REG8 sc) { |
| fdc.s.bufmark = fdc.s.cmd & 1; | fdc.s.bufmark = fdc.s.cmd & 1; |
| fdc.s.bufpos = 0; | fdc.s.bufpos = 0; |
| fdc.s.bufsize = size; | fdc.s.bufsize = size; |
| fdc.s.curtime = 0; | |
| return(stat); | return(stat); |
| } | } |
| Line 169 static REG8 crccmd(void) { | Line 171 static REG8 crccmd(void) { |
| fdc.s.bufsize = 0; | fdc.s.bufsize = 0; |
| } | } |
| fdc.s.bufwrite = FALSE; | fdc.s.bufwrite = FALSE; |
| fdc.s.curtime = 0; | |
| return(stat); | return(stat); |
| } | } |
| Line 181 static void bufposinc(void) { | Line 184 static void bufposinc(void) { |
| return; | return; |
| } | } |
| fdc.s.bufpos++; | fdc.s.bufpos++; |
| fdc.s.curtime = 0; | |
| if (fdc.s.bufpos >= fdc.s.bufsize) { | if (fdc.s.bufpos >= fdc.s.bufsize) { |
| r = FALSE; | r = FALSE; |
| if (fdc.s.type == 2) { | if (fdc.s.type == 2) { |
| Line 208 static void bufposinc(void) { | Line 212 static void bufposinc(void) { |
| } | } |
| } | } |
| if (!r) { | if (!r) { |
| dma.DMA_REDY = 8; | |
| fdc.s.bufdir = FDCDIR_NONE; | fdc.s.bufdir = FDCDIR_NONE; |
| dmac_sendready(FALSE); | |
| } | } |
| } | } |
| } | } |
| Line 221 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 225 void IOOUTCALL fdc_o(UINT port, REG8 val |
| if ((port & (~7)) != 0x0ff8) { | if ((port & (~7)) != 0x0ff8) { |
| return; | return; |
| } | } |
| TRACEOUT(("fdc %.4x,%.2x [%.4x]", port, value, Z80_PC)); | // TRACEOUT(("fdc %.4x,%.2x [%.4x]", port, value, Z80_PC)); |
| switch(port & 7) { | switch(port & 7) { |
| case 0: // コマンド | case 0: // コマンド |
| fdc.s.cmd = value; | fdc.s.cmd = value; |
| Line 232 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 236 void IOOUTCALL fdc_o(UINT port, REG8 val |
| fdc.s.stat = type2flash(); | fdc.s.stat = type2flash(); |
| } | } |
| fdc.s.bufdir = FDCDIR_NONE; | fdc.s.bufdir = FDCDIR_NONE; |
| // リストアコマンドにおいて | |
| // マリオは コマンド発行後にbusyを見張る | |
| // 逆にソーサリアンとかは busyだとエラーになる… | |
| // 条件は何? | |
| 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; |
| Line 301 void IOOUTCALL fdc_o(UINT port, REG8 val | Line 309 void IOOUTCALL fdc_o(UINT port, REG8 val |
| case 0x0d: // フォースインタラプト | case 0x0d: // フォースインタラプト |
| setbusy(0); // 必要ない? | setbusy(0); // 必要ない? |
| // fdc.s.skip = 0; // 000330 | // fdc.s.skip = 0; // 000330 |
| dma.DMA_REDY = 8; // ver0.25 | dmac_sendready(FALSE); |
| break; | break; |
| case 0x0e: // リードトラック | case 0x0e: // リードトラック |
| Line 377 REG8 IOINPCALL fdc_i(UINT port) { | Line 385 REG8 IOINPCALL fdc_i(UINT port) { |
| if (ret) { | if (ret) { |
| return(ret); | return(ret); |
| } | } |
| #if 0 | #if 1 |
| if (fdc.s.type == 2) { | if (fdc.s.bufdir) { // YsII |
| if (last_r == _fdc.r && last_off == fdc.off && | fdc.s.curtime++; |
| !(--timeoutwait)) { | if (fdc.s.curtime >= 8) { |
| inc_off(); | fdc.s.stat |= 0x04; |
| timeoutwait = 4; | bufposinc(); |
| } | } |
| last_r = _fdc.r; | } |
| last_off = fdc.off; | |
| } // Read Write時のみの変化でいい筈 | |
| #endif | #endif |
| ret = getstat(); | ret = getstat(); |
| if (!(ret & 0x02)) { | if (!(ret & 0x02)) { |
| dma.DMA_REDY = 8; | dmac_sendready(FALSE); |
| } | } |
| return(ret); | return(ret); |
| Line 433 void fdc_reset(void) { | Line 439 void fdc_reset(void) { |
| FDDMTR_INIT; | FDDMTR_INIT; |
| ZeroMemory(&fdc, sizeof(fdc)); | ZeroMemory(&fdc, sizeof(fdc)); |
| fdc.s.step = 1; | fdc.s.step = 1; |
| fdc.s.equip = xmilcfg.fddequip; | |
| } | } |