Browse code

Started migrating to new assembler

neauoire authored on 20/04/2021 00:23:30
Showing 6 changed files
... ...
@@ -32,7 +32,7 @@ else
32 32
 fi
33 33
 
34 34
 echo "Assembling.."
35
-./bin/assembler projects/software/nasu.usm bin/boot.rom
35
+./bin/assembler projects/examples/dev.controller.buttons.usm bin/boot.rom
36 36
 
37 37
 echo "Running.."
38 38
 if [ "${2}" = '--cli' ]; 
... ...
@@ -6,60 +6,87 @@
6 6
 
7 7
 ( variables )
8 8
 
9
-;slime { color 1 }
9
+@slime [
10
+	&color 00
11
+	&end
12
+]
10 13
 
11 14
 ( devices )
12 15
 
13
-|0100 ;System { vector 2 pad 6 r 2 g 2 b 2 }
14
-|0120 ;Screen { vector 2 width 2 height 2 pad 2 x 2 y 2 addr 2 color 1 }
15
-|0140 ;Controller { vector 2 button 1 key 1 }
16
+|0100 @System [
17
+	&vector 0000 
18
+	&pad    0000 
19
+			0000 
20
+			0000
21
+	&r      0000 
22
+	&g      0000 
23
+	&b      0000 
24
+	&end    
25
+]
26
+|0120 @Screen [
27
+	&vector 0000 
28
+	&width  0000 
29
+	&height 0000 
30
+	&pad    0000 
31
+	&x      0000 
32
+	&y      0000 
33
+	&addr   0000 
34
+	&color  00 
35
+	&end    
36
+]
37
+|0140 @Controller [
38
+	&vector 0000 
39
+	&button 00 
40
+	&key    00 
41
+	&end    
42
+]
16 43
 
17 44
 |0200
18 45
 
19
-	( theme ) #0daf =System.r #02ff =System.g #035f =System.b
20
-	( vectors ) ,FRAME =Screen.vector
46
+	( theme ) #0daf =System/r #02ff =System/g #035f =System/b
47
+	( vectors ) ,on-frame =Screen/vector
21 48
 	
22 49
 	( set origin )
23
-	~Screen.width 2/ =Screen.x 
24
-	~Screen.height 2/ =Screen.y
25
-	,default_icn =Screen.addr
26
-	#31 =Screen.color
27
-	#2a =slime
50
+	~Screen/width 2/ =Screen/x 
51
+	~Screen/height 2/ =Screen/y
52
+	,default_icn =Screen/addr
53
+	#31 =Screen/color
54
+	#2a =slime/color
28 55
 
29 56
 BRK
30 57
 
31
-@FRAME
58
+@on-frame
32 59
 
33
-	#2a =slime
34
-	,default_icn =Screen.addr
60
+	#2a =slime/color
61
+	,default_icn =Screen/addr
35 62
 
36 63
 	( hold ctrl key to change slime color )
37 64
 
38
-	~Controller.button #0f AND
39
-		DUP #01 NEQ ^$no-ctrl JNZ #25 =slime $no-ctrl
40
-		DUP #02 NEQ ^$no-alt JNZ #2f =slime $no-alt
65
+	~Controller/button #0f AND
66
+		DUP #01 NEQ ^$no-ctrl JNZ #25 =slime/color $no-ctrl
67
+		DUP #02 NEQ ^$no-alt JNZ #2f =slime/color $no-alt
41 68
 	POP
42 69
 
43
-	( clear ) #30 =Screen.color
70
+	( clear ) #30 =Screen/color
44 71
 
45 72
 	( detect movement )
46
-	~Controller.button #f0 AND
73
+	~Controller/button #f0 AND
47 74
 		DUP #04 SFT #01 AND #01 NEQ ^$no-up JNZ 
48
-			( move ) ~Screen.y -- =Screen.y ,up_icn =Screen.addr $no-up
75
+			( move ) ~Screen/y -- =Screen/y ,up_icn =Screen/addr $no-up
49 76
 		DUP #05 SFT #01 AND #01 NEQ ^$no-down JNZ 
50
-			( move ) ~Screen.y ++ =Screen.y ,down_icn =Screen.addr $no-down
77
+			( move ) ~Screen/y ++ =Screen/y ,down_icn =Screen/addr $no-down
51 78
 		DUP #06 SFT #01 AND #01 NEQ ^$no-left JNZ 
52
-			( move ) ~Screen.x -- =Screen.x ,left_icn =Screen.addr $no-left
79
+			( move ) ~Screen/x -- =Screen/x ,left_icn =Screen/addr $no-left
53 80
 		DUP #07 SFT #01 AND #01 NEQ ^$no-right JNZ 
54
-			( move ) ~Screen.x ++ =Screen.x ,right_icn =Screen.addr $no-right
81
+			( move ) ~Screen/x ++ =Screen/x ,right_icn =Screen/addr $no-right
55 82
 	POP
