# modl
## VM design
### instruction set
<!-- Why does load have 2 parameters? -->
<!-- not load, it'll have one -->
<!-- Wouldn't it be better to call it STORE? -->
<!-- what is S suffix* ? suffix, right short? short as in type? why would we need that. ok i guess-->
Legend:
+ R-* Registers
+ ALN Alignment margin (To align the instruction for 8 bit)
| OC | INSTRUCTION | PARAMETERS | DESCRIPTION |
|:------:|:-----------:|:------------------------------:| ----------------------------------------------------------------------------------------------------------------------------- |
| 00 | NOP | | Does nothing |
| 01 | RET | | Returns control to the caller |
| 02 | MOV | DST/4 SRC/4 | Moves data from one register to another |
| 03 | LOADR | R-DST/4 R-ADR/4 | Loads data into the specified register |
| 04 | LOADC | ALN/4 R-DST/4 DATA/? | Loads small data into specified register (data in SEBO format) |
| 05 | TBLGETR | R-TBL/4 R-NAME/4 | Loads table's entry into the table's register. Name is specified in register R-NAME. |
| 06 | TBLGETC | ALN/4 R-TBL/4 NAME/? | Loads table's entry into the table's register. Name is specified after the command (name in SEBO format). |
| ~~ | SETR | R-DST/4 R-VAL/4 | REMOVED!!! Rewrites value in the target register (changes value instead of reference) |
| ~~ | SETC | ALN/4 R-DST/4 DATA/? | REMOVED!!! Rewrites value in the target register (changes value instead of reference). data is provided as SEBO |
| 09 | CALLR | R-AC/4 R-FUN/4 | Calls function loaded into the register R-FUN, passes the amount of paramters in R-AC |
| 0A | CALLC | OFFS/64 | Calls function by the relative signed 64 bit offset |
| 0B | LOADD | ALN/4 R-DST/4 OFFS/64 | Parses and loads data taken from specified place (by using relative offset) |
| 0C | LOADFUN | ALN/4 R-DST/4 OFFS/64 | Loads new function into the specified register. OFFS - is a relative offset between current ip and a function's first command |
| 0D | ROL | R-L/4 R-R/4 | Bitwise shift left R-L << R-R |
| 0E | ROR | R-L/4 R-R/4 | Bitwise shift right R-L >> R-R |
| 0F | IDIV | R-L/4 R-R/4 | Integer divide registers, result in R-L |
| 10 | ADD | R-L/4 R-R/4 | Add up both registers, result in R-L |
| 11 | SUB | R-L/4 R-R/4 | Subtract registers, result in R-L |
| 12 | MUL | R-L/4 R-R/4 | Multiply registers, result in R-L |
| 13 | DIV | R-L/4 R-R/4 | Divide registers, result in R-L |
| 14 | MOD | R-L/4 R-R/4 | Get modulo (division rest) registers, result in R-L |
| 15 | AND | R-L/4 R-R/4 | Perform bitwise and on registers, result in R-L |
| 16 | OR | R-L/4 R-R/4 | Perform bitwise or on registers, result in R-L |
| 17 | XOR | R-L/4 R-R/4 | Perform bitwise xor on registers, result in R-L |
| 18 | NAND | R-L/4 R-R/4 | Perform invert bitwise and on registers, result in R-L |
| 19 | NOR | R-L/4 R-R/4 | Perform invert bitwise or on registers, result in R-L |
| 1A | NXOR | R-L/4 R-R/4 | Perform invert bitwise xor on registers, result in R-L |
| 1F | JMP | OFFS/64 | Long jump instruction (4 byte signed integer argument -- relative jump position) |
| 20..29 | CMPcc | R-L/4 R-R/4 | Compares objects in specified registers. suffixes:(EQ, NEQ, LT, NLT, GT, NGT, LE, NLE, GE, NGE) |
| 30 | JCF | ALN/4 R-COND/4 OFFS/64 | if value is falsy in the specified register (condition register is placed in least significant bits) |
| 31 | JCT | ALN/4 R-COND/4 OFFS/64 | Jumps if value is truthy in the specified register (condition register is placed in least significant bits) |
| 40 | POP | ALN/4 R-DEST/4 | Perform POP on stack into register R-DEST |
| 41 | PUSH | ALN/4 R-SRC/4 | Perform PUSH on stack from register R-SRC |
| 42 | TBLPUSH | R-TBL/4 R-VAL/4 | Perform PUSH into the table from register R-VAL |
| 43 | TBLSETR | R-TBL/4 R-NAME/4 ALN/4 R-VAL/4 | Sets table's values from register R-VAL |
| 44 | TBLSETC | R-TBL/4 R-NAME/4 DATA/? | Sets table's values from inline data in SEO format |
| 45 | ENVGETR | R-DST/4 R-NAME/4 | Searches environment for a variable with a given name (taken from R-NAME) |
| 46 | ENVGETC | ALN/4 R-DST/4 NAME/? | Searches environment for a variable with a given name (taken from NAME in SEBO format) |
| 47 | ENVSETR | R-NAME/4 R-VAL/4 | Sets the value of an environmental variable with a given name |
| 48 | ENVSETC | ALN/4 R-VAL/4 NAME/? | Sets environment for a variable with a given name (taken from NAME in SEBO format) |
| 49 | ENVUPKR | R-ARRV/4 R-ARRK/4 | Unpack values from R-ARRV into environment under names in R-ARRK (invalid identifiers shall be omitted) |
| 4A | ENVUPKC | ALN/4 R-ARR/4 KEYS/? | Unpack values from R-ARR into environment under names in KEYS (in SEBO format) (invalid identifiers shall be omitted) |
| 4B | ENVUPKT | ALN/4 R-TBL/4 | Unpack values from R-TBL as a table, into environment under its keys as identifiers (invalid identifiers shall be omitted) |
| 4C | ENVPUSH | | Push env |
| 4D | ENVPOP | | Pop env |
| 50 | NOT | ALN/4 R-OPERAND/4 | Perform logical "NOT" operation |
| 51 | INV | ALN/4 R-OPERAND/4 | Perform bitwise "NOT" operation |
| 52 | LEN | ALN/4 R-OPERAND/4 | Perform length operation, returning length of the string, table (where length indicates last index of pushed value) |
| 53 | NEG | ALN/4 R-OPERAND/4 | Negate |
### bytecode
```
here
```