aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--saga/script.h31
-rw-r--r--saga/sfuncs.cpp93
-rw-r--r--saga/sthread.cpp183
3 files changed, 163 insertions, 144 deletions
diff --git a/saga/script.h b/saga/script.h
index 9baf427faa..11f3e877ff 100644
--- a/saga/script.h
+++ b/saga/script.h
@@ -28,7 +28,6 @@
#include "saga/text.h"
#include "saga/yslib.h"
-#include "common/stack.h"
namespace Saga {
@@ -45,8 +44,6 @@ namespace Saga {
#define R_SCRIPT_STRINGLIMIT 255
#define R_TAB " "
-#define R_DEF_THREAD_STACKSIZE 16
-
#define S_ERROR_PREFIX "SError: "
#define S_WARN_PREFIX "SWarning: "
@@ -80,7 +77,33 @@ struct R_SCRIPT_THREAD {
unsigned long i_offset; // Instruction offset
R_SEMAPHORE sem;
- Common::Stack<SDataWord_T> *stack;
+
+ // The scripts are allowed to access the stack like any other memory
+ // area. It's therefore probably quite important that our stacks work
+ // the same as in the original interpreter.
+
+ SDataWord_T stackBuf[64];
+
+ int stackPtr;
+ int framePtr;
+
+ SDataWord_T stackTop() {
+ return stackBuf[stackPtr];
+ }
+
+ int stackSize() {
+ return ARRAYSIZE(stackBuf) - stackPtr - 1;
+ }
+
+ void push(SDataWord_T n) {
+ assert(stackPtr > 0);
+ stackBuf[--stackPtr] = n;
+ }
+
+ SDataWord_T pop() {
+ assert(stackPtr < ARRAYSIZE(stackBuf));
+ return stackBuf[stackPtr++];
+ }
};
struct R_PROC_TBLENTRY {
diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp
index a4846e4189..0ce2c2b216 100644
--- a/saga/sfuncs.cpp
+++ b/saga/sfuncs.cpp
@@ -30,12 +30,11 @@
#include "saga/animation.h"
#include "saga/console.h"
#include "saga/interface.h"
+#include "saga/music.h"
#include "saga/script.h"
#include "saga/sdata.h"
-#include "common/stack.h"
-
namespace Saga {
#define OPCODE(x) &Script::x
@@ -131,7 +130,7 @@ int Script::SF_sleep(R_SCRIPTFUNC_PARAMS) {
SDataWord_T time_param;
int time;
- time_param = thread->stack->pop();
+ time_param = thread->pop();
time = _vm->_sdata->readWordU(time_param);
thread->sleep_time = time * 10;
return R_SUCCESS;
@@ -143,8 +142,8 @@ int Script::SF_sleep(R_SCRIPTFUNC_PARAMS) {
int Script::SF_3(R_SCRIPTFUNC_PARAMS) {
// INCOMPLETE
SDataWord_T param1;
- param1 = thread->stack->pop();
- thread->stack->push(0); // push for now to allow intro faire
+ param1 = thread->pop();
+ thread->push(0); // push for now to allow intro faire
// setup to run completely
return R_SUCCESS;
@@ -156,7 +155,7 @@ int Script::SF_3(R_SCRIPTFUNC_PARAMS) {
int Script::SF_setCommandText(R_SCRIPTFUNC_PARAMS) {
SDataWord_T s_idx_parm;
- s_idx_parm = thread->stack->pop();
+ s_idx_parm = thread->pop();
// INCOMPLETE
return R_SUCCESS;
@@ -175,9 +174,9 @@ int Script::SF_actorWalkTo(R_SCRIPTFUNC_PARAMS) {
int actor_idx;
R_POINT pt;
- actor_parm = thread->stack->pop();
- x_parm = thread->stack->pop();
- y_parm = thread->stack->pop();
+ actor_parm = thread->pop();
+ x_parm = thread->pop();
+ y_parm = thread->pop();
actor_id = _vm->_sdata->readWordS(actor_parm);
actor_idx = _vm->_actor->getActorIndex(actor_id);
@@ -210,8 +209,8 @@ int Script::SF_setFacing(R_SCRIPTFUNC_PARAMS) {
int actor_idx;
int orientation;
- actor_parm = thread->stack->pop();
- orient_parm = thread->stack->pop();
+ actor_parm = thread->pop();
+ orient_parm = thread->pop();
actor_id = _vm->_sdata->readWordS(actor_parm);
orientation = _vm->_sdata->readWordS(orient_parm);
@@ -233,7 +232,7 @@ int Script::SF_setFacing(R_SCRIPTFUNC_PARAMS) {
int Script::SF_freezeInterface(R_SCRIPTFUNC_PARAMS) {
SDataWord_T b_param;
- b_param = thread->stack->pop();
+ b_param = thread->pop();
if (b_param) {
_vm->_interface->deactivate();
@@ -251,8 +250,8 @@ int Script::SF_faceTowards(R_SCRIPTFUNC_PARAMS) {
// Script function #15
int Script::SF_setFollower(R_SCRIPTFUNC_PARAMS) {
- thread->stack->pop();
- thread->stack->pop();
+ thread->pop();
+ thread->pop();
return R_SUCCESS;
}
@@ -274,9 +273,9 @@ int Script::SF_startAnim(R_SCRIPTFUNC_PARAMS) {
int frame_count;
int anim_id;
- anim_id_parm = thread->stack->pop();
- frame_parm = thread->stack->pop();
- unk_parm = thread->stack->pop();
+ anim_id_parm = thread->pop();
+ frame_parm = thread->pop();
+ unk_parm = thread->pop();
frame_count = _vm->_sdata->readWordS(frame_parm);
anim_id = _vm->_sdata->readWordS(anim_id_parm);
@@ -302,9 +301,9 @@ int Script::SF_actorWalkToAsync(R_SCRIPTFUNC_PARAMS) {
int actor_idx;
R_POINT pt;
- actor_parm = thread->stack->pop();
- x_parm = thread->stack->pop();
- y_parm = thread->stack->pop();
+ actor_parm = thread->pop();
+ x_parm = thread->pop();
+ y_parm = thread->pop();
actor_id = _vm->_sdata->readWordS(actor_parm);
actor_idx = _vm->_actor->getActorIndex(actor_id);
@@ -341,9 +340,9 @@ int Script::SF_moveTo(R_SCRIPTFUNC_PARAMS) {
int result;
R_POINT pt;
- actor_parm = thread->stack->pop();
- x_parm = thread->stack->pop();
- y_parm = thread->stack->pop();
+ actor_parm = thread->pop();
+ x_parm = thread->pop();
+ y_parm = thread->pop();
actor_id = _vm->_sdata->readWordS(actor_parm);
pt.x = _vm->_sdata->readWordS(x_parm);
@@ -365,8 +364,8 @@ int Script::SF_moveTo(R_SCRIPTFUNC_PARAMS) {
// Script function #34
int Script::SF_swapActors(R_SCRIPTFUNC_PARAMS) {
- thread->stack->pop();
- thread->stack->pop();
+ thread->pop();
+ thread->pop();
return R_SUCCESS;
}
@@ -385,10 +384,10 @@ int Script::SF_actorWalk(R_SCRIPTFUNC_PARAMS) {
int actor_idx;
R_POINT pt;
- actor_parm = thread->stack->pop();
- x_parm = thread->stack->pop();
- y_parm = thread->stack->pop();
- unk_parm = thread->stack->pop();
+ actor_parm = thread->pop();
+ x_parm = thread->pop();
+ y_parm = thread->pop();
+ unk_parm = thread->pop();
actor_idx = _vm->_actor->getActorIndex(_vm->_sdata->readWordS(actor_parm));
if (actor_idx < 0) {
@@ -425,10 +424,10 @@ int Script::SF_cycleActorFrames(R_SCRIPTFUNC_PARAMS) {
int action;
//uint16 flags;
- actor_parm = thread->stack->pop();
- unk1_parm = thread->stack->pop();
- action_parm = thread->stack->pop();
- unk2_parm = thread->stack->pop();
+ actor_parm = thread->pop();
+ unk1_parm = thread->pop();
+ action_parm = thread->pop();
+ unk2_parm = thread->pop();
actor_id = _vm->_sdata->readWordS(actor_parm);
action = _vm->_sdata->readWordS(action_parm);
actor_idx = _vm->_actor->getActorIndex(actor_id);
@@ -458,9 +457,9 @@ int Script::SF_setFrame(R_SCRIPTFUNC_PARAMS) {
int action;
//uint16 flags;
- actor_parm = thread->stack->pop();
- action_parm = thread->stack->pop();
- unk1_parm = thread->stack->pop();
+ actor_parm = thread->pop();
+ action_parm = thread->pop();
+ unk1_parm = thread->pop();
actor_id = _vm->_sdata->readWordS(actor_parm);
action = _vm->_sdata->readWordS(action_parm);
@@ -490,10 +489,10 @@ int Script::SF_linkAnim(R_SCRIPTFUNC_PARAMS) {
uint16 anim_id1;
uint16 anim_id2;
- anim1_parm = thread->stack->pop();
- anim2_parm = thread->stack->pop();
- tframes_parm = thread->stack->pop();
- unk_parm = thread->stack->pop();
+ anim1_parm = thread->pop();
+ anim2_parm = thread->pop();
+ tframes_parm = thread->pop();
+ unk_parm = thread->pop();
tframes = _vm->_sdata->readWordS(tframes_parm);
anim_id1 = _vm->_sdata->readWordU(anim1_parm);
anim_id2 = _vm->_sdata->readWordU(anim2_parm);
@@ -533,12 +532,12 @@ int Script::SF_placeActor(R_SCRIPTFUNC_PARAMS) {
int result;
R_POINT pt;
- actor_parm = thread->stack->pop();
- x_parm = thread->stack->pop();
- y_parm = thread->stack->pop();
- unknown_parm = thread->stack->pop();
- action_parm = thread->stack->pop();
- unknown_parm = thread->stack->pop();
+ actor_parm = thread->pop();
+ x_parm = thread->pop();
+ y_parm = thread->pop();
+ unknown_parm = thread->pop();
+ action_parm = thread->pop();
+ unknown_parm = thread->pop();
actor_id = _vm->_sdata->readWordS(actor_parm);
pt.x = _vm->_sdata->readWordS(x_parm);
@@ -568,7 +567,7 @@ int Script::SF_placeActor(R_SCRIPTFUNC_PARAMS) {
// game cinematic. Pushes a zero or positive value if the game
// has not been interrupted.
int Script::SF_checkUserInterrupt(R_SCRIPTFUNC_PARAMS) {
- thread->stack->push(0);
+ thread->push(0);
// INCOMPLETE
diff --git a/saga/sthread.cpp b/saga/sthread.cpp
index 2c919d9849..a3b7584f02 100644
--- a/saga/sthread.cpp
+++ b/saga/sthread.cpp
@@ -33,8 +33,6 @@
#include "saga/sdata.h"
-#include "common/stack.h"
-
namespace Saga {
R_SCRIPT_THREAD *Script::SThreadCreate() {
@@ -50,7 +48,8 @@ R_SCRIPT_THREAD *Script::SThreadCreate() {
return NULL;
}
- new_thread->stack = new Common::Stack<SDataWord_T>();
+ new_thread->stackPtr = ARRAYSIZE(new_thread->stackBuf) - 1;
+ new_thread->framePtr = ARRAYSIZE(new_thread->stackBuf) - 1;
new_node = ys_dll_add_head(threadList(), new_thread, sizeof *new_thread);
@@ -64,8 +63,6 @@ int Script::SThreadDestroy(R_SCRIPT_THREAD *thread) {
return R_FAILURE;
}
- delete thread->stack;
-
return R_SUCCESS;
}
@@ -220,7 +217,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
saved_offset = thread->i_offset;
in_char = scriptS.readByte();
- debug(0, "Executing thread offset: %lu (%x) stack: %d", thread->i_offset, in_char, thread->stack->size());
+ debug(0, "Executing thread offset: %lu (%x) stack: %d", thread->i_offset, in_char, thread->stackSize());
switch (in_char) {
case 0x01: // nextblock
@@ -231,21 +228,21 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
// STACK INSTRUCTIONS
case 0x02: // Dup top element (DUP)
- thread->stack->push(thread->stack->top());
+ thread->push(thread->stackTop());
break;
case 0x03: // Pop nothing (POPN)
- thread->stack->pop();
+ thread->pop();
break;
case 0x04: // Push false (PSHF)
- thread->stack->push(0);
+ thread->push(0);
break;
case 0x05: // Push true (PSHT)
- thread->stack->push(1);
+ thread->push(1);
break;
case 0x06: // Push word (PUSH)
case 0x08: // Push word (PSHD) (dialogue string index)
param1 = (SDataWord_T)scriptS.readUint16LE();
- thread->stack->push(param1);
+ thread->push(param1);
break;
// DATA INSTRUCTIONS
@@ -254,19 +251,19 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
n_buf = scriptS.readByte();
param1 = (SDataWord_T)scriptS.readUint16LE();
_vm->_sdata->getBit(n_buf, param1, &bitstate);
- thread->stack->push(bitstate);
+ thread->push(bitstate);
break;
case 0x0C: // Get word (GETW)
n_buf = scriptS.readByte();
param1 = scriptS.readUint16LE();
_vm->_sdata->getWord(n_buf, param1, &data);
- thread->stack->push(data);
+ thread->push(data);
break;
case 0x0F: // Modify flag (MODF)
n_buf = scriptS.readByte();
param1 = (SDataWord_T)scriptS.readUint16LE();
bitstate = _vm->_sdata->readWordU(param1);
- data = thread->stack->top();
+ data = thread->stackTop();
if (bitstate) {
_vm->_sdata->setBit(n_buf, data, 1);
} else {
@@ -276,13 +273,13 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
case 0x10: // Put word (PUTW)
n_buf = scriptS.readByte();
param1 = (SDataWord_T)scriptS.readUint16LE();
- data = thread->stack->top();
+ data = thread->stackTop();
_vm->_sdata->putWord(n_buf, param1, data);
break;
case 0x13: // Modify flag and pop (MDFP)
n_buf = scriptS.readByte();
param1 = (SDataWord_T)scriptS.readUint16LE();
- param1 = thread->stack->pop();
+ param1 = thread->pop();
bitstate = _vm->_sdata->readWordU(param1);
if (bitstate) {
_vm->_sdata->setBit(n_buf, param1, 1);
@@ -293,7 +290,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
case 0x14: // Put word and pop (PTWP)
n_buf = scriptS.readByte();
param1 = (SDataWord_T)scriptS.readUint16LE();
- data = thread->stack->top();
+ data = thread->stackTop();
_vm->_sdata->putWord(n_buf, param1, data);
break;
@@ -311,11 +308,11 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
error("Calling dynamically generated script? Wow");
param1 = (SDataWord_T)scriptS.readUint16LE();
data = scriptS.pos();
- thread->stack->push(n_args);
+ thread->push(n_args);
// NOTE: The original pushes the program
// counter as a pointer here. But I don't think
// we will have to do that.
- thread->stack->push(data);
+ thread->push(data);
thread->i_offset = (unsigned long)param1;
}
break;
@@ -342,7 +339,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
thread->i_offset, func_num);
_vm->_console->print(S_WARN_PREFIX "Removing %d operand(s) from stack.\n", n_args);
for (i = 0; i < n_args; i++) {
- thread->stack->pop();
+ thread->pop();
}
} else {
FIXME_SHADOWED_result = (this->*sfunc)(thread);
@@ -354,7 +351,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
break;
case 0x1A: // (ENTR) Enter the dragon
//data = scriptS.pos();
- //thread->stack->push(data);
+ //thread->push(data);
param1 = scriptS.readUint16LE();
break;
@@ -362,12 +359,12 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
unhandled = 1;
break;
case 0x1C: // Return with void
- if (thread->stack->size() == 0) {
+ if (thread->stackSize() == 0) {
_vm->_console->print("Script execution complete.");
thread->executing = 0;
} else {
- data = thread->stack->pop();
- /* int n_args = */ thread->stack->pop();
+ data = thread->pop();
+ /* int n_args = */ thread->pop();
thread->i_offset = data;
}
break;
@@ -382,7 +379,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
// (JNZP): Jump if nonzero + POP
case 0x1E:
param1 = scriptS.readUint16LE();
- data = thread->stack->pop();
+ data = thread->pop();
if (data) {
thread->i_offset = (unsigned long)param1;
}
@@ -390,7 +387,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
// (JZP): Jump if zero + POP
case 0x1F:
param1 = scriptS.readUint16LE();
- data = thread->stack->pop();
+ data = thread->pop();
if (!data) {
thread->i_offset = (unsigned long)param1;
}
@@ -398,7 +395,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
// (JNZ): Jump if nonzero
case 0x20:
param1 = scriptS.readUint16LE();
- data = thread->stack->top();
+ data = thread->stackTop();
if (data) {
thread->i_offset = (unsigned long)param1;
}
@@ -406,7 +403,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
// (JZ): Jump if zero
case 0x21:
param1 = scriptS.readUint16LE();
- data = thread->stack->top();
+ data = thread->stackTop();
if (!data) {
thread->i_offset = (unsigned long)param1;
}
@@ -420,7 +417,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
unsigned int default_jmp;
int case_found = 0;
- data = thread->stack->pop();
+ data = thread->pop();
n_switch = scriptS.readUint16LE();
for (i = 0; i < n_switch; i++) {
switch_num = scriptS.readUint16LE();
@@ -471,22 +468,22 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
// (NEG) Negate stack by 2's complement
case 0x25:
- data = thread->stack->pop();
+ data = thread->pop();
data = ~data;
data++;
- thread->stack->push(data);
+ thread->push(data);
break;
// (TSTZ) Test for zero
case 0x26:
- data = thread->stack->pop();
+ data = thread->pop();
data = data ? 0 : 1;
- thread->stack->push(data);
+ thread->push(data);
break;
// (NOT) Binary not
case 0x27:
- data = thread->stack->pop();
+ data = thread->pop();
data = ~data;
- thread->stack->push(data);
+ thread->push(data);
break;
case 0x28: // inc_v increment, don't push
unhandled = 1;
@@ -517,110 +514,110 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
// (ADD): Addition
case 0x2C:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
iresult = iparam1 + iparam2;
- thread->stack->push((SDataWord_T) iresult);
+ thread->push((SDataWord_T) iresult);
break;
// (SUB): Subtraction
case 0x2D:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
iresult = iparam1 - iparam2;
- thread->stack->push((SDataWord_T) iresult);
+ thread->push((SDataWord_T) iresult);
break;
// (MULT): Integer multiplication
case 0x2E:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
iresult = iparam1 * iparam2;
- thread->stack->push((SDataWord_T) iresult);
+ thread->push((SDataWord_T) iresult);
break;
// (DIV): Integer division
case 0x2F:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
iresult = iparam1 / iparam2;
- thread->stack->push((SDataWord_T) iresult);
+ thread->push((SDataWord_T) iresult);
break;
// (MOD) Modulus
case 0x30:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
iresult = iparam1 % iparam2;
- thread->stack->push((SDataWord_T) iresult);
+ thread->push((SDataWord_T) iresult);
break;
// (EQU) Test equality
case 0x33:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
data = (iparam1 == iparam2) ? 1 : 0;
- thread->stack->push(data);
+ thread->push(data);
break;
// (NEQU) Test inequality
case 0x34:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
data = (iparam1 != iparam2) ? 1 : 0;
- thread->stack->push(data);
+ thread->push(data);
break;
// (GRT) Test Greater-than
case 0x35:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
data = (iparam1 > iparam2) ? 1 : 0;
- thread->stack->push(data);
+ thread->push(data);
break;
// (LST) Test Less-than
case 0x36:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
data = (iparam1 < iparam2) ? 1 : 0;
- thread->stack->push(data);
+ thread->push(data);
break;
// (GRTE) Test Greater-than or Equal to
case 0x37:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
data = (iparam1 >= iparam2) ? 1 : 0;
- thread->stack->push(data);
+ thread->push(data);
break;
// (LSTE) Test Less-than or Equal to
case 0x38:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
iparam1 = (long)param1;
data = (iparam1 <= iparam2) ? 1 : 0;
- thread->stack->push(data);
+ thread->push(data);
break;
// BITWISE INSTRUCTIONS
// (SHR): Arithmetic binary shift right
case 0x3F:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
iparam2 = (long)param2;
// Preserve most significant bit
data = (0x01 << ((sizeof param1 * CHAR_BIT) - 1)) & param1;
@@ -628,59 +625,59 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
param1 >>= 1;
param1 |= data;
}
- thread->stack->push(param1);
+ thread->push(param1);
break;
// (SHL) Binary shift left
case 0x40:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
param1 <<= param2;
- thread->stack->push(param1);
+ thread->push(param1);
break;
// (AND) Binary AND
case 0x41:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
param1 &= param2;
- thread->stack->push(param1);
+ thread->push(param1);
break;
// (OR) Binary OR
case 0x42:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
param1 |= param2;
- thread->stack->push(param1);
+ thread->push(param1);
break;
// (XOR) Binary XOR
case 0x43:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
param1 ^= param2;
- thread->stack->push(param1);
+ thread->push(param1);
break;
// BOOLEAN LOGIC INSTRUCTIONS
// (LAND): Logical AND
case 0x44:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
data = (param1 && param2) ? 1 : 0;
- thread->stack->push(data);
+ thread->push(data);
break;
// (LOR): Logical OR
case 0x45:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
data = (param1 || param2) ? 1 : 0;
- thread->stack->push(data);
+ thread->push(data);
break;
// (LXOR): Logical XOR
case 0x46:
- param2 = thread->stack->pop();
- param1 = thread->stack->pop();
+ param2 = thread->pop();
+ param1 = thread->pop();
data = ((param1) ? !(param2) : !!(param2));
- thread->stack->push(data);
+ thread->push(data);
break;
// GAME INSTRUCTIONS
@@ -704,7 +701,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
}
for (i = 0; i < n_voices; i++) {
- data = thread->stack->pop();
+ data = thread->pop();
if (a_index < 0)
continue;
if (!isVoiceLUTPresent()) {