/* =========================================================================== Copyright (C) 2015 the OpenMoHAA team This file is part of OpenMoHAA source code. OpenMoHAA source code is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. OpenMoHAA source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenMoHAA source code; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ // scriptopcodes.cpp #include "glb_local.h" #include "scriptopcodes.h" static opcode_t OpcodeInfo[] = { { "OPCODE_EOF", 0, 0, 0 }, { "OPCODE_BOOL_JUMP_FALSE4", 5, -1, 0 }, { "OPCODE_BOOL_JUMP_TRUE4", 5, -1, 0 }, { "OPCODE_VAR_JUMP_FALSE4", 5, -1, 0 }, { "OPCODE_VAR_JUMP_TRUE4", 5, -1, 0 }, { "OPCODE_BOOL_LOGICAL_AND", 5, -1, 0 }, { "OPCODE_BOOL_LOGICAL_OR", 5, -1, 0 }, { "OPCODE_VAR_LOGICAL_AND", 5, -1, 0 }, { "OPCODE_VAR_LOGICAL_OR", 5, -1, 0 }, { "OPCODE_BOOL_TO_VAR", 0, 0, 0 }, { "OPCODE_JUMP4", 1 + sizeof( unsigned int ), 0, 0 }, { "OPCODE_JUMP_BACK4", 1 + sizeof( unsigned int ), 0, 0 }, { "OPCODE_STORE_INT0", 1, 1, 0 }, { "OPCODE_STORE_INT1", 1 + sizeof( char ), 1, 0 }, { "OPCODE_STORE_INT2", 1 + sizeof( short ), 1, 0 }, { "OPCODE_STORE_INT3", 1 + sizeof( short3 ), 1, 0 }, { "OPCODE_STORE_INT4", 1 + sizeof( int ), 1, 0 }, { "OPCODE_BOOL_STORE_FALSE", 1, 1, 0 }, { "OPCODE_BOOL_STORE_TRUE", 1, 1, 0 }, { "OPCODE_STORE_STRING", 1 + sizeof( unsigned int ), 1, 0 }, { "OPCODE_STORE_FLOAT", 1 + sizeof( float ), 1, 0 }, { "OPCODE_STORE_VECTOR", 1 + sizeof( Vector ), 1, 0 }, { "OPCODE_CALC_VECTOR", 1, -2, 0 }, { "OPCODE_STORE_NULL", 1, 1, 0 }, { "OPCODE_STORE_NIL", 1, 1, 0 }, { "OPCODE_EXEC_CMD0", 5, 0, 1 }, { "OPCODE_EXEC_CMD1", 5, -1, 1 }, { "OPCODE_EXEC_CMD2", 5, -2, 1 }, { "OPCODE_EXEC_CMD3", 5, -3, 1 }, { "OPCODE_EXEC_CMD4", 5, -4, 1 }, { "OPCODE_EXEC_CMD5", 5, -5, 1 }, { "OPCODE_EXEC_CMD_COUNT1", 6, -128, 1 }, { "OPCODE_EXEC_CMD_METHOD0", 5, -1, 1 }, { "OPCODE_EXEC_CMD_METHOD1", 5, -2, 1 }, { "OPCODE_EXEC_CMD_METHOD2", 5, -3, 1 }, { "OPCODE_EXEC_CMD_METHOD3", 5, -4, 1 }, { "OPCODE_EXEC_CMD_METHOD4", 5, -5, 1 }, { "OPCODE_EXEC_CMD_METHOD5", 5, -6, 1 }, { "OPCODE_EXEC_CMD_METHOD_COUNT1", 6, -128, 1 }, { "OPCODE_EXEC_METHOD0", 5, 0, 1 }, { "OPCODE_EXEC_METHOD1", 5, -1, 1 }, { "OPCODE_EXEC_METHOD2", 5, -2, 1 }, { "OPCODE_EXEC_METHOD3", 5, -3, 1 }, { "OPCODE_EXEC_METHOD4", 5, -4, 1 }, { "OPCODE_EXEC_METHOD5", 5, -5, 1 }, { "OPCODE_EXEC_METHOD_COUNT1", 6, -128, 1 }, { "OPCODE_LOAD_GAME_VAR", 5, -1, 0 }, { "OPCODE_LOAD_LEVEL_VAR", 5, -1, 0 }, { "OPCODE_LOAD_LOCAL_VAR", 5, -1, 0 }, { "OPCODE_LOAD_PARM_VAR", 5, -1, 0 }, { "OPCODE_LOAD_SELF_VAR", 5, -1, 0 }, { "OPCODE_LOAD_GROUP_VAR", 5, -1, 0 }, { "OPCODE_LOAD_OWNER_VAR", 5, -1, 0 }, { "OPCODE_LOAD_FIELD_VAR", 5, -2, 0 }, { "OPCODE_LOAD_ARRAY_VAR", 1, -3, 0 }, { "OPCODE_LOAD_CONST_ARRAY1", 2, -128, 0 }, { "OPCODE_STORE_FIELD_REF", 5, 0, 0 }, { "OPCODE_STORE_ARRAY_REF", 1, -1, 0 }, { "OPCODE_MARK_STACK_POS", 1, 0, 0 }, { "OPCODE_STORE_PARAM", 1, 1, 0 }, { "OPCODE_RESTORE_STACK_POS", 1, 0, 0 }, { "OPCODE_LOAD_STORE_GAME_VAR", 5, 0, 0 }, { "OPCODE_LOAD_STORE_LEVEL_VAR", 5, 0, 0 }, { "OPCODE_LOAD_STORE_LOCAL_VAR", 5, 0, 0 }, { "OPCODE_LOAD_STORE_PARM_VAR", 5, 0, 0 }, { "OPCODE_LOAD_STORE_SELF_VAR", 5, 0, 0 }, { "OPCODE_LOAD_STORE_GROUP_VAR", 5, 0, 0 }, { "OPCODE_LOAD_STORE_OWNER_VAR", 5, 0, 0 }, { "OPCODE_STORE_GAME_VAR", 5, 1, 0 }, { "OPCODE_STORE_LEVEL_VAR", 5, 1, 0 }, { "OPCODE_STORE_LOCAL_VAR", 5, 1, 0 }, { "OPCODE_STORE_PARM_VAR", 5, 1, 0 }, { "OPCODE_STORE_SELF_VAR", 5, 1, 0 }, { "OPCODE_STORE_GROUP_VAR", 5, 1, 0 }, { "OPCODE_STORE_OWNER_VAR", 5, 1, 0 }, { "OPCODE_STORE_FIELD", 5, 0, 1 }, { "OPCODE_STORE_ARRAY", 1, -1, 0 }, { "OPCODE_STORE_GAME", 1, 1, 0 }, { "OPCODE_STORE_LEVEL", 1, 1, 0 }, { "OPCODE_STORE_LOCAL", 1, 1, 0 }, { "OPCODE_STORE_PARM", 1, 1, 0 }, { "OPCODE_STORE_SELF", 1, 1, 0 }, { "OPCODE_STORE_GROUP", 1, 1, 0 }, { "OPCODE_STORE_OWNER", 1, 1, 0 }, { "OPCODE_BIN_BITWISE_AND", 1, -1, 0 }, { "OPCODE_BIN_BITWISE_OR", 1, -1, 0 }, { "OPCODE_BIN_BITWISE_EXCL_OR", 1, -1, 0 }, { "OPCODE_BIN_EQUALITY", 1, -1, 0 }, { "OPCODE_BIN_INEQUALITY", 1, -1, 0 }, { "OPCODE_BIN_LESS_THAN", 1, -1, 0 }, { "OPCODE_BIN_GREATER_THAN", 1, -1, 0 }, { "OPCODE_BIN_LESS_THAN_OR_EQUAL", 1, -1, 0 }, { "OPCODE_BIN_GREATER_THAN_OR_EQUAL", 1, -1, 0 }, { "OPCODE_BIN_PLUS", 1, -1, 0 }, { "OPCODE_BIN_MINUS", 1, -1, 0 }, { "OPCODE_BIN_MULTIPLY", 1, -1, 0 }, { "OPCODE_BIN_DIVIDE", 1, -1, 0 }, { "OPCODE_BIN_PERCENTAGE", 1, -1, 0 }, { "OPCODE_UN_MINUS", 1, 0, 0 }, { "OPCODE_UN_COMPLEMENT", 1, 0, 0 }, { "OPCODE_UN_TARGETNAME", 1, 0, 0 }, { "OPCODE_BOOL_UN_NOT", 1, 0, 0 }, { "OPCODE_VAR_UN_NOT", 1, 0, 0 }, { "OPCODE_UN_CAST_BOOLEAN", 1, 0, 0 }, { "OPCODE_UN_INC", 1, 0, 0 }, { "OPCODE_UN_DEC", 1, 0, 0 }, { "OPCODE_UN_SIZE", 1, 0, 0 }, { "OPCODE_SWITCH", 5, -1, 0 }, { "OPCODE_FUNC", 11, -128, 1 }, { "OPCODE_NOP", 1, 0, 0 }, { "OPCODE_BIN_SHIFT_LEFT", 1, -1, 0 }, { "OPCODE_BIN_SHIFT_RIGHT", 1, -1, 0 }, { "OPCODE_END", 1, -1, 0 }, { "OPCODE_RETURN", 1, -1, 0 }, }; static const char *aszVarGroupNames[] = { "game", "level", "local", "parm", "self" }; /* ==================== VarGroupName ==================== */ const char *VarGroupName( int iVarGroup ) { return aszVarGroupNames[ iVarGroup ]; } /* ==================== OpcodeName ==================== */ const char *OpcodeName( int opcode ) { return OpcodeInfo[ opcode ].opcodename; } /* ==================== OpcodeLength ==================== */ int OpcodeLength( int opcode ) { return OpcodeInfo[ opcode ].opcodelength; } /* ==================== OpcodeVarStackOffset ==================== */ int OpcodeVarStackOffset( int opcode ) { return OpcodeInfo[ opcode ].opcodestackoffset; } /* ==================== SetOpcodeVarStackOffset ==================== */ void SetOpcodeVarStackOffset( int opcode, int iVarStackOffset ) { OpcodeInfo[ opcode ].opcodestackoffset = iVarStackOffset; } /* ==================== IsExternalOpcode ==================== */ bool IsExternalOpcode( int opcode ) { return OpcodeInfo[ opcode ].isexternal ? true : false; }