From c95c9c27496ba0302203f29ec5597c491dddf543 Mon Sep 17 00:00:00 2001 From: Lauri Kasanen Date: Thu, 27 Oct 2022 18:19:44 +0300 Subject: [PATCH] Allow specifying range end as a size --- doc/da65.sgml | 3 ++- src/da65/infofile.c | 16 +++++++++++++--- src/da65/scanner.c | 8 ++++++++ src/da65/scanner.h | 1 + 4 files changed, 24 insertions(+), 4 deletions(-) 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,