Spin Byte Code
Title:Spin Byte Code
Author:johnfos
Published:Wed, 24 Aug 2011 20:15:57 GMT

Spin Byte Code

Spin Byte code was long undocumented. However they have been reverse engineered by Cliffe L. Biffle and Robert Vandiver ("asterick"). The meaning of the operand types can be deduced from the source. The names of the byte codes is unofficial. Even though the source code of the SPIN interpreter is released, there is no official list of opcode names whatsoever.

Opcode structure

Opcodes are divided into two main categories: LOWER and UPPER opcodes. Opcodes $00 to $3F are LOWER opcodes and $40 to $FF are UPPER opcodes. That is, if two highest bits of an opcode are zero, the opcode is a LOWER opcode. Otherwise it is an UPPER opcode.

LOWER opcodes are decoded in the main loop with a jump table. UPPER opcodes are handled in a separate subroutine.

Structure of LOWER opcodes

Following is the structure of opcodes, based on the source code of SPIN interpreter. The names of the fields are not official.
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
0
0
L
L
B
B
C
NZ
The L and B fields tell to which subroutine (of 16 different) the SPIN interpreter jumps to.
L: LONG. These bits mean from what long the jump address is read. (The jump table is in 4 longs, each long has four one-byte pointers). For UPPER instructions
B: BYTE. Which byte of the long is used as a jump destination?
C: CARRY. Value of the C flag is set to the value of this bit.
NZ: NONZERO. Value of the Z flag is set to the negative value of this bit.

Structure of UPPER opcodes

UPPER opcodes are divided into 3 classes: variable ops, memory ops and math ops. Math ops handle mathematical operations and always operate on the stack. Memory ops (memops) operate on memory, addressed by an operand in the stack. Variable ops (varops) also operate on memory, but an index is embedded in the instruction, it is not read from the stack. They are used to save memory as use of memory op would take an extra long.

For variable ops bit 7 is clear and bit 6 is set, ie. opcodes from $40 to $7F are variable ops. For memory ops, bit 7 is set, but either bit 6 or 5 is clear. So opcodes from $80 to $DF are memory ops. For math ops, bits 7 to 5 are set. Therefore opcodes from $E0 to $FF are math ops.

Struture of Variable ops

Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
0
1
S/V
X
X
X
O
O
S/V-field: Operate on VAR or STACK? Zero means that the instruction operates on VAR region, one means it operates on local stack (function local variables).
X-field: Offset. These three bits tell which LONG to access. The long offset is added to stack pointer or VAR base pointer.
O-field: Operation field. What to do with the memory location?
00: Read (Push result in the stack)
01: Write (Pop value from the stack)
10: Assignment (effect). In this mode, a second opcode (different from the normal opcodes), called an assignment operator, is executed and its result is stored in the target. These opcodes can be math operators, or for example random number operators, sign-extend operators or decrement/increment operators.
11: Push the address of destination into stack.

Structure of Memory ops

Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
1
S
S
I
B
B
O
O

S-field: Size of address operand. 00: Byte; 01: Word; 10: Long; 11: Illegal (would be a math op). If the I-field is set to 1, the index value is shifted left by S bits.
I-field: Index field. If 1, the target register is determined by adding an index popped from stack to a base address determined by the B-field. If 0, an absolute address is popped from the stack.
B-field: Base mode. If I-bit is 1, this indicates what base address the offset is added to. 00: Base is popped from stack. 01: Base is the object base address 10: VAR base. 11: Stack base.
O-field: See Structure of Variable ops.

Structure of Math ops

Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
1
1
1
X
X
X
X
X
X-field: The 5-bit X-field determines the operation to be executed.

Spin Byte Code Instruction List


The following table is extracted from asterick's GEAR source code, and gives a list of the byte codes.

