ref: 8f20620c1627fe4ea67d5ea6aceaf0505df5af29
parent: 96bce05be2d899fda544a480672cdf76c6737468
author: Rangi <[email protected]>
date: Fri Feb 12 18:09:06 EST 2021
Allow shifting macro arguments by a negative amount Fixes #733
--- a/src/asm/macro.c
+++ b/src/asm/macro.c
@@ -168,12 +168,12 @@
{
if (!macroArgs) {
error("Cannot shift macro arguments outside of a macro\n");
- } else if (count < 0) {
- error("Cannot shift arguments by negative amount %" PRId32 "\n", count);
} else if (macroArgs->shift < macroArgs->nbArgs) {
macroArgs->shift += count;
if (macroArgs->shift > macroArgs->nbArgs)
macroArgs->shift = macroArgs->nbArgs;
+ else if (macroArgs->shift < 0)
+ macroArgs->shift = 0;
}
}
--- a/src/asm/rgbasm.5
+++ b/src/asm/rgbasm.5
@@ -1487,6 +1487,7 @@
.Pp
.Ic SHIFT
can optionally be given an integer parameter, and will apply the above shifting that number of times.
+A negative parameter will shift the arguments in reverse.
.Ss Printing things during assembly
The
.Ic PRINT
--- a/test/asm/shift-negative.asm
+++ b/test/asm/shift-negative.asm
@@ -1,4 +1,16 @@
+reverse: MACRO
+ for i, _NARG
+i = _NARG - i - 1
+ shift i
+ println \1
+ shift -i
+ endr
+ENDM
+
+ reverse $1, $2, $3
+
m: MACRO
+ shift 2
shift -3
ENDM
m
--- a/test/asm/shift-negative.err
+++ b/test/asm/shift-negative.err
@@ -1,3 +1,0 @@
-ERROR: shift-negative.asm(4) -> shift-negative.asm::m(2):
- Cannot shift arguments by negative amount -3
-error: Assembly aborted (1 errors)!
--- a/test/asm/shift-negative.out
+++ b/test/asm/shift-negative.out
@@ -1,0 +1,3 @@
+$3
+$2
+$1