Improved assembler

This commit is contained in:
neauoire 2021-02-04 13:49:03 -08:00
parent 6ac543f312
commit f3426fa886
3 changed files with 61 additions and 43 deletions

View File

@ -1,3 +1,9 @@
( comment )
,abcd ,ef STR
;var1
;var2
;var3
,ef ,var2 STR
:label1

39
uxn.c
View File

@ -56,7 +56,7 @@ getflag(char flag)
}
void
echo(Stack *s, Uint8 len, char *name)
echos(Stack *s, Uint8 len, char *name)
{
int i;
printf("%s\n", name);
@ -68,21 +68,32 @@ echo(Stack *s, Uint8 len, char *name)
printf("\n\n");
}
void
echom(Memory *m, Uint8 len, char *name)
{
int i;
printf("%s\n", name);
for(i = 0; i < len; ++i) {
if(i % 16 == 0)
printf("\n");
printf("%02x ", m->dat[i]);
}
printf("\n\n");
}
#pragma mark - Operations
/* clang-format off */
void wspush(Uint8 v) { cpu.wst.dat[cpu.wst.ptr++] = v; }
void wspush(Uint8 b) { cpu.wst.dat[cpu.wst.ptr++] = b; }
Uint8 wspop(void) { return cpu.wst.dat[--cpu.wst.ptr]; }
Uint16 wspop16(void) {
Uint8 a = cpu.wst.dat[--cpu.wst.ptr];
Uint8 b = cpu.wst.dat[--cpu.wst.ptr];
return a + (b << 8);
void wspush16(Uint16 s) {
printf("0x%04x\n", s);
}
Uint16 wspop16(void) { return wspop() + (wspop() << 8); }
Uint8 wspeek(void) { return cpu.wst.dat[cpu.wst.ptr - 1]; }
void rspush(Uint8 v) { cpu.rst.dat[cpu.rst.ptr++] = v; }
void rspush(Uint8 b) { cpu.rst.dat[cpu.rst.ptr++] = b; }
Uint8 rspop(void) { return cpu.rst.dat[--cpu.rst.ptr]; }
void op_brk() { setflag(FLAG_HALT, 1); }
@ -109,13 +120,8 @@ void op_add() { wspush(wspop() + wspop()); }
void op_sub() { wspush(wspop() - wspop()); }
void op_mul() { wspush(wspop() * wspop()); }
void op_div() { wspush(wspop() / wspop()); }
void op_ldr() { }
void op_str() {
Uint8 b = wspop();
Uint16 addr = wspop16();
printf("store: %02x @ %04x\n", b, addr);
}
void op_ldr() { wspush16(wspop16()); }
void op_str() { cpu.ram.dat[wspop16()] = wspop(); }
void (*ops[])(void) = {
op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot,
@ -215,6 +221,7 @@ main(int argc, char *argv[])
load(f);
run();
/* print result */
echo(&cpu.wst, 0x40, "stack");
echos(&cpu.wst, 0x40, "stack");
echom(&cpu.ram, 0x40, "ram");
return 0;
}

View File

@ -148,27 +148,6 @@ pushshort(Uint16 s, int lit)
pushbyte(s & 0xff, 0);
}
#pragma mark - Parser
Uint8
findop(char *s)
{
int i;
for(i = 0; i < 32; ++i)
if(scmp(opcodes[i], s))
return i;
return 0;
}
void
makelabel(char *id, Uint8 addr)
{
Label *l = &labels[labelslen++];
scpy(suca(id), l->name, 64);
l->addr = addr;
printf("New label: %s[0x%02x]\n", l->name, l->addr);
}
Label *
findlabel(char *s)
{
@ -184,10 +163,33 @@ findlabel(char *s)
int
error(char *name, char *id)
{
printf("Error: %s - %s\n", name, id);
printf("Error: %s(%s)\n", name, id);
return 0;
}
Uint8
findop(char *s)
{
int i;
for(i = 0; i < 32; ++i)
if(scmp(opcodes[i], s))
return i;
return 0;
}
int
makelabel(char *id, Uint8 addr)
{
Label *l;
if(findlabel(id))
return error("Label duplicate", id);
l = &labels[labelslen++];
scpy(id, l->name, 64);
l->addr = addr;
printf("New label: %s[0x%02x]\n", l->name, l->addr);
return 1;
}
int
pass1(FILE *f)
{
@ -195,8 +197,11 @@ pass1(FILE *f)
char w[64];
while(fscanf(f, "%s", w) == 1) {
if(iscomment(w, &skip)) continue;
if(w[0] == ':') makelabel(w + 1, addr);
if(w[0] == ';') makelabel(w + 1, vars++);
suca(w);
if(w[0] == ':' && !makelabel(w + 1, addr))
return error("Pass1 failed", w);
if(w[0] == ';' && !makelabel(w + 1, vars++))
return error("Pass1 failed", w);
/* move addr ptr */
if(findop(w) || scmp(w, "BRK"))
addr += 1;
@ -213,7 +218,7 @@ pass1(FILE *f)
else if(ismarker(w))
addr += 0;
else
return error("Unknown label(pass1)", w);
return error("Unknown label", w);
}
rewind(f);
return 1;
@ -242,7 +247,7 @@ pass2(FILE *f)
else if(sihx(w + 1) && slen(w + 1) == 4)
pushshort(shex(w + 1), w[0] == ',');
else
return error("Unknown label(pass2)", w);
return error("Unknown label", w);
}
return 1;
}