mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 13:47:58 +03:00

This fixes #311 where a memory corruption that occurred in ARM was caused because of insufficient ScriptVM stack size. The stack size was incorrectly calculated because the stack offset was using unsigned values instead of signed in ARM.
204 lines
4.5 KiB
C
204 lines
4.5 KiB
C
/*
|
|
===========================================================================
|
|
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.h
|
|
|
|
#pragma once
|
|
|
|
#include "q_shared.h"
|
|
|
|
/** Should stay a 8-byte value. */
|
|
using opval_t = uint8_t;
|
|
/** Store an index in the string table. */
|
|
using op_name_t = uint32_t;
|
|
/** Event number. */
|
|
using op_ev_t = uint32_t;
|
|
/** Index in the event name table. */
|
|
using op_evName_t = uint32_t;
|
|
/** Jump offset. */
|
|
using op_offset_t = uint32_t;
|
|
/** Parameter count. */
|
|
using op_parmNum_t = uint8_t;
|
|
/** Parameter count of const array. */
|
|
using op_arrayParmNum_t = uint16_t;
|
|
|
|
typedef struct {
|
|
const char *opcodename;
|
|
int opcodelength;
|
|
short opcodestackoffset;
|
|
char isexternal;
|
|
} opcode_t;
|
|
|
|
typedef struct {
|
|
unsigned char opcode;
|
|
signed char VarStackOffset;
|
|
} opcode_info_t;
|
|
|
|
typedef enum {
|
|
OP_DONE,
|
|
OP_BOOL_JUMP_FALSE4,
|
|
OP_BOOL_JUMP_TRUE4,
|
|
OP_VAR_JUMP_FALSE4,
|
|
OP_VAR_JUMP_TRUE4,
|
|
|
|
OP_BOOL_LOGICAL_AND,
|
|
OP_BOOL_LOGICAL_OR,
|
|
OP_VAR_LOGICAL_AND,
|
|
OP_VAR_LOGICAL_OR,
|
|
|
|
OP_BOOL_TO_VAR,
|
|
|
|
OP_JUMP4,
|
|
OP_JUMP_BACK4,
|
|
|
|
OP_STORE_INT0,
|
|
OP_STORE_INT1,
|
|
OP_STORE_INT2,
|
|
OP_STORE_INT3,
|
|
OP_STORE_INT4,
|
|
|
|
OP_BOOL_STORE_FALSE,
|
|
OP_BOOL_STORE_TRUE,
|
|
|
|
OP_STORE_STRING,
|
|
OP_STORE_FLOAT,
|
|
OP_STORE_VECTOR,
|
|
OP_CALC_VECTOR,
|
|
OP_STORE_NULL,
|
|
OP_STORE_NIL,
|
|
|
|
OP_EXEC_CMD0, // exec normal
|
|
OP_EXEC_CMD1,
|
|
OP_EXEC_CMD2,
|
|
OP_EXEC_CMD3,
|
|
OP_EXEC_CMD4,
|
|
OP_EXEC_CMD5,
|
|
OP_EXEC_CMD_COUNT1,
|
|
|
|
OP_EXEC_CMD_METHOD0, // exec from listener
|
|
OP_EXEC_CMD_METHOD1,
|
|
OP_EXEC_CMD_METHOD2,
|
|
OP_EXEC_CMD_METHOD3,
|
|
OP_EXEC_CMD_METHOD4,
|
|
OP_EXEC_CMD_METHOD5,
|
|
OP_EXEC_CMD_METHOD_COUNT1,
|
|
|
|
OP_EXEC_METHOD0, // exec from listener with return
|
|
OP_EXEC_METHOD1,
|
|
OP_EXEC_METHOD2,
|
|
OP_EXEC_METHOD3,
|
|
OP_EXEC_METHOD4,
|
|
OP_EXEC_METHOD5,
|
|
OP_EXEC_METHOD_COUNT1,
|
|
|
|
OP_LOAD_GAME_VAR,
|
|
OP_LOAD_LEVEL_VAR,
|
|
OP_LOAD_LOCAL_VAR,
|
|
OP_LOAD_PARM_VAR,
|
|
OP_LOAD_SELF_VAR,
|
|
OP_LOAD_GROUP_VAR,
|
|
OP_LOAD_OWNER_VAR,
|
|
OP_LOAD_FIELD_VAR,
|
|
OP_LOAD_ARRAY_VAR,
|
|
OP_LOAD_CONST_ARRAY1,
|
|
|
|
OP_STORE_FIELD_REF,
|
|
OP_STORE_ARRAY_REF,
|
|
|
|
OP_MARK_STACK_POS,
|
|
|
|
OP_STORE_PARAM,
|
|
|
|
OP_RESTORE_STACK_POS,
|
|
|
|
OP_LOAD_STORE_GAME_VAR,
|
|
OP_LOAD_STORE_LEVEL_VAR,
|
|
OP_LOAD_STORE_LOCAL_VAR,
|
|
OP_LOAD_STORE_PARM_VAR,
|
|
OP_LOAD_STORE_SELF_VAR,
|
|
OP_LOAD_STORE_GROUP_VAR,
|
|
OP_LOAD_STORE_OWNER_VAR,
|
|
|
|
OP_STORE_GAME_VAR,
|
|
OP_STORE_LEVEL_VAR,
|
|
OP_STORE_LOCAL_VAR,
|
|
OP_STORE_PARM_VAR,
|
|
OP_STORE_SELF_VAR,
|
|
OP_STORE_GROUP_VAR,
|
|
OP_STORE_OWNER_VAR,
|
|
OP_STORE_FIELD,
|
|
OP_STORE_ARRAY,
|
|
OP_STORE_GAME,
|
|
OP_STORE_LEVEL,
|
|
OP_STORE_LOCAL,
|
|
OP_STORE_PARM,
|
|
OP_STORE_SELF,
|
|
OP_STORE_GROUP,
|
|
OP_STORE_OWNER,
|
|
|
|
OP_BIN_BITWISE_AND,
|
|
OP_BIN_BITWISE_OR,
|
|
OP_BIN_BITWISE_EXCL_OR,
|
|
OP_BIN_EQUALITY,
|
|
OP_BIN_INEQUALITY,
|
|
OP_BIN_LESS_THAN,
|
|
OP_BIN_GREATER_THAN,
|
|
OP_BIN_LESS_THAN_OR_EQUAL,
|
|
OP_BIN_GREATER_THAN_OR_EQUAL,
|
|
OP_BIN_PLUS,
|
|
OP_BIN_MINUS,
|
|
OP_BIN_MULTIPLY,
|
|
OP_BIN_DIVIDE,
|
|
OP_BIN_PERCENTAGE,
|
|
|
|
OP_UN_MINUS,
|
|
OP_UN_COMPLEMENT,
|
|
OP_UN_TARGETNAME,
|
|
OP_BOOL_UN_NOT,
|
|
OP_VAR_UN_NOT,
|
|
OP_UN_CAST_BOOLEAN,
|
|
OP_UN_INC,
|
|
OP_UN_DEC,
|
|
OP_UN_SIZE,
|
|
|
|
OP_SWITCH,
|
|
|
|
OP_FUNC,
|
|
|
|
OP_NOP,
|
|
|
|
OP_BIN_SHIFT_LEFT,
|
|
OP_BIN_SHIFT_RIGHT,
|
|
|
|
OP_END,
|
|
OP_RETURN,
|
|
|
|
OP_PREVIOUS,
|
|
OP_MAX = OP_PREVIOUS
|
|
} opcode_e;
|
|
|
|
const char *VarGroupName(int iVarGroup);
|
|
const char *OpcodeName(int opcode);
|
|
int OpcodeLength(int opcode);
|
|
int OpcodeVarStackOffset(int opcode);
|
|
void SetOpcodeVarStackOffset(int opcode, int iVarStackOffset);
|
|
bool IsExternalOpcode(int opcode);
|