diff --git a/src/vm.c b/src/vm.c index 668aed7..531f342 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -24,7 +23,9 @@ typedef enum { OP_SUB_F32, /* dest = src1 - src2 */ OP_MUL_F32, /* dest = src1 * src2 */ OP_DIV_F32, /* dest = src1 / src2 */ - OP_MOV, /* dest = src1 */ + OP_F32_TO_INT, /* dest = src1 as int */ + OP_INT_TO_F32, /* dest = src1 as f32 */ + OP_MOV, /* dest = src1 */ OP_JMP, /* jump to address src1 unconditionally */ OP_JGZ, /* jump to address dest if src1 > 0 */ OP_INT_TO_STRING, /* dest = src1 as str */ @@ -69,7 +70,7 @@ void pack_string(const char *str, uint32_t length, uint32_t dest_addr) { uint32_t i = 0; while (i < length) { char ch = str[i++]; - if (ch == '\0' || ch == EOF) { + if (ch == '\0') { uint32_t word = memory[buffer_addr + word_index].u; word = set_char(word, char_index, '\0'); memory[buffer_addr + word_index].u = word; @@ -85,7 +86,6 @@ void pack_string(const char *str, uint32_t length, uint32_t dest_addr) { char_index = 0; word_index++; } - length++; } } @@ -142,6 +142,16 @@ void run_vm() { } memory[dest_addr].f = memory[src1_addr].f / memory[src2_addr].f; break; + case OP_F32_TO_INT: { + float tmp = memory[src1_addr].f; + memory[dest_addr].u = (uint32_t)tmp; + break; + } + case OP_INT_TO_F32: { + int tmp = memory[src1_addr].u; + memory[dest_addr].f = (float)tmp; + break; + } case OP_HALT: return; case OP_MOV: @@ -238,9 +248,13 @@ int main() { memory[i++].u = 100; memory[i++].u = OP_JGZ; memory[i++].u = 100; - memory[i++].u = 4; - memory[i++].u = 4; - memory[i++].u = OP_F32_TO_STRING; + memory[i++].u = 0; + memory[i++].u = 0; + memory[i++].u = OP_F32_TO_INT; + memory[i++].u = 103; + memory[i++].u = 0; + memory[i++].u = 103; + memory[i++].u = OP_INT_TO_STRING; memory[i++].u = 103; memory[i++].u = 0; memory[i++].u = 104;