summaryrefslogtreecommitdiff
path: root/indra/lscript/lscript_byteformat.h
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
committerJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
commit420b91db29485df39fd6e724e782c449158811cb (patch)
treeb471a94563af914d3ed3edd3e856d21cb1b69945 /indra/lscript/lscript_byteformat.h
Print done when done.
Diffstat (limited to 'indra/lscript/lscript_byteformat.h')
-rw-r--r--indra/lscript/lscript_byteformat.h544
1 files changed, 544 insertions, 0 deletions
diff --git a/indra/lscript/lscript_byteformat.h b/indra/lscript/lscript_byteformat.h
new file mode 100644
index 0000000000..a79f2effae
--- /dev/null
+++ b/indra/lscript/lscript_byteformat.h
@@ -0,0 +1,544 @@
+/**
+ * @file lscript_byteformat.h
+ * @brief Shared code between compiler and assembler and LSL
+ *
+ * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#ifndef LL_LSCRIPT_BYTEFORMAT_H
+#define LL_LSCRIPT_BYTEFORMAT_H
+
+// Data shared between compiler/assembler and lscript execution code
+
+#include "stdtypes.h"
+
+const S32 LSL2_VERSION_NUMBER = 0x0200;
+const S32 LSL2_VERSION1_END_NUMBER = 0x0101;
+const S32 LSL2_VERSION2_START_NUMBER = 0x0200;
+
+const S32 LSL2_MAJOR_VERSION_ONE = 1;
+const S32 LSL2_MAJOR_VERSION_TWO = 2;
+const S32 LSL2_CURRENT_MAJOR_VERSION = LSL2_MAJOR_VERSION_TWO;
+
+const S32 TOP_OF_MEMORY = 16384;
+
+typedef enum e_lscript_registers
+{
+ LREG_INVALID,
+ LREG_IP, // instruction pointer
+ LREG_VN, // version number
+ LREG_BP, // base pointer - what local variables are referenced from
+ LREG_SP, // stack pointer - where the top of the stack is
+ LREG_HR, // heap register - where in memory does the heap start
+ LREG_HP, // heap pointer - where is the top of the heap?
+ LREG_CS, // current state - what state are we currently in?
+ LREG_NS, // next state - what state are we currently in?
+ LREG_CE, // current events - what events are waiting to be handled?
+ LREG_IE, // in event - which event handler are we currently in?
+ LREG_ER, // event register - what events do we have active handlers for?
+ LREG_FR, // fault register - which errors are currently active?
+ LREG_SLR, // sleep register - are we sleeping?
+ LREG_GVR, // global variable register - where do global variables start
+ LREG_GFR, // global function register - where do global functions start
+ LREG_SR, // state register - where do states start
+ LREG_TM, // top of memory - where is the top of memory
+ LREG_PR, // parameter register - data passed to script from launcher
+ LREG_ESR, // energy supply register - how much energy do we have on board?
+ LREG_NCE, // 64 bit current envents - what events are waiting to be handled?
+ LREG_NIE, // 64 bit in event - which event handler are we currently in?
+ LREG_NER, // 64 bit event register - what events do we have active handlers for?
+ LREG_EOF
+} LSCRIPTRegisters;
+
+const S32 gLSCRIPTRegisterAddresses[LREG_EOF] =
+{
+ 0, // LREG_INVALID
+ 4, // LREG_IP
+ 8, // LREG_VN
+ 12, // LREG_BP
+ 16, // LREG_SP
+ 20, // LREG_HR
+ 24, // LREG_HP
+ 28, // LREG_CS
+ 32, // LREG_NS
+ 36, // LREG_CE
+ 40, // LREG_IE
+ 44, // LREG_ER
+ 48, // LREG_FR
+ 52, // LREG_SLR
+ 56, // LREG_GVR
+ 60, // LREG_GFR
+ 72, // LREG_SR
+ 0, // LREG_TM
+ 64, // LREG_PR
+ 68, // LREG_ESR
+ 76, // LREG_NCE
+ 84, // LREG_NIE
+ 92, // LREG_NER
+};
+
+const char * const gLSCRIPTRegisterNames[LREG_EOF] =
+{
+ "INVALID", // LREG_INVALID
+ "IP", // LREG_IP
+ "VN", // LREG_VN
+ "BP", // LREG_BP
+ "SP", // LREG_SP
+ "HR", // LREG_HR
+ "HP", // LREG_HP
+ "CS", // LREG_CS
+ "NS", // LREG_NS
+ "CE", // LREG_CE
+ "IE", // LREG_IE
+ "ER", // LREG_ER
+ "FR", // LREG_FR
+ "SLR", // LREG_SLR
+ "GVR", // LREG_GVR
+ "GFR", // LREG_GFR
+ "SR", // LREG_SR
+ "TM", // LREG_TM
+ "PR", // LREG_PR
+ "ESR", // LREG_ESR
+ "NCE", // LREG_NCE
+ "NIE", // LREG_NIE
+ "NER", // LREG_NER
+};
+
+typedef enum e_lscript_op_codes
+{
+ LOPC_INVALID,
+ LOPC_NOOP,
+ LOPC_POP,
+ LOPC_POPS,
+ LOPC_POPL,
+ LOPC_POPV,
+ LOPC_POPQ,
+ LOPC_POPARG,
+ LOPC_POPIP,
+ LOPC_POPBP,
+ LOPC_POPSP,
+ LOPC_POPSLR,
+ LOPC_DUP,
+ LOPC_DUPS,
+ LOPC_DUPL,
+ LOPC_DUPV,
+ LOPC_DUPQ,
+ LOPC_STORE,
+ LOPC_STORES,
+ LOPC_STOREL,
+ LOPC_STOREV,
+ LOPC_STOREQ,
+ LOPC_STOREG,
+ LOPC_STOREGS,
+ LOPC_STOREGL,
+ LOPC_STOREGV,
+ LOPC_STOREGQ,
+ LOPC_LOADP,
+ LOPC_LOADSP,
+ LOPC_LOADLP,
+ LOPC_LOADVP,
+ LOPC_LOADQP,
+ LOPC_LOADGP,
+ LOPC_LOADGLP,
+ LOPC_LOADGSP,
+ LOPC_LOADGVP,
+ LOPC_LOADGQP,
+ LOPC_PUSH,
+ LOPC_PUSHS,
+ LOPC_PUSHL,
+ LOPC_PUSHV,
+ LOPC_PUSHQ,
+ LOPC_PUSHG,
+ LOPC_PUSHGS,
+ LOPC_PUSHGL,
+ LOPC_PUSHGV,
+ LOPC_PUSHGQ,
+ LOPC_PUSHIP,
+ LOPC_PUSHBP,
+ LOPC_PUSHSP,
+ LOPC_PUSHARGB,
+ LOPC_PUSHARGI,
+ LOPC_PUSHARGF,
+ LOPC_PUSHARGS,
+ LOPC_PUSHARGV,
+ LOPC_PUSHARGQ,
+ LOPC_PUSHE,
+ LOPC_PUSHEV,
+ LOPC_PUSHEQ,
+ LOPC_PUSHARGE,
+ LOPC_ADD,
+ LOPC_SUB,
+ LOPC_MUL,
+ LOPC_DIV,
+ LOPC_MOD,
+ LOPC_EQ,
+ LOPC_NEQ,
+ LOPC_LEQ,
+ LOPC_GEQ,
+ LOPC_LESS,
+ LOPC_GREATER,
+ LOPC_BITAND,
+ LOPC_BITOR,
+ LOPC_BITXOR,
+ LOPC_BOOLAND,
+ LOPC_BOOLOR,
+ LOPC_NEG,
+ LOPC_BITNOT,
+ LOPC_BOOLNOT,
+ LOPC_JUMP,
+ LOPC_JUMPIF,
+ LOPC_JUMPNIF,
+ LOPC_STATE,
+ LOPC_CALL,
+ LOPC_RETURN,
+ LOPC_CAST,
+ LOPC_STACKTOS,
+ LOPC_STACKTOL,
+ LOPC_PRINT,
+ LOPC_CALLLIB,
+ LOPC_CALLLIB_TWO_BYTE,
+ LOPC_SHL,
+ LOPC_SHR,
+ LOPC_EOF
+} LSCRIPTOpCodesEnum;
+
+const U8 LSCRIPTOpCodes[LOPC_EOF] =
+{
+ 0x00, // LOPC_INVALID
+ 0x00, // LOPC_NOOP
+ 0x01, // LOPC_POP
+ 0x02, // LOPC_POPS
+ 0x03, // LOPC_POPL
+ 0x04, // LOPC_POPV
+ 0x05, // LOPC_POPQ
+ 0x06, // LOPC_POPARG
+ 0x07, // LOPC_POPIP
+ 0x08, // LOPC_POPBP
+ 0x09, // LOPC_POPSP
+ 0x0a, // LOPC_POPSLR
+ 0x20, // LOPC_DUP
+ 0x21, // LOPC_DUPS
+ 0x22, // LOPC_DUPL
+ 0x23, // LOPC_DUPV
+ 0x24, // LOPC_DUPQ
+ 0x30, // LOPC_STORE
+ 0x31, // LOPC_STORES
+ 0x32, // LOPC_STOREL
+ 0x33, // LOPC_STOREV
+ 0x34, // LOPC_STOREQ
+ 0x35, // LOPC_STOREG
+ 0x36, // LOPC_STOREGS
+ 0x37, // LOPC_STOREGL
+ 0x38, // LOPC_STOREGV
+ 0x39, // LOPC_STOREGQ
+ 0x3a, // LOPC_LOADP
+ 0x3b, // LOPC_LOADSP
+ 0x3c, // LOPC_LOADLP
+ 0x3d, // LOPC_LOADVP
+ 0x3e, // LOPC_LOADQP
+ 0x3f, // LOPC_LOADGP
+ 0x40, // LOPC_LOADGSP
+ 0x41, // LOPC_LOADGLP
+ 0x42, // LOPC_LOADGVP
+ 0x43, // LOPC_LOADGQP
+ 0x50, // LOPC_PUSH
+ 0x51, // LOPC_PUSHS
+ 0x52, // LOPC_PUSHL
+ 0x53, // LOPC_PUSHV
+ 0x54, // LOPC_PUSHQ
+ 0x55, // LOPC_PUSHG
+ 0x56, // LOPC_PUSHGS
+ 0x57, // LOPC_PUSHGL
+ 0x58, // LOPC_PUSHGV
+ 0x59, // LOPC_PUSHGQ
+ 0x5a, // LOPC_PUSHIP
+ 0x5b, // LOPC_PUSHBP
+ 0x5c, // LOPC_PUSHSP
+ 0x5d, // LOPC_PUSHARGB
+ 0x5e, // LOPC_PUSHARGI
+ 0x5f, // LOPC_PUSHARGF
+ 0x60, // LOPC_PUSHARGS
+ 0x61, // LOPC_PUSHARGV
+ 0x62, // LOPC_PUSHARGQ
+ 0x63, // LOPC_PUSHE
+ 0x64, // LOPC_PUSHEV
+ 0x65, // LOPC_PUSHEQ
+ 0x66, // LOPC_PUSHARGE
+ 0x70, // LOPC_ADD
+ 0x71, // LOPC_SUB
+ 0x72, // LOPC_MUL
+ 0x73, // LOPC_DIV
+ 0x74, // LOPC_MOD
+ 0x75, // LOPC_EQ
+ 0x76, // LOPC_NEQ
+ 0x77, // LOPC_LEQ
+ 0x78, // LOPC_GEQ
+ 0x79, // LOPC_LESS
+ 0x7a, // LOPC_GREATER
+ 0x7b, // LOPC_BITAND
+ 0x7c, // LOPC_BITOR
+ 0x7d, // LOPC_BITXOR
+ 0x7e, // LOPC_BOOLAND
+ 0x7f, // LOPC_BOOLOR
+ 0x80, // LOPC_NEG
+ 0x81, // LOPC_BITNOT
+ 0x82, // LOPC_BOOLNOT
+ 0x90, // LOPC_JUMP
+ 0x91, // LOPC_JUMPIF
+ 0x92, // LOPC_JUMPNIF
+ 0x93, // LOPC_STATE
+ 0x94, // LOPC_CALL
+ 0x95, // LOPC_RETURN
+ 0xa0, // LOPC_CAST
+ 0xb0, // LOPC_STACKTOS
+ 0xb1, // LOPC_STACKTOL
+ 0xc0, // LOPC_PRINT
+ 0xd0, // LOPC_CALLLIB
+ 0xd1, // LOPC_CALLLIB_TWO_BYTE
+ 0xe0, // LOPC_SHL
+ 0xe1 // LOPC_SHR
+};
+
+typedef enum e_lscript_state_event_type
+{
+ LSTT_NULL,
+ LSTT_STATE_ENTRY,
+ LSTT_STATE_EXIT,
+ LSTT_TOUCH_START,
+ LSTT_TOUCH,
+ LSTT_TOUCH_END,
+ LSTT_COLLISION_START,
+ LSTT_COLLISION,
+ LSTT_COLLISION_END,
+ LSTT_LAND_COLLISION_START,
+ LSTT_LAND_COLLISION,
+ LSTT_LAND_COLLISION_END,
+ LSTT_TIMER,
+ LSTT_CHAT,
+ LSTT_REZ,
+ LSTT_SENSOR,
+ LSTT_NO_SENSOR,
+ LSTT_CONTROL,
+ LSTT_MONEY,
+ LSTT_EMAIL,
+ LSTT_AT_TARGET,
+ LSTT_NOT_AT_TARGET,
+ LSTT_AT_ROT_TARGET,
+ LSTT_NOT_AT_ROT_TARGET,
+ LSTT_RTPERMISSIONS,
+ LSTT_INVENTORY,
+ LSTT_ATTACH,
+ LSTT_DATASERVER,
+ LSTT_LINK_MESSAGE,
+ LSTT_MOVING_START,
+ LSTT_MOVING_END,
+ LSTT_OBJECT_REZ,
+ LSTT_REMOTE_DATA,
+ LSTT_HTTP_RESPONSE,
+ LSTT_EOF,
+
+ LSTT_STATE_BEGIN = LSTT_STATE_ENTRY,
+ LSTT_STATE_END = LSTT_EOF
+} LSCRIPTStateEventType;
+
+const U64 LSCRIPTStateBitField[LSTT_EOF] =
+{
+ 0x0000000000000000, // LSTT_NULL
+ 0x0000000000000001, // LSTT_STATE_ENTRY
+ 0x0000000000000002, // LSTT_STATE_EXIT
+ 0x0000000000000004, // LSTT_TOUCH_START
+ 0x0000000000000008, // LSTT_TOUCH
+ 0x0000000000000010, // LSTT_TOUCH_END
+ 0x0000000000000020, // LSTT_COLLISION_START
+ 0x0000000000000040, // LSTT_COLLISION
+ 0x0000000000000080, // LSTT_COLLISION_END
+ 0x0000000000000100, // LSTT_LAND_COLLISION_START
+ 0x0000000000000200, // LSTT_LAND_COLLISION
+ 0x0000000000000400, // LSTT_LAND_COLLISION_END
+ 0x0000000000000800, // LSTT_TIMER
+ 0x0000000000001000, // LSTT_CHAT
+ 0x0000000000002000, // LSTT_REZ
+ 0x0000000000004000, // LSTT_SENSOR
+ 0x0000000000008000, // LSTT_NO_SENSOR
+ 0x0000000000010000, // LSTT_CONTROL
+ 0x0000000000020000, // LSTT_MONEY
+ 0x0000000000040000, // LSTT_EMAIL
+ 0x0000000000080000, // LSTT_AT_TARGET
+ 0x0000000000100000, // LSTT_NOT_AT_TARGET
+ 0x0000000000200000, // LSTT_AT_ROT_TARGET
+ 0x0000000000400000, // LSTT_NOT_AT_ROT_TARGET
+ 0x0000000000800000, // LSTT_RTPERMISSIONS
+ 0x0000000001000000, // LSTT_INVENTORY
+ 0x0000000002000000, // LSTT_ATTACH
+ 0x0000000004000000, // LSTT_DATASERVER
+ 0x0000000008000000, // LSTT_LINK_MESSAGE
+ 0x0000000010000000, // LSTT_MOVING_START
+ 0x0000000020000000, // LSTT_MOVING_END
+ 0x0000000040000000, // LSTT_OBJECT_REZ
+ 0x0000000080000000, // LSTT_REMOTE_DATA
+ 0x0000000100000000LL // LSTT_HTTP_RESPOSE
+};
+
+inline S32 get_event_handler_jump_position(U64 bit_field, LSCRIPTStateEventType type)
+{
+ S32 count = 0, position = LSTT_STATE_ENTRY;
+ while (position < type)
+ {
+ if (bit_field & 0x1)
+ {
+ count++;
+ }
+ bit_field >>= 1;
+ position++;
+ }
+ return count;
+}
+
+inline S32 get_number_of_event_handlers(U64 bit_field)
+{
+ S32 count = 0, position = 0;
+ while (position < LSTT_EOF)
+ {
+ if (bit_field & 0x1)
+ {
+ count++;
+ }
+ bit_field >>= 1;
+ position++;
+ }
+ return count;
+}
+
+typedef enum e_lscript_types
+{
+ LST_NULL,
+ LST_INTEGER,
+ LST_FLOATINGPOINT,
+ LST_STRING,
+ LST_KEY,
+ LST_VECTOR,
+ LST_QUATERNION,
+ LST_LIST,
+ LST_UNDEFINED,
+ LST_EOF
+} LSCRIPTType;
+
+const U8 LSCRIPTTypeByte[LST_EOF] =
+{
+ LST_NULL,
+ LST_INTEGER,
+ LST_FLOATINGPOINT,
+ LST_STRING,
+ LST_KEY,
+ LST_VECTOR,
+ LST_QUATERNION,
+ LST_LIST,
+ LST_NULL,
+};
+
+const U8 LSCRIPTTypeHi4Bits[LST_EOF] =
+{
+ LST_NULL,
+ LST_INTEGER << 4,
+ LST_FLOATINGPOINT << 4,
+ LST_STRING << 4,
+ LST_KEY << 4,
+ LST_VECTOR << 4,
+ LST_QUATERNION << 4,
+ LST_LIST << 4,
+};
+
+const char * const LSCRIPTTypeNames[LST_EOF] =
+{
+ "VOID",
+ "integer",
+ "float",
+ "string",
+ "key",
+ "vector",
+ "quaternion",
+ "list",
+ "invalid"
+};
+
+const S32 LSCRIPTDataSize[LST_EOF] =
+{
+ 0, // VOID
+ 4, // integer
+ 4, // float
+ 4, // string
+ 4, // key
+ 12, // vector
+ 16, // quaternion
+ 4, // list
+ 0 // invalid
+};
+
+
+typedef enum e_lscript_runtime_faults
+{
+ LSRF_INVALID,
+ LSRF_MATH,
+ LSRF_STACK_HEAP_COLLISION,
+ LSRF_BOUND_CHECK_ERROR,
+ LSRF_HEAP_ERROR,
+ LSRF_VERSION_MISMATCH,
+ LSRF_MISSING_INVENTORY,
+ LSRF_SANDBOX,
+ LSRF_CHAT_OVERRUN,
+ LSRF_TOO_MANY_LISTENS,
+ LSRF_NESTING_LISTS,
+ LSRF_EOF
+} LSCRIPTRunTimeFaults;
+
+extern char *LSCRIPTRunTimeFaultStrings[LSRF_EOF];
+
+const S32 LSCRIPTRunTimeFaultBits[LSRF_EOF] =
+{
+ 0, // LSRF_INVALID
+ 1, // LSRF_MATH
+ 2, // LSRF_STACK_HEAP_COLLISION
+ 3, // LSREF_BOUND_CHECK_ERROR
+ 4, // LSREF_HEAP_ERROR
+ 5, // LSREF_VERSION_MISMATCH
+ 6, // LSREF_MISSING_INVENTORY
+ 7, // LSRF_SANDBOX
+ 8, // LSRF_CHAT_OVERRUN
+ 9, // LSRF_TOO_MANY_LISTENS
+ 10, // LSRF_NESTING_LISTS
+};
+
+typedef enum e_lscript_runtime_permissions
+{
+ SCRIPT_PERMISSION_DEBIT,
+ SCRIPT_PERMISSION_TAKE_CONTROLS,
+ SCRIPT_PERMISSION_REMAP_CONTROLS,
+ SCRIPT_PERMISSION_TRIGGER_ANIMATION,
+ SCRIPT_PERMISSION_ATTACH,
+ SCRIPT_PERMISSION_RELEASE_OWNERSHIP,
+ SCRIPT_PERMISSION_CHANGE_LINKS,
+ SCRIPT_PERMISSION_CHANGE_JOINTS,
+ SCRIPT_PERMISSION_CHANGE_PERMISSIONS,
+ SCRIPT_PERMISSION_TRACK_CAMERA,
+ SCRIPT_PERMISSION_CONTROL_CAMERA,
+ SCRIPT_PERMISSION_EOF
+} LSCRIPTRunTimePermissions;
+
+const U32 LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_EOF] =
+{
+ (0x1 << 1), // SCRIPT_PERMISSION_DEBIT,
+ (0x1 << 2), // SCRIPT_PERMISSION_TAKE_CONTROLS,
+ (0x1 << 3), // SCRIPT_PERMISSION_REMAP_CONTROLS,
+ (0x1 << 4), // SCRIPT_PERMISSION_TRIGGER_ANIMATION,
+ (0x1 << 5), // SCRIPT_PERMISSION_ATTACH,
+ (0x1 << 6), // SCRIPT_PERMISSION_RELEASE_OWNERSHIP,
+ (0x1 << 7), // SCRIPT_PERMISSION_CHANGE_LINKS,
+ (0x1 << 8), // SCRIPT_PERMISSION_CHANGE_JOINTS,
+ (0x1 << 9), // SCRIPT_PERMISSION_CHANGE_PERMISSIONS
+ (0x1 << 10),// SCRIPT_PERMISSION_TRACK_CAMERA
+ (0x1 << 11),// SCRIPT_PERMISSION_CONTROL_CAMERA
+};
+
+#endif
+