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:
parent
1f346baa92
commit
c7b1ec2198
5 changed files with 29 additions and 46 deletions
|
@ -447,6 +447,7 @@ generator = cpp(context, "DreamGen", blacklist = [
|
|||
'finalframe',
|
||||
'findallryan',
|
||||
'findexobject',
|
||||
'findfirstpath',
|
||||
'findinvpos',
|
||||
'findlen',
|
||||
'findnextcolon',
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -172,6 +172,7 @@
|
|||
void checkObjectSize();
|
||||
bool checkObjectSizeCPP();
|
||||
void openOb();
|
||||
uint8 findFirstPath(uint16 param);
|
||||
void identifyOb();
|
||||
void selectOb();
|
||||
void findInvPos();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue