aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2011-12-02 21:27:45 +0100
committerWillem Jan Palenstijn2011-12-03 13:58:53 +0100
commitb2fdf79c4a7fa1af38642e1435ac2d38a2d6ebad (patch)
treedc6393643686d1dab1f2d633bf8b52acb59b23ee
parent91c9ecf7e1e335230cff6bebfa9f2a24e9f688cf (diff)
downloadscummvm-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.h49
-rw-r--r--engines/dreamweb/stubs.cpp2
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) {