2021-02-11 16:12:30 +00:00
|
|
|
#include "dos33diskimage.h"
|
2021-01-22 21:45:10 +00:00
|
|
|
|
|
|
|
#include <QFile>
|
|
|
|
#include <QDataStream>
|
|
|
|
#include <QFileInfo>
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QDir>
|
|
|
|
|
|
|
|
#include "tracksectorlist.h"
|
2021-02-11 16:12:30 +00:00
|
|
|
#include "genericfile.h"
|
2021-01-22 21:45:10 +00:00
|
|
|
#include "applesoftfile.h"
|
|
|
|
#include "binaryfile.h"
|
|
|
|
#include "IntBasicFile.h"
|
|
|
|
#include "relocatablefile.h"
|
|
|
|
#include "textfile.h"
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
Dos33DiskImage::Dos33DiskImage(QString filename)
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
2021-02-15 22:30:02 +00:00
|
|
|
m_disk_image = new RawDiskImage(filename);
|
|
|
|
|
2021-01-22 21:45:10 +00:00
|
|
|
if (!filename.isEmpty())
|
|
|
|
{
|
|
|
|
read(filename);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-15 22:30:02 +00:00
|
|
|
Dos33DiskImage::Dos33DiskImage(RawDiskImage *rawImage)
|
|
|
|
{
|
|
|
|
m_disk_image = rawImage;
|
|
|
|
}
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
Dos33DiskImage::~Dos33DiskImage()
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
2021-02-15 22:30:02 +00:00
|
|
|
// foreach (GenericFile *file, m_files)
|
|
|
|
// {
|
|
|
|
// delete file;
|
|
|
|
// }
|
2021-01-22 21:45:10 +00:00
|
|
|
}
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
bool Dos33DiskImage::read(QString filename)
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
2021-02-15 22:30:02 +00:00
|
|
|
bool retval = m_disk_image->read(filename);
|
2021-01-22 21:45:10 +00:00
|
|
|
|
2021-02-15 22:30:02 +00:00
|
|
|
if (retval)
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
2021-02-15 22:30:02 +00:00
|
|
|
for (auto tracknum = 0; tracknum < m_disk_image->numTracks(); tracknum++)
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
2021-02-15 22:30:02 +00:00
|
|
|
for (auto secnum = 0; secnum < m_disk_image->sectorsPerTrack(); secnum++)
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
2021-02-15 22:30:02 +00:00
|
|
|
TSPair tmpts(tracknum,secnum);
|
|
|
|
Sector newSec;
|
|
|
|
SectorData * data = m_disk_image->sectorAt(tmpts);
|
|
|
|
newSec.setData(data);
|
|
|
|
newSec.setTrackSector(tmpts);
|
|
|
|
m_contents[tmpts] = newSec;
|
2021-01-22 21:45:10 +00:00
|
|
|
}
|
|
|
|
}
|
2021-02-15 22:30:02 +00:00
|
|
|
}
|
2021-01-22 21:45:10 +00:00
|
|
|
|
2021-02-15 22:30:02 +00:00
|
|
|
return retval;
|
2021-01-22 21:45:10 +00:00
|
|
|
|
2021-02-15 22:30:02 +00:00
|
|
|
// m_fullImageName = filename;
|
|
|
|
// m_imageName = QFileInfo(filename).fileName();
|
|
|
|
// QFile infile(filename);
|
|
|
|
// QCryptographicHash hash(QCryptographicHash::Md5);
|
|
|
|
|
|
|
|
// if (infile.open(QIODevice::ReadOnly))
|
|
|
|
// {
|
|
|
|
// QByteArray contents = infile.readAll();
|
|
|
|
// int expectedsize = sectorsPerTrack() * tracks() * 256;
|
|
|
|
// if (contents.size() != expectedsize)
|
|
|
|
// {
|
|
|
|
// if (contents.size() == 35*16*256) { m_sectors_per_track = 16; }
|
|
|
|
// else if (contents.size() == 35*13*256) { m_sectors_per_track = 13; }
|
|
|
|
// else qWarning() << QString("Size mismatch in file! Expected %1, got %2")
|
|
|
|
// .arg(expectedsize)
|
|
|
|
// .arg(contents.size());
|
|
|
|
// }
|
|
|
|
|
|
|
|
// QDataStream qds(contents);
|
|
|
|
// for (int track = 0; track < 35; track++)
|
|
|
|
// {
|
|
|
|
// for (int sector = 0; sector < m_sectors_per_track; sector++)
|
|
|
|
// {
|
|
|
|
// char buffer[256];
|
|
|
|
// if (qds.readRawData(buffer,256) == 256)
|
|
|
|
// {
|
|
|
|
// TSPair tmpts(track,sector);
|
|
|
|
// Sector newSec;
|
|
|
|
// newSec.setTrackSector(tmpts);
|
|
|
|
// newSec.setData(QByteArray(buffer,256));
|
|
|
|
// m_contents[tmpts] = newSec;
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// qDebug() << "Invalid sector read!";
|
|
|
|
// return false;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// hash.addData(contents);
|
|
|
|
|
|
|
|
// m_hash = hash.result();
|
|
|
|
// // qDebug() << "Hash: " << m_hash;
|
|
|
|
|
|
|
|
// return true;
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// qDebug() << "Could not open file " << filename;
|
|
|
|
// return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
Sector &Dos33DiskImage::getSector(TSPair ts) { return m_contents[ts]; }
|
|
|
|
|
|
|
|
Sector &Dos33DiskImage::getSector(int track, int sector) {
|
|
|
|
return getSector(TSPair(track,sector));
|
2021-01-22 21:45:10 +00:00
|
|
|
}
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
VTOC Dos33DiskImage::getVTOC()
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
|
|
|
return getSector(17,0).promoteToVTOC();
|
|
|
|
}
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
QList<CatalogSector> Dos33DiskImage::getCatalogSectors()
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
|
|
|
QList<CatalogSector> retval;
|
|
|
|
VTOC vtoc = getVTOC();
|
|
|
|
TSPair ts = vtoc.firstCatalogSector();
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
CatalogSector cs = getSector(ts).asCatalogSector();
|
2021-01-22 21:45:10 +00:00
|
|
|
retval.append(cs);
|
|
|
|
while (cs.nextCatalogSector() != TSPair(0,0)) {
|
|
|
|
ts = cs.nextCatalogSector();
|
2021-02-11 16:12:30 +00:00
|
|
|
cs = getSector(ts).asCatalogSector();
|
2021-01-22 21:45:10 +00:00
|
|
|
retval.append(cs);
|
|
|
|
}
|
2021-02-03 18:32:07 +00:00
|
|
|
|
2021-01-22 21:45:10 +00:00
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
GenericFile *Dos33DiskImage::getFile(FileDescriptiveEntry fde)
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
|
|
|
GenericFile *retval = 0;
|
|
|
|
if (m_files.contains(fde))
|
|
|
|
{
|
|
|
|
retval = m_files[fde];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-02-03 18:32:07 +00:00
|
|
|
if (!fde.firstTSListSector().isValid())
|
|
|
|
{
|
|
|
|
qWarning(" Not returning a file from invalid TSList!");
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
TrackSectorList tsl = getSector(fde.firstTSListSector()).asTrackSectorList();
|
2021-02-03 18:32:07 +00:00
|
|
|
if (!fde.firstTSListSector().isValid())
|
|
|
|
{
|
|
|
|
qWarning(" Not returning a file from invalid TSList!");
|
|
|
|
return nullptr;
|
|
|
|
}
|
2021-01-22 21:45:10 +00:00
|
|
|
|
2021-02-15 22:30:02 +00:00
|
|
|
ChunkByteList data = getDataFromTrackSectorList(tsl);
|
|
|
|
setFileType(fde.fileTypeIdentifier());
|
|
|
|
|
|
|
|
// if (fileType() == "A")
|
|
|
|
// {
|
|
|
|
// retval = new ApplesoftFile(data);
|
|
|
|
// }
|
|
|
|
// else if (fileType() == "B")
|
|
|
|
// {
|
|
|
|
// retval = new BinaryFile(data);
|
|
|
|
// }
|
|
|
|
// else if (fileType() == "R")
|
|
|
|
// {
|
|
|
|
// retval = new RelocatableFile(data);
|
|
|
|
// }
|
|
|
|
// else if ((fileType() == "T"))
|
|
|
|
// {
|
|
|
|
// retval = new TextFile(data);
|
|
|
|
// }
|
|
|
|
// else if ((fileType() == "I"))
|
|
|
|
// {
|
|
|
|
// retval = new IntBasicFile(data);
|
|
|
|
// }
|
|
|
|
// else
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
|
|
|
retval = new GenericFile(data);
|
|
|
|
}
|
2021-02-11 16:12:30 +00:00
|
|
|
|
2021-01-22 21:45:10 +00:00
|
|
|
m_files[fde] = retval;
|
|
|
|
}
|
|
|
|
if (retval) { retval->setDiskFile(this); }
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-02-15 22:30:02 +00:00
|
|
|
ChunkByteList Dos33DiskImage::getDataFromTrackSectorList(TrackSectorList tsl)
|
2021-01-22 21:45:10 +00:00
|
|
|
{
|
2021-02-15 22:30:02 +00:00
|
|
|
ChunkByteList retval;
|
2021-01-22 21:45:10 +00:00
|
|
|
|
|
|
|
foreach(TSPair pair, tsl.getDataTSPairs())
|
|
|
|
{
|
2021-02-03 18:32:07 +00:00
|
|
|
if (pair.isValid())
|
|
|
|
{
|
2021-02-11 16:12:30 +00:00
|
|
|
Sector sec = getSector(pair);
|
2021-02-15 22:30:02 +00:00
|
|
|
retval.appendChunk(sec.rawData());
|
2021-02-03 18:32:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
qWarning("Not adding data from invalid TSList");
|
|
|
|
}
|
2021-01-22 21:45:10 +00:00
|
|
|
}
|
|
|
|
|
2021-02-03 18:32:07 +00:00
|
|
|
auto next = tsl.getNextTSList();
|
|
|
|
if (next.isValid() && next != TSPair(0,0)) {
|
2021-02-11 16:12:30 +00:00
|
|
|
TrackSectorList nextTsl = getSector(tsl.getNextTSList()).asTrackSectorList();
|
2021-02-15 22:30:02 +00:00
|
|
|
retval.appendChunkList(getDataFromTrackSectorList(nextTsl));
|
2021-01-22 21:45:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
QList<FileDescriptiveEntry> Dos33DiskImage::getAllFDEs()
|
2021-02-03 18:32:07 +00:00
|
|
|
{
|
2021-01-22 21:45:10 +00:00
|
|
|
QList<FileDescriptiveEntry> retval;
|
|
|
|
|
|
|
|
QList<CatalogSector> sectors = getCatalogSectors();
|
|
|
|
|
|
|
|
foreach (CatalogSector cs, sectors)
|
|
|
|
{
|
|
|
|
QList<FileDescriptiveEntry> fdes = cs.getFDEs();
|
|
|
|
retval.append(fdes);
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
2021-02-11 16:12:30 +00:00
|
|
|
QString Dos33DiskImage::getMetaDataPath() const {
|
2021-01-22 21:45:10 +00:00
|
|
|
QString path = QString("%1.metadata/").arg(getFullDiskImageName());
|
|
|
|
|
|
|
|
QDir dir(path);
|
|
|
|
dir.mkpath(".");
|
|
|
|
|
|
|
|
return path;
|
|
|
|
}
|
|
|
|
|
2021-02-15 22:30:02 +00:00
|
|
|
FileList Dos33DiskImage::fileList()
|
|
|
|
{
|
|
|
|
return { };
|
|
|
|
}
|
|
|
|
|