diff --git a/src/compiler/AST.c b/src/compiler/AST.c index 8d3b9b1..97ca81e 100644 --- a/src/compiler/AST.c +++ b/src/compiler/AST.c @@ -20,18 +20,6 @@ str ArgumentType_toString(ArgumentType t){ return _ArgumentType_str[t]; } -RegisterCode RegisterCode_parse(str r){ - if(str_equals(r, STR("ax"))) - return RegisterCode_ax; - if(str_equals(r, STR("bx"))) - return RegisterCode_bx; - if(str_equals(r, STR("cx"))) - return RegisterCode_cx; - if(str_equals(r, STR("dx"))) - return RegisterCode_dx; - return RegisterCode_Unset; -} - void Section_init(Section* sec, str name){ sec->name = name; diff --git a/src/compiler/AST.h b/src/compiler/AST.h index 769c4d7..8c2f878 100644 --- a/src/compiler/AST.h +++ b/src/compiler/AST.h @@ -2,6 +2,7 @@ #include "../std.h" #include "../string/str.h" #include "../instructions/instructions.h" +#include "../instructions/registers.h" #include "../collections/List.h" typedef enum ArgumentType { @@ -15,16 +16,6 @@ typedef enum ArgumentType { str ArgumentType_toString(ArgumentType t); -typedef enum RegisterCode { - RegisterCode_Unset, - RegisterCode_ax, - RegisterCode_bx, - RegisterCode_cx, - RegisterCode_dx -} RegisterCode; - -RegisterCode RegisterCode_parse(str register_name); - typedef struct Argument { ArgumentType type; union { diff --git a/src/instructions/impl/MOV.c b/src/instructions/impl/MOV.c index 567421b..fd20e1d 100644 --- a/src/instructions/impl/MOV.c +++ b/src/instructions/impl/MOV.c @@ -4,7 +4,7 @@ i32 MOV_impl(VM* vm){ u8 dst_register_i = 0; readRegisterVar(dst_register_i); - u8 src_register_i = 0; + u8 src_register_i = 0; readRegisterVar(src_register_i); if(dst_register_i == src_register_i){ VM_setError(vm, "dst_register_i == src_register_i (%x) ", src_register_i); diff --git a/src/instructions/impl/impl_macros.h b/src/instructions/impl/impl_macros.h index 6dd7e1e..3a9e6b1 100644 --- a/src/instructions/impl/impl_macros.h +++ b/src/instructions/impl/impl_macros.h @@ -1,5 +1,6 @@ #pragma once #include "../instructions.h" +#include "../registers.h" #define readVar(VAR) {\ if(!VM_dataRead(vm, &VAR, vm->current_pos, sizeof(VAR))) \ @@ -8,7 +9,7 @@ } #define validateRegisterIndex(VAR) {\ - if(VAR > sizeof(vm->registers)){\ + if(VAR> sizeof(vm->registers)){\ VM_setError(vm, "invalid register index (%x)", VAR);\ return -1;\ }\ @@ -16,6 +17,7 @@ #define readRegisterVar(VAR) {\ readVar(VAR);\ + VAR -= 1;\ validateRegisterIndex(VAR);\ } diff --git a/src/instructions/registers.c b/src/instructions/registers.c new file mode 100644 index 0000000..70153e4 --- /dev/null +++ b/src/instructions/registers.c @@ -0,0 +1,13 @@ +#include "registers.h" + +RegisterCode RegisterCode_parse(str r){ + if(str_equals(r, STR("ax"))) + return RegisterCode_ax; + if(str_equals(r, STR("bx"))) + return RegisterCode_bx; + if(str_equals(r, STR("cx"))) + return RegisterCode_cx; + if(str_equals(r, STR("dx"))) + return RegisterCode_dx; + return RegisterCode_Unset; +} diff --git a/src/instructions/registers.h b/src/instructions/registers.h new file mode 100644 index 0000000..6b0db8e --- /dev/null +++ b/src/instructions/registers.h @@ -0,0 +1,13 @@ +#pragma once +#include "../std.h" +#include "../string/str.h" + +typedef enum RegisterCode { + RegisterCode_Unset, + RegisterCode_ax, + RegisterCode_bx, + RegisterCode_cx, + RegisterCode_dx +} RegisterCode; + +RegisterCode RegisterCode_parse(str register_name);