creature/README.md

180 lines
3.1 KiB
Markdown
Raw Permalink Normal View History

2022-08-28 17:25:00 +00:00
# creature
A simple, extendable, 16 instruction stack machine.
It has two portions of memory: the stack and the block. I hesitate to call the
block a heap because it is not a data structure, it is a continuous block of
memory.
2022-08-29 04:56:27 +00:00
Both the stack and the block are infinite, to the extent computing resources and
integer limits allow, in the positive direction. They are automatically expanded
when written to.
## Instruction Set
Each documented instruction has a list of what is pushed, and what is popped.
the items are listed in chronological order, from first pushed/popped to last
pushed/popped.
2022-08-30 00:20:46 +00:00
You'll notice that words specifying an address are always at the top of the
stack. This helps increse security and reduce the likelihood of bugs. When
writing functions to extend creature, it is highly advised that you follow this
principle when deciding on an order to pop arguments off of the stack in.
### 0x0 PUSH
Pushes the next word in program memory onto the stack.
Pushes:
1. next word in program memory
### 0x1 POP
Pops the top word off of the stack, and discards it.
Pops:
1. word
### 0x2 PEEK
Reads a memory address from the block and places it atop the stack.
Pops:
1. address
Pushes:
1. word found at address
### 0x3 POKE
Sets a memory address in the block.
Pops:
1. address
2. value to store
### 0x4 ADD
Adds two words. Tip: this can be used as a logical OR.
Pops:
2022-08-30 00:20:46 +00:00
1. right operand
2. left operand
Pushes:
1. left operand + right operand
### 0x5 SUB
Subtracts two words.
Pops:
2022-08-30 00:20:46 +00:00
1. right operand
2. left operand
Pushes:
1. left operand - right operand
### 0x6 MUL
Multiplies two words.
Pops:
2022-08-30 00:20:46 +00:00
1. right operand
2. left operand
Pushes:
1. left operand * right operand
### 0x7 DIV
Divides two words.
Pops:
2022-08-30 00:20:46 +00:00
1. right operand
2. left operand
Pushes:
1. left operand / right operand
### 0x8 EQ
Checks if two words are equal. Pushes 1 if true, zero if false.
Pops:
2022-08-30 00:20:46 +00:00
1. right operand
2. left operand
Pushes:
1. left operand == right operand
### 0x9 GT
Checks if a word is greater than another word. Pushes 1 if true, zero if false.
Pops:
2022-08-30 00:20:46 +00:00
1. right operand
2. left operand
Pushes:
1. left operand > right operand
### 0xA LT
Checks if a word is less than another word. Pushes 1 if true, zero if false.
Pops:
2022-08-30 00:20:46 +00:00
1. right operand
2. left operand
Pushes:
1. left operand < right operand
### 0xB NEQ
Checks if two words are *not* equal. Pushes 1 if true, zero if false.
Pops:
2022-08-30 00:20:46 +00:00
1. right operand
2. left operand
Pushes:
1. left operand != right operand
### 0xC MOD
2022-08-29 04:56:27 +00:00
Performs a modulo operation on two words. Tip: this can be used as a logical
AND.
Pops:
2022-08-30 00:20:46 +00:00
1. right operand
2. left operand
Pushes:
1. left operand % right operand
### 0xD HALT
Halts execution of the machine.
### 0xE JMP
Jumps to the specified address if a word is non-zero.
Pops:
1. address
2. condition
### 0xF CAL
Call a function that can be registered using the Machine.Register method.
Functions are allowed to push and pop whatever they want to and from the stack,
as well as read and write to and from the block.
Pops:
1. function ID
2. ...other stuff, it depends on the function.
Pushes:
1. ...again, depends on the function.