| | 1 | /* $Header: d:/cvsroot/tads/tads3/vmop.h,v 1.4 1999/07/11 00:46:59 MJRoberts Exp $ */ |
| | 2 | |
| | 3 | /* |
| | 4 | * Copyright (c) 1998, 2002 Michael J. Roberts. All Rights Reserved. |
| | 5 | * |
| | 6 | * Please see the accompanying license file, LICENSE.TXT, for information |
| | 7 | * on using and copying this software. |
| | 8 | */ |
| | 9 | /* |
| | 10 | Name |
| | 11 | vmop.h - T3 VM Opcodes |
| | 12 | Function |
| | 13 | |
| | 14 | Notes |
| | 15 | |
| | 16 | Modified |
| | 17 | 11/14/98 MJRoberts - Creation |
| | 18 | */ |
| | 19 | |
| | 20 | #ifndef VMOP_H |
| | 21 | #define VMOP_H |
| | 22 | |
| | 23 | #define OPC_PUSH_0 0x01 /* push constant integer 0 */ |
| | 24 | #define OPC_PUSH_1 0x02 /* push constant integer 1 */ |
| | 25 | #define OPC_PUSHINT8 0x03 /* push SBYTE operand as integer */ |
| | 26 | #define OPC_PUSHINT 0x04 /* push INT4 operand as integer */ |
| | 27 | #define OPC_PUSHSTR 0x05 /* push UINT4 operand as string constant */ |
| | 28 | #define OPC_PUSHLST 0x06 /* push UINT4 operand as list constant */ |
| | 29 | #define OPC_PUSHOBJ 0x07 /* push UINT4 operand as object ID */ |
| | 30 | #define OPC_PUSHNIL 0x08 /* push nil */ |
| | 31 | #define OPC_PUSHTRUE 0x09 /* push true */ |
| | 32 | #define OPC_PUSHPROPID 0x0A /* push UINT2 operand as property ID */ |
| | 33 | #define OPC_PUSHFNPTR 0x0B /* push UINT4 code offset */ |
| | 34 | #define OPC_PUSHSTRI 0x0C /* push inline string constant */ |
| | 35 | #define OPC_PUSHPARLST 0x0D /* push varargs parameter list */ |
| | 36 | #define OPC_MAKELSTPAR 0x0E /* push varargs parameter from list */ |
| | 37 | #define OPC_PUSHENUM 0x0F /* push an enum value */ |
| | 38 | |
| | 39 | #define OPC_NEG 0x20 /* negate */ |
| | 40 | #define OPC_BNOT 0x21 /* bitwise NOT */ |
| | 41 | #define OPC_ADD 0x22 /* add */ |
| | 42 | #define OPC_SUB 0x23 /* subtract */ |
| | 43 | #define OPC_MUL 0x24 /* multiply */ |
| | 44 | #define OPC_BAND 0x25 /* bitwise AND */ |
| | 45 | #define OPC_BOR 0x26 /* bitwise OR */ |
| | 46 | #define OPC_SHL 0x27 /* shift left */ |
| | 47 | #define OPC_SHR 0x28 /* shift right */ |
| | 48 | #define OPC_XOR 0x29 /* bitwise/logical XOR */ |
| | 49 | #define OPC_DIV 0x2A /* divide */ |
| | 50 | #define OPC_MOD 0x2B /* MOD (remainder) */ |
| | 51 | #define OPC_NOT 0x2C /* logical NOT */ |
| | 52 | #define OPC_BOOLIZE 0x2D /* convert top of stack to true/nil */ |
| | 53 | #define OPC_INC 0x2E /* increment value at top of stack */ |
| | 54 | #define OPC_DEC 0x2F /* decrement value at top of stack */ |
| | 55 | |
| | 56 | #define OPC_EQ 0x40 /* equals */ |
| | 57 | #define OPC_NE 0x41 /* not equals */ |
| | 58 | #define OPC_LT 0x42 /* less than */ |
| | 59 | #define OPC_LE 0x43 /* less than or equal to */ |
| | 60 | #define OPC_GT 0x44 /* greater than */ |
| | 61 | #define OPC_GE 0x45 /* greater than or equal to */ |
| | 62 | |
| | 63 | #define OPC_RETVAL 0x50 /* return with value at top of stack */ |
| | 64 | #define OPC_RETNIL 0x51 /* return nil */ |
| | 65 | #define OPC_RETTRUE 0x52 /* return true */ |
| | 66 | #define OPC_RET 0x54 /* return with no value */ |
| | 67 | |
| | 68 | #define OPC_CALL 0x58 /* function call */ |
| | 69 | #define OPC_PTRCALL 0x59 /* function call through pointer */ |
| | 70 | |
| | 71 | #define OPC_GETPROP 0x60 /* get property */ |
| | 72 | #define OPC_CALLPROP 0x61 /* call property with arguments */ |
| | 73 | #define OPC_PTRCALLPROP 0x62 /* call property through pointer with args */ |
| | 74 | #define OPC_GETPROPSELF 0x63 /* get property of 'self' */ |
| | 75 | #define OPC_CALLPROPSELF 0x64 /* call method of 'self' */ |
| | 76 | #define OPC_PTRCALLPROPSELF 0x65 /* call method of 'self' through pointer */ |
| | 77 | #define OPC_OBJGETPROP 0x66 /* get property of specific object */ |
| | 78 | #define OPC_OBJCALLPROP 0x67 /* call method of specific object */ |
| | 79 | #define OPC_GETPROPDATA 0x68 /* get property, disallowing side effects */ |
| | 80 | #define OPC_PTRGETPROPDATA 0x69 /* get prop through pointer, data only */ |
| | 81 | #define OPC_GETPROPLCL1 0x6A /* get property of local variable */ |
| | 82 | #define OPC_CALLPROPLCL1 0x6B /* call property of local variable */ |
| | 83 | #define OPC_GETPROPR0 0x6C /* get property of R0 */ |
| | 84 | #define OPC_CALLPROPR0 0x6D /* call property of R0 */ |
| | 85 | |
| | 86 | #define OPC_INHERIT 0x72 /* inherit from superclass */ |
| | 87 | #define OPC_PTRINHERIT 0x73 /* inherit through property pointer */ |
| | 88 | #define OPC_EXPINHERIT 0x74 /* inherit from an explicit superclass */ |
| | 89 | #define OPC_PTREXPINHERIT 0x75 /* inherit from explicit sc through prop ptr */ |
| | 90 | #define OPC_VARARGC 0x76 /* modifier: next call is var arg count */ |
| | 91 | #define OPC_DELEGATE 0x77 /* delegate to object on stack */ |
| | 92 | #define OPC_PTRDELEGATE 0x78 /* delegate through property pointer */ |
| | 93 | |
| | 94 | #define OPC_GETLCL1 0x80 /* push a local variable */ |
| | 95 | #define OPC_GETLCL2 0x81 /* push a local (2-byte index) */ |
| | 96 | #define OPC_GETARG1 0x82 /* push an argument */ |
| | 97 | #define OPC_GETARG2 0x83 /* push an argument (2-byte index) */ |
| | 98 | #define OPC_PUSHSELF 0x84 /* push 'self' */ |
| | 99 | #define OPC_GETDBLCL 0x85 /* push debug frame local */ |
| | 100 | #define OPC_GETDBARG 0x86 /* push debug frame argument */ |
| | 101 | #define OPC_GETARGC 0x87 /* get current argument count */ |
| | 102 | #define OPC_DUP 0x88 /* duplicate top of stack */ |
| | 103 | #define OPC_DISC 0x89 /* discard top of stack */ |
| | 104 | #define OPC_DISC1 0x8A /* discard n items from stack */ |
| | 105 | #define OPC_GETR0 0x8B /* push the R0 register onto the stack */ |
| | 106 | #define OPC_GETDBARGC 0x8C /* push debug frame argument count */ |
| | 107 | #define OPC_SWAP 0x8D /* swap top two stack elements */ |
| | 108 | |
| | 109 | #define OPC_PUSHCTXELE 0x8E /* push a method context value */ |
| | 110 | #define PUSHCTXELE_TARGPROP 0x01 /* push target property */ |
| | 111 | #define PUSHCTXELE_TARGOBJ 0x02 /* push target object */ |
| | 112 | #define PUSHCTXELE_DEFOBJ 0x03 /* push defining object */ |
| | 113 | |
| | 114 | #define OPC_SWITCH 0x90 /* jump through case table */ |
| | 115 | #define OPC_JMP 0x91 /* unconditional branch */ |
| | 116 | #define OPC_JT 0x92 /* jump if true */ |
| | 117 | #define OPC_JF 0x93 /* jump if false */ |
| | 118 | #define OPC_JE 0x94 /* jump if equal */ |
| | 119 | #define OPC_JNE 0x95 /* jump if not equal */ |
| | 120 | #define OPC_JGT 0x96 /* jump if greater than */ |
| | 121 | #define OPC_JGE 0x97 |
| | 122 | #define OPC_JLT 0x98 /* jump if less than */ |
| | 123 | #define OPC_JLE 0x99 /* jump if less than or equal */ |
| | 124 | #define OPC_JST 0x9A /* jump and save if true */ |
| | 125 | #define OPC_JSF 0x9B /* jump and save if false */ |
| | 126 | #define OPC_LJSR 0x9C /* local jump to subroutine */ |
| | 127 | #define OPC_LRET 0x9D /* local return from subroutine */ |
| | 128 | #define OPC_JNIL 0x9E /* jump if nil */ |
| | 129 | #define OPC_JNOTNIL 0x9F /* jump if not nil */ |
| | 130 | #define OPC_JR0T 0xA0 /* jump if R0 is true */ |
| | 131 | #define OPC_JR0F 0xA1 /* jump if R0 is false */ |
| | 132 | |
| | 133 | #define OPC_SAY 0xB0 /* display a constant string */ |
| | 134 | #define OPC_BUILTIN_A 0xB1 /* call built-in func from set 0 */ |
| | 135 | #define OPC_BUILTIN_B 0xB2 /* call built-in from set 1 */ |
| | 136 | #define OPC_BUILTIN_C 0xB3 /* call built-in from set 2 */ |
| | 137 | #define OPC_BUILTIN_D 0xB4 /* call built-in from set 3 */ |
| | 138 | #define OPC_BUILTIN1 0xB5 /* call built-in from any set, 8-bit index */ |
| | 139 | #define OPC_BUILTIN2 0xB6 /* call built-in from any set, 16-bit index */ |
| | 140 | #define OPC_CALLEXT 0xB7 /* call external function */ |
| | 141 | #define OPC_THROW 0xB8 /* throw an exception */ |
| | 142 | #define OPC_SAYVAL 0xB9 /* display the value at top of stack */ |
| | 143 | |
| | 144 | #define OPC_INDEX 0xBA /* index a list */ |
| | 145 | #define OPC_IDXLCL1INT8 0xBB /* index a local variable by an int8 value */ |
| | 146 | #define OPC_IDXINT8 0xBC /* index by an int8 value */ |
| | 147 | |
| | 148 | #define OPC_NEW1 0xC0 /* create new object instance */ |
| | 149 | #define OPC_NEW2 0xC1 /* create new object (2-byte operands) */ |
| | 150 | #define OPC_TRNEW1 0xC2 /* create new transient instance */ |
| | 151 | #define OPC_TRNEW2 0xC3 /* create transient object (2-byte operands) */ |
| | 152 | |
| | 153 | #define OPC_INCLCL 0xD0 /* increment local variable by 1 */ |
| | 154 | #define OPC_DECLCL 0xD1 /* decrement local variable by 1 */ |
| | 155 | #define OPC_ADDILCL1 0xD2 /* add immediate 1-byte int to local */ |
| | 156 | #define OPC_ADDILCL4 0xD3 /* add immediate 4-byte int to local */ |
| | 157 | #define OPC_ADDTOLCL 0xD4 /* add value to local variable */ |
| | 158 | #define OPC_SUBFROMLCL 0xD5 /* subtract value from local variable */ |
| | 159 | #define OPC_ZEROLCL1 0xD6 /* set local to zero */ |
| | 160 | #define OPC_ZEROLCL2 0xD7 /* set local to zero */ |
| | 161 | #define OPC_NILLCL1 0xD8 /* set local to nil */ |
| | 162 | #define OPC_NILLCL2 0xD9 /* set local to nil */ |
| | 163 | #define OPC_ONELCL1 0xDA /* set local to numeric value 1 */ |
| | 164 | #define OPC_ONELCL2 0xDB /* set local to numeric value 1 */ |
| | 165 | |
| | 166 | #define OPC_SETLCL1 0xE0 /* set local (1-byte local number) */ |
| | 167 | #define OPC_SETLCL2 0xE1 /* set local (2-byte local number) */ |
| | 168 | #define OPC_SETARG1 0xE2 /* set parameter (1-byte param number) */ |
| | 169 | #define OPC_SETARG2 0xE3 /* set parameter (2-byte param number) */ |
| | 170 | #define OPC_SETIND 0xE4 /* set value at index */ |
| | 171 | #define OPC_SETPROP 0xE5 /* set property in object */ |
| | 172 | #define OPC_PTRSETPROP 0xE6 /* set property through prop pointer */ |
| | 173 | #define OPC_SETPROPSELF 0xE7 /* set property in self */ |
| | 174 | #define OPC_OBJSETPROP 0xE8 /* set property in immediate object */ |
| | 175 | #define OPC_SETDBLCL 0xE9 /* set debugger local variable */ |
| | 176 | #define OPC_SETDBARG 0xEA /* set debugger parameter variable */ |
| | 177 | |
| | 178 | #define OPC_SETSELF 0xEB /* set 'self' */ |
| | 179 | #define OPC_LOADCTX 0xEC /* load method context from stack */ |
| | 180 | #define OPC_STORECTX 0xED /* store method context and push on stack */ |
| | 181 | #define OPC_SETLCL1R0 0xEE /* set local (1-byte local number) from R0 */ |
| | 182 | #define OPC_SETINDLCL1I8 0xEF /* set indexed local */ |
| | 183 | |
| | 184 | #define OPC_BP 0xF1 /* debugger breakpoint */ |
| | 185 | #define OPC_NOP 0xF2 /* no operation */ |
| | 186 | |
| | 187 | |
| | 188 | #endif /* VMOP_H */ |
| | 189 | |