diff --git a/parser.cpp b/parser.cpp index d962963..2586b89 100644 --- a/parser.cpp +++ b/parser.cpp @@ -1,6 +1,7 @@ #include "parser.h" #include "tokenizer.h" #include "error.h" +#include #include #include #include @@ -13,6 +14,7 @@ #define MAX_CONSTANTS 256 #define MAX_STRUCT_MEMBERS 10 +/* struct t_variable { char name[MAX_IDENTIFIER_LENGTH]; int type; @@ -29,6 +31,7 @@ struct t_struct { struct t_scope { }; +*/ struct t_label { char name[MAX_IDENTIFIER_LENGTH]; @@ -59,9 +62,9 @@ struct t_constant { };*/ static byte* code; // [MAX_CODE_SIZE]; -static word codepos = 0; -static word lines[32768]; -static word current_line; +static uint32_t codepos = 0; +static uint32_t lines[32768]; +static uint32_t current_line; //static t_label known_labels[MAX_LABELS]; //static int num_known_labels = 0; @@ -72,6 +75,7 @@ static int num_anonymous_labels = 0; static char* breaklabel = nullptr; static char* contlabel = nullptr; +/* static t_variable* variables = nullptr; static int num_variables = 0; static bool variable_is_array = false; @@ -82,10 +86,11 @@ static int num_external_functions = 0; static t_string strings[256]; static int num_strings = 0; -static bool parser_finished = false; - static t_constant constants[MAX_CONSTANTS]; static int num_constants; +*/ + +static bool parser_finished = false; /****************************************************************************************/ /* GENERIC FUNCTIONS */ @@ -118,6 +123,14 @@ static void emmit_w(const word value) { code[codepos++] = value >> 8; } +static void emmit_dw(const uint32_t value) { + byte *v = (byte*)&value; + lines[codepos] = current_line; code[codepos++] = *(v++); + lines[codepos] = current_line; code[codepos++] = *(v++); + lines[codepos] = current_line; code[codepos++] = *(v++); + lines[codepos] = current_line; code[codepos++] = *(v++); +} + static void emmit_f(const float value) { byte *v = (byte*)&value; lines[codepos] = current_line; code[codepos++] = *(v++); @@ -126,62 +139,23 @@ static void emmit_f(const float value) { lines[codepos] = current_line; code[codepos++] = *(v++); } -static void patch(const word address, const word dest) { +static void patch(const uint32_t address, const word dest) { code[address] = dest & 255; code[address + 1] = dest >> 8; } -static const word get_current_address() { +static void patch_dw(const uint32_t address, const uint32_t dest) { + byte *v = (byte*)&dest; + code[address] = v[0]; + code[address+1] = v[1]; + code[address+2] = v[2]; + code[address+3] = v[3]; +} + +static const uint32_t get_current_address() { return codepos; } -/****************************************************************************************/ -/* VARIABLE MANAGEMENT */ -/****************************************************************************************/ - -static int get_variable_index(const char* string, const int array_size = 1) { - t_variable* variable = variables; - t_variable* last = variables; - while (variable != nullptr) { - if (strcmp(variable->name, string) == 0) { variable_is_array = (variable->size > 1); return variable->index + 0xC000; } - last = variable; - variable = variable->next; - } - t_variable* newvar = (t_variable*)malloc(sizeof(t_variable)); - //newvar->name = (char*)malloc(strlen(string) + 1); - strcpy(newvar->name, string); - newvar->index = num_variables; - num_variables += array_size; - newvar->size = array_size; - variable_is_array = (newvar->size > 1); - newvar->next = nullptr; - if (last != nullptr) { - last->next = newvar; - } - else { - variables = newvar; - } - return newvar->index + 0xC000; -} - -static bool is_variable_array() { return variable_is_array; } - -/****************************************************************************************/ -/* CONSTANT MANAGEMENT */ -/****************************************************************************************/ -void parser_register_constant(const char* name, const unsigned char value) { - strcpy(constants[num_constants].name, name); - constants[num_constants++].value = value; -} - -static const int get_constant(const char* name) { - for (int i = 0; i < num_constants; i++) { - if (strcmp(constants[i].name, name) == 0) - return constants[i].value; - } - return -1; -} - /****************************************************************************************/ /* LABEL MANAGEMENT */ /****************************************************************************************/ diff --git a/parser.h b/parser.h index 3c43d80..081ba97 100644 --- a/parser.h +++ b/parser.h @@ -41,10 +41,10 @@ enum OPS { }; void parser_parse(const char* buffer, unsigned char* mem); -const int parser_get_codesize(); -const int parser_get_memory_usage(); -unsigned short* parser_get_lines(); +//const int parser_get_codesize(); +//const int parser_get_memory_usage(); +//unsigned short* parser_get_lines(); -void parser_register_external_function(const char* name, const char* parameters, void (*fun)(void)); +//void parser_register_external_function(const char* name, const char* parameters, void (*fun)(void)); -void parser_register_constant(const char* name, const unsigned char value); \ No newline at end of file +//void parser_register_constant(const char* name, const unsigned char value); \ No newline at end of file