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));
}
/*