Ejemplo n.º 1
0
void CIniFileBase::SetAutoFlush (bool AutoFlush)
{
	m_InstantFlush = AutoFlush;
	if (AutoFlush)
	{
		FlushChanges();
	}
}
Ejemplo n.º 2
0
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();
}
Ejemplo n.º 3
0
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();
}
Ejemplo n.º 4
0
// 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);
}
Ejemplo n.º 5
0
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;
    }
}