BYTE MDD_CFBT_SectorWrite( DWORD sector_addr, BYTE * buffer, BYTE allowWriteToZero) // lda sector lda // buf 512 byte block { WORD i; if (sector_addr == 0 && allowWriteToZero == FALSE) return FALSE; MDD_CFBT_CFwrite( R_COUNT, 1); MDD_CFBT_CFwrite( R_SECT, sector_addr); MDD_CFBT_CFwrite( R_CYLO, sector_addr>>8); MDD_CFBT_CFwrite( R_CYHI, sector_addr>>16); MDD_CFBT_CFwrite( R_DRIVE, ((BYTE)(sector_addr>>24) & 0xf)|0xe0); // always select card #0 MDD_CFBT_CFwrite( R_CMD, C_SECTOR_WRITE); while (MDD_CFBT_CFread( R_STATUS) != S_READY) { if (MDD_CFBT_CFread( R_STATUS) == S_ERROR) { return FALSE; } } #ifdef __C30__ ADDR0 = (R_DATA & 0x01) == 0x01; // publish the register address ADDR1 = (R_DATA & 0x02) == 0x02; ADDR2 = (R_DATA & 0x04) == 0x04; ADDR3 = (R_DATA & 0x08) == 0x08; #endif #ifdef __18CXX ADDBL = (R_DATA| 0x30); #endif MDD_CFBT_DATABoutput; // make the databus output CF_CE = 0; // CF selected for ( i=0; i<512; i++) { MDD_CFBT_DATABOUT = RAMread( buffer, 0); // read data CF_WE = 0; // WE enable CF_WE = 1; // WE disable buffer++; } CF_CE = 1; // CF deselected when done return TRUE; } // write_sector
BYTE MDD_CFPMP_SectorWrite( DWORD sector_addr, BYTE * buffer, BYTE allowWriteToZero) { WORD i; if (sector_addr == 0 && allowWriteToZero == FALSE) return FALSE; PMADDRbits.CS1 = 1; MDD_CFPMP_CFwrite( R_COUNT, 1); MDD_CFPMP_CFwrite( R_SECT, sector_addr); MDD_CFPMP_CFwrite( R_CYLO, sector_addr>>8); MDD_CFPMP_CFwrite( R_CYHI, sector_addr>>16); MDD_CFPMP_CFwrite( R_DRIVE, ((BYTE)(sector_addr>>24) & 0xf)|0xe0); // always select card #0 MDD_CFPMP_CFwrite( R_CMD, C_SECTOR_WRITE); MDD_CFPMP_CFread (0); while (MDD_CFPMP_CFread( R_STATUS) != S_READY) { if (MDD_CFPMP_CFread( R_STATUS) == S_ERROR) { return FALSE; } } PMADDR = R_DATA | (PMADDR & 0xC000); for ( i=0; i<512; i++) { MDD_CFPMP_CFwait(); PMDIN1 = RAMread( buffer, 0); // write data buffer++; } PMADDRbits.CS1 = 0; // CF deselected when done return TRUE; } // write_sector