Slang/SBC/bytecode.md

172 lines
2.9 KiB
Markdown

# Slang Bytecode
## Standalone
### NOP
0x00
> Does nothing.
### END
0x01
> Closes previously opened block.
### POP
0x02
> Drops `TOS`.
### RET
0x03
> Returns `TOS` to caller.
### BLTIN
0x04
> Reads string from the bytecode until null byte (max 255 bytes) and pushes builtin function with that name.
### CODE
0x05
> Reads code from the bytecode until the corresponding `END` instruction and pushes a reference to it and then its length.
> Opens a block.
## Unary
### POS
0x10
> Pushes `abs(TOS)`.
### NEG
0x11
> Pushes `-TOS`.
### NOT
0x12
> Pushes `!TOS`.
### INV
0x13
> Pushes `~TOS`.
### ATOI
0x14
> Pushes integer of smallest possible width parsed from string `TOS`.
### ITOA
0x15
> Pushes string representation of integer `TOS`.
### ITOF
0x16
> Pushes real of smallest possible width equal to integer `TOS`.
### CEIL
0x17
> Pushes smallest integer of smallest possible width greater or equal to real `TOS`.
### FLR
0x18
> Pushes largest integer of smallest possible width less or equal to real `TOS`.
### RND
0x19
> Pushes integer of smallest possible width equal to rounded `TOS`.
### CTOS
0x1A
> Pushes string consisting of char `TOS` and a null byte.
## Binary
### ADD
0x20
> Pushes `TOS1 + TOS`.
### SUB
0x21
> Pushes `TOS1 - TOS`.
### MUL
0x22
> Pushes `TOS1 * TOS`.
### DIV
0x23
> Pushes `TOS1 / TOS`.
### IDIV
0x24
> Pushes `TOS1 // TOS`.
### MOD
0x25
> Pushes `TOS1 % TOS`.
### POW
0x26
> Pushes `TOS1 ** TOS`.
### LSH
0x27
> Pushes `TOS1 << TOS`.
### RSH
0x28
> Pushes `TOS1 >> TOS`.
### AND
0x29
> Pushes `TOS1 & TOS`.
### OR
0x2A
> Pushes `TOS1 | TOS`.
### XOR
0x2B
> Pushes `TOS1 ^ TOS`.
## Comparisons
### EQ
0x30
> Pushes `TOS1 == TOS`.
### NE
0x31
> Pushes `TOS1 != TOS`.
### LT
0x32
> Pushes `TOS1 < TOS`.
### GT
0x33
> Pushes `TOS1 > TOS`.
### LE
0x34
> Pushes `TOS1 <= TOS`.
### GE
0x35
> Pushes `TOS1 >= TOS`.
### IS
0x36
> Pushes `TOS1 is TOS`.
### ISNOT
0x37
> Pushes `TOS1 is not TOS`.
## Flow control
### IF
0x40
> If `TOS` is false, skips bytecode until corresponding `ELSE` (if exists) or `END`.
> Opens a block.
### ELSE
0x41
> Pops last `IF` result from `IF`-stack, and if it is true, skips bytecode to corresponding `END`.
> Opens a block.
### EXEC
0x42
> Executes code block `TOS1` of length `TOS` and pushes the result.
## With argument
### ALLOC*(bytes)*
0xA0
> Pushes reference to `calloc(1, bytes)`.
### EXTEND*(bytes)*
0xA1
> Extends integer `TOS` width to `bytes` bytes if narrower.
### CONST*(bytes)*
0xA2
> Reads next `bytes` bytes of bytecode and pushes a reference to a copy of them.
### JUMPF*(offset)*
0xA3
> Jumps `offset` bytes of bytecode forward.
### JUMPB*(offset)*
0xA4
> Jumps `offset` bytes of bytecode backward.
### SCPGET*(cell)*
0xA5
> Pushes the value of cell `cell` of local scope variables array.
### SCPSET*(cell)*
0xA6
> Sets the value of cell `cell` of local scope variables array to `TOS`.
### CALL*(nargs)*
0xA7
> Calls `TOS` with `nargs` arguments popped from stack (below the callable).