feat(runtime): Implement add sub mult and div opcodes
Implement calculation of add sub mult and div operations
This commit is contained in:
parent
780042035c
commit
896d2c6f7b
3 changed files with 121 additions and 2 deletions
10
runtime/BinCmdMap.h
Normal file
10
runtime/BinCmdMap.h
Normal file
|
|
@ -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
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
CC=gcc
|
CC=gcc
|
||||||
CFLAGS=-I.
|
CFLAGS=-I.
|
||||||
DEPS=OperandStack.h
|
DEPS=OperandStack.h BinCmdMap
|
||||||
OBJ=OperandStack.o salruntime.o
|
OBJ=OperandStack.o salruntime.o
|
||||||
|
|
||||||
%.o: %.c $(DEPS)
|
%.o: %.c $(DEPS)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,116 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#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() {
|
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;
|
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);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue