#include "./assembler.h" #include "../emu/cpu_const.h" #include "../emu/cpu_human.h" #include "./asm_const.h" #include #include #include #include #include // i apologise for the next three functions, they are written very werirdly, // and are not as readable as they coudld be, sorry // the rough flow for each is just to loop along a string until you // encounter a specific char, or a non space / tab char // // again i apologise for the unreadability, they use way to many // goto's, but should be pretty efficient. char *FindNextChar(char *data, char toFind, bool careAboutNull) { begin: switch (*data) { case '\0': if (careAboutNull) { fprintf(stderr, "FOUND NULL CHAR BEFORE CHAR TO FIND\n"); exit(-1); } goto final; default: if (*data == toFind) { final: return data; } data++; goto begin; } } char *FindNextNonSpaceChar(char *data, bool careAboutNull) { begin: switch(*data) { case '\0': if (careAboutNull) { fprintf(stderr, "FOUND NULL CHAR BEFORE NON SPACE / TAB CHAR\n"); exit(-1); } goto final; case ' ': case '\t': data++; goto begin; default: final: return data; } } char *FindNextSpaceChar(char *data, bool careAboutNull) { begin: switch(*data) { case '\0': if (careAboutNull) { fprintf(stderr, "FOUND NULL CHAR BEFORE NON SPACE / TAB CHAR\n"); exit(-1); } case ' ': case '\t': return data; default: data++; goto begin; } } AsmInstructionArray *InterpretAssembly(char *data) { char *d = data; AsmInstructionArray *asmIA = malloc(sizeof(AsmInstructionArray)); uint32_t cSize = 0, mSize = 32; asmIA->instruction = malloc(sizeof(AsmInstruction) * 32); while (true) { loopStart: if (cSize == mSize) { mSize += 32; asmIA->instruction = realloc(asmIA->instruction, mSize); } AsmInstruction current = *(asmIA->instruction + (cSize * sizeof(AsmInstruction))); d = FindNextNonSpaceChar(d, false); if (*d == '\0') goto final; if (*d == '\n') { d++; goto loopStart; } if (*(FindNextSpaceChar(d, true) - 1) == ':') { memcpy(¤t.label, d, (FindNextSpaceChar(d, true) - 1) - d); d = FindNextNonSpaceChar(d, true); } else { current.label[0] = '\0'; } memcpy(¤t.instruction, d, 3); d = FindNextNonSpaceChar(d, false); if (*d == '\0') goto final; if (*d == '\n') { d++; goto loopEnd; } char *comma = FindNextChar(d, ',', true), *nline = FindNextChar(d, '\n', true); bool a2 = comma < nline; char *eoA1 = a2 ? comma : nline; memcpy(¤t.arg1, d, eoA1 - d); if (!a2) goto loopEnd; d = FindNextNonSpaceChar(eoA1 + 1, true); memcpy(¤t.arg2, d, nline - d); d = nline + 1; loopEnd: cSize++; } final: // TODO i think its mostly done, just need to make sure i free any rand temp // shit used here asmIA->instruction = realloc(asmIA->instruction, cSize); asmIA->length = cSize; return asmIA; }