Adds stack, base pointer manipulation.

This commit is contained in:
Felix Queißner 2016-05-21 21:36:34 +02:00
parent ad718a930e
commit 1f83e6567d
3 changed files with 35 additions and 2 deletions

View file

@ -80,7 +80,7 @@ An instruction is only executed when all conditions are met.
| 4 | SET | output = STACK[BP + input0] = input1 |
| 5 | BPGET | output = BP |
| 6 | BPSET | output = BP = input0 |
| 7 | RSTSTACK | output = SP = BP |
| 7 | CPGET | output = CP + cmdinfo |
| 8 | MATH | output = input0 OP[info] input1 |
| 9 | SPGET | output = SP + input0 |
| 10 | SPSET | output = SP + input0 = input1 |
@ -134,6 +134,9 @@ by the `cmdinfo`.
| seti | no | pop | pop | set | 0 | discard | no |
| bpget | no | zero | zero | bpget | 0 | push | no |
| bpset | no | pop | zero | bpset | 0 | discard | no |
| spget | no | zero | zero | spget | 0 | push | no |
| spset | no | pop | zero | spset | 0 | discard | no |
| cpget | no | zero | zero | cpget | 1 | push | no |
| add | no | pop | pop | math | 0 | push | no |
| sub | no | pop | pop | math | 1 | push | no |
| cmp | no | pop | pop | math | 1 | discard | yes |

View file

@ -21,6 +21,31 @@ static void cmd_store(Process *p, CommandInfo *info)
info->output = info->input1;
}
static void cmd_spget(Process *p, CommandInfo *info)
{
info->output = p->stackPointer;
}
static void cmd_spset(Process *p, CommandInfo *info)
{
info->output = p->stackPointer = info->input0;
}
static void cmd_bpget(Process *p, CommandInfo *info)
{
info->output = p->basePointer;
}
static void cmd_bpset(Process *p, CommandInfo *info)
{
info->output = p->basePointer = info->input0;
}
static void cmd_cpget(Process *p, CommandInfo *info)
{
info->output = p->codePointer + info->additional;
}
static void cmd_math(CommandInfo *info)
{
switch(info->additional)
@ -116,6 +141,11 @@ int vm_step_process(Process *process)
case VM_CMD_MATH: cmd_math(&info); break;
case VM_CMD_SYSCALL: vm_syscall(process, &info); break;
case VM_CMD_HWIO: vm_hwio(process, &info); break;
case VM_CMD_SPGET: cmd_spget(process, &info); break;
case VM_CMD_SPSET: cmd_spset(process, &info); break;
case VM_CMD_BPGET: cmd_bpget(process, &info); break;
case VM_CMD_BPSET: cmd_bpset(process, &info); break;
case VM_CMD_CPGET: cmd_cpget(process, &info); break;
default: vm_assert(0, "Invalid instruction: command undefined.");
}

View file

@ -28,7 +28,7 @@ extern "C" {
#define VM_CMD_SET 4
#define VM_CMD_BPGET 5
#define VM_CMD_BPSET 6
#define VM_CMD_RSTSTACK 7
#define VM_CMD_CPGET 7
#define VM_CMD_MATH 8
#define VM_CMD_SPGET 9
#define VM_CMD_SPSET 10