Byte Code
Operand Type
Opcode class
$00
FRAME_CALL_RETURN
OP_NONE
LOWER
$01
FRAME_CALL_NORETURN
OP_NONE
LOWER
$02
FRAME_CALL_ABORT
OP_NONE
LOWER
$03
FRAME_CALL_TRASHABORT
OP_NONE
LOWER
$04
BRANCH
OP_SIGNED_OFFSET
LOWER
$05
CALL
OP_BYTE_LITERAL
LOWER
$06
OBJCALL
OP_OBJ_CALL_PAIR
LOWER
$07
OBJCALL_INDEXED
OP_OBJ_CALL_PAIR
LOWER
$08
LOOP_START
OP_SIGNED_OFFSET
LOWER
$09
LOOP_CONTINUE
OP_SIGNED_OFFSET
LOWER
$0a
JUMP_IF_FALSE
OP_SIGNED_OFFSET
LOWER
$0b
JUMP_IF_TRUE
OP_SIGNED_OFFSET
LOWER
$0c
JUMP_FROM_STACK
OP_NONE
LOWER
$0d
COMPARE_CASE
OP_SIGNED_OFFSET
LOWER
$0e
COMPARE_CASE_RANGE
OP_SIGNED_OFFSET
LOWER
$0f
LOOK_ABORT
OP_NONE
LOWER
$10
LOOKUP_COMPARE
OP_NONE
LOWER
$11
LOOKDOWN_COMPARE
OP_NONE
LOWER
$12
LOOKUPRANGE_COMPARE
OP_NONE
LOWER
$13
LOOKDOWNRANGE_COMPARE
OP_NONE
LOWER
$14
QUIT
OP_NONE
LOWER
$15
MARK_INTERPRETED
OP_NONE
LOWER
$16
STRSIZE
OP_NONE
LOWER
$17
STRCOMP
OP_NONE
LOWER
$18
BYTEFILL
OP_NONE
LOWER
$19
WORDFILL
OP_NONE
LOWER
$1a
LONGFILL
OP_NONE
LOWER
$1b
WAITPEQ
OP_NONE
LOWER
$1c
BYTEMOVE
OP_NONE
LOWER
$1d
WORDMOVE
OP_NONE
LOWER
$1e
LONGMOVE
OP_NONE
LOWER
$1f
WAITPNE
OP_NONE
LOWER
$20
CLKSET
OP_NONE
LOWER
$21
COGSTOP
OP_NONE
LOWER
$22
LOCKRET
OP_NONE
LOWER
$23
WAITCNT
OP_NONE
LOWER
$24
READ_INDEXED_SPR
OP_NONE
LOWER
$25
WRITE_INDEXED_SPR
OP_NONE
LOWER
$26
EFFECT_INDEXED_SPR
OP_EFFECT
LOWER
$27
WAITVID
OP_NONE
LOWER
$28
COGINIT_RETURNS
OP_NONE
LOWER
$29
LOCKNEW_RETURNS
OP_NONE
LOWER
$2a
LOCKSET_RETURNS
OP_NONE
LOWER
$2b
LOCKCLR_RETURNS
OP_NONE
LOWER
$2c
COGINIT
OP_NONE
LOWER
$2d
LOCKNEW
OP_NONE
LOWER
$2e
LOCKSET
OP_NONE
LOWER
$2f
LOCKCLR
OP_NONE
LOWER
$30
ABORT
OP_NONE
LOWER
$31
ABORT_WITH_RETURN
OP_NONE
LOWER
$32
RETURN
OP_NONE
LOWER
$33
POP_RETURN
OP_NONE
LOWER
$34
PUSH_NEG1
OP_NONE
LOWER
$35
PUSH_0
OP_NONE
LOWER
$36
PUSH_1
OP_NONE
LOWER
$37
PUSH_PACKED_LIT
OP_PACKED_LITERAL
LOWER
$38
PUSH_BYTE_LIT
OP_BYTE_LITERAL
LOWER
$39
PUSH_WORD_LIT
OP_WORD_LITERAL,
LOWER
$3a
PUSH_MID_LIT
OP_NEAR_LONG_LITERAL,
LOWER
$3b
PUSH_LONG_LIT
OP_LONG_LITERAL,
LOWER
$3c
UNKNOWN OP $3C
OP_NONE
LOWER
$3d
INDEXED_MEM_OP
OP_MEMORY_OPCODE,
LOWER
$3e
INDEXED_RANGE_MEM_OP
OP_MEMORY_OPCODE
LOWER
$3f
MEMORY_OP
OP_MEMORY_OPCODE
LOWER
$40
PUSH_VARMEM_LONG_0
OP_NONE
VAROP
$41
POP_VARMEM_LONG_0
OP_NONE
VAROP
$42
EFFECT_VARMEM_LONG_0
OP_EFFECT
VAROP
$43
REFERENCE_VARMEM_LONG_0
OP_NONE
VAROP
$44
PUSH_VARMEM_LONG_1
OP_NONE
VAROP
$45
POP_VARMEM_LONG_1
OP_NONE
VAROP
$46
EFFECT_VARMEM_LONG_1
OP_EFFECT
VAROP
$47
REFERENCE_VARMEM_LONG_1
OP_NONE
VAROP
$48
PUSH_VARMEM_LONG_2
OP_NONE
VAROP
$49
POP_VARMEM_LONG_2
OP_NONE
VAROP
$4a
EFFECT_VARMEM_LONG_2
OP_EFFECT
VAROP
$4b
REFERENCE_VARMEM_LONG_2
OP_NONE
VAROP
$4c
PUSH_VARMEM_LONG_3
OP_NONE
VAROP
$4d
POP_VARMEM_LONG_3
OP_NONE
VAROP
$4e
EFFECT_VARMEM_LONG_3
OP_EFFECT
VAROP
$4f
REFERENCE_VARMEM_LONG_3
OP_NONE
VAROP
$50
PUSH_VARMEM_LONG_4
OP_NONE
VAROP
$51
POP_VARMEM_LONG_4
OP_NONE
VAROP
$52
EFFECT_VARMEM_LONG_4
OP_EFFECT
VAROP
$53
REFERENCE_VARMEM_LONG_4
OP_NONE
VAROP
$54
PUSH_VARMEM_LONG_5
OP_NONE
VAROP
$55
POP_VARMEM_LONG_5
OP_NONE
VAROP
$56
EFFECT_VARMEM_LONG_5
OP_EFFECT
VAROP
$57
REFERENCE_VARMEM_LONG_5
OP_NONE
VAROP
$58
PUSH_VARMEM_LONG_6
OP_NONE
VAROP
$59
POP_VARMEM_LONG_6
OP_NONE
VAROP
$5a
EFFECT_VARMEM_LONG_6
OP_EFFECT
VAROP
$5b
REFERENCE_VARMEM_LONG_6
OP_NONE
VAROP
$5c
PUSH_VARMEM_LONG_7
OP_NONE
VAROP
$5d
POP_VARMEM_LONG_7
OP_NONE
VAROP
$5e
EFFECT_VARMEM_LONG_7
OP_EFFECT
VAROP
$5f
REFERENCE_VARMEM_LONG_7
OP_NONE
VAROP
$60
PUSH_LOCALMEM_LONG_0
OP_NONE
VAROP
$61
POP_LOCALMEM_LONG_0
OP_NONE
VAROP
$62
EFFECT_LOCALMEM_LONG_0
OP_EFFECT
VAROP
$63
REFERENCE_LOCALMEM_LONG_0
OP_NONE
VAROP
$64
PUSH_LOCALMEM_LONG_1
OP_NONE
VAROP
$65
POP_LOCALMEM_LONG_1
OP_NONE
VAROP
$66
EFFECT_LOCALMEM_LONG_1
OP_EFFECT
VAROP
$67
REFERENCE_LOCALMEM_LONG_1
OP_NONE
VAROP
$68
PUSH_LOCALMEM_LONG_2
OP_NONE
VAROP
$69
POP_LOCALMEM_LONG_2
OP_NONE
VAROP
$6a
EFFECT_LOCALMEM_LONG_2
OP_EFFECT
VAROP
$6b
REFERENCE_LOCALMEM_LONG_2
OP_NONE
VAROP
$6c
PUSH_LOCALMEM_LONG_3
OP_NONE
VAROP
$6d
POP_LOCALMEM_LONG_3
OP_NONE
VAROP
$6e
EFFECT_LOCALMEM_LONG_3
OP_EFFECT
VAROP
$6f
REFERENCE_LOCALMEM_LONG_3
OP_NONE
VAROP
$70
PUSH_LOCALMEM_LONG_4
OP_NONE
VAROP
$71
POP_LOCALMEM_LONG_4
OP_NONE
VAROP
$72
EFFECT_LOCALMEM_LONG_4
OP_EFFECT
VAROP
$73
REFERENCE_LOCALMEM_LONG_4
OP_NONE
VAROP
$74
PUSH_LOCALMEM_LONG_5
OP_NONE
VAROP
$75
POP_LOCALMEM_LONG_5
OP_NONE
VAROP
$76
EFFECT_LOCALMEM_LONG_5
OP_EFFECT
VAROP
$77
REFERENCE_LOCALMEM_LONG_5
OP_NONE
VAROP
$78
PUSH_LOCALMEM_LONG_6
OP_NONE
VAROP
$79
POP_LOCALMEM_LONG_6
OP_NONE
VAROP
$7a
EFFECT_LOCALMEM_LONG_6
OP_EFFECT
VAROP
$7b
REFERENCE_LOCALMEM_LONG_6
OP_NONE
VAROP
$7c
PUSH_LOCALMEM_LONG_7
OP_NONE
VAROP
$7d
POP_LOCALMEM_LONG_7
OP_NONE
VAROP
$7e
EFFECT_LOCALMEM_LONG_7
OP_EFFECT
VAROP
$7f
REFERENCE_LOCALMEM_LONG_7
OP_NONE
VAROP
$80
PUSH_MAINMEM_BYTE
OP_NONE
MEMOP
$81
POP_MAINMEM_BYTE
OP_NONE
MEMOP
$82
EFFECT_MAINMEM_BYTE
OP_EFFECT
MEMOP
$83
REFERENCE_MAINMEM_BYTE
OP_NONE
MEMOP
$84
PUSH_OBJECTMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$85
POP_OBJECTMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$86
EFFECT_OBJECTMEM_BYTE
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$87
REFERENCE_OBJECTMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$88
PUSH_VARIABLEMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$89
POP_VARIABLEMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$8a
EFFECT_VARIABLEMEM_BYTE
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$8b
REFERENCE_VARIABLEMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$8c
PUSH_LOCALMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$8d
POP_LOCALMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$8e
EFFECT_LOCALMEM_BYTE
OP_UNSIGNED_EFFECTED_OFFSET,
MEMOP
$8f
REFERENCE_LOCALMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$90
PUSH_INDEXED_MAINMEM_BYTE
OP_NONE
MEMOP
$91
POP_INDEXED_MAINMEM_BYTE
OP_NONE
MEMOP
$92
EFFECT_INDEXED_MAINMEM_BYTE
OP_EFFECT
MEMOP
$93
REFERENCE_INDEXED_MAINMEM_BYTE
OP_NONE
MEMOP
$94
PUSH_INDEXED_OBJECTMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$95
POP_INDEXED_OBJECTMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$96
EFFECT_INDEXED_OBJECTMEM_BYTE
OP_UNSIGNED_EFFECTED_OFFSET,
MEMOP
$97
REFERENCE_INDEXED_OBJECTMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$98
PUSH_INDEXED_VARIABLEMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$99
POP_INDEXED_VARIABLEMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$9a
EFFECT_INDEXED_VARIABLEMEM_BYTE
OP_UNSIGNED_EFFECTED_OFFSET,
MEMOP
$9b
REFERENCE_INDEXED_VARIABLEMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$9c
PUSH_INDEXED_LOCALMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$9d
POP_INDEXED_LOCALMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$9e
EFFECT_INDEXED_LOCALMEM_BYTE
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$9f
REFERENCE_INDEXED_LOCALMEM_BYTE
OP_UNSIGNED_OFFSET
MEMOP
$a0
PUSH_MAINMEM_WORD
OP_NONE
MEMOP
$a1
POP_MAINMEM_WORD
OP_NONE
MEMOP
$a2
EFFECT_MAINMEM_WORD
OP_EFFECT
MEMOP
$a3
REFERENCE_MAINMEM_WORD
OP_NONE
MEMOP
$a4
PUSH_OBJECTMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$a5
POP_OBJECTMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$a6
EFFECT_OBJECTMEM_WORD
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$a7
REFERENCE_OBJECTMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$a8
PUSH_VARIABLEMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$a9
POP_VARIABLEMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$aa
EFFECT_VARIABLEMEM_WORD
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$ab
REFERENCE_VARIABLEMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$ac
PUSH_LOCALMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$ad
POP_LOCALMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$ae
EFFECT_LOCALMEM_WORD
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$af
REFERENCE_LOCALMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$b0
PUSH_INDEXED_MAINMEM_WORD
OP_NONE
MEMOP
$b1
POP_INDEXED_MAINMEM_WORD
OP_NONE
MEMOP
$b2
EFFECT_INDEXED_MAINMEM_WORD
OP_EFFECT
MEMOP
$b3
REFERENCE_INDEXED_MAINMEM_WORD
OP_NONE
MEMOP
$b4
PUSH_INDEXED_OBJECTMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$b5
POP_INDEXED_OBJECTMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$b6
EFFECT_INDEXED_OBJECTMEM_WORD
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$b7
REFERENCE_INDEXED_OBJECTMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$b8
PUSH_INDEXED_VARIABLEMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$b9
POP_INDEXED_VARIABLEMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$ba
EFFECT_INDEXED_VARIABLEMEM_WORD
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$bb
REFERENCE_INDEXED_VARIABLEMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$bc
PUSH_INDEXED_LOCALMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$bd
POP_INDEXED_LOCALMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$be
EFFECT_INDEXED_LOCALMEM_WORD
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$bf
REFERENCE_INDEXED_LOCALMEM_WORD
OP_UNSIGNED_OFFSET
MEMOP
$c0
PUSH_MAINMEM_LONG
OP_NONE
MEMOP
$c1
POP_MAINMEM_LONG
OP_NONE
MEMOP
$c2
EFFECT_MAINMEM_LONG
OP_EFFECT
MEMOP
$c3
REFERENCE_MAINMEM_LONG
OP_NONE
MEMOP
$c4
PUSH_OBJECTMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$c5
POP_OBJECTMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$c6
EFFECT_OBJECTMEM_LONG
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$c7
REFERENCE_OBJECTMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$c8
PUSH_VARIABLEMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$c9
POP_VARIABLEMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$ca
EFFECT_VARIABLEMEM_LONG
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$cb
REFERENCE_VARIABLEMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$cc
PUSH_LOCALMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$cd
POP_LOCALMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$ce
EFFECT_LOCALMEM_LONG
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$cf
REFERENCE_LOCALMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$d0
PUSH_INDEXED_MAINMEM_LONG
OP_NONE
MEMOP
$d1
POP_INDEXED_MAINMEM_LONG
OP_NONE
MEMOP
$d2
EFFECT_INDEXED_MAINMEM_LONG
OP_EFFECT
MEMOP
$d3
REFERENCE_INDEXED_MAINMEM_LONG
OP_NONE
MEMOP
$d4
PUSH_INDEXED_OBJECTMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$d5
POP_INDEXED_OBJECTMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$d6
EFFECT_INDEXED_OBJECTMEM_LONG
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$d7
REFERENCE_INDEXED_OBJECTMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$d8
PUSH_INDEXED_VARIABLEMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$d9
POP_INDEXED_VARIABLEMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$da
EFFECT_INDEXED_VARIABLEMEM_LONG
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$db
REFERENCE_INDEXED_VARIABLEMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$dc
PUSH_INDEXED_LOCALMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$dd
POP_INDEXED_LOCALMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$de
EFFECT_INDEXED_LOCALMEM_LONG
OP_UNSIGNED_EFFECTED_OFFSET
MEMOP
$df
REFERENCE_INDEXED_LOCALMEM_LONG
OP_UNSIGNED_OFFSET
MEMOP
$e0
ROTATE_RIGHT
OP_NONE
MATHOP
$e1
ROTATE_LEFT
OP_NONE
MATHOP
$e2
SHIFT_RIGHT
OP_NONE
MATHOP
$e3
SHIFT_LEFT
OP_NONE
MATHOP
$e4
LIMIT_MIN
OP_NONE
MATHOP
$e5
LIMIT_MAX
OP_NONE
MATHOP
$e6
NEGATE
OP_NONE
MATHOP
$e7
COMPLEMENT
OP_NONE
MATHOP
$e8
BIT_AND
OP_NONE
MATHOP
$e9
ABSOLUTE_VALUE
OP_NONE
MATHOP
$ea
BIT_OR
OP_NONE
MATHOP
$eb
BIT_XOR
OP_NONE
MATHOP
$ec
ADD
OP_NONE
MATHOP
$ed
SUBTRACT
OP_NONE
MATHOP
$ee
ARITH_SHIFT_RIGHT
OP_NONE
MATHOP
$ef
BIT_REVERSE
OP_NONE
MATHOP
$f0
LOGICAL_AND
OP_NONE
MATHOP
$f1
ENCODE
OP_NONE
MATHOP
$f2
LOGICAL_OR
OP_NONE
MATHOP
$f3
DECODE
OP_NONE
MATHOP
$f4
MULTIPLY
OP_NONE
MATHOP
$f5
MULTIPLY_HI
OP_NONE
MATHOP
$f6
DIVIDE
OP_NONE
MATHOP
$f7
MODULO
OP_NONE
MATHOP
$f8
SQUARE_ROOT
OP_NONE
MATHOP
$f9
LESS
OP_NONE
MATHOP
$fa
GREATER
OP_NONE
MATHOP
$fb
NOT_EQUAL
OP_NONE
MATHOP
$fc
EQUAL
OP_NONE
MATHOP
$fd
LESS_EQUAL
OP_NONE
MATHOP
$fe
GREATER_EQUAL
OP_NONE
MATHOP
$ff
LOGICAL_NOT
OP_NONE
MATHOP