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',
|
'finalframe',
|
||||||
'findallryan',
|
'findallryan',
|
||||||
'findexobject',
|
'findexobject',
|
||||||
|
'findfirstpath',
|
||||||
'findinvpos',
|
'findinvpos',
|
||||||
'findlen',
|
'findlen',
|
||||||
'findnextcolon',
|
'findnextcolon',
|
||||||
|
|
|
@ -790,49 +790,6 @@ flunkedit:
|
||||||
dl = 255;
|
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() {
|
void DreamGenContext::__start() {
|
||||||
static const uint8 src[] = {
|
static const uint8 src[] = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
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()
|
#include "stubs.h" // Allow hand-reversed functions to have a signature different than void f()
|
||||||
|
|
||||||
void dirCom();
|
void dirCom();
|
||||||
void findFirstPath();
|
|
||||||
void getAnyAd();
|
void getAnyAd();
|
||||||
void getFreeAd();
|
void getFreeAd();
|
||||||
void dirFile();
|
void dirFile();
|
||||||
|
|
|
@ -341,6 +341,32 @@ void DreamGenContext::openOb() {
|
||||||
_openChangeSize = getOpenedSlotCount() * kItempicsize + kInventx;
|
_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() {
|
void DreamGenContext::identifyOb() {
|
||||||
if (data.word(kWatchingtime) != 0) {
|
if (data.word(kWatchingtime) != 0) {
|
||||||
blank();
|
blank();
|
||||||
|
@ -362,8 +388,7 @@ void DreamGenContext::identifyOb() {
|
||||||
data.byte(kPointerspath) = dl;
|
data.byte(kPointerspath) = dl;
|
||||||
ax = pop();
|
ax = pop();
|
||||||
push(ax);
|
push(ax);
|
||||||
findFirstPath();
|
data.byte(kPointerfirstpath) = findFirstPath(ax);
|
||||||
data.byte(kPointerfirstpath) = al;
|
|
||||||
ax = pop();
|
ax = pop();
|
||||||
|
|
||||||
byte x = al;
|
byte x = al;
|
||||||
|
|
|
@ -172,6 +172,7 @@
|
||||||
void checkObjectSize();
|
void checkObjectSize();
|
||||||
bool checkObjectSizeCPP();
|
bool checkObjectSizeCPP();
|
||||||
void openOb();
|
void openOb();
|
||||||
|
uint8 findFirstPath(uint16 param);
|
||||||
void identifyOb();
|
void identifyOb();
|
||||||
void selectOb();
|
void selectOb();
|
||||||
void findInvPos();
|
void findInvPos();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue