Difference between revisions of "VM instructions / opcodes"

From Final Fantasy XII Wiki
Jump to navigation Jump to search
Line 239: Line 239:
 
|0
 
|0
 
|Pops stack into Y register
 
|Pops stack into Y register
 +
|-
 +
|REQ
 +
|0x21
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|FREQ
 +
|0x22
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|TREQ
 +
|0x23
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|REQSW
 +
|0x24
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|FREQSW
 +
|0x25
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|TREQSW
 +
|0x26
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|REQEW
 +
|0x27
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|FREQEW
 +
|0x28
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|TREQEW
 +
|0x29
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|PREQ
 +
|0x2a
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|PREQSW
 +
|0x2b
 +
|1
 +
|no
 +
|0
 +
|
 +
|-
 +
|PREQEW
 +
|0x2c
 +
|1
 +
|no
 +
|0
 +
|
 
|}
 
|}
 
[[Category:Instructions]]
 
[[Category:Instructions]]
 
[[Category:VM]]
 
[[Category:VM]]
 
[[Category:General]]
 
[[Category:General]]

Revision as of 10:28, 15 July 2019

Final Fantasy XII VM supports 100 known opcodes. There are three types of instructions. Instructions with an immediate, which are 3 bytes long, instructions without immediate, which are 1 byte long and special instructions like NOP and LABEL that have a defined size of zero and thus can't be used, because it causes the VM to loop indefinitely. These are probably used only by compiler and never put in the code itself.

Name Opcode Size Immediate Arguments Description
NOP 0x00 0 no 0 Don't use. It causes eternal loop
LABEL 0x01 0 no 0 Don't use. It causes eternal loop
TAG 0x02 0 no 0 Don't use. It causes eternal loop
SYSHALT 0x03 1 no 0
SYSTEM 0x04 1 no 1
OPLOR 0x05 1 no 2 Logical or
OPLAND 0x06 1 no 2 Logical and
OPOR 0x07 1 no 2 Binary or
OPEOR 0x08 1 no 2 Binary exclusive or
OPAND 0x09 1 no 2 Binary and
OPEQ 0x0a 1 no 2 Compares whether two values on stack are equal
OPNE 0x0b 1 no 2 Compares whether two values on stack are not equal
OPGT 0x0c 1 no 2 Compares whether second value on stack is greater than first
OPLS 0x0d 1 no 2 Compares whether second value on stack is less than first
OPGTE 0x0e 1 no 2 Compares whether second value on stack is greater or equal to first
OPLSE 0x0f 1 no 2 Compares whether second value on stack is less or equal to first
OPSLL 0x10 1 no 2 Shift left logical
OPSRL 0x11 1 no 2 Shift right logical
OPADD 0x12 1 no 2 Addition
OPSUB 0x13 1 no 2 Substraction
OPMUL 0x14 1 no 2 Multiplication
OPDIV 0x15 1 no 2 Division
OPMOD 0x16 1 no 2 Modulo
OPNOT 0x17 1 no 1 Logical negation
OPBNOT 0x18 1 no 1 Binary negation
OPUMINUS 0x19 1 no 1 Not used
OPFIXADRS 0x1a 1 no 1 Not used
PUSHA 0x1b 1 no 0 Pushes contents of A register to stack
POPA 0x1c 1 no 0 Pops stack into A register
PUSHX 0x1d 1 no 0 Pushes contents of X register to stack
PUSHY 0x1e 1 no 0 Pushes contents of Y register to stack
POPX 0x1f 1 no 0 Pops stack into X register
POPY 0x20 1 no 0 Pops stack into Y register
REQ 0x21 1 no 0
FREQ 0x22 1 no 0
TREQ 0x23 1 no 0
REQSW 0x24 1 no 0
FREQSW 0x25 1 no 0
TREQSW 0x26 1 no 0
REQEW 0x27 1 no 0
FREQEW 0x28 1 no 0
TREQEW 0x29 1 no 0
PREQ 0x2a 1 no 0
PREQSW 0x2b 1 no 0
PREQEW 0x2c 1 no 0