mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "globals.h"
 | |
| #include "flags.h"
 | |
| #include "dataspec.h"
 | |
| #include "sector.h"
 | |
| #include "sectorset.h"
 | |
| #include "imagereader/imagereader.h"
 | |
| #include "fmt/format.h"
 | |
| #include <algorithm>
 | |
| #include <iostream>
 | |
| #include <fstream>
 | |
| 
 | |
| class ImgImageReader : public ImageReader
 | |
| {
 | |
| public:
 | |
| 	ImgImageReader(const ImageSpec& spec):
 | |
| 		ImageReader(spec)
 | |
| 	{}
 | |
| 
 | |
| 	SectorSet readImage()
 | |
| 	{
 | |
|         std::ifstream inputFile(spec.filename, std::ios::in | std::ios::binary);
 | |
|         if (!inputFile.is_open())
 | |
|             Error() << "cannot open input file";
 | |
| 
 | |
|         size_t headSize = spec.sectors * spec.bytes;
 | |
|         size_t trackSize = headSize * spec.heads;
 | |
| 
 | |
|         std::cout << fmt::format("reading {} tracks, {} heads, {} sectors, {} bytes per sector, {} kB total",
 | |
|                         spec.cylinders, spec.heads,
 | |
|                         spec.sectors, spec.bytes,
 | |
|                         spec.cylinders * trackSize / 1024)
 | |
|                 << std::endl;
 | |
| 
 | |
|         SectorSet sectors;
 | |
|         for (int track = 0; track < spec.cylinders; track++)
 | |
|         {
 | |
|             for (int head = 0; head < spec.heads; head++)
 | |
|             {
 | |
|                 for (int sectorId = 0; sectorId < spec.sectors; sectorId++)
 | |
|                 {
 | |
|                     inputFile.seekg(track*trackSize + head*headSize + sectorId*spec.bytes, std::ios::beg);
 | |
| 
 | |
|                     Bytes data(spec.bytes);
 | |
|                     inputFile.read((char*) data.begin(), spec.bytes);
 | |
| 
 | |
|                     std::unique_ptr<Sector>& sector = sectors.get(track, head, sectorId);
 | |
|                     sector.reset(new Sector);
 | |
|                     sector->status = Sector::OK;
 | |
|                     sector->logicalTrack = sector->physicalTrack = track;
 | |
|                     sector->logicalSide = sector->physicalSide = head;
 | |
|                     sector->logicalSector = sectorId;
 | |
|                     sector->data = data;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         return sectors;
 | |
| 	}
 | |
| };
 | |
| 
 | |
| std::unique_ptr<ImageReader> ImageReader::createImgImageReader(
 | |
| 	const ImageSpec& spec)
 | |
| {
 | |
|     return std::unique_ptr<ImageReader>(new ImgImageReader(spec));
 | |
| }
 | |
| 
 |