diff options
-rw-r--r-- | engines/dreamweb/runtime.h | 49 | ||||
-rw-r--r-- | engines/dreamweb/stubs.cpp | 2 |
2 files changed, 33 insertions, 18 deletions
diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h index 3fab4ecc60..e700d29a49 100644 --- a/engines/dreamweb/runtime.h +++ b/engines/dreamweb/runtime.h @@ -150,16 +150,14 @@ typedef Common::SharedPtr<Segment> SegmentPtr; class Context; class SegmentRef { - Context *_context; uint16 _value; SegmentPtr _segment; public: - SegmentRef(Context *ctx, uint16 value = 0, SegmentPtr segment = SegmentPtr()): _context(ctx), _value(value), _segment(segment) { + SegmentRef(uint16 value = 0, SegmentPtr segment = SegmentPtr()) + : _value(value), _segment(segment) { } - inline SegmentRef& operator=(const uint16 id); - inline uint8 &byte(unsigned index) { assert(_segment != 0); return _segment->byte(index); @@ -186,6 +184,19 @@ public: } }; +class MutableSegmentRef : public SegmentRef { +protected: + Context *_context; + +public: + MutableSegmentRef(Context *ctx, uint16 value = 0, SegmentPtr segment = SegmentPtr()) + : _context(ctx), SegmentRef(value, segment) { + } + + inline MutableSegmentRef& operator=(const uint16 id); + +}; + struct Flags { bool _z, _c, _s, _o; inline Flags(): _z(true), _c(false), _s(false), _o(false) {} @@ -240,25 +251,29 @@ public: LowPartOfRegister dl; HighPartOfRegister dh; - SegmentRef cs, ds, es, data; - //data == fake segment register always pointing to data segment + SegmentPtr _realData; ///< the primary data segment, points to a huge blob of binary data + SegmentRef cs; + MutableSegmentRef ds; + MutableSegmentRef es; + SegmentRef data; ///< fake segment register always pointing to data segment Flags flags; inline Context(): engine(0), al(ax), ah(ax), bl(bx), bh(bx), cl(cx), ch(cx), dl(dx), dh(dx), - cs(this), ds(this), es(this), data(this) { - _segments[kDefaultDataSegment] = SegmentPtr(new Segment()); - cs = kDefaultDataSegment; - ds = kDefaultDataSegment; - es = kDefaultDataSegment; - data = kDefaultDataSegment; + _realData(new Segment()), + cs(kDefaultDataSegment, _realData), + ds(this, kDefaultDataSegment, _realData), + es(this, kDefaultDataSegment, _realData), + data(kDefaultDataSegment, _realData) { + + _segments[kDefaultDataSegment] = _realData; } SegmentRef getSegment(uint16 value) { SegmentMap::iterator i = _segments.find(value); if (i != _segments.end()) - return SegmentRef(this, value, i->_value); + return SegmentRef(value, i->_value); else - return SegmentRef(this, value); + return SegmentRef(value); } SegmentRef allocateSegment(uint size) { @@ -272,7 +287,7 @@ public: assert(!_segments.contains(id)); SegmentPtr seg(new Segment(size)); _segments[id] = seg; - return SegmentRef(this, id, seg); + return SegmentRef(id, seg); } void deallocateSegment(uint16 id) { @@ -553,8 +568,8 @@ public: } }; -inline SegmentRef& SegmentRef::operator=(const uint16 id) { - *this = _context->getSegment(id); +inline MutableSegmentRef& MutableSegmentRef::operator=(const uint16 id) { + SegmentRef::operator=(_context->getSegment(id)); return *this; } diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index a64285875a..bfd766c0e8 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -632,7 +632,7 @@ void DreamGenContext::deallocateMem(uint16 segment) { uint16 bseg = data.word(kBuffers); if (!bseg) return; - SegmentRef buffers(this); + MutableSegmentRef buffers(this); buffers = bseg; uint8 *ptr = buffers.ptr(kSpritetable, tsize); for(uint i = 0; i < tsize; i += 32) { |