//--------------------------------------------------------------------------- // // X68000 EMULATOR "XM6" // // Copyright (C) 2001-2006 PI.(ytanaka@ipc-tokai.or.jp) // Copyright (C) 2014-2020 GIMONS // // XM6i // Copyright (C) 2010-2015 isaki@NetBSD.org // // Imported sava's Anex86/T98Next image and MO format support patch. // Comments translated to english by akuker. // //--------------------------------------------------------------------------- #pragma once #include #include #include using namespace std; class DiskCache { // Number of tracks to cache static const int CACHE_MAX = 16; public: // Internal data definition using cache_t = struct { shared_ptr disktrk; // Disk Track uint32_t serial; // Serial }; DiskCache(const string&, int, uint32_t, off_t = 0); ~DiskCache() = default; void SetRawMode(bool b) { cd_raw = b; } // CD-ROM raw mode setting // Access bool Save() const; // Save and release all bool ReadSector(vector&, uint32_t); // Sector Read bool WriteSector(const vector&, uint32_t); // Sector Write private: // Internal Management shared_ptr Assign(int); shared_ptr GetTrack(uint32_t); bool Load(int index, int track, shared_ptr); void UpdateSerialNumber(); // Internal data array cache = {}; // Cache management uint32_t serial = 0; // Last serial number string sec_path; // Path int sec_size; // Sector Size (8=256, 9=512, 10=1024, 11=2048, 12=4096) int sec_blocks; // Blocks per sector bool cd_raw = false; // CD-ROM RAW mode off_t imgoffset; // Offset to actual data };