part 1
This commit is contained in:
parent
885a091400
commit
8a4e9539dd
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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
|
||||||
|
154
asm/assembler.c
154
asm/assembler.c
@ -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(¤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;
|
||||||
}
|
}
|
@ -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>
|
||||||
|
2
build.sh
2
build.sh
@ -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"
|
Loading…
Reference in New Issue
Block a user