aboutsummaryrefslogtreecommitdiff
path: root/tr8as.c
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-05-21 22:44:06 +0100
committerJuan J. Martinez <jjm@usebox.net>2023-05-21 22:44:06 +0100
commit82e506390d12a3ce30604e42af8cbccc448ad861 (patch)
treeee6da5aeb4b5f10267850072caf856efff0d7b80 /tr8as.c
parent6909a1a5f7e2eeb15d451af99072774593321158 (diff)
downloadtr8vm-82e506390d12a3ce30604e42af8cbccc448ad861.tar.gz
tr8vm-82e506390d12a3ce30604e42af8cbccc448ad861.zip
Add .str directive
Diffstat (limited to 'tr8as.c')
-rw-r--r--tr8as.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/tr8as.c b/tr8as.c
index 15143b7..64af41d 100644
--- a/tr8as.c
+++ b/tr8as.c
@@ -695,6 +695,37 @@ static uint8_t parse_equ(As *as, char **c)
return new_define(as, id, value);
}
+static uint8_t parse_str(As *as, char **c)
+{
+ /* .str "string" */
+
+ *c = skip_whitespace(*c);
+ if (**c != '"')
+ return error_l("Syntax error", &as->loc, "expected \"");
+ (*c)++;
+
+ while (**c && **c != '\"' && **c != '\n')
+ {
+ if (**c == '\\')
+ {
+ (*c)++;
+ if (**c != '\\' && **c != '"')
+ return error_l("Syntax error", &as->loc, "invalid escape sequence");
+ }
+
+ as->out[as->addr++] = **c;
+ if (as->addr > as->size)
+ as->size = as->addr;
+ (*c)++;
+ }
+
+ if (**c != '"')
+ return error_l("Syntax error", &as->loc, "expected \"");
+
+ return 1;
+}
+
+
static uint8_t parse_db(As *as, char **c)
{
char word[MAX_ID + 1];
@@ -1582,6 +1613,7 @@ static InstParse insts[] =
{ ".incbin", parse_incbin },
{ ".org", parse_org },
{ ".equ", parse_equ },
+ { ".str", parse_str },
{ ".db", parse_db },
{ ".dw", parse_dw },
{ ".ds", parse_ds },