void CIniFileBase::SetAutoFlush (bool AutoFlush) { m_InstantFlush = AutoFlush; if (AutoFlush) { FlushChanges(); } }
void CFloppyController::DetachImage(int drive) { if (m_drivedata[drive].fpFile == NULL) return; FlushChanges(); ::fclose(m_drivedata[drive].fpFile); m_drivedata[drive].fpFile = NULL; m_drivedata[drive].okReadOnly = FALSE; m_drivedata[drive].Reset(); }
void CFloppyController::Reset() { FlushChanges(); m_drive = m_side = m_track = 0; m_pDrive = NULL; m_datareg = m_writereg = m_shiftreg = 0; m_writing = m_searchsync = m_writemarker = m_crccalculus = FALSE; m_writeflag = m_shiftflag = FALSE; m_trackchanged = FALSE; m_status = FLOPPY_STATUS_TRACK0 | FLOPPY_STATUS_WRITEPROTECT; m_flags = FLOPPY_CMD_CORRECTION500 | FLOPPY_CMD_SIDEUP | FLOPPY_CMD_DIR | FLOPPY_CMD_SKIPSYNC; PrepareTrack(); }
// Read track data from file and fill m_data void CFloppyController::PrepareTrack() { FlushChanges(); if (m_pDrive == NULL) return; #if !defined(PRODUCT) DebugLogFormat(_T("Floppy Prepare Track\tTRACK %d SIDE %d\r\n"), m_track, m_side); #endif DWORD count; m_trackchanged = FALSE; m_status |= FLOPPY_STATUS_MOREDATA; m_pDrive->dataptr = 0; m_pDrive->datatrack = m_track; m_pDrive->dataside = m_side; // Track has 10 sectors, 512 bytes each; offset of the file is === ((Track<<1)+SIDE)*5120 long foffset = ((m_track * 2) + (m_side)) * 5120; BYTE data[5120]; memset(data, 0, 5120); if (m_pDrive->fpFile != NULL) { ::fseek(m_pDrive->fpFile, foffset, SEEK_SET); count = ::fread(&data, 1, 5120, m_pDrive->fpFile); //TODO: Контроль ошибок чтения } // Fill m_data array and m_marker array with marked data EncodeTrackData(data, m_pDrive->data, m_pDrive->marker, m_track, m_side); ////DEBUG: Test DecodeTrackData() //BYTE data2[5120]; //BOOL parsed = DecodeTrackData(m_pDrive->data, data2); //ASSERT(parsed); //BOOL tested = TRUE; //for (int i = 0; i < 5120; i++) // if (data[i] != data2[i]) // { // tested = FALSE; // break; // } //ASSERT(tested); }
void CFloppyController::SetCommand(WORD cmd) { //#if !defined(PRODUCT) // DebugLogFormat(_T("Floppy COMMAND %06o\r\n"), cmd); //#endif BOOL okPrepareTrack = FALSE; // Нужно ли считывать дорожку в буфер // Проверить, не сменился ли текущий привод int newdrive = -1; switch (cmd & 0x0f) { case 0: newdrive = -1; break; case 1: default: newdrive = 0; break; case 2: case 6: case 10: case 14: newdrive = 1; break; case 4: case 12: newdrive = 2; break; case 8: newdrive = 3; break; } if (m_drive != newdrive) { FlushChanges(); m_drive = newdrive; m_pDrive = (newdrive == -1) ? NULL : m_drivedata + m_drive; okPrepareTrack = TRUE; #if !defined(PRODUCT) DebugLogFormat(_T("Floppy CURRENT DRIVE %d\r\n"), newdrive); #endif } if (m_drive == -1) return; cmd &= ~3; // Убираем из команды информацию о текущем приводе // Copy new flags to m_flags m_flags &= ~FLOPPY_CMD_MASKSTORED; m_flags |= cmd & FLOPPY_CMD_MASKSTORED; // Проверяем, не сменилась ли сторона if (m_flags & FLOPPY_CMD_SIDEUP) // Side selection: 0 - down, 1 - up { if (m_side == 0) { m_side = 1; okPrepareTrack = TRUE; } } else { if (m_side == 1) { m_side = 0; okPrepareTrack = TRUE; } } if (cmd & FLOPPY_CMD_STEP) // Move head for one track to center or from center { #if !defined(PRODUCT) DebugLogFormat(_T("Floppy STEP %d\r\n"), (m_flags & FLOPPY_CMD_DIR) ? 1 : 0); #endif m_side = (m_flags & FLOPPY_CMD_SIDEUP) ? 1 : 0; if (m_flags & FLOPPY_CMD_DIR) { if (m_track < 82) { m_track++; okPrepareTrack = TRUE; } } else { if (m_track >= 1) { m_track--; okPrepareTrack = TRUE; } } } if (okPrepareTrack) PrepareTrack(); if (cmd & FLOPPY_CMD_SEARCHSYNC) // Search for marker { #if !defined(PRODUCT) DebugLog(_T("Floppy SEARCHSYNC\r\n")); //DEBUG #endif m_flags &= ~FLOPPY_CMD_SEARCHSYNC; m_searchsync = TRUE; m_crccalculus = TRUE; m_status &= ~FLOPPY_STATUS_CHECKSUMOK; } if (m_writing && (cmd & FLOPPY_CMD_SKIPSYNC)) // Запись маркера { //#if !defined(PRODUCT) // DebugLog(_T("Floppy MARKER\r\n")); //DEBUG //#endif m_writemarker = TRUE; m_status &= ~FLOPPY_STATUS_CHECKSUMOK; } }