aboutsummaryrefslogtreecommitdiff
path: root/tr8as.c
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-05-25 21:43:18 +0100
committerJuan J. Martinez <jjm@usebox.net>2023-05-25 21:43:18 +0100
commit607865f4a8b5662606bd3d361b6a194b016775fc (patch)
tree82281bdefc009eaabe81fccdffb8b87732e899c5 /tr8as.c
parentfe0e86d475b825d855e58662bef3bcedab5eab60 (diff)
downloadtr8vm-607865f4a8b5662606bd3d361b6a194b016775fc.tar.gz
tr8vm-607865f4a8b5662606bd3d361b6a194b016775fc.zip
Suport for assembly "line"
label: instr ; comment And all are optional.
Diffstat (limited to 'tr8as.c')
-rw-r--r--tr8as.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/tr8as.c b/tr8as.c
index c09cf48..6d43bdc 100644
--- a/tr8as.c
+++ b/tr8as.c
@@ -1588,6 +1588,9 @@ static uint8_t parse(As *as, char *c)
char word[MAX_ID + 1];
uint8_t i;
+ /* A valid assembler line can have a label, an instruction and a comment,
+ * and all of them are optional. */
+
c = skip_whitespace(c);
/* comment or empty line */
@@ -1603,22 +1606,29 @@ static uint8_t parse(As *as, char *c)
c++;
if (!new_label(as, word))
return 0;
- }
- else
- {
- /* instruction */
- for (i = 0; insts[i].parse; i++)
- if (!strcasecmp(insts[i].id, word))
- {
- if (!insts[i].parse(as, &c))
- return 0;
- break;
- }
- if (!insts[i].parse)
- return error_l("Parse error", &as->loc, word);
+ c = skip_whitespace(c);
+
+ /* comment or EOL */
+ if (!*c || *c == ';')
+ return 1;
+
+ if (!next_word(as, &c, word))
+ return 0;
}
+ /* instruction */
+ for (i = 0; insts[i].parse; i++)
+ if (!strcasecmp(insts[i].id, word))
+ {
+ if (!insts[i].parse(as, &c))
+ return 0;
+ break;
+ }
+
+ if (!insts[i].parse)
+ return error_l("Parse error", &as->loc, word);
+
c = skip_whitespace(c);
/* comment or EOL */