ntsys/ntsys-assembler.h
2026-02-28 20:54:09 +04:00

308 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#if (!defined(NTSYS_ASSEMBLER_H___))
#define NTSYS_ASSEMBLER_H___
#define __READ_FILE_WITH_EOF_OR_LN ((c = getc(fp)) != EOF && c != '\n' && c != '\r')
#define is_space(c) (c >= 0 && c <= 32)
#define __SPACE_SHIFT while (is_space(st[pos])) { pos ++; }
#define __NEXT_ARG {__e_byte_t isStr = 0;while (!is_space(st[save]) || isStr == 1) { if (st[save] == '"' && st[save - 1] != '\\') {isStr = !isStr;}save ++; }}while (is_space(st[save])) { save ++; }{size_t n_p = save;__e_byte_t isStr = 0;while (!is_space(st[n_p]) || isStr == 1) { if (st[n_p] == '"' && st[n_p - 1] != '\\') {isStr = !isStr;}n_p ++; }st[n_p] = '\0';}
#define get_mem_pos() *mem_pos = ftell(fp) == 0 ? 0 : ftell(fp) - 1;
static char* get_str(char* ptr, FILE* fp) {
if (ptr != NULL) {
free(ptr);
}
unsigned long len = 0;
int c;
{
unsigned long save_ptr = ftell(fp);
while (__READ_FILE_WITH_EOF_OR_LN) {
len ++;
}
fseek(fp, save_ptr, SEEK_SET);
}
if (len == 0) return NULL;
ptr = malloc(len);
if (ptr == NULL) {
ntsys_error("Out of memory!");
return NULL;
}
len = 0;
while (__READ_FILE_WITH_EOF_OR_LN) {
ptr[len] = c;
len ++;
}
return ptr;
}
/*
* XX - шестнадцатиричное число
* :S - тип данных
* :D - сами данные
* :O - метка перехода
*
* ------------------ Формат -------------------
*
* имя_комманды=описание
*
*/
char __fun_names_ntsys[][20] = {
"push=00:S:D",
"pop=01:S",
"push.string=02:D"
};
static size_t __index_of(char* arr, char c) {
size_t i = 0;
while (i < strlen(arr)) {
if (arr[i] == c) break;
i ++;
}
return i;
}
word_t* shfdiyde_labels = NULL;
char** shdgsjgdsjjgds_names = NULL;
size_t sfdfshgshgfs_lb_pos = 0;
#define labels_names shdgsjgdsjjgds_names
#define labels shfdiyde_labels
#define lb_pos sfdfshgshgfs_lb_pos
int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) {
if (st == NULL) {
ntsys_error("Null Pointer Exception!");
return EXIT_FAILURE;
}
size_t len = strlen(st);
size_t pos = 0;
__e_byte_t isStr = 0;
while (pos < len) {
size_t sP = pos;
if (pos == 0) sP = 1;
if (st[pos] == '"' && st[sP - 1] != '\\') {
isStr = !isStr;
}
if (st[pos] == '#' && isStr == 0) {
st[pos] = '\0';
break;
}
pos ++;
}
if (isStr == 1) {
ntsys_error("Find no close string!");
return EXIT_FAILURE;
}
isStr = 0;
len = strlen(st);
pos = 0;
{
__SPACE_SHIFT;
size_t save = pos;
while (!is_space(st[pos])) { pos ++; }
st[pos] = '\0';
size_t arr_len = sizeof(__fun_names_ntsys) / sizeof(__fun_names_ntsys[0]);
size_t i = 0;
while (i < arr_len) {
char eq[20];
strcpy(eq, __fun_names_ntsys[i]);
size_t par_pos = 0;
{
size_t u = 0;
size_t d = strlen(__fun_names_ntsys[i]);
while (u < d) {
eq[u] = __fun_names_ntsys[i][u];
if (eq[u] == '=') {
eq[u] = '\0';
par_pos = u + 1;
break;
}
u ++;
}
}
char* h = (st + save);
if (h[strlen(st + save)] == ':') {
get_mem_pos();
h[strlen(h - 1)] = '\0';
labels_names[lb_pos] = h;
labels[lb_pos++] = ((word_t)*mem_pos + 1);
break;
};
if (strcmp((st + save), eq) == 0) {
size_t d = strlen(__fun_names_ntsys[i] + par_pos);
size_t p = 0;
puts(st + save);
__e_byte_t data_type = 1;
while (p < d) {
char* str = &__fun_names_ntsys[i][par_pos];
if (str[p] == ':') {
p ++;
switch (str[p]) {
case 'D':
{
__NEXT_ARG;
__e_byte_t sys_cnt = 10;
__e_byte_t is_str = 0;
if (st[save] == '"') {
is_str = 1;
size_t f = 0;
save ++;
while (1) {
if (st[save + f] == '"' && st[save + f - 1] != '\\') {
putc('\0', fp);
break;
}
if (st[save + f] == '\\' && st[save + f - 1] != '\\') { f ++; continue; }
if (st[save + f - 1] == '\\') {
switch (st[save + f]) {
case '0':
putc('\0', fp); break;
case 'a':
putc('\a', fp); break;
case 'b':
putc('\b', fp); break;
case 't':
putc('\t', fp); break;
case 'n':
putc('\n', fp); break;
case 'v':
putc('\v', fp); break;
case 'f':
putc('\f', fp); break;
case 'r':
putc('\r', fp); break;
case '\\':
putc('\\', fp); break;
default:
ntsys_error("Unknown ident!");
return EXIT_FAILURE;
}
} else {
putc(st[save + f], fp);
}
f ++;
}
} else if (st[save + 1] == 'x') {
sys_cnt = 16;
} else if (st[save + 1] == 'b') {
sys_cnt = 2;
}
if (is_str == 0) {
if (sys_cnt != 10) {
save += 2;
}
char* arr = NULL;
long cnt = strtol(&st[save], &arr, sys_cnt);
switch (data_type) {
case 0x01: fwrite((__e_byte_t*)((byte_t*)&cnt), 1, sizeof(byte_t), fp);
break;
case 0x02: fwrite((__e_byte_t*)((word_t*)&cnt), 1, sizeof(word_t), fp);
break;
case 0x04: fwrite((__e_byte_t*)((dword_t*)&cnt), 1, sizeof(dword_t), fp);
break;
case 0x08: fwrite((__e_byte_t*)((qword_t*)&cnt), 1, sizeof(qword_t), fp);
break;
case 0xF1: fwrite((__e_byte_t*)((sbyte_t*)&cnt), 1, sizeof(sbyte_t), fp);
break;
case 0xF2: fwrite((__e_byte_t*)((sword_t*)&cnt), 1, sizeof(sword_t), fp);
break;
case 0xF4: fwrite((__e_byte_t*)((sdword_t*)&cnt), 1, sizeof(sdword_t), fp);
break;
case 0xF8: fwrite((__e_byte_t*)((sqword_t*)&cnt), 1, sizeof(sqword_t), fp);
break;
}
}
}
break;
case 'S':
{
__NEXT_ARG;
if (strcmp(&st[save], "byte") == 0) {
data_type = 0x01;
} else if (strcmp(&st[save], "word") == 0) {
data_type = 0x02;
} else if (strcmp(&st[save], "dword") == 0) {
data_type = 0x04;
} else if (strcmp(&st[save], "qword") == 0) {
data_type = 0x08;
} else if (strcmp(&st[save], "sbyte") == 0) {
data_type = 0xF1;
} else if (strcmp(&st[save], "sword") == 0) {
data_type = 0xF2;
} else if (strcmp(&st[save], "sdword") == 0) {
data_type = 0xF4;
} else if (strcmp(&st[save], "sqword") == 0) {
data_type = 0xF8;
} else {
ntsys_error("Incorrect datatype!");
return EXIT_FAILURE;
}
fwrite((__e_byte_t*)&data_type, 1, sizeof(__e_byte_t), fp);
}
break;
case 'O':
{
}
break;
}
} else {
char* hx = "0123456789ABCDEF";
__e_byte_t hex = (__index_of(hx, str[p + 1])) | (__index_of(hx, str[p]) << 4);
fputc(hex, fp);
p ++;
}
p ++;
}
break;
}
i ++;
}
}
get_mem_pos();
printf("Memory position: %zu\n", *mem_pos);
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;
}
FILE* fw = fopen(asm_out, "wb");
if (fw == NULL) {
ntsys_error("Cannot create or rewrite output file!");
fclose(fp);
return EXIT_FAILURE;
}
char* st = NULL;
size_t mem_pos = 0;
size_t lb_size = 1;
int c;
while ((c = getc(fp)) != EOF) {
if (c == ':') {
lb_size ++;
}
}
rewind(fp);
labels = malloc(sizeof(word_t) * lb_size);
labels_names = (char**)malloc(sizeof(char*) * lb_size);
while ((st = get_str(st, fp)) != NULL) {
if (ntsys_asm_from_string(&mem_pos, st, fw) != EXIT_SUCCESS) return EXIT_FAILURE;
}
free(st);
fclose(fp);
fclose(fw);
return EXIT_SUCCESS;
}
#undef __READ_FILE_WITH_EOF_OR_LN
#undef __SPACE_SHIFTsize_t lb_size = 1;
#undef is_space
#undef __NEXT_ARG
#undef get_mem_pos
#undef labels
#undef labels_names
#undef lb_pos
#endif /* NTSYS_ASSEMBLER_H___ */