ref: 31294d6d9dd5f4cdb79caa07832ff4a494f74072
parent: 6c10ca62ad899fe5f5f0f687d7ec7b3b0650601f
author: Anthony J. Bentley <anthony@anjbe.name>
date: Mon Oct 5 12:56:37 EDT 2015
rgbasm: refactor bank range checking, and bump the SRAM limit. This doesn’t affect rgblink, which still needs work.
--- a/src/asm/asmy.y
+++ b/src/asm/asmy.y
@@ -20,6 +20,49 @@
char *tzNewMacro;
ULONG ulNewMacroSize;
+void
+bankrangecheck(char *name, ULONG secttype, SLONG org, SLONG bank)
+{+ SLONG minbank, maxbank;
+ char *stype;
+ switch (secttype) {+ case SECT_ROMX:
+ stype = "ROMX";
+ minbank = 1;
+ maxbank = 0x1ff;
+ break;
+ case SECT_SRAM:
+ stype = "SRAM";
+ minbank = 0;
+ maxbank = 0x1ff;
+ break;
+ case SECT_WRAMX:
+ stype = "WRAMX";
+ minbank = 1;
+ maxbank = 7;
+ break;
+ case SECT_VRAM:
+ stype = "VRAM";
+ minbank = 0;
+ maxbank = 1;
+ break;
+ default:
+ yyerror("BANK only allowed for "+ "ROMX, WRAMX, SRAM, or VRAM sections");
+ }
+
+ if (bank < minbank || bank > maxbank) {+ yyerror("%s bank value $%x out of range ($%x to $%x)",+ stype, bank, minbank, maxbank);
+ }
+
+ if (secttype == SECT_WRAMX) {+ bank -= minbank;
+ }
+
+ out_NewAbsSection(name, secttype, org, bank);
+}
+
size_t symvaluetostring(char *dest, size_t maxLength, char *sym)
{size_t length;
@@ -1054,76 +1097,14 @@
}
| T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' const ']'
{- if( $4==SECT_ROMX ) {- if( $8>=1 && $8<=0x1ff )
- out_NewAbsSection($2,$4,-1,$8);
- else
- yyerror("ROM bank value $%x out of range (1 to $1ff)", $8);- } else if ($4 == SECT_SRAM) {- if ($8 >= 0 && $8 <= 3) {- out_NewAbsSection($2, $4, -1, $8);
- } else {- yyerror("SRAM bank value $%x out of range (0 to 3)", $8);- }
- } else if ($4 == SECT_WRAMX) {- if ($8 >= 1 && $8 <= 7) {- out_NewAbsSection($2, $4, -1, $8 - 1);
- } else {- yyerror("WRAMX bank value $%x out of range (1 to 7)", $8);- }
- } else if ($4 == SECT_VRAM) {- if ($8 >= 0 && $8 <= 1) {- out_NewAbsSection($2, $4, -1, $8);
- } else {- yyerror("VRAM bank value $%x out of range (0 to 1)", $8);- }
- } else {- yyerror("BANK only allowed for ROMX, WRAMX, SRAM, or VRAM sections");- }
+ bankrangecheck($2, $4, -1, $8);
}
| T_POP_SECTION string ',' sectiontype '[' const ']' ',' T_OP_BANK '[' const ']'
{- if( $4==SECT_ROMX ) {- if( $6>=0 && $6<0x10000 ) {- if( $11>=1 && $11<=0x1ff )
- out_NewAbsSection($2,$4,$6,$11);
- else
- yyerror("ROM bank value $%x out of range (1 to $1ff)", $11);- } else
- yyerror("Address $%x not 16-bit", $6);- } else if ($4 == SECT_SRAM) {- if ($6 >= 0 && $6 < 0x10000) {- if ($11 >= 0 && $11 <= 3) {- out_NewAbsSection($2, $4, $6, $11);
- } else {- yyerror("SRAM bank value $%x out of range (0 to 3)", $11);- }
- } else {- yyerror("Address $%x not 16-bit", $6);- }
- } else if ($4 == SECT_WRAMX) {- if ($6 >= 0 && $6 < 0x10000) {- if ($11 >= 1 && $11 <= 7) {- out_NewAbsSection($2, $4, $6, $11 - 1);
- } else {- yyerror("WRAMX bank value $%x out of range (1 to 7)", $11);- }
- } else {- yyerror("Address $%x not 16-bit", $6);- }
- } else if ($4 == SECT_VRAM) {- if ($6 >= 0 && $6 < 0x10000) {- if ($11 >= 0 && $11 <= 1) {- out_NewAbsSection($2,$4,$6,$11);
- } else {- yyerror("VRAM bank value $%x out of range (0 to 1)", $11);- }
- } else {- yyerror("Address $%x not 16-bit", $6);- }
- } else {- yyerror("BANK only allowed for ROMX, WRAMX, SRAM, or VRAM sections");+ if ($6 < 0 || $6 > 0x10000) {+ yyerror("Address $%x not 16-bit", $6);}
+ bankrangecheck($2, $4, $6, $11);
}
;
--
⑨