diff options
author | Walter van Niftrik | 2017-08-12 12:02:26 +0200 |
---|---|---|
committer | Walter van Niftrik | 2019-07-17 11:42:23 +0200 |
commit | e937838b914bf2f11bd3cfbe38b537abc0c72f78 (patch) | |
tree | b33795770e2f1460c4d21aaf804aa5c5043eb853 /engines/adl/disk.h | |
parent | 14bfe02b81cf22887750a94bc703502cc82473b9 (diff) | |
download | scummvm-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.h | 42 |
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 |