shithub: rgbds

Download patch

ref: 8f20620c1627fe4ea67d5ea6aceaf0505df5af29
parent: 96bce05be2d899fda544a480672cdf76c6737468
author: Rangi <remy.oukaour+rangi42@gmail.com>
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