45 lines
1.1 KiB
C
45 lines
1.1 KiB
C
|
|
#include "vmbl.h"
|
||
|
|
#include <stdio.h>
|
||
|
|
|
||
|
|
VMBL_Exception VBML_ExecuteInstruction(VMBL_State *vmblState, VMBL_Instruction instruction) {
|
||
|
|
switch (instruction.type)
|
||
|
|
{
|
||
|
|
case INSTRUCTION_PUSH:
|
||
|
|
if (vmblState->stackSize >= VMBL_STACK_SIZE) {
|
||
|
|
return (VMBL_Exception){ EXCEPTION_STACK_OVERFLOW };
|
||
|
|
}
|
||
|
|
|
||
|
|
vmblState->stack[vmblState->stackSize++] = instruction.opperand;
|
||
|
|
break;
|
||
|
|
|
||
|
|
case INSTRUCTION_ADD:
|
||
|
|
if (vmblState->stackSize < 2) {
|
||
|
|
return (VMBL_Exception){ EXCEPTION_STACK_UNDERFLOW };
|
||
|
|
}
|
||
|
|
|
||
|
|
vmblState->stack[vmblState->stackSize - 2] += vmblState->stack[vmblState->stackSize - 1];
|
||
|
|
vmblState->stackSize--;
|
||
|
|
break;
|
||
|
|
|
||
|
|
default:
|
||
|
|
|
||
|
|
return (VMBL_Exception) { EXCEPTION_INVALID_OPCODE };
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return (VMBL_Exception) { EXCEPTION_NONE };
|
||
|
|
}
|
||
|
|
|
||
|
|
void VMBL_Dump(VMBL_State vmblState, VMBL_Exception exception) {
|
||
|
|
fprintf(stderr, "EXCEPTION: %s\n\n", exceptionAsCString(exception));
|
||
|
|
fprintf(stderr, "Stack:\n");
|
||
|
|
|
||
|
|
if (vmblState.stackSize > 0) {
|
||
|
|
for (size_t i = 0; i < vmblState.stackSize; i++) {
|
||
|
|
fprintf(stderr, " 0x%lX: %ld\n", i, vmblState.stack[i]);
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
fprintf(stderr, " [empty]\n");
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|