--- np2/io/fdc.c 2003/10/17 03:52:24 1.2 +++ np2/io/fdc.c 2004/01/22 01:10:04 1.7 @@ -4,14 +4,16 @@ #include "compiler.h" -#include "dosio.h" -#include "i286.h" #include "pccore.h" #include "iocore.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, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0}; @@ -42,7 +44,7 @@ static BOOL fdc_isfdcinterrupt(void) { return(fdc.intreq); } -BYTE DMACCALL fdc_dmafunc(BYTE func) { +REG8 DMACCALL fdc_dmafunc(REG8 func) { switch(func) { case DMAEXT_START: @@ -55,13 +57,13 @@ BYTE DMACCALL fdc_dmafunc(BYTE func) { return(0); } -static void fdc_dmaready(BYTE enable) { +static void fdc_dmaready(REG8 enable) { if (CTRL_FDMEDIA == DISKTYPE_2HD) { - dmac.dmach[DMA_2HD].ready = enable; + dmac.dmach[FDC_DMACH2HD].ready = enable; } else { - dmac.dmach[DMA_2DD].ready = enable; + dmac.dmach[FDC_DMACH2DD].ready = enable; } } @@ -145,7 +147,7 @@ static void fdc_timeoutset(void) { -static BOOL FDC_DriveCheck(BYTE protectcheck) { +static BOOL FDC_DriveCheck(BOOL protectcheck) { if (!fddfile[fdc.us].fname[0]) { fdc.stat[fdc.us] = FDCRLT_IC0 | FDCRLT_NR | (fdc.hd << 2) | fdc.us; @@ -354,6 +356,7 @@ static void readsector(void) { fdcsend_error7(); return; } + fdc.event = FDCEVENT_BUFSEND2; fdc.bufp = 0; #if 1 // ver0.27 ?? @@ -465,16 +468,23 @@ static void FDC_SenceintStatus(void) { } } -#if 0 // for test.. static void FDC_ReadID(void) { // cmd: 0a switch(fdc.event) { case FDCEVENT_CMDRECV: + fdc.mf = fdc.cmd & 0x40; 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; } } -#endif static void FDC_WriteID(void) { // cmd: 0d @@ -590,7 +600,7 @@ static const FDCOPE FDC_Ope[0x20] = { FDC_Recalibrate, FDC_SenceintStatus, FDC_WriteData, - FDC_Invalid, // FDC_ReadID, + FDC_ReadID, FDC_Invalid, FDC_ReadData, FDC_WriteID, @@ -622,7 +632,7 @@ static void fdcstatusreset(void) { fdc.status = FDCSTAT_RQM; } -void DMACCALL fdc_DataRegWrite(BYTE data) { +void DMACCALL fdc_datawrite(REG8 data) { // if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) == FDCSTAT_RQM) { switch(fdc.event) { @@ -661,8 +671,7 @@ void DMACCALL fdc_DataRegWrite(BYTE data // } } - -BYTE DMACCALL fdc_DataRegRead(void) { +REG8 DMACCALL fdc_dataread(void) { // if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) // == (FDCSTAT_RQM | FDCSTAT_DIO)) { @@ -706,17 +715,19 @@ BYTE DMACCALL fdc_DataRegRead(void) { // ---- 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; if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) == FDCSTAT_RQM) { - fdc_DataRegWrite(dat); + fdc_datawrite(dat); } (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; if ((fdc.ctrlreg ^ dat) & 0x10) { fdcstatusreset(); @@ -727,31 +738,33 @@ static void IOOUTCALL fdc_o94(UINT 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; (void)port; 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; if ((fdc.status & (FDCSTAT_RQM | FDCSTAT_DIO)) == (FDCSTAT_RQM | FDCSTAT_DIO)) { - ret = fdc_DataRegRead(); + ret = fdc_dataread(); } else { ret = fdc.lastdata; } (void)port; +// TRACEOUT(("fdc in %x %x", port, ret)); return(ret); } -static BYTE IOINPCALL fdc_i94(UINT port) { +static REG8 IOINPCALL fdc_i94(UINT port) { CTRL_FDMEDIA = DISKTYPE_2HD; @@ -760,21 +773,21 @@ 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; - fdc_DataRegWrite(dat); + fdc_datawrite(dat); (void)port; } -static void IOOUTCALL fdc_occ(UINT port, BYTE dat) { +static void IOOUTCALL fdc_occ(UINT port, REG8 dat) { CTRL_FDMEDIA = DISKTYPE_2DD; fdc.ctrlreg = dat; (void)port; } -static BYTE IOINPCALL fdc_ic8(UINT port) { +static REG8 IOINPCALL fdc_ic8(UINT port) { CTRL_FDMEDIA = DISKTYPE_2DD; @@ -782,18 +795,18 @@ static BYTE IOINPCALL fdc_ic8(UINT port) 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; - ret = fdc_DataRegRead(); + ret = fdc_dataread(); (void)port; return(ret); } -static BYTE IOINPCALL fdc_icc(UINT port) { +static REG8 IOINPCALL fdc_icc(UINT port) { CTRL_FDMEDIA = DISKTYPE_2DD; @@ -802,13 +815,13 @@ 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; (void)port; } -static BYTE IOINPCALL fdc_ibe(UINT port) { +static REG8 IOINPCALL fdc_ibe(UINT port) { (void)port; return((fdc.chgreg & 3) | 8); @@ -834,6 +847,8 @@ void fdc_reset(void) { ZeroMemory(&fdc, sizeof(fdc)); fdcstatusreset(); CTRL_FDMEDIA = DISKTYPE_2HD; + dmac_attach(DMADEV_FDD, FDC_DMACH2HD); + dmac_attach(DMADEV_FDD, FDC_DMACH2DD); } void fdc_bind(void) {