shithub: rgbds

Download patch

ref: 1ab93a194e7242912929b08798447f91e831a090
parent: 1b05c43b979f8cc8c9bd571a7c96f13614724111
author: Ben10do <[email protected]>
date: Thu Feb 23 10:00:57 EST 2017

Implement ALIGN keyword in rgbasm

The ALIGN keyword specifies the number of bits that should be zero at the start of a section. It works in a simliar fashion to BANK.

--- a/src/asm/asmy.y
+++ b/src/asm/asmy.y
@@ -442,7 +442,7 @@
 %left	T_OP_MUL T_OP_DIV T_OP_MOD
 %left	T_OP_NOT
 %left	T_OP_DEF
-%left	T_OP_BANK
+%left	T_OP_BANK T_OP_ALIGN
 %left	T_OP_SIN
 %left	T_OP_COS
 %left	T_OP_TAN
@@ -1095,6 +1095,10 @@
 			else
 				yyerror("Address $%x not 16-bit", $6);
 		}
+	|	T_POP_SECTION string ',' sectiontype ',' T_OP_ALIGN '[' const ']'
+		{
+			out_NewAlignedSection($2, $4, $8, -1);
+		}
 	|	T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' const ']'
 		{
 			bankrangecheck($2, $4, -1, $8);
@@ -1105,6 +1109,14 @@
 				yyerror("Address $%x not 16-bit", $6);
 			}
 			bankrangecheck($2, $4, $6, $11);
+		}
+	|	T_POP_SECTION string ',' sectiontype ',' T_OP_ALIGN '[' const ']' ',' T_OP_BANK '[' const ']'
+		{
+			out_NewAlignedSection($2, $4, $8, $13);
+		}
+	|	T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' const ']' ',' T_OP_ALIGN '[' const ']'
+		{
+			out_NewAlignedSection($2, $4, $13, $8);
 		}
 ;
 
--- a/src/asm/globlex.c
+++ b/src/asm/globlex.c
@@ -267,6 +267,7 @@
 	{"def", T_OP_DEF},
 
 	{"bank", T_OP_BANK},
+	{"align", T_OP_ALIGN},
 
 	{"round", T_OP_ROUND},
 	{"ceil", T_OP_CEIL},
--- a/src/asm/output.c
+++ b/src/asm/output.c
@@ -631,7 +631,10 @@
 void 
 out_NewAlignedSection(char *pzName, ULONG secttype, SLONG alignment, SLONG bank)
 {
-	out_SetCurrentSection(out_FindSection(pzName, secttype, -1, bank, alignment));
+	if (alignment < 0) {
+		yyerror("Alignment must not be negative.");
+	}
+	out_SetCurrentSection(out_FindSection(pzName, secttype, -1, bank, 1 << alignment));
 }
 
 /*