aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorFilippos Karapetis2011-12-27 03:10:53 +0200
committerFilippos Karapetis2011-12-27 03:11:22 +0200
commit107805c34309401ac1367b8739a358dd2aaabf55 (patch)
treebd55169a1e2cbe4fe07fa9c62ff8d79a0cf78048 /engines
parenta95f34bc64ada8f1d35466a0e4cb10c96ba95580 (diff)
downloadscummvm-rg350-107805c34309401ac1367b8739a358dd2aaabf55.tar.gz
scummvm-rg350-107805c34309401ac1367b8739a358dd2aaabf55.tar.bz2
scummvm-rg350-107805c34309401ac1367b8739a358dd2aaabf55.zip
DREAMWEB: Remove almost all of the ASM runtime
Diffstat (limited to 'engines')
-rw-r--r--engines/dreamweb/runtime.h374
1 files changed, 1 insertions, 373 deletions
diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h
index 9b70d164a6..0bbef5028e 100644
--- a/engines/dreamweb/runtime.h
+++ b/engines/dreamweb/runtime.h
@@ -32,387 +32,15 @@
namespace DreamGen {
-struct Register {
- union {
- uint16 _value;
- uint8 _part[2];
- };
- inline Register(): _value() {}
- inline Register& operator=(uint16 v) { _value = v; return *this; }
- inline operator uint16&() { return _value; }
-};
-
-template<int kIndex> //from low to high
-struct RegisterPart {
- uint8 &_value;
-
- explicit inline RegisterPart(Register &reg) : _value(reg._part[kIndex]) {}
-
- inline operator uint8&() {
- return _value;
- }
-
- inline RegisterPart& operator=(const RegisterPart& o) {
- _value = o._value;
- return *this;
- }
-
- inline RegisterPart& operator=(uint8 v) {
- _value = v;
- return *this;
- }
-};
-
-#ifdef SCUMM_LITTLE_ENDIAN
- typedef RegisterPart<0> LowPartOfRegister;
- typedef RegisterPart<1> HighPartOfRegister;
-#else
- typedef RegisterPart<1> LowPartOfRegister;
- typedef RegisterPart<0> HighPartOfRegister;
-#endif
-
-struct Flags {
- bool _z, _c, _s, _o;
- inline Flags(): _z(true), _c(false), _s(false), _o(false) {}
-
- inline bool z() const { return _z; }
- inline bool c() const { return _c; }
- inline bool s() const { return _s; }
-
- inline bool l() const { return _o != _s; }
- inline bool le() const { return _o != _s|| _z; }
-
- inline void update_zs(uint8 v) {
- _s = v & 0x80;
- _z = v == 0;
- }
-
- inline void update_zs(uint16 v) {
- _s = v & 0x8000;
- _z = v == 0;
- }
-
- inline void update_o(uint8 v, uint8 a, uint8 b) {
- uint8 s1 = a & 0x80, s2 = b & 0x80;
- _o = (s1 == s2) && (v & 0x80) != s1;
- }
-
- inline void update_o(uint16 v, uint16 a, uint16 b) {
- uint16 s1 = a & 0x8000, s2 = b & 0x8000;
- _o = (s1 == s2) && (v & 0x8000) != s1;
- }
-};
-
class Context {
public:
- Register ax, dx, bx, cx, si, di;
- LowPartOfRegister al;
- HighPartOfRegister ah;
- LowPartOfRegister bl;
- HighPartOfRegister bh;
- LowPartOfRegister cl;
- HighPartOfRegister ch;
- LowPartOfRegister dl;
- HighPartOfRegister dh;
-
- SegmentRef cs;
MutableSegmentRef ds;
- MutableSegmentRef es;
- Flags flags;
-
- Context(SegmentManager *segMan): al(ax), ah(ax), bl(bx), bh(bx), cl(cx), ch(cx), dl(dx), dh(dx),
- cs(segMan->data),
- ds(segMan, segMan->data),
- es(segMan, segMan->data) {
-
- }
-
- inline void _cmp(uint8 a, uint8 b) {
- _sub(a, b);
- }
-
- inline void _cmp(uint16 a, uint16 b) {
- _sub(a, b);
- }
-
- inline void _test(uint8 a, uint8 b) {
- _and(a, b);
- }
-
- inline void _test(uint16 a, uint16 b) {
- _and(a, b);
- }
-
- inline void _add(uint8 &dst, uint8 src) {
- unsigned r = (unsigned)dst + src;
- flags.update_o((uint8)r, dst, src);
- flags._c = r >= 0x100;
- dst = r;
- flags.update_zs(dst);
- }
-
- inline void _add(uint16 &dst, uint16 src) {
- unsigned r = (unsigned)dst + src;
- flags.update_o((uint16)r, dst, src);
- flags._c = r >= 0x10000;
- dst = r;
- flags.update_zs(dst);
- }
-
- inline void _sub(uint8 &dst, uint8 src) {
- flags.update_o(uint8(dst - src), dst, (uint8)-src);
- flags._c = dst < src;
- dst -= src;
- flags.update_zs(dst);
- }
-
- inline void _sub(uint16 &dst, uint16 src) {
- flags.update_o(uint16(dst - src), dst, (uint16)-src);
- flags._c = dst < src;
- dst -= src;
- flags.update_zs(dst);
- }
-
- inline void _inc(uint8 &dst) {
- flags.update_o((uint8)(dst + 1), dst, 1);
- ++dst;
- flags.update_zs(dst);
- }
-
- inline void _inc(uint16 &dst) {
- flags.update_o((uint16)(dst + 1), dst, 1);
- ++dst;
- flags.update_zs(dst);
- }
- inline void _dec(uint8 &dst) {
- flags.update_o(uint8(dst - 1), dst, 1);
- --dst;
- flags.update_zs(dst);
- }
-
- inline void _dec(uint16 &dst) {
- flags.update_o(uint16(dst - 1), dst, 1);
- --dst;
- flags.update_zs(dst);
- }
-
- inline void _and(uint8 &dst, uint8 src) {
- dst &= src;
- flags.update_zs(dst);
- flags._c = flags._o = false;
- }
-
- inline void _and(uint16 &dst, uint16 src) {
- dst &= src;
- flags.update_zs(dst);
- flags._c = flags._o = false;
- }
+ Context(SegmentManager *segMan): ds(segMan, segMan->data) {
- inline void _or(uint8 &dst, uint8 src) {
- dst |= src;
- flags.update_zs(dst);
- flags._c = flags._o = false;
- }
-
- inline void _or(uint16 &dst, uint16 src) {
- dst |= src;
- flags.update_zs(dst);
- flags._c = flags._o = false;
- }
-
- inline void _xor(uint8 &dst, uint8 src) {
- dst ^= src;
- flags.update_zs(dst);
- flags._c = flags._o = false;
- }
-
- inline void _xor(uint16 &dst, uint16 src) {
- dst ^= src;
- flags.update_zs(dst);
- flags._c = flags._o = false;
- }
-
- inline void _shr(uint8 &dst, uint8 src) {
- src &= 0x1f;
- if (src > 0) {
- dst >>= (src - 1);
- flags._c = dst & 1;
- dst >>= 1;
- flags.update_zs(dst);
- }
- if (src == 1)
- flags._o = dst & 0x80;
- }
-
- inline void _shr(uint16 &dst, uint8 src) {
- src &= 0x1f;
- if (src > 0) {
- dst >>= (src - 1);
- flags._c = dst & 1;
- dst >>= 1;
- flags.update_zs(dst);
- }
- if (src == 1)
- flags._o = dst & 0x8000;
- }
-
- inline void _shl(uint8 &dst, uint8 src) {
- src &= 0x1f;
- if (src > 0) {
- dst <<= (src - 1);
- flags._c = dst & 0x80;
- dst <<= 1;
- flags.update_zs(dst);
- }
- if (src == 1)
- flags._o = ((dst & 0x80) != 0) == flags._c;
- }
- inline void _shl(uint16 &dst, uint8 src) {
- src &= 0x1f;
- if (src > 0) {
- dst <<= (src - 1);
- flags._c = dst & 0x8000;
- dst <<= 1;
- flags.update_zs(dst);
- }
- if (src == 1)
- flags._o = ((dst & 0x8000) != 0) == flags._c;
- }
-
- inline void _mul(uint8 src) {
- unsigned r = unsigned(al) * src;
- ax = (uint16)r;
- flags._c = r >= 0x10000;
- flags._z = r == 0;
- flags._s = r & 0x8000;
- flags._o = ah != 0;
- }
-
- inline void _mul(uint16 src) {
- unsigned r = unsigned(ax) * src; //assuming here that we have at least 32 bits
- dx = (r >> 16) & 0xffff;
- ax = r & 0xffff;
- flags._c = false;
- flags._z = r == 0;
- flags._s = r & 0x80000000;
- flags._o = dx != 0;
- }
-
- inline void _neg(uint8 &src) {
- uint8 r = 0;
- _sub(r, src);
- src = r;
- }
-
- inline void _neg(uint16 &src) {
- uint16 r = 0;
- _sub(r, src);
- src = r;
- }
-
- inline void _lodsb() {
- al = ds.byte(si++);
- }
-
- inline void _lodsw() {
- ax = ds.word(si);
- si += 2;
- }
-
- inline void _movsb() {
- es.byte(di++) = ds.byte(si++);
- }
-
- inline void _movsb(uint size, bool clear_cx = false) {
- assert(size != 0xffff);
- //fixme: add overlap and segment boundary check and rewrite
- while (size--)
- _movsb();
- if (clear_cx)
- cx = 0;
- }
-
- inline void _movsw() {
- _movsb();
- _movsb();
- }
-
- inline void _movsw(uint size, bool clear_cx = false) {
- assert(size != 0xffff);
- _movsb(size * 2, clear_cx);
- }
-
- inline void _stosb() {
- es.byte(di++) = al;
- }
-
- inline void _stosb(uint size, bool clear_cx = false) {
- assert(size != 0xffff);
- uint8 *dst = es.ptr(di, size);
- memset(dst, al, size);
- di += size;
- if (clear_cx)
- cx = 0;
- }
-
- inline void _stosw() {
- es.byte(di++) = al;
- es.byte(di++) = ah;
- }
-
- inline void _stosw(uint size, bool clear_cx = false) {
- assert(size != 0xffff);
- uint8 *dst = es.ptr(di, size * 2);
- di += 2 * size;
- while (size--) {
- *dst++ = al;
- *dst++ = ah;
- }
- if (clear_cx)
- cx = 0;
- }
-
- inline void _xchg(uint16 &a, uint16 &b) {
- uint16 x = a;
- a = b;
- b = x;
- }
-
- inline void _xchg(uint8 &a, uint8 &b) {
- uint8 t = a;
- a = b;
- b = t;
- }
-
- Common::Array<uint16> stack;
- inline void push(uint16 v) {
- stack.push_back(v);
- }
-
- inline uint16 pop() {
- assert(!stack.empty());
- uint16 v = stack.back();
- stack.pop_back();
- return v;
}
};
-class StackChecker {
- const Context &_context;
- const uint _stackDepth;
-
-public:
- StackChecker(const Context &context): _context(context), _stackDepth(context.stack.size()) {}
- ~StackChecker() { assert(_context.stack.size() == _stackDepth); }
-};
-
-#ifndef NDEBUG
-# define STACK_CHECK StackChecker checker(*this)
-#else
-# define STACK_CHECK do {} while (0)
-#endif
-
} // End of namespace DreamGen
#endif