Improved assembler
This commit is contained in:
parent
6ac543f312
commit
f3426fa886
|
@ -1,3 +1,9 @@
|
|||
( comment )
|
||||
|
||||
,abcd ,ef STR
|
||||
;var1
|
||||
;var2
|
||||
;var3
|
||||
|
||||
,ef ,var2 STR
|
||||
|
||||
:label1
|
39
uxn.c
39
uxn.c
|
@ -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;
|
||||
}
|
||||
|
|
57
uxnasm.c
57
uxnasm.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue