pretty sure strings are still broken, but it runs at least
This commit is contained in:
parent
bcc61a93eb
commit
f28dd417d9
|
@ -1,7 +1,7 @@
|
||||||
#include "compiler.h"
|
#include "compiler.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
|
||||||
void demo_add_compile(Value *memory) {
|
uint32_t demo_add_compile(Value *memory) {
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
memory[i++].u = OP(OP_LOADU, 0, 0, 0);
|
memory[i++].u = OP(OP_LOADU, 0, 0, 0);
|
||||||
memory[i++].u = 0;
|
memory[i++].u = 0;
|
||||||
|
@ -14,56 +14,27 @@ void demo_add_compile(Value *memory) {
|
||||||
memory[i++].u = OP(OP_LOADF, 4, 0, 0);
|
memory[i++].u = OP(OP_LOADF, 4, 0, 0);
|
||||||
memory[i++].f = 5.0f;
|
memory[i++].f = 5.0f;
|
||||||
memory[i++].u = OP(OP_LOADU, 5, 0, 0);
|
memory[i++].u = OP(OP_LOADU, 5, 0, 0);
|
||||||
memory[i++].u = 200;
|
uint32_t jmp = i + 1;
|
||||||
memory[i++].u = OP(OP_LOADU, 6, 0, 0);
|
memory[i++].u = jmp;
|
||||||
memory[i++].u = 250;
|
|
||||||
memory[i++].u = OP(OP_LOADU, 7, 0, 0);
|
|
||||||
memory[i++].u = 252;
|
|
||||||
uint32_t jmp = i;
|
|
||||||
memory[i++].u = OP(OP_ADD_REAL, 4, 4, 3);
|
memory[i++].u = OP(OP_ADD_REAL, 4, 4, 3);
|
||||||
memory[i++].u = OP(OP_SUB_UINT, 1, 1, 2);
|
memory[i++].u = OP(OP_SUB_UINT, 1, 1, 2);
|
||||||
memory[i++].u = OP(OP_JGT_UINT, jmp, 1, 0);
|
memory[i++].u = OP(OP_JGT_UINT, 5, 1, 0);
|
||||||
memory[i++].u = OP(OP_REAL_TO_STRING, 5, 4, 0);
|
memory[i++].u = OP(OP_REAL_TO_STRING, 6, 4, 0);
|
||||||
memory[i++].u = OP(OP_PRINT_STRING, 0, 5, 0);
|
|
||||||
memory[i++].u = OP(OP_REAL_TO_UINT, 1, 4, 4);
|
|
||||||
memory[i++].u = OP(OP_UINT_TO_STRING, 6, 1, 0);
|
|
||||||
memory[i++].u = OP(OP_PRINT_STRING, 0, 6, 0);
|
memory[i++].u = OP(OP_PRINT_STRING, 0, 6, 0);
|
||||||
memory[i++].u = OP(OP_READ_STRING, 7, 0, 0);
|
memory[i++].u = OP(OP_REAL_TO_UINT, 1, 4, 4);
|
||||||
|
memory[i++].u = OP(OP_UINT_TO_STRING, 7, 1, 0);
|
||||||
memory[i++].u = OP(OP_PRINT_STRING, 0, 7, 0);
|
memory[i++].u = OP(OP_PRINT_STRING, 0, 7, 0);
|
||||||
memory[i++].u = OP(OP_HALT, 0, 0, 0);
|
memory[i++].u = OP(OP_READ_STRING, 8, 0, 0);
|
||||||
|
memory[i++].u = OP(OP_PRINT_STRING, 0, 8, 0);
|
||||||
|
memory[i++].u = OP(OP_HALT, 0, 0, 0); /* explicit halt */
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void demo_function_call_compile(Value *memory) {
|
uint32_t demo_function_call_compile(Value *memory) {
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
memory[i++].u = OP(OP_LOADU, 0, 0, 0);
|
|
||||||
memory[i++].u = 0;
|
|
||||||
memory[i++].u = OP(OP_LOADU, 1, 0, 0);
|
|
||||||
memory[i++].u = 5;
|
|
||||||
memory[i++].u = OP(OP_LOADU, 2, 0, 0);
|
|
||||||
memory[i++].u = 1;
|
|
||||||
memory[i++].u = OP(OP_LOADF, 3, 0, 0);
|
|
||||||
memory[i++].f = 5.0f;
|
|
||||||
memory[i++].u = OP(OP_LOADF, 4, 0, 0);
|
|
||||||
memory[i++].f = 5.0f;
|
|
||||||
memory[i++].u = OP(OP_LOADU, 5, 0, 0);
|
|
||||||
memory[i++].u = 200;
|
|
||||||
memory[i++].u = OP(OP_LOADU, 6, 0, 0);
|
|
||||||
memory[i++].u = 250;
|
|
||||||
memory[i++].u = OP(OP_LOADU, 7, 0, 0);
|
|
||||||
memory[i++].u = 252;
|
|
||||||
uint32_t jmp = i;
|
|
||||||
memory[i++].u = OP(OP_ADD_REAL, 4, 4, 3);
|
|
||||||
memory[i++].u = OP(OP_SUB_UINT, 1, 1, 2);
|
|
||||||
memory[i++].u = OP(OP_JGT_UINT, jmp, 1, 0);
|
|
||||||
memory[i++].u = OP(OP_REAL_TO_STRING, 5, 4, 0);
|
|
||||||
memory[i++].u = OP(OP_PRINT_STRING, 0, 5, 0);
|
|
||||||
memory[i++].u = OP(OP_REAL_TO_UINT, 1, 4, 4);
|
|
||||||
memory[i++].u = OP(OP_UINT_TO_STRING, 6, 1, 0);
|
|
||||||
memory[i++].u = OP(OP_PRINT_STRING, 0, 6, 0);
|
|
||||||
memory[i++].u = OP(OP_READ_STRING, 7, 0, 0);
|
|
||||||
memory[i++].u = OP(OP_PRINT_STRING, 0, 7, 0);
|
|
||||||
memory[i++].u = OP(OP_HALT, 0, 0, 0);
|
memory[i++].u = OP(OP_HALT, 0, 0, 0);
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void letDeclaration() {
|
static void letDeclaration() {
|
||||||
|
@ -92,7 +63,8 @@ static void declaration(Token t) {
|
||||||
/**
|
/**
|
||||||
* Compile.
|
* Compile.
|
||||||
*/
|
*/
|
||||||
void compile(Value *memory, char *buffer) {
|
uint32_t compile(Value *memory, char *buffer) {
|
||||||
|
uint32_t i = 0;
|
||||||
initTokenizer(buffer);
|
initTokenizer(buffer);
|
||||||
Token t = nextToken();
|
Token t = nextToken();
|
||||||
while (t.type != TOKEN_EOF) {
|
while (t.type != TOKEN_EOF) {
|
||||||
|
@ -100,4 +72,5 @@ void compile(Value *memory, char *buffer) {
|
||||||
declaration(t);
|
declaration(t);
|
||||||
t = nextToken();
|
t = nextToken();
|
||||||
}
|
}
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
#include "opcodes.h"
|
#include "opcodes.h"
|
||||||
|
|
||||||
void demo_add_compile (Value *memory);
|
uint32_t demo_add_compile (Value *memory);
|
||||||
void demo_function_call_compile(Value *memory);
|
uint32_t demo_function_call_compile(Value *memory);
|
||||||
void compile (Value* memory, char *buffer);
|
uint32_t compile (Value* memory, char *buffer);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -51,7 +51,11 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
initTokenMap();
|
initTokenMap();
|
||||||
compile(vm.memory, buffer);
|
compile(vm.memory, buffer);
|
||||||
/* demo_add_compile(vm.memory); */
|
vm.frame_stack_size = FRAME_STACK_SIZE;
|
||||||
|
vm.return_stack_size = RETURN_STACK_SIZE;
|
||||||
|
vm.memory_size = MEMORY_SIZE;
|
||||||
|
uint32_t i = demo_add_compile(vm.memory);
|
||||||
|
vm.frame_stack[vm.fp].allocated.end = i + 1;
|
||||||
|
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
emscripten_set_main_loop(mainloop, 0, 1);
|
emscripten_set_main_loop(mainloop, 0, 1);
|
||||||
|
|
45
src/vm.c
45
src/vm.c
|
@ -5,7 +5,8 @@
|
||||||
do { \
|
do { \
|
||||||
type value = vm->frame_stack[vm->fp].registers[src1].accessor; \
|
type value = vm->frame_stack[vm->fp].registers[src1].accessor; \
|
||||||
type value2 = vm->frame_stack[vm->fp].registers[src2].accessor; \
|
type value2 = vm->frame_stack[vm->fp].registers[src2].accessor; \
|
||||||
vm->pc = (value op value2) ? dest : vm->pc; \
|
vm->pc = \
|
||||||
|
(value op value2) ? vm->frame_stack[vm->fp].registers[dest].u : vm->pc; \
|
||||||
return true; \
|
return true; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -186,38 +187,51 @@ bool step_vm(VM *vm) {
|
||||||
COMPARE_AND_JUMP(float, u, <=);
|
COMPARE_AND_JUMP(float, u, <=);
|
||||||
}
|
}
|
||||||
case OP_INT_TO_STRING: {
|
case OP_INT_TO_STRING: {
|
||||||
int32_t a = (int32_t)vm->frame_stack[vm->fp].registers[src1].i; /* get value */
|
int32_t a =
|
||||||
uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp].allocated.end; /* get start of unallocated */
|
(int32_t)vm->frame_stack[vm->fp].registers[src1].i; /* get value */
|
||||||
vm->frame_stack[vm->fp].registers[dest].u = str_dest; /* store ptr of string to dest register */
|
uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp]
|
||||||
|
.allocated.end; /* get start of unallocated */
|
||||||
|
vm->frame_stack[vm->fp].registers[dest].u =
|
||||||
|
str_dest; /* store ptr of string to dest register */
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
int len = sprintf(buffer, "%d", a);
|
int len = sprintf(buffer, "%d", a);
|
||||||
mem_strcpy(vm->memory, buffer, len, str_dest); /* copy buffer to dest */
|
mem_strcpy(vm->memory, buffer, len, str_dest); /* copy buffer to dest */
|
||||||
vm->frame_stack[vm->fp].allocated.end += sizeof(uint32_t) + len * sizeof(char); /* increment to end of allocated */
|
vm->frame_stack[vm->fp].allocated.end +=
|
||||||
|
len + 1; /* increment to end of allocated */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case OP_UINT_TO_STRING: {
|
case OP_UINT_TO_STRING: {
|
||||||
uint32_t a = (uint32_t)vm->frame_stack[vm->fp].registers[src1].u; /* get value */
|
uint32_t a =
|
||||||
uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp].allocated.end; /* get start of unallocated */
|
(uint32_t)vm->frame_stack[vm->fp].registers[src1].u; /* get value */
|
||||||
vm->frame_stack[vm->fp].registers[dest].u = str_dest; /* store ptr of string to dest register */
|
uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp]
|
||||||
|
.allocated.end; /* get start of unallocated */
|
||||||
|
vm->frame_stack[vm->fp].registers[dest].u =
|
||||||
|
str_dest; /* store ptr of string to dest register */
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
int len = sprintf(buffer, "%d", a);
|
int len = sprintf(buffer, "%d", a);
|
||||||
mem_strcpy(vm->memory, buffer, len, str_dest); /* copy buffer to dest */
|
mem_strcpy(vm->memory, buffer, len, str_dest); /* copy buffer to dest */
|
||||||
vm->frame_stack[vm->fp].allocated.end += sizeof(uint32_t) + len * sizeof(char); /* increment to end of allocated */
|
vm->frame_stack[vm->fp].allocated.end +=
|
||||||
|
len + 1; /* increment to end of allocated */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case OP_REAL_TO_STRING: {
|
case OP_REAL_TO_STRING: {
|
||||||
float a = (float)vm->frame_stack[vm->fp].registers[src1].f; /* get value */
|
float a = (float)vm->frame_stack[vm->fp].registers[src1].f; /* get value */
|
||||||
uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp].allocated.end; /* get start of unallocated */
|
uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp]
|
||||||
vm->frame_stack[vm->fp].registers[dest].u = str_dest; /* store ptr of string to dest register */
|
.allocated.end; /* get start of unallocated */
|
||||||
|
vm->frame_stack[vm->fp].registers[dest].u =
|
||||||
|
str_dest; /* store ptr of string to dest register */
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
int len = sprintf(buffer, "%f", a);
|
int len = sprintf(buffer, "%f", a);
|
||||||
mem_strcpy(vm->memory, buffer, len, str_dest); /* copy buffer to dest */
|
mem_strcpy(vm->memory, buffer, len, str_dest); /* copy buffer to dest */
|
||||||
vm->frame_stack[vm->fp].allocated.end += sizeof(uint32_t) + len * sizeof(char); /* increment to end of allocated */
|
vm->frame_stack[vm->fp].allocated.end +=
|
||||||
|
len + 1; /* increment to end of allocated */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case OP_READ_STRING: {
|
case OP_READ_STRING: {
|
||||||
uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp].allocated.end; /* get start of unallocated */
|
uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp]
|
||||||
vm->frame_stack[vm->fp].registers[dest].u = str_dest; /* store ptr of string to dest register */
|
.allocated.end; /* get start of unallocated */
|
||||||
|
vm->frame_stack[vm->fp].registers[dest].u =
|
||||||
|
str_dest; /* store ptr of string to dest register */
|
||||||
uint32_t buffer = str_dest + 1;
|
uint32_t buffer = str_dest + 1;
|
||||||
uint32_t length = 0;
|
uint32_t length = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -230,7 +244,8 @@ bool step_vm(VM *vm) {
|
||||||
length++;
|
length++;
|
||||||
}
|
}
|
||||||
vm->memory[str_dest].u = length;
|
vm->memory[str_dest].u = length;
|
||||||
vm->frame_stack[vm->fp].allocated.end += sizeof(uint32_t) + length * sizeof(char); /* increment to end of allocated */
|
vm->frame_stack[vm->fp].allocated.end +=
|
||||||
|
length + 1; /* increment to end of allocated */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case OP_PRINT_STRING: {
|
case OP_PRINT_STRING: {
|
||||||
|
|
Loading…
Reference in New Issue