Added padding

This commit is contained in:
neauoire 2021-02-04 15:23:04 -08:00
parent f3426fa886
commit 9597611918
3 changed files with 42 additions and 22 deletions

View File

@ -1,9 +1,29 @@
( comment ) ( define some variables in the zero-page )
;var1 ;var1
;var2 ;var2
;var3 ;var3
,ef ,var2 STR ,22 ,var1 STR ( store 0x22 in var1 )
,var1 LDR ( load var2, put value on stack )
:label1 @0100 ( store program reset after zero-page )
:RESET ( --- )
BRK
@c000 ( much further.. )
:FRAME ( --- )
BRK
@d000 ( further still.. )
:ERROR ( --- )
BRK
@FFFA ( vectors, last 3 shorts )
.RESET
.FRAME
.ERROR

26
uxn.c
View File

@ -31,7 +31,7 @@ typedef struct {
typedef struct { typedef struct {
Uint8 literal, status; Uint8 literal, status;
Uint16 counter; Uint16 counter, vreset, vframe, verror;
Stack wst, rst; Stack wst, rst;
Memory rom, ram; Memory rom, ram;
} Computer; } Computer;
@ -85,6 +85,8 @@ echom(Memory *m, Uint8 len, char *name)
/* clang-format off */ /* clang-format off */
Uint8 mempoke8(Uint16 p) { return cpu.rom.dat[p+1] & 0xff; }
Uint16 mempoke16(Uint16 p) { return (cpu.rom.dat[p] << 8) + (cpu.rom.dat[p+1] & 0xff); }
void wspush(Uint8 b) { cpu.wst.dat[cpu.wst.ptr++] = b; } void wspush(Uint8 b) { cpu.wst.dat[cpu.wst.ptr++] = b; }
Uint8 wspop(void) { return cpu.wst.dat[--cpu.wst.ptr]; } Uint8 wspop(void) { return cpu.wst.dat[--cpu.wst.ptr]; }
void wspush16(Uint16 s) { void wspush16(Uint16 s) {
@ -120,7 +122,7 @@ void op_add() { wspush(wspop() + wspop()); }
void op_sub() { wspush(wspop() - wspop()); } void op_sub() { wspush(wspop() - wspop()); }
void op_mul() { wspush(wspop() * wspop()); } void op_mul() { wspush(wspop() * wspop()); }
void op_div() { wspush(wspop() / wspop()); } void op_div() { wspush(wspop() / wspop()); }
void op_ldr() { wspush16(wspop16()); } void op_ldr() { wspush(cpu.ram.dat[wspop16()]); }
void op_str() { cpu.ram.dat[wspop16()] = wspop(); } void op_str() { cpu.ram.dat[wspop16()] = wspop(); }
void (*ops[])(void) = { void (*ops[])(void) = {
@ -134,8 +136,7 @@ Uint8 opr[][2] = {
{0,0}, {0,0}, {0,0}, {1,0}, {0,1}, {1,1}, {0,1}, {3,3}, {0,0}, {0,0}, {0,0}, {1,0}, {0,1}, {1,1}, {0,1}, {3,3},
{2,0}, {2,0}, {2,0}, {2,0}, {2,1}, {2,1}, {2,1}, {2,1}, {2,0}, {2,0}, {2,0}, {2,0}, {2,1}, {2,1}, {2,1}, {2,1},
{1,0}, {1,0}, {1,0}, {1,0}, {2,1}, {0,0}, {0,0}, {0,0}, {1,0}, {1,0}, {1,0}, {1,0}, {2,1}, {0,0}, {0,0}, {0,0},
{2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {3,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}
{3,1}, {3,1}
}; };
/* clang-format on */ /* clang-format on */
@ -163,12 +164,6 @@ error(char *name)
return 0; return 0;
} }
void
load(FILE *f)
{
fread(cpu.rom.dat, sizeof(cpu.rom.dat), 1, f);
}
int int
eval() eval()
{ {
@ -195,8 +190,13 @@ eval()
} }
void void
run(void) start(FILE *f)
{ {
reset();
fread(cpu.rom.dat, sizeof(cpu.rom.dat), 1, f);
cpu.vreset = mempoke16(0xfffa);
cpu.vframe = mempoke16(0xfffc);
cpu.verror = mempoke16(0xfffe);
while(!(cpu.status & FLAG_HALT) && eval(cpu)) while(!(cpu.status & FLAG_HALT) && eval(cpu))
; ;
/* debug */ /* debug */
@ -217,9 +217,7 @@ main(int argc, char *argv[])
return error("No input."); return error("No input.");
if(!(f = fopen(argv[1], "rb"))) if(!(f = fopen(argv[1], "rb")))
return error("Missing input."); return error("Missing input.");
reset(); start(f);
load(f);
run();
/* print result */ /* print result */
echos(&cpu.wst, 0x40, "stack"); echos(&cpu.wst, 0x40, "stack");
echom(&cpu.ram, 0x40, "ram"); echom(&cpu.ram, 0x40, "ram");

View File

@ -178,7 +178,7 @@ findop(char *s)
} }
int int
makelabel(char *id, Uint8 addr) makelabel(char *id, Uint16 addr)
{ {
Label *l; Label *l;
if(findlabel(id)) if(findlabel(id))
@ -193,7 +193,8 @@ makelabel(char *id, Uint8 addr)
int int
pass1(FILE *f) pass1(FILE *f)
{ {
int skip = 0, addr = 0, vars = 0; int skip = 0, vars = 0;
Uint16 addr = 0;
char w[64]; char w[64];
while(fscanf(f, "%s", w) == 1) { while(fscanf(f, "%s", w) == 1) {
if(iscomment(w, &skip)) continue; if(iscomment(w, &skip)) continue;
@ -205,9 +206,9 @@ pass1(FILE *f)
/* move addr ptr */ /* move addr ptr */
if(findop(w) || scmp(w, "BRK")) if(findop(w) || scmp(w, "BRK"))
addr += 1; addr += 1;
else if(w[0] == '@') else if(w[0] == '@') {
addr += 0; addr = shex(w + 1);
else if(w[0] == ':') } else if(w[0] == ':')
addr += 0; addr += 0;
else if(w[0] == ';') else if(w[0] == ';')
addr += 0; addr += 0;
@ -264,5 +265,6 @@ main(int argc, char *argv[])
return error("Assembly", "Failed"); return error("Assembly", "Failed");
fwrite(p.data, sizeof(p.data), 1, fopen(argv[2], "wb")); fwrite(p.data, sizeof(p.data), 1, fopen(argv[2], "wb"));
fclose(f); fclose(f);
printf("Assembled %s.\n", argv[2]);
return 0; return 0;
} }