From 896d2c6f7b906ab46f18c98da58c5d1e3537532f Mon Sep 17 00:00:00 2001 From: Laborratte5 Date: Sun, 21 Jul 2024 11:25:07 +0200 Subject: [PATCH] feat(runtime): Implement add sub mult and div opcodes Implement calculation of add sub mult and div operations --- runtime/BinCmdMap.h | 10 ++++ runtime/Makefile | 2 +- runtime/salruntime.c | 111 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 runtime/BinCmdMap.h diff --git a/runtime/BinCmdMap.h b/runtime/BinCmdMap.h new file mode 100644 index 0000000..fc1f287 --- /dev/null +++ b/runtime/BinCmdMap.h @@ -0,0 +1,10 @@ +#ifndef BIN_CMD_MAP +#define BIN_CMD_MAP + +#define CMD_CONST 0x0001 +#define CMD_ADD 0x0004 +#define CMD_SUB 0x0005 +#define CMD_MULT 0x0006 +#define CMD_DIV 0x0007 + +#endif diff --git a/runtime/Makefile b/runtime/Makefile index f39f16c..2e3e598 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -1,6 +1,6 @@ CC=gcc CFLAGS=-I. -DEPS=OperandStack.h +DEPS=OperandStack.h BinCmdMap OBJ=OperandStack.o salruntime.o %.o: %.c $(DEPS) diff --git a/runtime/salruntime.c b/runtime/salruntime.c index 608663e..181ebaa 100644 --- a/runtime/salruntime.c +++ b/runtime/salruntime.c @@ -1,7 +1,116 @@ #include +#include +#include "BinCmdMap.h" +#include "OperandStack.h" + +void runV1Program(FILE* program); +void add(OperandStack* stack); +void sub(OperandStack* stack); +void mult(OperandStack* stack); +void div(OperandStack* stack); int main() { - printf("Hello, world!"); + FILE* program = fopen("./test.bin", "r"); + if (program == NULL) { + // TODO: check for errors (e.g. file not found) + return -1; + } + + uint8_t version; + size_t nread = fread(&version, 1, 1, program); + + switch (version) { + case 1: + runV1Program(program); + break; + default: + printf("Unkown binary version: %i.\n \ + Probably the program was compiled with a more recent \ + version.", version); + } + + fclose(program); return 0; } + +void runV1Program(FILE* program) { + OperandStack stack = {}; + uint8_t opcode; + + while (fread(&opcode, sizeof(opcode), 1, program) == 1) { + + switch (opcode) { + case CMD_CONST: + int32_t val; + fread(&val, sizeof(int32_t), 1, program); + // TODO: check for errors + OStackPush(&stack, val); + break; + case CMD_ADD: + add(&stack); + break; + case CMD_SUB: + sub(&stack); + break; + case CMD_MULT: + mult(&stack); + break; + case CMD_DIV: + div(&stack); + break; + default: + printf("Unkown command"); + } + } + // TODO check for errors + // (feof(program) == 0); + + int result; + OStackPop(&stack, &result); + printf("%i\n", result); +} + +void add(OperandStack* stack) { + int operandA; + int operandB; + + OStackPop(stack, &operandA); + OStackPop(stack, &operandB); + + int result = operandA + operandB; + OStackPush(stack, result); +} + +void sub(OperandStack* stack) { + int operandA; + int operandB; + + OStackPop(stack, &operandA); + OStackPop(stack, &operandB); + + int result = operandA - operandB; + OStackPush(stack, result); +} + +void mult(OperandStack* stack) { + int operandA; + int operandB; + + OStackPop(stack, &operandA); + OStackPop(stack, &operandB); + + int result = operandA * operandB; + OStackPush(stack, result); +} + +void div(OperandStack* stack) { + int operandA; + int operandB; + + OStackPop(stack, &operandA); + OStackPop(stack, &operandB); + + int result = operandA / operandB; + OStackPush(stack, result); +}