DREAMWEB: cleanups
This commit is contained in:
parent
326d5025cc
commit
694c00bd10
1 changed files with 41 additions and 15 deletions
|
@ -4,6 +4,7 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "common/scummsys.h"
|
#include "common/scummsys.h"
|
||||||
#include "common/array.h"
|
#include "common/array.h"
|
||||||
|
#include "common/debug.h"
|
||||||
#include "common/hashmap.h"
|
#include "common/hashmap.h"
|
||||||
|
|
||||||
namespace dreamgen {
|
namespace dreamgen {
|
||||||
|
@ -51,14 +52,15 @@ typedef RegisterPart<0xff, 0> LowPartOfRegister;
|
||||||
typedef RegisterPart<0xff00, 8> HighPartOfRegister;
|
typedef RegisterPart<0xff00, 8> HighPartOfRegister;
|
||||||
|
|
||||||
class WordRef {
|
class WordRef {
|
||||||
Common::Array<uint8> &_data;
|
uint8 *_data;
|
||||||
unsigned _index;
|
unsigned _index;
|
||||||
uint16 _value;
|
uint16 _value;
|
||||||
|
|
||||||
public:
|
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());
|
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) {
|
inline WordRef& operator=(const WordRef &ref) {
|
||||||
|
@ -74,9 +76,13 @@ public:
|
||||||
inline operator uint16&() {
|
inline operator uint16&() {
|
||||||
return _value;
|
return _value;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline ~WordRef() {
|
inline ~WordRef() {
|
||||||
_data[_index] = _value & 0xff;
|
debug(1, "writing %d -> 0x%04x", _index, _value);
|
||||||
_data[_index + 1] = _value >> 8;
|
_data[0] = _value & 0xff;
|
||||||
|
_data[1] = _value >> 8;
|
||||||
|
_value = _data[0] | (_data[1] << 8);
|
||||||
|
debug(1, "word ref result %d -> 0x%04x", _index, _value);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -208,14 +214,17 @@ public:
|
||||||
uint8 x = a;
|
uint8 x = a;
|
||||||
_sub(x, b);
|
_sub(x, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _cmp(uint16 a, uint16 b) {
|
inline void _cmp(uint16 a, uint16 b) {
|
||||||
uint16 x = a;
|
uint16 x = a;
|
||||||
_sub(x, b);
|
_sub(x, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _test(uint8 a, uint8 b) {
|
inline void _test(uint8 a, uint8 b) {
|
||||||
uint8 x = a;
|
uint8 x = a;
|
||||||
_and(x, b);
|
_and(x, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _test(uint16 a, uint16 b) {
|
inline void _test(uint16 a, uint16 b) {
|
||||||
uint16 x = a;
|
uint16 x = a;
|
||||||
_and(x, b);
|
_and(x, b);
|
||||||
|
@ -226,16 +235,19 @@ public:
|
||||||
dst += src;
|
dst += src;
|
||||||
flags.update(dst);
|
flags.update(dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _add(uint16 &dst, uint16 src) {
|
inline void _add(uint16 &dst, uint16 src) {
|
||||||
flags._c = dst + src < dst;
|
flags._c = dst + src < dst;
|
||||||
dst += src;
|
dst += src;
|
||||||
flags.update(dst);
|
flags.update(dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _sub(uint8 &dst, uint8 src) {
|
inline void _sub(uint8 &dst, uint8 src) {
|
||||||
flags._c = dst < src;
|
flags._c = dst < src;
|
||||||
dst -= src;
|
dst -= src;
|
||||||
flags.update(dst);
|
flags.update(dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _sub(uint16 &dst, uint16 src) {
|
inline void _sub(uint16 &dst, uint16 src) {
|
||||||
flags._c = dst < src;
|
flags._c = dst < src;
|
||||||
dst -= src;
|
dst -= src;
|
||||||
|
@ -247,16 +259,19 @@ public:
|
||||||
flags._c = false;
|
flags._c = false;
|
||||||
flags.update(dst);
|
flags.update(dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _and(uint16 &dst, uint16 src) {
|
inline void _and(uint16 &dst, uint16 src) {
|
||||||
dst &= src;
|
dst &= src;
|
||||||
flags._c = false;
|
flags._c = false;
|
||||||
flags.update(dst);
|
flags.update(dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _or(uint8 &dst, uint8 src) {
|
inline void _or(uint8 &dst, uint8 src) {
|
||||||
dst |= src;
|
dst |= src;
|
||||||
flags._c = false;
|
flags._c = false;
|
||||||
flags.update(dst);
|
flags.update(dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _or(uint16 &dst, uint16 src) {
|
inline void _or(uint16 &dst, uint16 src) {
|
||||||
dst |= src;
|
dst |= src;
|
||||||
flags._c = false;
|
flags._c = false;
|
||||||
|
@ -268,6 +283,7 @@ public:
|
||||||
flags._c = false;
|
flags._c = false;
|
||||||
flags.update(dst);
|
flags.update(dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _xor(uint16 &dst, uint16 src) {
|
inline void _xor(uint16 &dst, uint16 src) {
|
||||||
dst ^= src;
|
dst ^= src;
|
||||||
flags._c = false;
|
flags._c = false;
|
||||||
|
@ -278,6 +294,7 @@ public:
|
||||||
inline void _shr(uint16 &dst, uint8 src) {}
|
inline void _shr(uint16 &dst, uint8 src) {}
|
||||||
inline void _shl(uint8 &dst, uint8 src) {}
|
inline void _shl(uint8 &dst, uint8 src) {}
|
||||||
inline void _shl(uint16 &dst, uint8 src) {}
|
inline void _shl(uint16 &dst, uint8 src) {}
|
||||||
|
|
||||||
inline void _mul(uint8 src) {
|
inline void _mul(uint8 src) {
|
||||||
unsigned r = unsigned(al) * src;
|
unsigned r = unsigned(al) * src;
|
||||||
ax = (uint16)r;
|
ax = (uint16)r;
|
||||||
|
@ -287,6 +304,7 @@ public:
|
||||||
flags._o = s != flags._s;
|
flags._o = s != flags._s;
|
||||||
flags._s = s;
|
flags._s = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _mul(uint16 src) {
|
inline void _mul(uint16 src) {
|
||||||
unsigned r = unsigned(ax) * src; //assuming here that we have at least 32 bits
|
unsigned r = unsigned(ax) * src; //assuming here that we have at least 32 bits
|
||||||
dx = (r >> 16) & 0xffff;
|
dx = (r >> 16) & 0xffff;
|
||||||
|
@ -297,11 +315,13 @@ public:
|
||||||
flags._o = s != flags._s;
|
flags._o = s != flags._s;
|
||||||
flags._s = s;
|
flags._s = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _neg(uint8 &src) {
|
inline void _neg(uint8 &src) {
|
||||||
src = ~src;
|
src = ~src;
|
||||||
flags._c = false;
|
flags._c = false;
|
||||||
flags.update(src);
|
flags.update(src);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _neg(uint16 &src) {
|
inline void _neg(uint16 &src) {
|
||||||
src = ~src;
|
src = ~src;
|
||||||
flags._c = false;
|
flags._c = false;
|
||||||
|
@ -311,21 +331,26 @@ public:
|
||||||
inline void _movsb() {
|
inline void _movsb() {
|
||||||
es.byte(di++) = ds.byte(si++);
|
es.byte(di++) = ds.byte(si++);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _movsw() {
|
inline void _movsw() {
|
||||||
es.word(di) = ds.word(si);
|
es.word(di) = ds.word(si);
|
||||||
di += 2;
|
di += 2;
|
||||||
si += 2;
|
si += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _lodsb() {
|
inline void _lodsb() {
|
||||||
al = ds.byte(si++);
|
al = ds.byte(si++);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _lodsw() {
|
inline void _lodsw() {
|
||||||
ax = ds.word(si);
|
ax = ds.word(si);
|
||||||
si += 2;
|
si += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _stosb() {
|
inline void _stosb() {
|
||||||
es.byte(di++) = al;
|
es.byte(di++) = al;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _stosw() {
|
inline void _stosw() {
|
||||||
es.word(di) = ax;
|
es.word(di) = ax;
|
||||||
di += 2;
|
di += 2;
|
||||||
|
@ -347,6 +372,7 @@ public:
|
||||||
inline void push(uint16 v) {
|
inline void push(uint16 v) {
|
||||||
stack.push_back(v);
|
stack.push_back(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline uint16 pop() {
|
inline uint16 pop() {
|
||||||
uint16 v = stack.back();
|
uint16 v = stack.back();
|
||||||
stack.pop_back();
|
stack.pop_back();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue