Compare commits

..

No commits in common. "7b7e22e68fc11b5519445ec709db5daaf37287ad" and "a3d4e414e7d455e35c0bbcbc154dbb4890fb8e7f" have entirely different histories.

3 changed files with 44 additions and 53 deletions

Binary file not shown.

BIN
ntsys

Binary file not shown.

View File

@ -74,65 +74,25 @@ int ntsys_asm_from_string(size_t* mempos, char* str, FILE* fp, byte_t cycle, nts
return ntsys_run_asm_parser(parser);
}
void ntsys_compile_asm_stadion1(FILE* fp, size_t* lb_size) {
char* st = NULL;
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 += 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;
}
#define ntsys_load_image_from_file(file, num) ( ntsys_compile_asm_stadion2( \
fp, (file), lb_size, &mem_pos, \
labels, labels_pos, &labels_count, &fsz, (num) \
) != 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;
}
char* st = NULL;
size_t mem_pos = 0;
size_t lb_size = 0;
ntsys_compile_asm_stadion1(fp, &lb_size);
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 ++;
}
}
free(st);
char** labels = malloc(sizeof(char*) * lb_size);
word_t* labels_pos = malloc(sizeof(word_t) * lb_size);
size_t u = 0;
@ -149,7 +109,22 @@ int ntsys_compile_asm(char* filename, char* asm_out) {
fclose(fp);
return EXIT_FAILURE;
}
if (ntsys_load_image_from_file(tmp, 0) != EXIT_SUCCESS) 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);
fclose(tmp);
rewind(fp);
FILE* fw = fopen(asm_out, "wb");
@ -158,9 +133,25 @@ int ntsys_compile_asm(char* filename, char* asm_out) {
fclose(fp);
return EXIT_FAILURE;
}
if (ntsys_load_image_from_file(fw, 1) != EXIT_SUCCESS) 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;
}
}
fflush(fw);
free(st);
fclose(fp);
fclose(fw);
size_t i = 0;
while (i < lb_size) {
if (labels[i] != NULL) free(labels[i]);