This commit is contained in:
Rose Apollo 2024-04-24 11:29:32 +00:00
parent 885a091400
commit 8a4e9539dd
5 changed files with 155 additions and 7 deletions

View File

@ -2,6 +2,7 @@
"files.associations": { "files.associations": {
"ram.h": "c", "ram.h": "c",
"stdint.h": "c", "stdint.h": "c",
"carg-parse.h": "c" "carg-parse.h": "c",
"cpu_human.h": "c"
} }
} }

View File

@ -2,7 +2,6 @@
#define ASM_ASM_CONST_H #define ASM_ASM_CONST_H
#include "../emu/cpu_const.h" #include "../emu/cpu_const.h"
#include "../emu/cpu_human.h"
#include <stdbool.h> #include <stdbool.h>
typedef struct typedef struct

View File

@ -5,10 +5,160 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h>
#include <string.h>
AsmInstructionArray InterpretAssembly(char *data) // 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; 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(&current.label, d, (FindNextSpaceChar(d, true) - 1) - d);
d = FindNextNonSpaceChar(d, true);
}
else
{
current.label[0] = '\0';
}
memcpy(&current.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(&current.arg1, d, eoA1 - d);
if (!a2)
goto loopEnd;
d = FindNextNonSpaceChar(eoA1 + 1, true);
memcpy(&current.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;
} }

View File

@ -1,5 +1,3 @@
#include "../emu/cpu_const.h"
#include "../emu/cpu_human.h"
#include "../lib/carg-parse/carg-parse.h" #include "../lib/carg-parse/carg-parse.h"
#include "./asm_const.h" #include "./asm_const.h"
#include <stdio.h> #include <stdio.h>

View File

@ -1,5 +1,5 @@
mkdir ./bin mkdir ./bin
clang -O2 -o ./bin/r16emu ./emu/main.c ./emu/cpu/instruction.c ./emu/cpu/ram.c ./emu/cpu/register.c ./emu/cpu/stack.c ./lib/carg-parse/carg-parse.c clang -O2 -o ./bin/r16emu ./emu/main.c ./emu/cpu/instruction.c ./emu/cpu/ram.c ./emu/cpu/register.c ./emu/cpu/stack.c ./lib/carg-parse/carg-parse.c
echo "built emulator" echo "built emulator"
clang -O2 -o ./bin/r16asm ./asm/main.c ./lib/carg-parse/carg-parse.c clang -O2 -o ./bin/r16asm ./asm/main.c ./asm/assembler.c ./lib/carg-parse/carg-parse.c
echo "built assemblor" echo "built assemblor"