diff options
author | Max Horn | 2011-12-02 21:27:45 +0100 |
---|---|---|
committer | Willem Jan Palenstijn | 2011-12-03 13:58:53 +0100 |
commit | b2fdf79c4a7fa1af38642e1435ac2d38a2d6ebad (patch) | |
tree | dc6393643686d1dab1f2d633bf8b52acb59b23ee | |
parent | 91c9ecf7e1e335230cff6bebfa9f2a24e9f688cf (diff) | |
download | scummvm-rg350-b2fdf79c4a7fa1af38642e1435ac2d38a2d6ebad.tar.gz scummvm-rg350-b2fdf79c4a7fa1af38642e1435ac2d38a2d6ebad.tar.bz2 scummvm-rg350-b2fdf79c4a7fa1af38642e1435ac2d38a2d6ebad.zip |
DREAMWEB: Make SegmentRef "immutable", add MutableSegmentRef subclass
This way, the cs and data segment "pointers" can be clearly seen to be
invariant and equal. Moreover, SegmentRef instances no longer needs to
carry a pointer to the context object.
-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) { |