/*========================================================================= script.cpp Author: PKG Created: Project: Spongebob Purpose: Copyright (c) 2000 Climax Development Ltd ===========================================================================*/ /*---------------------------------------------------------------------- Includes -------- */ #include "script\script.h" #ifndef __SCRIPT_FUNCTION_H__ #include "script\function.h" #endif #ifndef __SYSTEM_DBG_H__ #include "system\dbg.h" #endif #ifndef __MEMORY_HEADER__ #include "mem\memory.h" #endif /* Std Lib ------- */ /* Data ---- */ /*---------------------------------------------------------------------- Tyepdefs && Defines ------------------- */ //#define FULL_CODE_OUTPUT //#define SHOW_RUN_COUNT /*---------------------------------------------------------------------- Structure defintions -------------------- */ /*---------------------------------------------------------------------- Function Prototypes ------------------- */ /*---------------------------------------------------------------------- Vars ---- */ signed short CScript::s_globalVars[NUM_GLOBAL_VARS]= { 0, // LIVES }; // Buffer for passing arguments to functions unsigned short CScript::s_argBuffer[MAX_FUNCTION_ARGS]; /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ void CScript::initialise(FileEquate _fe) { int i; m_code=(unsigned short*)CFileIO::loadFile(_fe); m_stack=(unsigned short*)MemAlloc(sizeof(unsigned short)*STACK_SIZE,"ScriptStack"); reset(); for(i=0;ival2); break; case OP_ASSIGN: // varidx, value val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT PAUL_DBGMSG("$%d=%d",val1,val2); #endif setVar(val1,val2); break; case OP_ADD: // value, value pushes result to stack val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT PAUL_DBGMSG("ADD %d,%d",val1,val2); #endif push(val1+val2); break; case OP_MULTIPLY: // value, value pushes result to stack val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT PAUL_DBGMSG("MULTIPLY %d,%d",val1,val2); #endif push(val1*val2); break; case OP_DIVIDE: // value, value pushes result to stack val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT PAUL_DBGMSG("DIVIDE %d,%d",val1,val2); #endif if(val2==0) { SYSTEM_DBGMSG("[SCRIPT] DIVIDE BY ZERO @%d",m_pc); m_state=CRASHED_DIVIDE_BY_ZERO; } else { push(val1/val2); } break; case OP_NEG: // value pushes result to stack val1=pop(); #ifdef FULL_CODE_OUTPUT PAUL_DBGMSG("NEG %d",val1); #endif push(-val1); break; case OP_PRINT: // value val1=pop(); PAUL_DBGMSG("PRINT %d",val1); break; case OP_CALL_FUNCTION: // functionnumber, argcount args pushes return value to stack val1=readNextInstruction(); val2=readNextInstruction(); #ifdef FULL_CODE_OUTPUT PAUL_DBGMSG("CALL_FUNCTION %d ( %d args )",val1,val2); #endif ASSERT(val2=1); // Stack underflow about to occur :( return(m_stack[--m_sp]); } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ void CScript::setVar(int _varIdx,signed short _value) { ASSERT(_varIdx>=0&&_varIdx<=NUM_GLOBAL_VARS+NUM_LOCAL_VARS-1); if(_varIdx=0&&_varIdx<=NUM_GLOBAL_VARS+NUM_LOCAL_VARS-1); int ret=0; if(_varIdx