diff --git a/hello_user.exe b/hello_user.exe index a72c707..82a81a1 100644 Binary files a/hello_user.exe and b/hello_user.exe differ diff --git a/ntsys b/ntsys index c8509ba..82acabb 100755 Binary files a/ntsys and b/ntsys differ diff --git a/ntsys-assembler.h b/ntsys-assembler.h index 0e86690..98068f0 100644 --- a/ntsys-assembler.h +++ b/ntsys-assembler.h @@ -74,25 +74,60 @@ int ntsys_asm_from_string(size_t* mempos, char* str, FILE* fp, byte_t cycle, nts return ntsys_run_asm_parser(parser); } -int ntsys_compile_asm(char* filename, char* asm_out) { - FILE* fp = fopen(filename, "r"); - if (fp == NULL) { - ntsys_error("Cannot open assembler file!"); - return EXIT_FAILURE; - } +void ntsys_compile_asm_stadion1(FILE* fp, size_t* lb_size) { char* st = NULL; - size_t mem_pos = 0; - size_t lb_size = 0; while ((st = ntsys_get_str(st, fp)) != NULL) { char* cp = st; ntsys_asm_save_t __save = create_ntsys_asm_save(cp); ntsys_asm_cache_t sv = create_ntsys_asm_cache(__save); char* str = ntsys_get_arg(sv); if (str[strlen(str) - 1] == ':') { - lb_size ++; + *lb_size += 1; } } free(st); +} + +int ntsys_compile_asm_stadion2( + FILE* fp, + FILE* tmp, + size_t lb_size, + size_t* mem_pos, + char** labels, + word_t* labels_pos, + size_t labels_count, + dword_t* fsz, + byte_t num + ) { + char* st = NULL; + while ((st = ntsys_get_str(st, fp)) != NULL) { + if (ntsys_asm_from_string(mem_pos, st, tmp, num, labels, labels_pos, &labels_count, fsz) != EXIT_SUCCESS) { + free(st); + fclose(fp); + fclose(tmp); + size_t i = 0; + while (i < lb_size) { + if (labels[i] != NULL) free(labels[i]); + i ++; + } + free(labels); + free(labels_pos); + return EXIT_FAILURE; + } + } + free(st); + return EXIT_SUCCESS; +} + +int ntsys_compile_asm(char* filename, char* asm_out) { + FILE* fp = fopen(filename, "r"); + if (fp == NULL) { + ntsys_error("Cannot open assembler file!"); + return EXIT_FAILURE; + } + size_t mem_pos = 0; + size_t lb_size = 0; + ntsys_compile_asm_stadion1(fp, &lb_size); char** labels = malloc(sizeof(char*) * lb_size); word_t* labels_pos = malloc(sizeof(word_t) * lb_size); size_t u = 0; @@ -109,22 +144,10 @@ int ntsys_compile_asm(char* filename, char* asm_out) { fclose(fp); return EXIT_FAILURE; } - while ((st = ntsys_get_str(st, fp)) != NULL) { - if (ntsys_asm_from_string(&mem_pos, st, tmp, 0, labels, labels_pos, &labels_count, &fsz) != EXIT_SUCCESS) { - free(st); - fclose(fp); - fclose(tmp); - size_t i = 0; - while (i < lb_size) { - if (labels[i] != NULL) free(labels[i]); - i ++; - } - free(labels); - free(labels_pos); - return EXIT_FAILURE; - } - } - free(st); + if (ntsys_compile_asm_stadion2( + fp, tmp, lb_size, &mem_pos, + labels, labels_pos, labels_count, &fsz, 0 + ) != EXIT_SUCCESS) return EXIT_FAILURE; fclose(tmp); rewind(fp); FILE* fw = fopen(asm_out, "wb"); @@ -133,25 +156,12 @@ int ntsys_compile_asm(char* filename, char* asm_out) { fclose(fp); return EXIT_FAILURE; } - while ((st = ntsys_get_str(st, fp)) != NULL) { - if (ntsys_asm_from_string(&mem_pos, st, fw, 1, labels, labels_pos, &labels_count, &fsz) != EXIT_SUCCESS) { - free(st); - fclose(fp); - fclose(fw); - size_t i = 0; - while (i < lb_size) { - if (labels[i] != NULL) free(labels[i]); - i ++; - } - free(labels); - free(labels_pos); - return EXIT_FAILURE; - } - } + if (ntsys_compile_asm_stadion2( + fp, fw, lb_size, &mem_pos, + labels, labels_pos, labels_count, &fsz, 1 + ) != EXIT_SUCCESS) return EXIT_FAILURE; fflush(fw); - free(st); fclose(fp); - fclose(fw); size_t i = 0; while (i < lb_size) { if (labels[i] != NULL) free(labels[i]);