%token LINE
%token DIR_2BYTE DIR_4BYTE DIR_ALIGN DIR_ASCII DIR_ASCIZ DIR_BALIGN
%token DIR_BSS DIR_BYTE DIR_COMM DIR_DATA DIR_DOUBLE DIR_ENDR DIR_EXTERN
-%token DIR_EQU DIR_FILE DIR_FLOAT DIR_GLOBAL DIR_IDENT DIR_INT DIR_LOC
-%token DIR_LCOMM DIR_OCTA DIR_ORG DIR_P2ALIGN DIR_REPT DIR_SECTION
+%token DIR_EQU DIR_FILE DIR_FLOAT DIR_GLOBAL DIR_IDENT DIR_INT DIR_LINE
+%token DIR_LOC DIR_LCOMM DIR_OCTA DIR_ORG DIR_P2ALIGN DIR_REPT DIR_SECTION
%token DIR_SHORT DIR_SIZE DIR_SKIP DIR_SLEB128 DIR_STRING DIR_TEXT
%token DIR_TFLOAT DIR_TYPE DIR_QUAD DIR_ULEB128 DIR_VALUE DIR_WEAK DIR_WORD
%token DIR_ZERO
$$ = $3;
define_label(parser_gas, $1, 0);
}
+ /* Line directive */
+ | DIR_LINE INTNUM {
+ $$ = (yasm_bytecode *)NULL;
+ if (yasm_intnum_sign($2) < 0)
+ yasm__error(cur_line, N_("line number is negative"));
+ else
+ yasm_linemap_set(parser_gas->linemap, NULL,
+ yasm_intnum_get_uint($2), 1);
+ }
+ /* Macro directives */
+ | DIR_REPT expr {
+ yasm_intnum *intn = yasm_expr_get_intnum(&$2, NULL);
+
+ $$ = (yasm_bytecode *)NULL;
+ if (!intn) {
+ yasm__error(cur_line, N_("rept expression not absolute"));
+ } else if (yasm_intnum_sign(intn) < 0) {
+ yasm__error(cur_line, N_("rept expression is negative"));
+ } else {
+ gas_rept *rept = yasm_xmalloc(sizeof(gas_rept));
+ STAILQ_INIT(&rept->lines);
+ rept->startline = cur_line;
+ rept->numrept = yasm_intnum_get_uint(intn);
+ rept->numdone = 0;
+ rept->line = NULL;
+ rept->linepos = 0;
+ rept->ended = 0;
+ rept->oldbuf = NULL;
+ rept->oldbuflen = 0;
+ rept->oldbufpos = 0;
+ parser_gas->rept = rept;
+ }
+ }
+ | DIR_ENDR {
+ $$ = (yasm_bytecode *)NULL;
+ /* Shouldn't ever get here unless we didn't get a DIR_REPT first */
+ yasm__error(cur_line, N_("endr without matching rept"));
+ }
/* Alignment directives */
| DIR_ALIGN dirvals2 {
/* FIXME: Whether this is power-of-two or not depends on arch and
parser_gas.code_section = !strcmp(yasm_section_get_name(def_sect), ".text");
+ parser_gas.rept = NULL;
+
/* yacc debugging, needs YYDEBUG set in bison.y.in to work */
parser_gas.debug = 1;
gas_parser_parse(&parser_gas);
+ /* Check for ending inside a rept */
+ if (parser_gas.rept)
+ yasm__error(parser_gas.rept->startline,
+ N_("rept without matching endr"));
+
gas_parser_cleanup(&parser_gas);
/* Free locallabel base if necessary */
#define MAX_SAVED_LINE_LEN 80
+typedef struct gas_rept_line {
+ STAILQ_ENTRY(gas_rept_line) link;
+ YYCTYPE *data; /* line characters */
+ size_t len; /* length of data */
+} gas_rept_line;
+
+typedef struct gas_rept {
+ STAILQ_HEAD(reptlinelist, gas_rept_line) lines; /* repeated lines */
+ unsigned long startline; /* line number of rept directive */
+ unsigned long numrept; /* number of repititions to generate */
+ unsigned long numdone; /* number of repititions executed so far */
+ /*@null@*/ gas_rept_line *line; /* next line to repeat */
+ size_t linepos; /* position to start pulling chars from line */
+ int ended; /* seen endr directive yet? */
+
+ char *oldbuf; /* saved previous fill buffer */
+ size_t oldbuflen; /* previous fill buffer length */
+ size_t oldbufpos; /* position in previous fill buffer */
+} gas_rept;
+
typedef struct yasm_parser_gas {
FILE *in;
int debug;
} state;
int code_section;
+
+ /*@null@*/ gas_rept *rept;
} yasm_parser_gas;
/* shorter access names to commonly used parser_gas fields */
#define TOKLEN (size_t)(cursor-s->tok)
+static size_t
+rept_input(yasm_parser_gas *parser_gas, /*@out@*/ char *buf, size_t max_size)
+{
+ gas_rept *rept = parser_gas->rept;
+ size_t numleft = max_size;
+ char *bufp = buf;
+
+ /* If numrept is 0, copy out just the line end characters */
+ if (rept->numrept == 0) {
+ /* Skip first line, which contains .line */
+ rept->line = STAILQ_NEXT(rept->line, link);
+ if (!rept->line) {
+ rept->numrept = 1;
+ rept->numdone = 1;
+ }
+ while (rept->numrept == 0 && numleft > 0) {
+ *bufp++ = rept->line->data[rept->line->len-1];
+ rept->line = STAILQ_NEXT(rept->line, link);
+ if (!rept->line) {
+ rept->numrept = 1;
+ rept->numdone = 1;
+ }
+ }
+ }
+
+ /* Copy out the previous fill buffer until we're *really* done */
+ if (rept->numdone == rept->numrept) {
+ size_t numcopy = rept->oldbuflen - rept->oldbufpos;
+ if (numcopy > numleft)
+ numcopy = numleft;
+ memcpy(bufp, &rept->oldbuf[rept->oldbufpos], numcopy);
+ numleft -= numcopy;
+ bufp += numcopy;
+ rept->oldbufpos += numcopy;
+
+ if (rept->oldbufpos == rept->oldbuflen) {
+ /* Delete lines, then delete rept and clear rept state */
+ gas_rept_line *cur, *next;
+ cur = STAILQ_FIRST(&rept->lines);
+ while (cur) {
+ next = STAILQ_NEXT(cur, link);
+ yasm_xfree(cur->data);
+ yasm_xfree(cur);
+ cur = next;
+ }
+ yasm_xfree(rept->oldbuf);
+ yasm_xfree(rept);
+ parser_gas->rept = NULL;
+ }
+ }
+
+ while (numleft > 0 && rept->numdone < rept->numrept) {
+ /* Copy from line data to buf */
+ size_t numcopy = rept->line->len - rept->linepos;
+ if (numcopy > numleft)
+ numcopy = numleft;
+ memcpy(bufp, &rept->line->data[rept->linepos], numcopy);
+ numleft -= numcopy;
+ bufp += numcopy;
+ rept->linepos += numcopy;
+
+ /* Update locations if needed */
+ if (rept->linepos == rept->line->len) {
+ rept->line = STAILQ_NEXT(rept->line, link);
+ rept->linepos = 0;
+ }
+ if (rept->line == NULL) {
+ rept->numdone++;
+ rept->line = STAILQ_FIRST(&rept->lines);
+ }
+ }
+
+ return (max_size-numleft);
+}
static YYCTYPE *
fill(yasm_parser_gas *parser_gas, YYCTYPE *cursor)
yasm_xfree(s->bot);
s->bot = buf;
}
- if((cnt = yasm_preproc_input(parser_gas->preproc, s->lim,
+ if (parser_gas->rept && parser_gas->rept->ended) {
+ /* Pull from rept lines instead of preproc */
+ cnt = rept_input(parser_gas, s->lim, BSIZE);
+ } else if((cnt = yasm_preproc_input(parser_gas->preproc, s->lim,
BSIZE)) == 0) {
s->eof = &s->lim[cnt]; *s->eof++ = '\n';
}
int
gas_parser_lex(YYSTYPE *lvalp, yasm_parser_gas *parser_gas)
{
+ /*@null@*/ gas_rept *rept = parser_gas->rept;
Scanner *s = &parser_gas->s;
YYCTYPE *cursor = s->cur;
size_t count;
YYCTYPE savech;
+ int linestart;
+ gas_rept_line *new_line;
/* Catch EOF */
if (s->eof && cursor == s->eof)
return 0;
+ /* Handle rept */
+ if (rept && !rept->ended)
+ goto rept_directive;
+
/* Jump to proper "exclusive" states */
switch (parser_gas->state) {
case SECTION_DIRECTIVE:
'.ident' { RETURN(DIR_IDENT); }
'.int' { RETURN(DIR_INT); }
'.lcomm' { RETURN(DIR_LCOMM); }
+ '.line' { RETURN(DIR_LINE); }
'.loc' { RETURN(DIR_LOC); }
'.long' { RETURN(DIR_INT); }
'.octa' { RETURN(DIR_OCTA); }
goto stringconst_scan;
}
*/
+
+rept_directive:
+ strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE);
+ strbuf_size = STRBUF_ALLOC_SIZE;
+ count = 0;
+ linestart = 1;
+
+
+rept_scan:
+ SCANINIT();
+
+ /*!re2c
+ [\n;] {
+ /* Line ending, save in lines */
+ new_line = yasm_xmalloc(sizeof(gas_rept_line));
+ if (cursor == s->eof) {
+ yasm_xfree(strbuf);
+ return 0;
+ }
+ strbuf_append(count++, cursor, s, cur_line, s->tok[0]);
+ new_line->data = strbuf;
+ new_line->len = count;
+ STAILQ_INSERT_TAIL(&rept->lines, new_line, link);
+ /* Allocate new strbuf */
+ strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE);
+ strbuf_size = STRBUF_ALLOC_SIZE;
+ count = 0;
+ /* Mark start of line */
+ linestart = 1;
+ goto rept_scan;
+ }
+ '.rept' {
+ int i;
+ if (linestart) {
+ /* We don't support nested right now, error */
+ yasm__error(cur_line, N_("nested rept not supported"));
+ }
+ for (i=0; i<6; i++)
+ strbuf_append(count++, cursor, s, cur_line, s->tok[i]);
+ goto rept_scan;
+ }
+ '.endr' {
+ if (linestart) {
+ /* We're done, kick off the main lexer */
+ rept->line = STAILQ_FIRST(&rept->lines);
+ if (!rept->line) {
+ /* Didn't get any intervening data? Empty repeat, so
+ * don't even bother.
+ */
+ yasm_xfree(strbuf);
+ yasm_xfree(rept);
+ parser_gas->rept = NULL;
+ } else {
+ rept->ended = 1;
+
+ /* Add .line as first line to get line numbers correct */
+ new_line = yasm_xmalloc(sizeof(gas_rept_line));
+ new_line->data = yasm_xmalloc(40);
+ sprintf(new_line->data, ".line %lu;", rept->startline+1);
+ new_line->len = strlen(new_line->data);
+ STAILQ_INSERT_HEAD(&rept->lines, new_line, link);
+
+ /* Save previous fill buffer */
+ rept->oldbuf = parser_gas->s.bot;
+ rept->oldbuflen = s->lim - s->bot;
+ rept->oldbufpos = cursor - s->bot;
+
+ /* Reset fill */
+ s->bot = NULL;
+ s->tok = NULL;
+ s->ptr = NULL;
+ s->cur = NULL;
+ s->pos = NULL;
+ s->lim = NULL;
+ s->top = NULL;
+ s->eof = NULL;
+ cursor = NULL;
+ YYFILL(1);
+ }
+
+ goto scan;
+ } else {
+ int i;
+ for (i=0; i<6; i++)
+ strbuf_append(count++, cursor, s, cur_line, s->tok[i]);
+ goto rept_scan;
+ }
+ }
+
+ any {
+ if (cursor == s->eof) {
+ yasm_xfree(strbuf);
+ return 0;
+ }
+ strbuf_append(count++, cursor, s, cur_line, s->tok[0]);
+ linestart = 0;
+ goto rept_scan;
+ }
+ */
+
}
EXTRA_DIST += modules/parsers/gas/tests/varinsn.errwarn
EXTRA_DIST += modules/parsers/gas/tests/varinsn.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/Makefile.inc
+include modules/parsers/gas/tests/bin/Makefile.inc
--- /dev/null
+# $Id$
+
+TESTS += modules/parsers/gas/tests/bin/gas_bin_test.sh
+
+EXTRA_DIST += modules/parsers/gas/tests/bin/gas_bin_test.sh
+EXTRA_DIST += modules/parsers/gas/tests/bin/rept-err.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/rept-err.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptempty.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptempty.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptempty.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptlong.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptlong.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptlong.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptnested-err.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptnested-err.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptsimple.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptsimple.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptsimple.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptwarn.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptwarn.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptwarn.hex
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptzero.asm
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptzero.errwarn
+EXTRA_DIST += modules/parsers/gas/tests/bin/reptzero.hex
+
--- /dev/null
+#! /bin/sh
+# $Id$
+${srcdir}/out_test.sh gas_bin_test modules/parsers/gas/tests/bin "gas-compat parser bin output" "-f bin -p gas" ""
+exit $?
--- /dev/null
+.rept 6
+.byte 0
--- /dev/null
+-:1: rept without matching endr
--- /dev/null
+.byte 1
+.rept 2
+.endr
+.byte 2
--- /dev/null
+.byte 1
+.rept 5
+.byte 0
+.endr
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+.byte 2
--- /dev/null
+01
+00
+00
+00
+00
+00
+02
--- /dev/null
+.rept 6
+.byte 1
+.rept 2
+.byte 2
+.endr
+.byte 3
+.endr
--- /dev/null
+-:2: nested rept not supported
+-:3: rept without matching endr
+-:4: nested rept not supported
+-:4: nested rept not supported
+-:4: nested rept not supported
+-:4: nested rept not supported
+-:4: nested rept not supported
--- /dev/null
+.byte 1
+.rept 5
+.byte 0
+.endr
+.byte 2
--- /dev/null
+01
+00
+00
+00
+00
+00
+02
--- /dev/null
+.byte 1000
+.rept 3
+.byte 1000
+
+
+.byte 1000
+.endr
+
+.byte 1000
+.byte 1000
--- /dev/null
+-:1: warning: value does not fit in 8 bit field
+-:3: warning: value does not fit in 8 bit field
+-:6: warning: value does not fit in 8 bit field
+-:3: warning: value does not fit in 8 bit field
+-:6: warning: value does not fit in 8 bit field
+-:3: warning: value does not fit in 8 bit field
+-:6: warning: value does not fit in 8 bit field
+-:9: warning: value does not fit in 8 bit field
+-:10: warning: value does not fit in 8 bit field
--- /dev/null
+e8
+e8
+e8
+e8
+e8
+e8
+e8
+e8
+e8
--- /dev/null
+.byte 1
+.rept 0
+.byte 2
+.byte 3
+.endr
+.byte 4