diff --git a/include/asm/section.h b/include/asm/section.h index a852c42a..8fdefaa8 100644 --- a/include/asm/section.h +++ b/include/asm/section.h @@ -46,6 +46,7 @@ void out_AbsByteGroup(uint8_t const *s, int32_t length); void out_Skip(int32_t skip); void out_String(char const *s); void out_RelByte(struct Expression *expr); +void out_RelBytes(struct Expression *expr, int32_t n); void out_RelWord(struct Expression *expr); void out_RelLong(struct Expression *expr); void out_PCRelByte(struct Expression *expr); diff --git a/src/asm/asmy.y b/src/asm/asmy.y index 363a8b14..2be70109 100644 --- a/src/asm/asmy.y +++ b/src/asm/asmy.y @@ -884,6 +884,10 @@ ds : T_POP_DS uconst { out_Skip($2); } + | T_POP_DS uconst comma reloc_8bit + { + out_RelBytes(&$4, $2); + } ; db : T_POP_DB constlist_8bit_entry comma constlist_8bit { diff --git a/src/asm/rgbasm.5 b/src/asm/rgbasm.5 index fc2925de..9140b350 100644 --- a/src/asm/rgbasm.5 +++ b/src/asm/rgbasm.5 @@ -799,6 +799,14 @@ Note that strings are not zero-terminated! DB 1,2,3,4,"This is a string" .Ed .Pp +.Ic DS +can also be used to fill a region of memory with some value. +The following produces 42 times the byte $FF: +.Pp +.Bd -literal -offset indent +DS 42, $FF +.Ed +.Pp Alternatively, you can use .Ic DW to store a list of words (16-bit) or diff --git a/src/asm/section.c b/src/asm/section.c index 8cb67ba7..c7dca8f2 100644 --- a/src/asm/section.c +++ b/src/asm/section.c @@ -295,11 +295,7 @@ void out_String(char const *s) absByteBypassCheck(*s++); } -/* - * Output a relocatable byte. Checking will be done to see if it - * is an absolute value in disguise. - */ -void out_RelByte(struct Expression *expr) +static void outputExpression(struct Expression const *expr) { if (!rpn_isKnown(expr)) { out_CreatePatch(PATCHTYPE_BYTE, expr); @@ -307,6 +303,26 @@ void out_RelByte(struct Expression *expr) } else { out_AbsByte(expr->nVal); } +} + +/* + * Output a relocatable byte. Checking will be done to see if it + * is an absolute value in disguise. + */ +void out_RelByte(struct Expression *expr) +{ + outputExpression(expr); + rpn_Free(expr); +} + +/* + * Output several copies of a relocatable byte. Checking will be done to see if + * it is an absolute value in disguise. + */ +void out_RelBytes(struct Expression *expr, int32_t n) +{ + while (n--) + outputExpression(expr); rpn_Free(expr); } diff --git a/test/asm/ds-bad.asm b/test/asm/ds-bad.asm new file mode 100644 index 00000000..64565269 --- /dev/null +++ b/test/asm/ds-bad.asm @@ -0,0 +1,4 @@ +SECTION "test", ROM0[0] + + ds unknown, 0 + ds 1, $100 diff --git a/test/asm/ds-bad.err b/test/asm/ds-bad.err new file mode 100644 index 00000000..f5678b2c --- /dev/null +++ b/test/asm/ds-bad.err @@ -0,0 +1,5 @@ +ERROR: ds-bad.asm(3): + Expected constant expression: 'unknown' is not constant at assembly time +warning: ds-bad.asm(4): [-Wtruncation] + Expression must be 8-bit +error: Assembly aborted (1 errors)! diff --git a/test/asm/ds-bad.out b/test/asm/ds-bad.out new file mode 100644 index 00000000..e69de29b diff --git a/test/asm/ds-byte.asm b/test/asm/ds-byte.asm new file mode 100644 index 00000000..dc95ef60 --- /dev/null +++ b/test/asm/ds-byte.asm @@ -0,0 +1,8 @@ +SECTION "test", ROM0[0] + +Label: + ds 4, 42 +.other + ds 5, .other - Label - 5 ; Expressions should work... + ds 60, .last - Label ; ...even if not constant +.last diff --git a/test/asm/ds-byte.err b/test/asm/ds-byte.err new file mode 100644 index 00000000..e69de29b diff --git a/test/asm/ds-byte.out b/test/asm/ds-byte.out new file mode 100644 index 00000000..e69de29b diff --git a/test/asm/ds-byte.out.bin b/test/asm/ds-byte.out.bin new file mode 100644 index 00000000..6f4591e3 --- /dev/null +++ b/test/asm/ds-byte.out.bin @@ -0,0 +1 @@ +****˙˙˙˙˙EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE \ No newline at end of file