Spin Byte Code - rosco-pc/propeller-wiki GitHub Wiki

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