Added padding
This commit is contained in:
parent
f3426fa886
commit
9597611918
|
@ -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
26
uxn.c
|
@ -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");
|
||||||
|
|
12
uxnasm.c
12
uxnasm.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue