// --------------------------------------------------------------------------- // UpdateDrive // void DiskManager::UpdateDrive(Drive* drv) { if (!drv->holder || drv->sizechanged) return; CriticalSection::Lock lock(cs); int t; for (t=0; t<164 && !drv->modified[t]; t++) ; if (t < 164) { FileIO* fio = drv->holder->GetDisk(drv->index); if (fio) { for (; t<164; t++) { if (drv->modified[t]) { FloppyDisk::Sector* sec; int tracksize = 0; for (sec = drv->disk.GetFirstSector(t); sec; sec=sec->next) tracksize += sec->size + sizeof(SectorHeader); if (tracksize <= drv->tracksize[t]) { drv->modified[t] = false; fio->Seek(drv->trackpos[t], FileIO::begin); WriteTrackImage(fio, drv, t); } else { drv->sizechanged = true; break; } } } } } }
// --------------------------------------------------------------------------- // Mount // arg:dr Mount するドライブ // diskname ディスクイメージのファイルネーム // readonly 読み込みのみ // index mount するディスクイメージの番号 (-1 == no disk) // bool DiskManager::Mount (uint dr, const char* diskname, bool readonly, int index, bool create) { int i; Unmount(dr); CriticalSection::Lock lock(cs); // ディスクイメージがすでに hold されているかどうかを確認 DiskImageHolder* h = 0; for (i=0; i<max_drives; i++) { if (holder[i].Connect(diskname)) { h = &holder[i]; // これから開くディスクが既に開かれていないことを確認する if (index >= 0) { for (uint d=0; d<max_drives; d++) { if ((d != dr) && (drive[d].holder == h) && (drive[d].index == index)) { index = -1; // no disk statusdisplay.Show(90, 3000, "このディスクは使用中です"); break; } } } break; } } if (!h) // 空いている holder に hold させる { for (i=0; i<max_drives; i++) { if (!holder[i].IsOpen()) { h = &holder[i]; break; } } if (!h || !h->Open(diskname, readonly, create)) { if (h) h->Disconnect(); return 0; } } if (!h->GetNumDisks()) index = -1; FileIO* fio = 0; if (index >= 0) { fio = h->GetDisk(index); if (!fio) { h->Disconnect(); return false; } } drive[dr].holder = h; drive[dr].index = index; drive[dr].sizechanged = false; if (fio) { fio->Seek(0, FileIO::begin); if (!ReadDiskImage(fio, &drive[dr])) { h->Disconnect(); drive[dr].holder = 0; return false; } memset(drive[dr].modified, 0, 164); drive[dr].fdu.Mount(&drive[dr].disk); } return true; }