aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/runtime.h
diff options
context:
space:
mode:
authorVladimir2011-06-08 01:03:53 +0400
committerAlyssa Milburn2011-06-15 17:31:59 +0200
commit694c00bd10ec3daaf61445dfdc7c37f6c04a525c (patch)
treedd81b3cf9b398daae6bbf7ae9e1119608aabb7b1 /engines/dreamweb/runtime.h
parent326d5025ccdf0af4cf580583066bc0708a0c4e74 (diff)
downloadscummvm-rg350-694c00bd10ec3daaf61445dfdc7c37f6c04a525c.tar.gz
scummvm-rg350-694c00bd10ec3daaf61445dfdc7c37f6c04a525c.tar.bz2
scummvm-rg350-694c00bd10ec3daaf61445dfdc7c37f6c04a525c.zip
DREAMWEB: cleanups
Diffstat (limited to 'engines/dreamweb/runtime.h')
-rw-r--r--engines/dreamweb/runtime.h56
1 files changed, 41 insertions, 15 deletions
diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h
index 8e2eeb1db8..30bd043fd4 100644
--- a/engines/dreamweb/runtime.h
+++ b/engines/dreamweb/runtime.h
@@ -4,6 +4,7 @@
#include <assert.h>
#include "common/scummsys.h"
#include "common/array.h"
+#include "common/debug.h"
#include "common/hashmap.h"
namespace dreamgen {
@@ -51,32 +52,37 @@ typedef RegisterPart<0xff, 0> LowPartOfRegister;
typedef RegisterPart<0xff00, 8> HighPartOfRegister;
class WordRef {
- Common::Array<uint8> &_data;
- unsigned _index;
- uint16 _value;
+ uint8 *_data;
+ unsigned _index;
+ uint16 _value;
public:
- inline WordRef(Common::Array<uint8> &data, unsigned index) : _data(data), _index(index) {
+ inline WordRef(Common::Array<uint8> &data, unsigned index) : _data(data.begin() + index), _index(index) {
assert(index + 1 < data.size());
- _value = _data[index] | (_data[index + 1] << 8);
+ _value = _data[0] | (_data[1] << 8);
+ debug(1, "word ref %d -> 0x%04x", _index, _value);
}
-
+
inline WordRef& operator=(const WordRef &ref) {
_value = ref._value;
return *this;
}
-
+
inline WordRef& operator=(uint16 v) {
_value = v;
return *this;
}
-
+
inline operator uint16&() {
return _value;
}
+
inline ~WordRef() {
- _data[_index] = _value & 0xff;
- _data[_index + 1] = _value >> 8;
+ debug(1, "writing %d -> 0x%04x", _index, _value);
+ _data[0] = _value & 0xff;
+ _data[1] = _value >> 8;
+ _value = _data[0] | (_data[1] << 8);
+ debug(1, "word ref result %d -> 0x%04x", _index, _value);
}
};
@@ -189,13 +195,13 @@ public:
ds.reset(kDefaultDataSegment);
es.reset(kDefaultDataSegment);
}
-
+
SegmentRef getSegment(uint16 value) {
SegmentMap::iterator i = _segments.find(value);
assert(i != _segments.end());
return SegmentRef(this, value, &i->_value);
}
-
+
SegmentRef allocateSegment(uint size) {
unsigned id = kDefaultDataSegment + _segments.size();
assert(!_segments.contains(id));
@@ -203,39 +209,45 @@ public:
seg.data.resize(size);
return SegmentRef(this, id, &seg);
}
-
+
inline void _cmp(uint8 a, uint8 b) {
uint8 x = a;
_sub(x, b);
}
+
inline void _cmp(uint16 a, uint16 b) {
uint16 x = a;
_sub(x, b);
}
+
inline void _test(uint8 a, uint8 b) {
uint8 x = a;
_and(x, b);
}
+
inline void _test(uint16 a, uint16 b) {
uint16 x = a;
_and(x, b);
}
-
+
inline void _add(uint8 &dst, uint8 src) {
flags._c = dst + src < dst;
dst += src;
flags.update(dst);
}
+
inline void _add(uint16 &dst, uint16 src) {
flags._c = dst + src < dst;
dst += src;
flags.update(dst);
}
+
inline void _sub(uint8 &dst, uint8 src) {
flags._c = dst < src;
dst -= src;
flags.update(dst);
}
+
inline void _sub(uint16 &dst, uint16 src) {
flags._c = dst < src;
dst -= src;
@@ -247,16 +259,19 @@ public:
flags._c = false;
flags.update(dst);
}
+
inline void _and(uint16 &dst, uint16 src) {
dst &= src;
flags._c = false;
flags.update(dst);
}
+
inline void _or(uint8 &dst, uint8 src) {
dst |= src;
flags._c = false;
flags.update(dst);
}
+
inline void _or(uint16 &dst, uint16 src) {
dst |= src;
flags._c = false;
@@ -268,6 +283,7 @@ public:
flags._c = false;
flags.update(dst);
}
+
inline void _xor(uint16 &dst, uint16 src) {
dst ^= src;
flags._c = false;
@@ -278,6 +294,7 @@ public:
inline void _shr(uint16 &dst, uint8 src) {}
inline void _shl(uint8 &dst, uint8 src) {}
inline void _shl(uint16 &dst, uint8 src) {}
+
inline void _mul(uint8 src) {
unsigned r = unsigned(al) * src;
ax = (uint16)r;
@@ -287,6 +304,7 @@ public:
flags._o = s != flags._s;
flags._s = s;
}
+
inline void _mul(uint16 src) {
unsigned r = unsigned(ax) * src; //assuming here that we have at least 32 bits
dx = (r >> 16) & 0xffff;
@@ -297,11 +315,13 @@ public:
flags._o = s != flags._s;
flags._s = s;
}
+
inline void _neg(uint8 &src) {
src = ~src;
flags._c = false;
flags.update(src);
}
+
inline void _neg(uint16 &src) {
src = ~src;
flags._c = false;
@@ -311,26 +331,31 @@ public:
inline void _movsb() {
es.byte(di++) = ds.byte(si++);
}
+
inline void _movsw() {
es.word(di) = ds.word(si);
di += 2;
si += 2;
}
+
inline void _lodsb() {
al = ds.byte(si++);
}
+
inline void _lodsw() {
ax = ds.word(si);
si += 2;
}
+
inline void _stosb() {
es.byte(di++) = al;
}
+
inline void _stosw() {
es.word(di) = ax;
di += 2;
}
-
+
inline void _xchg(uint16 &a, uint16 &b) {
uint16 x = a;
a = b;
@@ -347,6 +372,7 @@ public:
inline void push(uint16 v) {
stack.push_back(v);
}
+
inline uint16 pop() {
uint16 v = stack.back();
stack.pop_back();