aboutsummaryrefslogtreecommitdiff
path: root/engines/adl/disk.h
diff options
context:
space:
mode:
authorWalter van Niftrik2017-08-12 12:02:26 +0200
committerWalter van Niftrik2019-07-17 11:42:23 +0200
commite937838b914bf2f11bd3cfbe38b537abc0c72f78 (patch)
treeb33795770e2f1460c4d21aaf804aa5c5043eb853 /engines/adl/disk.h
parent14bfe02b81cf22887750a94bc703502cc82473b9 (diff)
downloadscummvm-rg350-e937838b914bf2f11bd3cfbe38b537abc0c72f78.tar.gz
scummvm-rg350-e937838b914bf2f11bd3cfbe38b537abc0c72f78.tar.bz2
scummvm-rg350-e937838b914bf2f11bd3cfbe38b537abc0c72f78.zip
ADL: Add support for Serenia data blocks
Diffstat (limited to 'engines/adl/disk.h')
-rw-r--r--engines/adl/disk.h42
1 files changed, 34 insertions, 8 deletions
diff --git a/engines/adl/disk.h b/engines/adl/disk.h
index a13c2eeb47..97b66a9a9e 100644
--- a/engines/adl/disk.h
+++ b/engines/adl/disk.h
@@ -62,7 +62,7 @@ protected:
_filename(filename),
_offset(offset) { }
- Common::SeekableReadStream *createReadStream() const {
+ Common::SeekableReadStream *createReadStream() const override {
return _files->createReadStream(_filename, _offset);
}
@@ -80,7 +80,8 @@ public:
_tracks(0),
_sectorsPerTrack(0),
_bytesPerSector(0),
- _sectorLimit(0) { }
+ _sectorLimit(0),
+ _firstSector(0) { }
~DiskImage() {
delete _stream;
@@ -105,7 +106,7 @@ protected:
_sectorLimit(sectorLimit),
_disk(disk) { }
- Common::SeekableReadStream *createReadStream() const {
+ Common::SeekableReadStream *createReadStream() const override {
return _disk->createReadStream(_track, _sector, _offset, _size, _sectorLimit);
}
@@ -116,15 +117,15 @@ protected:
};
Common::SeekableReadStream *_stream;
- uint _tracks, _sectorsPerTrack, _bytesPerSector;
+ uint _tracks, _sectorsPerTrack, _bytesPerSector, _firstSector;
uint _sectorLimit;
};
// Data in plain files
class Files_Plain : public Files {
public:
- const DataBlockPtr getDataBlock(const Common::String &filename, uint offset = 0) const;
- Common::SeekableReadStream *createReadStream(const Common::String &filename, uint offset = 0) const;
+ const DataBlockPtr getDataBlock(const Common::String &filename, uint offset = 0) const override;
+ Common::SeekableReadStream *createReadStream(const Common::String &filename, uint offset = 0) const override;
};
// Data in files contained in Apple DOS 3.3 disk image
@@ -134,8 +135,8 @@ public:
~Files_AppleDOS();
bool open(const Common::String &filename, uint trackVTOC = 17);
- const DataBlockPtr getDataBlock(const Common::String &filename, uint offset = 0) const;
- Common::SeekableReadStream *createReadStream(const Common::String &filename, uint offset = 0) const;
+ const DataBlockPtr getDataBlock(const Common::String &filename, uint offset = 0) const override;
+ Common::SeekableReadStream *createReadStream(const Common::String &filename, uint offset = 0) const override;
private:
enum FileType {
@@ -169,6 +170,31 @@ private:
Common::HashMap<Common::String, TOCEntry> _toc;
};
+// On the Apple II, sector headers contain a disk volume number. This number
+// is used by ADL multi-disk games. The PC port has the disk volume number
+// as the first data byte of every sector that contains game data. We need
+// to skip this number as we read in the data. Additionally, the data is now
+// prefixed with an uint16 containing the data size.
+class DataBlock_PC : public DataBlock {
+public:
+ DataBlock_PC(DiskImage *disk, byte track, byte sector, uint16 offset = 0) :
+ _disk(disk),
+ _track(track),
+ _sector(sector),
+ _offset(offset) { }
+
+ virtual ~DataBlock_PC() { }
+
+ Common::SeekableReadStream *createReadStream() const override;
+
+private:
+ void read(Common::SeekableReadStream &stream, byte *const dataPtr, const uint32 size) const;
+
+ DiskImage *_disk;
+ byte _track, _sector;
+ uint16 _offset;
+};
+
} // End of namespace Adl
#endif