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.
This commit is contained in:
D G Turner 2011-12-25 23:33:11 +00:00
parent 1f346baa92
commit c7b1ec2198
5 changed files with 29 additions and 46 deletions

View file

@ -447,6 +447,7 @@ generator = cpp(context, "DreamGen", blacklist = [
'finalframe',
'findallryan',
'findexobject',
'findfirstpath',
'findinvpos',
'findlen',
'findnextcolon',

View file

@ -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,

View file

@ -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();

View file

@ -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;

View file

@ -172,6 +172,7 @@
void checkObjectSize();
bool checkObjectSizeCPP();
void openOb();
uint8 findFirstPath(uint16 param);
void identifyOb();
void selectOb();
void findInvPos();