commit 82f7103a55c21b13f898b20e5d1e174e501bc825
parent d61e724d4814be5546805e2fec07716da60efea8
Author: neauoire <aliceffekt@gmail.com>
Date: Mon, 19 Apr 2021 17:23:30 -0700
Started migrating to new assembler
Diffstat:
6 files changed, 77 insertions(+), 77 deletions(-)
diff --git a/build.sh b/build.sh
@@ -32,7 +32,7 @@ else
fi
echo "Assembling.."
-./bin/assembler projects/software/nasu.usm bin/boot.rom
+./bin/assembler projects/examples/dev.controller.buttons.usm bin/boot.rom
echo "Running.."
if [ "${2}" = '--cli' ];
diff --git a/projects/examples/dev.controller.buttons.usm b/projects/examples/dev.controller.buttons.usm
@@ -6,60 +6,87 @@
( variables )
-;slime { color 1 }
+@slime [
+ &color 00
+ &end
+]
( devices )
-|0100 ;System { vector 2 pad 6 r 2 g 2 b 2 }
-|0120 ;Screen { vector 2 width 2 height 2 pad 2 x 2 y 2 addr 2 color 1 }
-|0140 ;Controller { vector 2 button 1 key 1 }
+|0100 @System [
+ &vector 0000
+ &pad 0000
+ 0000
+ 0000
+ &r 0000
+ &g 0000
+ &b 0000
+ &end
+]
+|0120 @Screen [
+ &vector 0000
+ &width 0000
+ &height 0000
+ &pad 0000
+ &x 0000
+ &y 0000
+ &addr 0000
+ &color 00
+ &end
+]
+|0140 @Controller [
+ &vector 0000
+ &button 00
+ &key 00
+ &end
+]
|0200
- ( theme ) #0daf =System.r #02ff =System.g #035f =System.b
- ( vectors ) ,FRAME =Screen.vector
+ ( theme ) #0daf =System/r #02ff =System/g #035f =System/b
+ ( vectors ) ,on-frame =Screen/vector
( set origin )
- ~Screen.width 2/ =Screen.x
- ~Screen.height 2/ =Screen.y
- ,default_icn =Screen.addr
- #31 =Screen.color
- #2a =slime
+ ~Screen/width 2/ =Screen/x
+ ~Screen/height 2/ =Screen/y
+ ,default_icn =Screen/addr
+ #31 =Screen/color
+ #2a =slime/color
BRK
-@FRAME
+@on-frame
- #2a =slime
- ,default_icn =Screen.addr
+ #2a =slime/color
+ ,default_icn =Screen/addr
( hold ctrl key to change slime color )
- ~Controller.button #0f AND
- DUP #01 NEQ ^$no-ctrl JNZ #25 =slime $no-ctrl
- DUP #02 NEQ ^$no-alt JNZ #2f =slime $no-alt
+ ~Controller/button #0f AND
+ DUP #01 NEQ ^$no-ctrl JNZ #25 =slime/color $no-ctrl
+ DUP #02 NEQ ^$no-alt JNZ #2f =slime/color $no-alt
POP
- ( clear ) #30 =Screen.color
+ ( clear ) #30 =Screen/color
( detect movement )
- ~Controller.button #f0 AND
+ ~Controller/button #f0 AND
DUP #04 SFT #01 AND #01 NEQ ^$no-up JNZ
- ( move ) ~Screen.y -- =Screen.y ,up_icn =Screen.addr $no-up
+ ( move ) ~Screen/y -- =Screen/y ,up_icn =Screen/addr $no-up
DUP #05 SFT #01 AND #01 NEQ ^$no-down JNZ
- ( move ) ~Screen.y ++ =Screen.y ,down_icn =Screen.addr $no-down
+ ( move ) ~Screen/y ++ =Screen/y ,down_icn =Screen/addr $no-down
DUP #06 SFT #01 AND #01 NEQ ^$no-left JNZ
- ( move ) ~Screen.x -- =Screen.x ,left_icn =Screen.addr $no-left
+ ( move ) ~Screen/x -- =Screen/x ,left_icn =Screen/addr $no-left
DUP #07 SFT #01 AND #01 NEQ ^$no-right JNZ
- ( move ) ~Screen.x ++ =Screen.x ,right_icn =Screen.addr $no-right
+ ( move ) ~Screen/x ++ =Screen/x ,right_icn =Screen/addr $no-right
POP
( draw face )
- #31 =Screen.color
+ #31 =Screen/color
( draw slime )
- ,slime_icn =Screen.addr
- ~slime =Screen.color
+ ,slime_icn =Screen/addr
+ ~slime/color =Screen/color
BRK
diff --git a/src/assembler b/src/assembler
Binary files differ.
diff --git a/src/assembler.c b/src/assembler.c
@@ -13,7 +13,6 @@ WITH REGARD TO THIS SOFTWARE.
#define WORDLENMAX 32
#define MACROMAX 64
-#define OFFSET 0x0200
typedef unsigned char Uint8;
typedef signed char Sint8;
@@ -133,22 +132,6 @@ findlabeladdr(char *s)
}
Uint8
-findlabellen(char *s)
-{
- int i;
- char *param;
- Label *l = findlabel(s);
- if(scin(s, '.') < 1)
- return l->map[0].size;
- param = s + scin(s, '.') + 1;
- for(i = 0; i < l->maps; ++i)
- if(scmp(l->map[i].name, param, 64))
- return l->map[i].size;
- printf("!!! Warning %s.%s\n", l->name, param);
- return 0;
-}
-
-Uint8
findopcode(char *s)
{
int i;
@@ -175,7 +158,7 @@ char *
sublabel(char *src, char *scope, char *name)
{
scpy(scope, src, 64);
- scpy("-", src + slen(src), 64);
+ scpy("/", src + slen(src), 64);
scpy(name, src + slen(src), 64);
return src;
}
@@ -225,6 +208,13 @@ makelabel(char *name, Uint16 addr)
return error("Label name is hex number", name);
if(findopcode(name))
return error("Label name is invalid", name);
+ /* set length of last label */
+ if(p.llen) {
+ l = &p.labels[p.llen - 1];
+ l->len = addr - l->addr;
+ printf(" Set length of #%d \n", l->len);
+ }
+ /* make new label */
l = &p.labels[p.llen++];
l->addr = addr;
l->refs = 0;
@@ -234,25 +224,6 @@ makelabel(char *name, Uint16 addr)
}
int
-makevariable(char *name, Uint16 *addr, FILE *f)
-{
- Label *l;
- char word[64];
- if(!makelabel(name, *addr))
- return error("Could not create variable", name);
- l = findlabel(name);
- while(fscanf(f, "%s", word)) {
- if(word[0] == '{') continue;
- if(word[0] == '}') break;
- scpy(word, l->map[l->maps].name, 64);
- fscanf(f, "%02x", &l->map[l->maps].size);
- *addr += l->map[l->maps].size;
- l->len += l->map[l->maps++].size;
- }
- return 1;
-}
-
-int
skipblock(char *w, int *cap, char a, char b)
{
if(w[0] == b) {
@@ -303,25 +274,25 @@ parsetoken(char *w)
pushbyte((Sint8)(l->addr - p.ptr - 3), 1);
return ++l->refs;
} else if(w[0] == '=' && (l = findlabel(w + 1))) {
- if(!findlabellen(w + 1) || findlabellen(w + 1) > 2)
+ if(!l->len || l->len > 2)
return error("Invalid store helper", w);
if(findlabeladdr(w + 1) < 0x0100) {
pushbyte(findlabeladdr(w + 1), 1);
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR" : "POK"), 0);
+ pushbyte(findopcode(l->len == 2 ? "STR" : "POK"), 0);
} else {
pushshort(findlabeladdr(w + 1), 1);
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR2" : "POK2"), 0);
+ pushbyte(findopcode(l->len == 2 ? "STR2" : "POK2"), 0);
}
return ++l->refs;
} else if(w[0] == '~' && (l = findlabel(w + 1))) {
- if(!findlabellen(w + 1) || findlabellen(w + 1) > 2)
+ if(!l->len || l->len > 2)
return error("Invalid load helper", w);
if(findlabeladdr(w + 1) < 0x0100) {
pushbyte(findlabeladdr(w + 1), 1);
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR" : "PEK"), 0);
+ pushbyte(findopcode(l->len == 2 ? "LDR" : "PEK"), 0);
} else {
pushshort(findlabeladdr(w + 1), 1);
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR2" : "PEK2"), 0);
+ pushbyte(findopcode(l->len == 2 ? "LDR2" : "PEK2"), 0);
}
return ++l->refs;
} else if(w[0] == '.' && (l = findlabel(w + 1))) {
@@ -363,7 +334,10 @@ pass1(FILE *f)
printf("Pass 1\n");
while(fscanf(f, "%s", w) == 1) {
if(skipblock(w, &ccmnt, '(', ')')) continue;
- if(skipblock(w, &cbits, '[', ']')) {
+ if(w[0] == '&') {
+ if(!makelabel(sublabel(subw, scope, w + 1), addr))
+ return error("Pass1 failed", w);
+ } else if(skipblock(w, &cbits, '[', ']')) {
if(w[0] == '[' || w[0] == ']')
continue;
if(slen(w) == 4 && sihx(w))
@@ -383,9 +357,6 @@ pass1(FILE *f)
} else if(w[0] == '$') {
if(!makelabel(sublabel(subw, scope, w + 1), addr))
return error("Pass1 failed", w);
- } else if(w[0] == ';') {
- if(!makevariable(w + 1, &addr, f))
- return error("Pass1 failed", w);
} else if(w[0] == '|') {
if(shex(w + 1) < addr)
return error("Memory Overwrite", w);
@@ -406,6 +377,7 @@ pass2(FILE *f)
while(fscanf(f, "%s", w) == 1) {
if(w[0] == '$') continue;
if(w[0] == '%') continue;
+ if(w[0] == '&') continue;
if(skipblock(w, &ccmnt, '(', ')')) continue;
if(skipblock(w, &ctemplate, '{', '}')) continue;
if(w[0] == ';') {
@@ -440,7 +412,7 @@ void
cleanup(char *filename)
{
int i;
- printf("Assembled %s(%0.2fkb), %d labels, %d macros.\n\n", filename, (p.ptr - OFFSET) / 1000.0, p.llen, p.mlen);
+ printf("Assembled %s(%0.2fkb), %d labels, %d macros.\n\n", filename, p.ptr / 1000.0, p.llen, p.mlen);
for(i = 0; i < p.llen; ++i)
if(!p.labels[i].refs)
printf("--- Unused label: %s\n", p.labels[i].name);
@@ -459,7 +431,7 @@ main(int argc, char *argv[])
return !error("Open", "Failed");
if(!pass1(f) || !pass2(f))
return !error("Assembly", "Failed");
- fwrite(p.data + OFFSET, p.ptr - OFFSET, 1, fopen(argv[2], "wb"));
+ fwrite(p.data, p.ptr, 1, fopen(argv[2], "wb"));
fclose(f);
cleanup(argv[2]);
return 0;
diff --git a/src/uxn.c b/src/uxn.c
@@ -166,7 +166,7 @@ loaduxn(Uxn *u, char *filepath)
FILE *f;
if(!(f = fopen(filepath, "rb")))
return haltuxn(u, "Missing input rom.", 0);
- fread(u->ram.dat + PAGE_PROGRAM, sizeof(u->ram.dat) - PAGE_PROGRAM, 1, f);
+ fread(u->ram.dat + LOAD_OFFSET, sizeof(u->ram.dat) - LOAD_OFFSET, 1, f);
printf("Uxn loaded[%s].\n", filepath);
return 1;
}
diff --git a/src/uxn.h b/src/uxn.h
@@ -18,6 +18,7 @@ typedef signed short Sint16;
#define PAGE_DEVICE 0x0100
#define PAGE_PROGRAM 0x0200
+#define LOAD_OFFSET 0x0000
typedef struct {
Uint8 ptr, error;