This commit is contained in:
Felix Queißner 2016-06-14 20:42:23 +02:00
commit 8c23fa6b8f
3 changed files with 42 additions and 22 deletions

View file

@ -1,4 +1,4 @@
# SuperVM # SuperVM
SuperVM is a stack machine with a simple, but flexible command SuperVM is a stack machine with a simple, but flexible command
set. set.
@ -219,23 +219,24 @@ This allows a configuration such that the right hand side operand
is taken by the argument of the instruction instead of beeing popped is taken by the argument of the instruction instead of beeing popped
from the stack. from the stack.
| cmdinfo | Operation | | cmdinfo | Operation | Forumla |
|---------|-----------------------------| |---------|-----------------------------|-----------------|
| 0 | Addition | | 0 | Addition | input1 + input0 |
| 1 | Subtraction | | 1 | Subtraction | input1 - input0 |
| 2 | Multiplication | | 2 | Multiplication | input1 * input0 |
| 3 | Division | | 3 | Division | input1 / input0 |
| 4 | Euclidean Division / Modulo | | 4 | Euclidean Division / Modulo | input1 % input0 |
| 5 | Bitwise Logic And | | 5 | Bitwise Logic And | input1 ∧ input0 |
| 6 | Bitwise Logic Or | | 6 | Bitwise Logic Or | input1 input0 |
| 7 | Bitwise Logic Xor | | 7 | Bitwise Logic Xor | input1 ⊻ input0 |
| 8 | Bitwise Logic Not | | 8 | Bitwise Logic Not | ˜input0 |
| 9 | Rotating Bit Shift Left | | 9 | Rotating Bit Shift Left | input1 ⊲ input0 |
| 10 | Rotating Bit Shift Right | | 10 | Rotating Bit Shift Right | input1 ⊳ input0 |
| 11 | Arithmetic Bit Shift Left | | 11 | Arithmetic Bit Shift Left | input1 ≺ input0 |
| 12 | Arithmetic Bit Shift Right | | 12 | Arithmetic Bit Shift Right | input1 ≻ input0 |
| 13 | Logic Bit Shift Left | | 13 | Logic Bit Shift Left | input1 « input0 |
| 14 | Logic Bit Shift Right | | 14 | Logic Bit Shift Right | input1 » input0 |
| 15 | Negation | -input0 |
#### SpGet, SpSet #### SpGet, SpSet
These commands modify the stack pointer directly. These commands modify the stack pointer directly.

View file

@ -175,4 +175,4 @@ int main(int argc, const char **argv)
dump_memory(p); dump_memory(p);
return 0; return 0;
} }

View file

@ -9,12 +9,31 @@ static void cmd_copy(CommandInfo *info)
static void cmd_load(Process *p, CommandInfo *info) static void cmd_load(Process *p, CommandInfo *info)
{ {
info->output = vm_read_byte(p, info->input0); info->output = 0;
switch(info->additional) {
case 2:
info->output|=(uint32_t)(vm_read_byte(p, info->input0+3))<<24;
info->output|=(uint32_t)(vm_read_byte(p, info->input0+2))<<16;
case 1:
info->output|=(uint32_t)(vm_read_byte(p, info->input0+1))<< 8;
case 0:
info->output|=(uint32_t)(vm_read_byte(p, info->input0+0))<< 0;
break;
}
} }
static void cmd_store(Process *p, CommandInfo *info) static void cmd_store(Process *p, CommandInfo *info)
{ {
vm_write_byte(p, info->input0, info->input1); switch(info->additional) {
case 2:
vm_write_byte(p, info->input0+3, info->input1>>24);
vm_write_byte(p, info->input0+2, info->input1>>16);
case 1:
vm_write_byte(p, info->input0+1, info->input1>>8);
case 0:
vm_write_byte(p, info->input0, info->input1);
break;
}
info->output = info->input1; info->output = info->input1;
} }
@ -242,4 +261,4 @@ void vm_write_byte(Process *process, uint32_t address, uint8_t value)
vm_assert(page < process->mmap.length, "Out of memory."); vm_assert(page < process->mmap.length, "Out of memory.");
process->mmap.pages[page][index] = value; process->mmap.pages[page][index] = value;
} }