56 83
 
57 84
 	( draw face )
58
-	#31 =Screen.color
85
+	#31 =Screen/color
59 86
 
60 87
 	( draw slime )
61
-	,slime_icn =Screen.addr
62
-	~slime =Screen.color
88
+	,slime_icn =Screen/addr
89
+	~slime/color =Screen/color
63 90
 
64 91
 BRK
65 92
 
66 93
new file mode 100755
67 94
Binary files /dev/null and b/src/assembler differ
... ...
@@ -13,7 +13,6 @@ WITH REGARD TO THIS SOFTWARE.
13 13
 
14 14
 #define WORDLENMAX 32
15 15
 #define MACROMAX 64
16
-#define OFFSET 0x0200
17 16
 
18 17
 typedef unsigned char Uint8;
19 18
 typedef signed char Sint8;
... ...
@@ -132,22 +131,6 @@ findlabeladdr(char *s)
132 131
 	return 0;
133 132
 }
134 133
 
135
-Uint8
136
-findlabellen(char *s)
137
-{
138
-	int i;
139
-	char *param;
140
-	Label *l = findlabel(s);
141
-	if(scin(s, '.') < 1)
142
-		return l->map[0].size;
143
-	param = s + scin(s, '.') + 1;
144
-	for(i = 0; i < l->maps; ++i)
145
-		if(scmp(l->map[i].name, param, 64))
146
-			return l->map[i].size;
147
-	printf("!!! Warning %s.%s\n", l->name, param);
148
-	return 0;
149
-}
150
-
151 134
 Uint8
152 135
 findopcode(char *s)
153 136
 {
... ...
@@ -175,7 +158,7 @@ char *
175 158
 sublabel(char *src, char *scope, char *name)
176 159
 {
177 160
 	scpy(scope, src, 64);
178
-	scpy("-", src + slen(src), 64);
161
+	scpy("/", src + slen(src), 64);
179 162
 	scpy(name, src + slen(src), 64);
180 163
 	return src;
181 164
 }
... ...
@@ -225,6 +208,13 @@ makelabel(char *name, Uint16 addr)
225 208
 		return error("Label name is hex number", name);
226 209
 	if(findopcode(name))
227 210
 		return error("Label name is invalid", name);
211
+	/* set length of last label */
212
+	if(p.llen) {
213
+		l = &p.labels[p.llen - 1];
214
+		l->len = addr - l->addr;
215
+		printf("    Set length of #%d \n", l->len);
216
+	}
217
+	/* make new label */
228 218
 	l = &p.labels[p.llen++];
229 219
 	l->addr = addr;
230 220
 	l->refs = 0;
... ...
@@ -233,25 +223,6 @@ makelabel(char *name, Uint16 addr)
233 223
 	return 1;
234 224
 }
235 225
 
236
-int
237
-makevariable(char *name, Uint16 *addr, FILE *f)
238
-{
239
-	Label *l;
240
-	char word[64];
241
-	if(!makelabel(name, *addr))
242
-		return error("Could not create variable", name);
243
-	l = findlabel(name);
244
-	while(fscanf(f, "%s", word)) {
245
-		if(word[0] == '{') continue;
246
-		if(word[0] == '}') break;
247
-		scpy(word, l->map[l->maps].name, 64);
248
-		fscanf(f, "%02x", &l->map[l->maps].size);
249
-		*addr += l->map[l->maps].size;
250
-		l->len += l->map[l->maps++].size;
251
-	}
252
-	return 1;
253
-}
254
-
255 226
 int
256 227
 skipblock(char *w, int *cap, char a, char b)
