Browse code

Completed struct implementation

neauoire authored on 23/02/2021 20:04:59
Showing 2 changed files
... ...
@@ -91,45 +91,49 @@ findmacro(char *s)
91 91
 }
92 92
 
93 93
 Label *
94
-findlabelplain(char *s)
94
+findlabel(char *s)
95 95
 {
96
-	int i;
96
+	int i, rng = scin(s, '.');
97
+	char name[64];
98
+	scpy(s, name, rng > 0 ? rng + 1 : 64);
97 99
 	for(i = 0; i < labelslen; ++i)
98
-		if(scmp(labels[i].name, s, 64))
100
+		if(scmp(labels[i].name, name, 64))
99 101
 			return &labels[i];
100 102
 	return NULL;
101 103
 }
102 104
 
103
-Label *
104
-findlabelmacro(char *s)
105
+Uint16
106
+findlabeladdr(char *s)
105 107
 {
106
-	int i, o = 0, pti = scin(s, '.');
107
-	char name[64], param[64];
108
-	Label *l;
109
-	if(pti > 0) {
110
-		scpy(s, name, pti + 1);
111
-		scpy(s + pti + 1, param, 64);
112
-	} else
113
-		scpy(s, name, 64);
114
-	if(!(l = findlabelplain(name)) || !l->macro)
115
-		return NULL;
116
-	/* find macro offset */
108
+	int i, o = 0;
109
+	char *param;
110
+	Label *l = findlabel(s);
111
+	if(scin(s, '.') < 1)
112
+		return l->addr;
113
+	param = s + scin(s, '.') + 1;
117 114
 	for(i = 0; i < l->macro->len; ++i) {
118
-		if(scmp(l->macro->params[i], param, 64)) {
119
-			l->offset = o;
120
-			break;
121
-		}
115
+		if(scmp(l->macro->params[i], param, 64))
116
+			return l->addr + o;
122 117
 		o += l->macro->length[i];
123 118
 	}
124
-	return l;
119
+	printf("Warning %s.%s[%s]\n", l->name, param, l->macro->name);
120
+	return 0;
125 121
 }
126 122
 
127
-Label *
128
-findlabel(char *s)
123
+Uint8
124
+findlabellen(char *s)
129 125
 {
130
-	if(scin(s, '.') > 0)
131
-		return findlabelmacro(s);
132
-	return findlabelplain(s);
126
+	int i;
127
+	char *param;
128
+	Label *l = findlabel(s);
129
+	if(scin(s, '.') < 1)
130
+		return l->len;
131
+	param = s + scin(s, '.') + 1;
132
+	for(i = 0; i < l->macro->len; ++i)
133
+		if(scmp(l->macro->params[i], param, 64))
134
+			return l->macro->length[i];
135
+	printf("Warning %s.%s[%s]\n", l->name, param, l->macro->name);
136
+	return 0;
133 137
 }
134 138
 
135 139
 Uint8
... ...
@@ -356,9 +360,9 @@ pass2(FILE *f)
356 360
 		else if(w[0] == '+' && sihx(w + 1) && slen(w + 1) == 4) pushshort((Sint16)shex(w + 1), 1);
357 361
 		else if(w[0] == '-' && sihx(w + 1) && slen(w + 1) == 2) pushbyte((Sint8)(shex(w + 1) * -1), 1);
358 362
 		else if(w[0] == '-' && sihx(w + 1) && slen(w + 1) == 4) pushshort((Sint16)(shex(w + 1) * -1), 1);
359
-		else if(w[0] == '=' && (l = findlabel(w + 1)) && l->len){ pushshort(l->addr + l->offset, 1); pushbyte(findopcode(l->len == 2 ? "STR2" : "STR"),0); }
360
-		else if(w[0] == '~' && (l = findlabel(w + 1)) && l->len){ pushshort(l->addr + l->offset, 1); pushbyte(findopcode(l->len == 2 ? "LDR2" : "LDR"),0); }
361
-		else if((l = findlabel(w + 1))) pushshort(l->addr + l->offset, w[0] == ',');
363
+		else if(w[0] == '=' && (l = findlabel(w + 1)) && l->len){ pushshort(findlabeladdr(w+1), 1); pushbyte(findopcode(findlabellen(w+1) == 2? "STR2" : "STR"), 0); }
364
+		else if(w[0] == '~' && (l = findlabel(w + 1)) && l->len){ pushshort(findlabeladdr(w+1), 1); pushbyte(findopcode(findlabellen(w+1) == 2 ? "LDR2" : "LDR"), 0); }
365
+		else if((l = findlabel(w + 1))) pushshort(findlabeladdr(w+1), w[0] == ',');
362 366
 		else {
363 367
 			return error("Unknown label in second pass", w);
364 368
 		}
... ...
@@ -4,16 +4,21 @@
4 4
 :dev/w fff9 ( std write port )
5 5
 
6 6
 &Rect2d { x 2 y 2 width 2 height 2 }
7
+&ColorRGB { r 1 g 1 b 1 }
7 8
 
8 9
 ;rc1 Rect2d
9
-
10
-( TODO )
10
+;red ColorRGB
11 11
 
12 12
 |0100 @RESET
13 13
 	
14
-	#abcd ,rc1.height STR2
15
-	,rc1.height LDR2
16
-	,rc1.height LDR2
14
+	( byte mode )
15
+	#ff =red.r
16
+	~red.r
17
+
18
+	( short mode )_
19
+	#1234 =rc1.x
20
+	#abcd =rc1.height
21
+	~rc1.height
17 22
 
18 23
 BRK
19 24