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