The blog entries show how Plain VM/Assembly evolved, but they can be a bit confusing to read stand-alone. So, I need to clean-up the content here a bit. The exercise now is to write up Plain Assembly Reference, Plain VM Reference and make sure the two documents are synchronized and consistent. I had a working core before, but need to change it to adapt to my latest ideas. Looking at my first register only VM I admit that is much simpler, but I am really keen to get instructions like Transaction and syntax supporting distributed processing and parallelism going. Below is an updated VM Instruction table – the text is fresh from a libreOffice document that will be uploaded later.
|Assign||Assign an expression to a variable. Execute a pre-parsed expression tree and store the resulting value in a variable. Expression can either be written as an algebraic math expression or a list of simple operations separated with ;|
Call a function. Call creates a return entry on the stack and will continue with next instruction as End of the function is reached. Call can in contrary to raise also capture event’s raised by Raise.
|Decode||Unpack a bit field|
|Encode||Pack a bit Field.|
End a conditional block of code by jumping to a pre-calculated ix on the stack. For (as an example) will insert it’s own ix on the stack, End will jump to that ix and remove it from the stack.
|Exit||Exit the VM. Will terminate the current module.|
For Loop. Will create a stack return entry causing the next End instruction to jump back to the loop start.
|If||If statement to allow if..elsif..else with expressions.|
No Operation. Basically not needed except usefully for testing basic performance.
On capture event’s raised by a Call or State. It contains parameters defined by the Event definition in a Func.
Call an event with parameters, but without creating a return entry. Raise remove the stack, but will leave the stack entry point. The next end will return to the last “call”.
|Switch||Switch to a selected value.|
Will wait until a listed event is raised before it process that event and continue.
|While||Loop while an expression is true.|
Lock access to listed “interface” variables. Transaction will wait until access is granted or we time out. Transaction can also “spawn” in which case the transaction block is treated as a function in a different, local module that execute in parallel. See instruction Spawn.
Update complete a Transaction by either Commit or Rollback changes.
Can be called separate inside a Transaction block to commit part of the changes made.
Can be called separate inside a Transaction block to reset changes made. Changes are reset to the last commit.
Spawn call a function located in a different module. This function is executed in parallel and the returning event is inserted into our event queue.