Added .str directive
authorLukas Krickl <lukas@krickl.dev>
Tue, 5 Dec 2023 18:56:23 +0000 (19:56 +0100)
committerLukas Krickl <lukas@krickl.dev>
Tue, 5 Dec 2023 18:56:23 +0000 (19:56 +0100)
src/ulas.c
tests/t0.bin
tests/t0.s

index 44938ecb6ad43b5d10640654c6250e6f43f8386d..ea96dc823daa9f7d52b5c6acc9a36e5b1baa672c 100644 (file)
@@ -2223,6 +2223,28 @@ int ulas_asmdirfill(FILE *dst, const char **line, unsigned long n, int *rc) {
   return written;
 }
 
+int ulas_asmdirstr(FILE *dst, const char **line, unsigned long n, int *rc) {
+  // .str expr, expr, expr
+  struct ulas_tok t;
+  int written = 0;
+  memset(&t, 0, sizeof(t));
+
+  do {
+    char *s = ulas_strexpr(line, n, rc);
+    long len = strlen(s);
+    ulas_asmout(dst, s, len);
+
+    written += len;
+    if (ulas_tok(&ulas.tok, line, n) > 0) {
+      t = ulas_totok(ulas.tok.buf, strnlen(ulas.tok.buf, ulas.tok.maxlen), rc);
+    } else {
+      break;
+    }
+  } while (*rc != -1 && t.type == ',');
+
+  return written;
+}
+
 int ulas_asmline(FILE *dst, FILE *src, const char *line, unsigned long n) {
   // this buffer is written both to dst and to verbose output
   char outbuf[ULAS_OUTBUFMAX];
@@ -2283,8 +2305,10 @@ int ulas_asmline(FILE *dst, FILE *src, const char *line, unsigned long n) {
     case ULAS_ASMDIR_FILL:
       other_writes += ulas_asmdirfill(dst, &line, n, &rc);
       break;
-    case ULAS_ASMDIR_INCBIN:
     case ULAS_ASMDIR_STR:
+      other_writes += ulas_asmdirstr(dst, &line, n, &rc);
+      break;
+    case ULAS_ASMDIR_INCBIN:
     case ULAS_ASMDIR_PAD:
       // TODO: pad is the same as .fill n, $ - n
     case ULAS_ASMDIR_NONE:
index 79fe45a9385690c4d6f3d0e952ac5ced9f170f2e..5f3faedb0e43472151f75f8091ef024132d022c2 100644 (file)
Binary files a/tests/t0.bin and b/tests/t0.bin differ
index 0faea9494ab490721439e69b876a05fda5b3f705..f3999dc717658c9a2fe4757100546e995d2f96db 100644 (file)
@@ -91,3 +91,5 @@ l2:
 .fill 1, 0x180-$ ; fill until 0x180
   nop
 .def str s2 = "Hello"
+
+.str "test1", "test2"