257 228
 {
... ...
@@ -303,25 +274,25 @@ parsetoken(char *w)
303 274
 		pushbyte((Sint8)(l->addr - p.ptr - 3), 1);
304 275
 		return ++l->refs;
305 276
 	} else if(w[0] == '=' && (l = findlabel(w + 1))) {
306
-		if(!findlabellen(w + 1) || findlabellen(w + 1) > 2)
277
+		if(!l->len || l->len > 2)
307 278
 			return error("Invalid store helper", w);
308 279
 		if(findlabeladdr(w + 1) < 0x0100) {
309 280
 			pushbyte(findlabeladdr(w + 1), 1);
310
-			pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR" : "POK"), 0);
281
+			pushbyte(findopcode(l->len == 2 ? "STR" : "POK"), 0);
311 282
 		} else {
312 283
 			pushshort(findlabeladdr(w + 1), 1);
313
-			pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR2" : "POK2"), 0);
284
+			pushbyte(findopcode(l->len == 2 ? "STR2" : "POK2"), 0);
314 285
 		}
315 286
 		return ++l->refs;
316 287
 	} else if(w[0] == '~' && (l = findlabel(w + 1))) {
317
-		if(!findlabellen(w + 1) || findlabellen(w + 1) > 2)
288
+		if(!l->len || l->len > 2)
318 289
 			return error("Invalid load helper", w);
319 290
 		if(findlabeladdr(w + 1) < 0x0100) {
320 291
 			pushbyte(findlabeladdr(w + 1), 1);
321
-			pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR" : "PEK"), 0);
292
+			pushbyte(findopcode(l->len == 2 ? "LDR" : "PEK"), 0);
322 293
 		} else {
323 294
 			pushshort(findlabeladdr(w + 1), 1);
324
-			pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR2" : "PEK2"), 0);
295
+			pushbyte(findopcode(l->len == 2 ? "LDR2" : "PEK2"), 0);
325 296
 		}
326 297
 		return ++l->refs;
327 298
 	} else if(w[0] == '.' && (l = findlabel(w + 1))) {
... ...
@@ -363,7 +334,10 @@ pass1(FILE *f)
363 334
 	printf("Pass 1\n");
364 335
 	while(fscanf(f, "%s", w) == 1) {
365 336
 		if(skipblock(w, &ccmnt, '(', ')')) continue;
366
-		if(skipblock(w, &cbits, '[', ']')) {
337
+		if(w[0] == '&') {
338
+			if(!makelabel(sublabel(subw, scope, w + 1), addr))
339
+				return error("Pass1 failed", w);
340
+		} else if(skipblock(w, &cbits, '[', ']')) {
367 341
 			if(w[0] == '[' || w[0] == ']')
368 342
 				continue;
369 343
 			if(slen(w) == 4 && sihx(w))
... ...
@@ -383,9 +357,6 @@ pass1(FILE *f)
383 357
 		} else if(w[0] == '$') {
384 358
 			if(!makelabel(sublabel(subw, scope, w + 1), addr))
385 359
 				return error("Pass1 failed", w);
386
-		} else if(w[0] == ';') {
387
-			if(!makevariable(w + 1, &addr, f))
388
-				return error("Pass1 failed", w);
389 360
 		} else if(w[0] == '|') {
390 361
 			if(shex(w + 1) < addr)
391 362
 				return error("Memory Overwrite", w);
... ...
@@ -406,6 +377,7 @@ pass2(FILE *f)
406 377
 	while(fscanf(f, "%s", w) == 1) {
407 378
 		if(w[0] == '$') continue;
408 379
 		if(w[0] == '%') continue;
380
+		if(w[0] == '&') continue;
409 381
 		if(skipblock(w, &ccmnt, '(', ')')) continue;
410 382
 		if(skipblock(w, &ctemplate, '{', '}')) continue;
411 383
 		if(w[0] == ';') {
... ...
@@ -440,7 +412,7 @@ void
440 412
 cleanup(char *filename)
441 413
 {
442 414
 	int i;
443
-	printf("Assembled %s(%0.2fkb), %d labels, %d macros.\n\n", filename, (p.ptr - OFFSET) / 1000.0, p.llen, p.mlen);
415
+	printf("Assembled %s(%0.2fkb), %d labels, %d macros.\n\n", filename, p.ptr / 1000.0, p.llen, p.mlen);
444 416
 	for(i = 0; i < p.llen; ++i)
445 417
 		if(!p.labels[i].refs)
446 418
 			printf("--- Unused label: %s\n", p.labels[i].name);
... ...
@@ -459,7 +431,7 @@ main(int argc, char *argv[])
459 431
 		return !error("Open", "Failed");
460 432
 	if(!pass1(f) || !pass2(f))
461 433
 		return !error("Assembly", "Failed");
462
-	fwrite(p.data + OFFSET, p.ptr - OFFSET, 1, fopen(argv[2], "wb"));
434
+	fwrite(p.data, p.ptr, 1, fopen(argv[2], "wb"));
463 435
 	fclose(f);
464 436
 	cleanup(argv[2]);
465 437
 	return 0;
... ...
@@ -166,7 +166,7 @@ loaduxn(Uxn *u, char *filepath)
166 166
 	FILE *f;
167 167
 	if(!(f = fopen(filepath, "rb")))
168 168
 		return haltuxn(u, "Missing input rom.", 0);
169
-	fread(u->ram.dat + PAGE_PROGRAM, sizeof(u->ram.dat) - PAGE_PROGRAM, 1, f);
169
+	fread(u->ram.dat + LOAD_OFFSET, sizeof(u->ram.dat) - LOAD_OFFSET, 1, f);
170 170
 	printf("Uxn loaded[%s].\n", filepath);
171 171
 	return 1;
172 172
 }
... ...
@@ -18,6 +18,7 @@ typedef signed short Sint16;
18 18
 
19 19
 #define PAGE_DEVICE 0x0100
20 20
 #define PAGE_PROGRAM 0x0200
21
+#define LOAD_OFFSET 0x0000
21 22
 
22 23
 typedef struct {
23 24
 	Uint8 ptr, error;