... | ... |
@@ -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 |
|