aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/runtime.h
diff options
context:
space:
mode:
authorVladimir2011-06-08 03:12:14 +0400
committerAlyssa Milburn2011-06-15 17:32:56 +0200
commit3595e9b675b4f18570c589bd759a20ca28d469b8 (patch)
treefe689da80ed09d45bc3f18de02daa6ed47879ad3 /engines/dreamweb/runtime.h
parent2fa141335de2576e49dbb4c8d4cdadffacd68c71 (diff)
downloadscummvm-rg350-3595e9b675b4f18570c589bd759a20ca28d469b8.tar.gz
scummvm-rg350-3595e9b675b4f18570c589bd759a20ca28d469b8.tar.bz2
scummvm-rg350-3595e9b675b4f18570c589bd759a20ca28d469b8.zip
DREAMWEB: added shr/shl instructions
Diffstat (limited to 'engines/dreamweb/runtime.h')
-rw-r--r--engines/dreamweb/runtime.h46
1 files changed, 38 insertions, 8 deletions
diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h
index af484fe19c..b69bd15d52 100644
--- a/engines/dreamweb/runtime.h
+++ b/engines/dreamweb/runtime.h
@@ -245,14 +245,16 @@ public:
}
inline void _add(uint8 &dst, uint8 src) {
- flags._c = (unsigned(dst) + src) >= 0x100;
- dst += src;
+ unsigned r = (unsigned)dst + src;
+ flags._c = r >= 0x100;
+ dst = r;
flags.update(dst);
}
inline void _add(uint16 &dst, uint16 src) {
- flags._c = (unsigned(dst) + src) >= 0x10000;
- dst += src;
+ unsigned r = (unsigned)dst + src;
+ flags._c = r >= 0x10000;
+ dst = r;
flags.update(dst);
}
@@ -304,10 +306,38 @@ public:
flags.update(dst);
}
- inline void _shr(uint8 &dst, uint8 src) {}
- inline void _shr(uint16 &dst, uint8 src) {}
- inline void _shl(uint8 &dst, uint8 src) {}
- inline void _shl(uint16 &dst, uint8 src) {}
+ inline void _shr(uint8 &dst, uint8 src) {
+ if (src > 0 && src < 32) {
+ dst >>= (src - 1);
+ flags._c = dst & 1;
+ dst >>= 1;
+ }
+ flags.update(dst);
+ }
+ inline void _shr(uint16 &dst, uint8 src) {
+ if (src > 0 && src < 32) {
+ dst >>= (src - 1);
+ flags._c = dst & 1;
+ dst >>= 1;
+ }
+ flags.update(dst);
+ }
+ inline void _shl(uint8 &dst, uint8 src) {
+ if (src > 0 && src < 32) {
+ dst <<= (src - 1);
+ flags._c = dst & 0x80;
+ dst <<= 1;
+ }
+ flags.update(dst);
+ }
+ inline void _shl(uint16 &dst, uint8 src) {
+ if (src > 0 && src < 32) {
+ dst <<= (src - 1);
+ flags._c = dst & 0x8000;
+ dst <<= 1;
+ }
+ flags.update(dst);
+ }
inline void _mul(uint8 src) {
unsigned r = unsigned(al) * src;