return written;
}
-int ulas_asmdirstr(FILE *dst, const char **line, unsigned long n, int *rc) {
+int ulas_asmdirstr_and_pad(FILE *dst, const char **line, unsigned long n, int *rc,
+ unsigned int pad_to) {
/* .str expr, expr, expr */
struct ulas_tok t;
int i;
for (i = 0; i < (int)len; i++) {
s[i] = ulas.charcodemap[(int)s[i]];
}
+
+ ulas_asmout(dst, s, len);
+
+ for (i = pad_to-len; i > 0; i--) {
+ ulas_asmout(dst, "\0", 1);
+ written++;
+ }
- ulas_asmout(dst, s, len);
written += len;
if (ulas_tok(&ulas.tok, line, n) > 0) {
return (int)written;
}
+int ulas_asmdirstr(FILE *dst, const char **line, unsigned long n, int *rc) {
+ return ulas_asmdirstr_and_pad(dst, line, n, rc, 0);
+}
+
+int ulas_asmdirstr_pad(FILE *dst, const char **line, unsigned long n, int *rc) {
+ int written;
+ int pad_n;
+ struct ulas_tok t;
+
+
+ ULAS_EVALEXPRS_BEGIN
+ pad_n = ulas_intexpr(line, n, rc);
+ ULAS_EVALEXPRS_END
+
+ if (*rc == -1) {
+ return 0;
+ }
+
+ ulas_tok(&ulas.tok, line, n);
+ t =
+ ulas_totok(ulas.tok.buf, ulas_strnlen(ulas.tok.buf, ulas.tok.maxlen), rc);
+
+ if (*rc == -1 || t.type != ',') {
+ ULASERR("Expected ,\n");
+ return 0;
+ }
+
+
+ written = ulas_asmdirstr_and_pad(dst, line, n, rc, pad_n);
+
+ return written;
+}
+
+
int ulas_asmdirincbin(FILE *dst, const char **line, unsigned long n, int *rc) {
char *path = ulas_strexpr(line, n, rc);
char buf[256];
ULAS_ASMSTR_SETCHRCODE, ULAS_ASMSTR_CHR,
ULAS_ASMSTR_REP, ULAS_ASMSTR_SECTION,
ULAS_ASMSTR_BANK, ULAS_ASMSTR_BEGIN_SCOPE,
- ULAS_ASMSTR_END_SCOPE, NULL};
+ ULAS_ASMSTR_END_SCOPE, ULAS_ASMSTR_STR_PAD,
+ NULL};
enum ulas_asmdir dirs[] = {
ULAS_ASMDIR_ORG, ULAS_ASMDIR_SET,
ULAS_ASMDIR_BYTE, ULAS_ASMDIR_STR,
ULAS_ASMDIR_SETCHRCODE, ULAS_ASMDIR_CHR,
ULAS_ASMDIR_REP, ULAS_ASMDIR_SECTION,
ULAS_ASMDIR_BANK, ULAS_ASMDIR_BEGIN_SCOPE,
- ULAS_ASMDIR_END_SCOPE};
+ ULAS_ASMDIR_END_SCOPE, ULAS_ASMDIR_STR_PAD};
enum ulas_asmdir dir = ULAS_ASMDIR_NONE;
case ULAS_ASMDIR_STR:
other_writes += ulas_asmdirstr(dst, &line, n, &rc);
break;
+ case ULAS_ASMDIR_STR_PAD:
+ other_writes += ulas_asmdirstr_pad(dst, &line, n, &rc);
+ break;
case ULAS_ASMDIR_INCBIN:
other_writes += ulas_asmdirincbin(dst, &line, n, &rc);
break;