diff --git a/doc/da65.sgml b/doc/da65.sgml
index bf074a667..185dbe0e6 100644
--- a/doc/da65.sgml
+++ b/doc/da65.sgml
@@ -461,7 +461,8 @@ following attributes are recognized:
END
This gives the end address of the range. The end address is inclusive, that
means, it is part of the range. Of course, it may not be smaller than the
- start address.
+ start address. Optionally, the end may be given as a decimal offset instead
+ of an absolute address, "+3", to specify it as a size.
NAME
This is a convenience attribute. It takes a string argument and will cause
diff --git a/src/da65/infofile.c b/src/da65/infofile.c
index 6db82cb36..48a95c9b0 100644
--- a/src/da65/infofile.c
+++ b/src/da65/infofile.c
@@ -592,9 +592,19 @@ static void RangeSection (void)
case INFOTOK_END:
AddAttr ("END", &Attributes, tEnd);
InfoNextTok ();
- InfoAssureInt ();
- InfoRangeCheck (0x0000, 0xFFFF);
- End = InfoIVal;
+
+ if (InfoTok == INFOTOK_OFFSET_INTCON) {
+ InfoRangeCheck (0x0000, 0xFFFF);
+ if (!(Attributes & tStart))
+ InfoError ("When using End with an offset, Start must be specified before");
+ End = Start + InfoIVal - 1;
+ if (End > 0xFFFF)
+ InfoError ("Range error");
+ } else {
+ InfoAssureInt ();
+ InfoRangeCheck (0x0000, 0xFFFF);
+ End = InfoIVal;
+ }
InfoNextTok ();
break;
diff --git a/src/da65/scanner.c b/src/da65/scanner.c
index 33fb3a826..d0301c08a 100644
--- a/src/da65/scanner.c
+++ b/src/da65/scanner.c
@@ -372,6 +372,14 @@ Again:
return;
}
+ /* Decimal number offset? */
+ if (C == '+') {
+ NextChar ();
+ InfoIVal = GetDecimalToken ();
+ InfoTok = INFOTOK_OFFSET_INTCON;
+ return;
+ }
+
/* Other characters */
switch (C) {
diff --git a/src/da65/scanner.h b/src/da65/scanner.h
index d4e38177b..63d3273f6 100644
--- a/src/da65/scanner.h
+++ b/src/da65/scanner.h
@@ -48,6 +48,7 @@
typedef enum token_t {
INFOTOK_NONE,
INFOTOK_INTCON,
+ INFOTOK_OFFSET_INTCON,
INFOTOK_STRCON,
INFOTOK_CHARCON,
INFOTOK_IDENT,