commit b9a79ec

Devine Lu Linvega  ·  2024-02-24 16:46:18 +0000 UTC
parent cb73e63
(uxnasm)Passing uxntal scope requirements
2 files changed,  +82, -4
+77, -0
 1@@ -0,0 +1,77 @@
 2+( test file )
 3+
 4+|0100 @program
 5+
 6+	#01 ?{ ( skip ) #ffff }
 7+	!{ ( skip ) #ffff }
 8+	{ ( skip ) #ffff } POP2r
 9+
10+	( nested lambda )
11+	{ { "hello 0a $1 } STH2r !print-str } STH2r JSR2
12+
13+	( function application )
14+	{ 01 02 03 04 05 } STH2r { LIT "0 ADD #18 DEO #0a18 DEO JMP2r } STH2r foreach
15+
16+	( get lambda length )
17+	{ "Dindeldums $1 } STH2r get-lambda-length <print-dec> #0a18 DEO
18+
19+	( allocated string )
20+	;hello-word print-str
21+
22+	#800f DEO
23+
24+BRK
25+
26+( 
27+@| test label inheritance )
28+
29+@object 
30+
31+&x $1 &y $1
32+
33+&get-x ( -- x )
34+	,&x LDR
35+	JMP2r
36+
37+@object/get-y ( -- y )
38+	,&y LDR
39+	JMP2r
40+
41+( raw lambda length )
42+_{ 01 02 03 }
43+
44+@get-lambda-length ( lambda* -- length* )
45+	#0002 SUB2 LDA2
46+JMP2r
47+
48+@print-str ( str* -- )
49+	&while ( -- )
50+		( send ) LDAk #18 DEO
51+		( loop ) INC2 LDAk ?&while
52+	POP2
53+
54+JMP2r
55+
56+@foreach ( arr* fn* -- )
57+	STH2
58+	DUP2
59+	DUP2 #0002 SUB2 LDA2 ADD2
60+	SWP2
61+	&l
62+		LDAk STH2kr JSR2
63+		INC2 NEQ2k ?&l
64+	POP2 POP2 POP2r
65+JMP2r
66+
67+@<print-dec> ( short* -- )
68+	#2710 [ LIT2r 00fb ]
69+	&w ( -- )
70+		DIV2k #000a DIV2k MUL2 SUB2 SWPr EQUk OVR STHkr EQU AND ?&>skip
71+			DUP [ LIT "0 ] ADD #19 DEO
72+			INCr &>skip
73+		POP2 #000a DIV2 SWPr INCr STHkr ?&w
74+	POP2r POP2 POP2 JMP2r
75+
76+$20 @label2
77+
78+@hello-word "Hello 20 "World! 0a $1
+5, -4
 1@@ -320,7 +320,10 @@ parse(char *w, FILE *f)
 2 	case '@': /* label */
 3 		if(!makelabel(w + 1))
 4 			return error("Invalid label", w);
 5-		scpy(w + 1, p.scope, 0x40);
 6+		i = 0;
 7+		while(w[i + 1] != '/' && i < 0x3e && (p.scope[i] = w[i + 1])) 
 8+			i++;
 9+		p.scope[i] = '\0';
10 		break;
11 	case '&': /* sublabel */
12 		if(!sublabel(subw, p.scope, w + 1) || !makelabel(subw))
13@@ -346,7 +349,6 @@ parse(char *w, FILE *f)
14 	case '.': /* literal byte zero-page */
15 		makereference(p.scope, w + 1, w[0], p.ptr + 1);
16 		return writelitbyte(0xff);
17-	case ':':
18 	case '=': /* raw short absolute */
19 		makereference(p.scope, w + 1, w[0], p.ptr);
20 		return writeshort(0xffff, 0);
21@@ -420,7 +422,6 @@ resolve(void)
22 			p.data[r->addr] = l->addr & 0xff;
23 			l->refs++;
24 			break;
25-		case ':':
26 		case '=':
27 		case ';':
28 			if(!(l = findlabel(r->name)))
29@@ -501,7 +502,7 @@ main(int argc, char *argv[])
30 	if(argc == 1)
31 		return error("usage", "uxnasm [-v] input.tal output.rom");
32 	if(argv[1][0] == '-' && argv[1][1] == 'v')
33-		return !fprintf(stdout, "Uxnasm - Uxntal Assembler, 27 Oct 2023.\n");
34+		return !fprintf(stdout, "Uxnasm - Uxntal Assembler, 24 Feb 2024.\n");
35 	if(!(src = fopen(argv[1], "r")))
36 		return !error("Invalid input", argv[1]);
37 	if(!assemble(src))