aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorD G Turner2011-12-25 23:33:11 +0000
committerD G Turner2011-12-25 23:33:11 +0000
commitc7b1ec21980d622c138fa2dcac5a03f80aa415e1 (patch)
tree05e5ec95a789277c02b2a328595b07a5ab1a929f
parent1f346baa92064388de2958110d93006ac96a5479 (diff)
downloadscummvm-rg350-c7b1ec21980d622c138fa2dcac5a03f80aa415e1.tar.gz
scummvm-rg350-c7b1ec21980d622c138fa2dcac5a03f80aa415e1.tar.bz2
scummvm-rg350-c7b1ec21980d622c138fa2dcac5a03f80aa415e1.zip
DREAMWEB: Ported 'findfirstpath' to C++.
This conversion could do with a bit more work to remove the es/ax/cx temp usage and clean up the code.
-rwxr-xr-xdevtools/tasmrecover/tasm-recover1
-rw-r--r--engines/dreamweb/dreamgen.cpp43
-rw-r--r--engines/dreamweb/dreamgen.h1
-rw-r--r--engines/dreamweb/object.cpp29
-rw-r--r--engines/dreamweb/stubs.h1
5 files changed, 29 insertions, 46 deletions
diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover
index d3929afc14..daab0fae6c 100755
--- a/devtools/tasmrecover/tasm-recover
+++ b/devtools/tasmrecover/tasm-recover
@@ -447,6 +447,7 @@ generator = cpp(context, "DreamGen", blacklist = [
'finalframe',
'findallryan',
'findexobject',
+ 'findfirstpath',
'findinvpos',
'findlen',
'findnextcolon',
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 32bb520b18..e92291178c 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -790,49 +790,6 @@ flunkedit:
dl = 255;
}
-void DreamGenContext::findFirstPath() {
- STACK_CHECK;
- push(ax);
- bx = (0);
- es = data.word(kReels);
- al = data.byte(kRoomnum);
- ah = 0;
- cx = 144;
- _mul(cx);
- _add(bx, ax);
- cx = pop();
- dl = 0;
-fpathloop:
- ax = es.word(bx+2);
- _cmp(ax, 0x0ffff);
- if (flags.z())
- goto nofirst;
- _cmp(cl, al);
- if (flags.c())
- goto nofirst;
- _cmp(ch, ah);
- if (flags.c())
- goto nofirst;
- ax = es.word(bx+4);
- _cmp(cl, al);
- if (!flags.c())
- goto nofirst;
- _cmp(ch, ah);
- if (!flags.c())
- goto nofirst;
- goto gotfirst;
-nofirst:
- _add(bx, 8);
- _inc(dl);
- _cmp(dl, 12);
- if (!flags.z())
- goto fpathloop;
- al = 0;
- return;
-gotfirst:
- al = es.byte(bx+6);
-}
-
void DreamGenContext::__start() {
static const uint8 src[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h
index 45589cab07..4d6946e8ab 100644
--- a/engines/dreamweb/dreamgen.h
+++ b/engines/dreamweb/dreamgen.h
@@ -454,7 +454,6 @@ public:
#include "stubs.h" // Allow hand-reversed functions to have a signature different than void f()
void dirCom();
- void findFirstPath();
void getAnyAd();
void getFreeAd();
void dirFile();
diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index c202ac765c..84829bf440 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -341,6 +341,32 @@ void DreamGenContext::openOb() {
_openChangeSize = getOpenedSlotCount() * kItempicsize + kInventx;
}
+uint8 DreamGenContext::findFirstPath(uint16 param) {
+ es = data.word(kReels);
+ uint16 ptr = 144 * data.byte(kRoomnum);
+ // TODO: Replace ax, cx usage with temporary uint8/16 variables...
+ cx = param;
+
+ for (uint8 pathLoop = 0; pathLoop < 12; pathLoop++, ptr += 8) {
+ ax = es.word(ptr+2);
+
+ if (ax == 0x0ffff)
+ continue; // "nofirst"
+
+ if (cl < al || ch < ah)
+ continue; // "nofirst"
+
+ ax = es.word(ptr+4);
+
+ if (cl > al || ch > ah)
+ continue; // "nofirst"
+
+ return es.byte(ptr+6); // "gotfirst"
+ }
+
+ return 0;
+}
+
void DreamGenContext::identifyOb() {
if (data.word(kWatchingtime) != 0) {
blank();
@@ -362,8 +388,7 @@ void DreamGenContext::identifyOb() {
data.byte(kPointerspath) = dl;
ax = pop();
push(ax);
- findFirstPath();
- data.byte(kPointerfirstpath) = al;
+ data.byte(kPointerfirstpath) = findFirstPath(ax);
ax = pop();
byte x = al;
diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h
index 148436e8a8..62259a16a5 100644
--- a/engines/dreamweb/stubs.h
+++ b/engines/dreamweb/stubs.h
@@ -172,6 +172,7 @@
void checkObjectSize();
bool checkObjectSizeCPP();
void openOb();
+ uint8 findFirstPath(uint16 param);
void identifyOb();
void selectOb();
void findInvPos();