|
|
| version 1.2, 2003/10/17 03:52:24 | version 1.6, 2004/01/05 09:31:25 |
|---|---|
| Line 4 | Line 4 |
| #include "compiler.h" | #include "compiler.h" |
| #include "dosio.h" | |
| #include "i286.h" | |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "fddfile.h" | #include "fddfile.h" |
| enum { | |
| FDC_DMACH2HD = 2, | |
| FDC_DMACH2DD = 3 | |
| }; | |
| static const BYTE FDCCMD_TABLE[32] = { | static const UINT8 FDCCMD_TABLE[32] = { |
| 0, 0, 8, 2, 1, 8, 8, 1, 0, 8, 1, 0, 8, 5, 0, 2, | 0, 0, 8, 2, 1, 8, 8, 1, 0, 8, 1, 0, 8, 5, 0, 2, |
| 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0}; | 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0}; |
| Line 42 static BOOL fdc_isfdcinterrupt(void) { | Line 44 static BOOL fdc_isfdcinterrupt(void) { |
| return(fdc.intreq); | return(fdc.intreq); |
| } | } |
| BYTE DMACCALL fdc_dmafunc(BYTE func) { | REG8 DMACCALL fdc_dmafunc(REG8 func) { |
| switch(func) { | switch(func) { |
| case DMAEXT_START: | case DMAEXT_START: |
| Line 55 BYTE DMACCALL fdc_dmafunc(BYTE func) { | Line 57 BYTE DMACCALL fdc_dmafunc(BYTE func) { |
| return(0); | return(0); |
| } | } |
| static void fdc_dmaready(BYTE enable) { | static void fdc_dmaready(REG8 enable) { |
| if (CTRL_FDMEDIA == DISKTYPE_2HD) { | if (CTRL_FDMEDIA == DISKTYPE_2HD) { |
| dmac.dmach[DMA_2HD].ready = enable; | dmac.dmach[FDC_DMACH2HD].ready = enable; |
| } | } |
| else { | else { |
| dmac.dmach[DMA_2DD].ready = enable; | dmac.dmach[FDC_DMACH2DD].ready = enable; |
| } | } |
| } | } |
| Line 145 static void fdc_timeoutset(void) { | Line 147 static void fdc_timeoutset(void) { |
| static BOOL FDC_DriveCheck(BYTE protectcheck) { | static BOOL FDC_DriveCheck(BOOL protectcheck) { |
| if (!fddfile[fdc.us].fname[0]) { | if (!fddfile[fdc.us].fname[0]) { |
| fdc.stat[fdc.us] = FDCRLT_IC0 | FDCRLT_NR | (fdc.hd << 2) | fdc.us; | fdc.stat[fdc.us] = FDCRLT_IC0 | FDCRLT_NR | (fdc.hd << 2) | fdc.us; |
| Line 354 static void readsector(void) { | Line 356 static void readsector(void) { |
| fdcsend_error7(); | fdcsend_error7(); |
| return; | return; |
| } | } |
| fdc.event = FDCEVENT_BUFSEND2; | fdc.event = FDCEVENT_BUFSEND2; |
| fdc.bufp = 0; | fdc.bufp = 0; |
| #if 1 // ver0.27 ?? | #if 1 // ver0.27 ?? |
| Line 465 static void FDC_SenceintStatus(void) { | Line 468 static void FDC_SenceintStatus(void) { |
| } | } |
| } | } |
| #if 0 // for test.. | |
| static void FDC_ReadID(void) { // cmd: 0a | static void FDC_ReadID(void) { // cmd: 0a |
| switch(fdc.event) { | switch(fdc.event) { |
| case FDCEVENT_CMDRECV: | case FDCEVENT_CMDRECV: |
| fdc.mf = fdc.cmd & 0x40; | |
| get_hdus(); | get_hdus(); |
| if (fdd_readid() == SUCCESS) { | |
| fdcsend_success7(); | |
| } | |
| else { | |
| fdc.stat[fdc.us] = fdc.us | (fdc.hd << 2) | | |
| FDCRLT_IC0 | FDCRLT_MA; | |
| fdcsend_error7(); | |
| } | |
| break; | break; |
| } | } |
| } | } |
| #endif | |
| static void FDC_WriteID(void) { // cmd: 0d | static void FDC_WriteID(void) { // cmd: 0d |
| Line 590 static const FDCOPE FDC_Ope[0x20] = { | Line 600 static const FDCOPE FDC_Ope[0x20] = { |
| FDC_Recalibrate, | FDC_Recalibrate, |
| FDC_SenceintStatus, | FDC_SenceintStatus, |
| FDC_WriteData, | FDC_WriteData, |
| FDC_Invalid, // FDC_ReadID, | FDC_ReadID, |
| FDC_Invalid, | FDC_Invalid, |
| FDC_ReadData, | FDC_ReadData, |
| FDC_WriteID, | FDC_WriteID, |
| Line 622 static void fdcstatusreset(void) { | Line 632 static void fdcstatusreset(void) { |
| fdc.status = FDCSTAT_RQM; | fdc.status = FDCSTAT_RQM; |
| } | } |
| void DMACCALL fdc_DataRegWrite(BYTE data) { | void DMACCALL fdc_DataRegWrite(REG8 data) { |
| // if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) == FDCSTAT_RQM) { | // if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) == FDCSTAT_RQM) { |
| switch(fdc.event) { | switch(fdc.event) { |
| Line 661 void DMACCALL fdc_DataRegWrite(BYTE data | Line 671 void DMACCALL fdc_DataRegWrite(BYTE data |
| // } | // } |
| } | } |
| REG8 DMACCALL fdc_DataRegRead(void) { | |
| BYTE DMACCALL fdc_DataRegRead(void) { | |
| // if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) | // if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) |
| // == (FDCSTAT_RQM | FDCSTAT_DIO)) { | // == (FDCSTAT_RQM | FDCSTAT_DIO)) { |
| Line 706 BYTE DMACCALL fdc_DataRegRead(void) { | Line 715 BYTE DMACCALL fdc_DataRegRead(void) { |
| // ---- I/O | // ---- I/O |
| static void IOOUTCALL fdc_o92(UINT port, BYTE dat) { | static void IOOUTCALL fdc_o92(UINT port, REG8 dat) { |
| // TRACEOUT(("fdc out %x %x", port, dat)); | |
| CTRL_FDMEDIA = DISKTYPE_2HD; | CTRL_FDMEDIA = DISKTYPE_2HD; |
| if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) == FDCSTAT_RQM) { | if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) == FDCSTAT_RQM) { |
| fdc_DataRegWrite(dat); | fdc_DataRegWrite(dat); |
| Line 715 static void IOOUTCALL fdc_o92(UINT port, | Line 725 static void IOOUTCALL fdc_o92(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL fdc_o94(UINT port, BYTE dat) { | static void IOOUTCALL fdc_o94(UINT port, REG8 dat) { |
| // TRACEOUT(("fdc out %x %x", port, dat)); | |
| CTRL_FDMEDIA = DISKTYPE_2HD; | CTRL_FDMEDIA = DISKTYPE_2HD; |
| if ((fdc.ctrlreg ^ dat) & 0x10) { | if ((fdc.ctrlreg ^ dat) & 0x10) { |
| fdcstatusreset(); | fdcstatusreset(); |
| Line 727 static void IOOUTCALL fdc_o94(UINT port, | Line 738 static void IOOUTCALL fdc_o94(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static BYTE IOINPCALL fdc_i90(UINT port) { | static REG8 IOINPCALL fdc_i90(UINT port) { |
| // TRACEOUT(("fdc in %x %x", port, fdc.status)); | |
| CTRL_FDMEDIA = DISKTYPE_2HD; | CTRL_FDMEDIA = DISKTYPE_2HD; |
| (void)port; | (void)port; |
| return(fdc.status); | return(fdc.status); |
| } | } |
| static BYTE IOINPCALL fdc_i92(UINT port) { | static REG8 IOINPCALL fdc_i92(UINT port) { |
| BYTE ret; | REG8 ret; |
| CTRL_FDMEDIA = DISKTYPE_2HD; | CTRL_FDMEDIA = DISKTYPE_2HD; |
| if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) | if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) |
| Line 748 static BYTE IOINPCALL fdc_i92(UINT port) | Line 760 static BYTE IOINPCALL fdc_i92(UINT port) |
| ret = fdc.lastdata; | ret = fdc.lastdata; |
| } | } |
| (void)port; | (void)port; |
| // TRACEOUT(("fdc in %x %x", port, ret)); | |
| return(ret); | return(ret); |
| } | } |
| static BYTE IOINPCALL fdc_i94(UINT port) { | static REG8 IOINPCALL fdc_i94(UINT port) { |
| CTRL_FDMEDIA = DISKTYPE_2HD; | CTRL_FDMEDIA = DISKTYPE_2HD; |
| Line 760 static BYTE IOINPCALL fdc_i94(UINT port) | Line 773 static BYTE IOINPCALL fdc_i94(UINT port) |
| } | } |
| static void IOOUTCALL fdc_oca(UINT port, BYTE dat) { | static void IOOUTCALL fdc_oca(UINT port, REG8 dat) { |
| CTRL_FDMEDIA = DISKTYPE_2DD; | CTRL_FDMEDIA = DISKTYPE_2DD; |
| fdc_DataRegWrite(dat); | fdc_DataRegWrite(dat); |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL fdc_occ(UINT port, BYTE dat) { | static void IOOUTCALL fdc_occ(UINT port, REG8 dat) { |
| CTRL_FDMEDIA = DISKTYPE_2DD; | CTRL_FDMEDIA = DISKTYPE_2DD; |
| fdc.ctrlreg = dat; | fdc.ctrlreg = dat; |
| (void)port; | (void)port; |
| } | } |
| static BYTE IOINPCALL fdc_ic8(UINT port) { | static REG8 IOINPCALL fdc_ic8(UINT port) { |
| CTRL_FDMEDIA = DISKTYPE_2DD; | CTRL_FDMEDIA = DISKTYPE_2DD; |
| Line 782 static BYTE IOINPCALL fdc_ic8(UINT port) | Line 795 static BYTE IOINPCALL fdc_ic8(UINT port) |
| return(fdc.status); | return(fdc.status); |
| } | } |
| static BYTE IOINPCALL fdc_ica(UINT port) { | static REG8 IOINPCALL fdc_ica(UINT port) { |
| BYTE ret; | REG8 ret; |
| CTRL_FDMEDIA = DISKTYPE_2DD; | CTRL_FDMEDIA = DISKTYPE_2DD; |
| ret = fdc_DataRegRead(); | ret = fdc_DataRegRead(); |
| Line 793 static BYTE IOINPCALL fdc_ica(UINT port) | Line 806 static BYTE IOINPCALL fdc_ica(UINT port) |
| return(ret); | return(ret); |
| } | } |
| static BYTE IOINPCALL fdc_icc(UINT port) { | static REG8 IOINPCALL fdc_icc(UINT port) { |
| CTRL_FDMEDIA = DISKTYPE_2DD; | CTRL_FDMEDIA = DISKTYPE_2DD; |
| Line 802 static BYTE IOINPCALL fdc_icc(UINT port) | Line 815 static BYTE IOINPCALL fdc_icc(UINT port) |
| } | } |
| static void IOOUTCALL fdc_obe(UINT port, BYTE dat) { | static void IOOUTCALL fdc_obe(UINT port, REG8 dat) { |
| fdc.chgreg = dat; | fdc.chgreg = dat; |
| (void)port; | (void)port; |
| } | } |
| static BYTE IOINPCALL fdc_ibe(UINT port) { | static REG8 IOINPCALL fdc_ibe(UINT port) { |
| (void)port; | (void)port; |
| return((fdc.chgreg & 3) | 8); | return((fdc.chgreg & 3) | 8); |
| Line 834 void fdc_reset(void) { | Line 847 void fdc_reset(void) { |
| ZeroMemory(&fdc, sizeof(fdc)); | ZeroMemory(&fdc, sizeof(fdc)); |
| fdcstatusreset(); | fdcstatusreset(); |
| CTRL_FDMEDIA = DISKTYPE_2HD; | CTRL_FDMEDIA = DISKTYPE_2HD; |
| dmac_attach(DMADEV_2HD, FDC_DMACH2HD); | |
| dmac_attach(DMADEV_2DD, FDC_DMACH2DD); | |
| } | } |
| void fdc_bind(void) { | void fdc_bind(void) { |